diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2013-08-31 04:37:11 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2013-08-31 04:37:11 +0300 |
commit | aff26e01b106738488060121557c52e16e70f645 (patch) | |
tree | 7bfb6a5386da97db72f9c255d70141cb52775cdb | |
parent | af35570486899140425227767e27385fb5b3fa70 (diff) | |
parent | c551f08ab5c2a7e039285ff159b2fe00b12137b6 (diff) | |
download | xfdesktop-aff26e01b106738488060121557c52e16e70f645.tar.gz |
Merge branch 'eric/middle-click-menu'
-rw-r--r-- | src/windowlist.c | 144 |
1 files changed, 71 insertions, 73 deletions
diff --git a/src/windowlist.c b/src/windowlist.c index e337a6ef..f228ca3a 100644 --- a/src/windowlist.c +++ b/src/windowlist.c @@ -52,36 +52,51 @@ static gboolean wl_submenus = FALSE; static gboolean wl_sticky_once = FALSE; static void -set_num_workspaces(GtkWidget *w, gpointer num) +set_num_workspaces(GtkWidget *w, gpointer data) { - static Atom xa_NET_NUMBER_OF_DESKTOPS = 0; - XClientMessageEvent sev; - gint n; - GdkScreen *gscreen = gtk_widget_get_screen(w); - GdkWindow *groot = gdk_screen_get_root_window(gscreen); - - if(!xa_NET_NUMBER_OF_DESKTOPS) { - xa_NET_NUMBER_OF_DESKTOPS = XInternAtom(gdk_x11_get_default_xdisplay(), - "_NET_NUMBER_OF_DESKTOPS", False); - } - - n = GPOINTER_TO_INT(num); - - sev.type = ClientMessage; - sev.display = gdk_x11_get_default_xdisplay(); - sev.format = 32; - sev.window = GDK_WINDOW_XID(groot); - sev.message_type = xa_NET_NUMBER_OF_DESKTOPS; - sev.data.l[0] = n; + WnckScreen *wnck_screen = wnck_screen_get(gdk_screen_get_number(gtk_widget_get_screen(w))); + WnckWorkspace *wnck_workspace = wnck_screen_get_active_workspace(wnck_screen); + gint nworkspaces = wnck_screen_get_workspace_count(wnck_screen); + const gchar *ws_name = wnck_workspace_get_name(wnck_screen_get_workspace(wnck_screen, nworkspaces -1)); + gint num = GPOINTER_TO_INT(data); + gchar *rm_label_short = NULL, *rm_label_long = NULL; + gint current_workspace = wnck_workspace_get_number(wnck_workspace); + const gchar *current_workspace_name = wnck_workspace_get_name(wnck_workspace); + + g_return_if_fail(nworkspaces != num); + + TRACE("entering"); + + if(num < nworkspaces) { + if(!ws_name || atoi(ws_name) == nworkspaces) { + rm_label_short = g_strdup_printf(_("Remove Workspace %d"), nworkspaces); + rm_label_long = g_strdup_printf(_("Do you really want to remove workspace %d?\nNote: You are currently on workspace %d."), + nworkspaces, current_workspace); + } else { + gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name)); + rm_label_short = g_strdup_printf(_("Remove Workspace '%s'"), ws_name_esc); + rm_label_long = g_strdup_printf(_("Do you really want to remove workspace '%s'?\nNote: You are currently on workspace '%s'."), + ws_name_esc, current_workspace_name); + g_free(ws_name_esc); + } - gdk_error_trap_push(); + /* Popup a dialog box confirming that the user wants to remove a + * workspace */ + if(!xfce_dialog_confirm(NULL, NULL, _("Remove"), rm_label_long, + "%s", rm_label_short)) + { + g_free(rm_label_short); + g_free(rm_label_long); + return; + } + } - XSendEvent(gdk_x11_get_default_xdisplay(), GDK_WINDOW_XID(groot), False, - SubstructureNotifyMask | SubstructureRedirectMask, - (XEvent *)&sev); + if(rm_label_short != NULL) + g_free(rm_label_short); + if(rm_label_long != NULL) + g_free(rm_label_long); - gdk_flush(); - gdk_error_trap_pop(); + wnck_screen_change_workspace_count(wnck_screen, num); } static void @@ -153,11 +168,7 @@ menu_item_from_wnck_window(WnckWindow *wnck_window, gint icon_width, g_string_prepend(label, "<i>"); g_string_append(label, "</i>"); } - if(wnck_window_is_minimized(wnck_window)) { - g_string_prepend(label, "["); - g_string_append(label, "]"); - } - + if(wl_show_icons) { icon = wnck_window_get_icon(wnck_window); w = gdk_pixbuf_get_width(icon); @@ -165,12 +176,18 @@ menu_item_from_wnck_window(WnckWindow *wnck_window, gint icon_width, if(w != icon_width || h != icon_height) { tmp = gdk_pixbuf_scale_simple(icon, icon_width, icon_height, GDK_INTERP_BILINEAR); + + if(wnck_window_is_minimized(wnck_window)) { + /* minimized window, fade out app icon */ + gdk_pixbuf_saturate_and_pixelate(tmp, tmp, 0.55, TRUE); + } + img = gtk_image_new_from_pixbuf(tmp); g_object_unref(G_OBJECT(tmp)); } else img = gtk_image_new_from_pixbuf(icon); } - + if(img) { mi = gtk_image_menu_item_new_with_label(label->str); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img); @@ -203,7 +220,6 @@ windowlist_populate(XfceDesktop *desktop, WnckWindow *wnck_window; gint w, h; PangoFontDescription *italic_font_desc; - gboolean is_empty_workspace; if(!show_windowlist) return; @@ -249,36 +265,29 @@ windowlist_populate(XfceDesktop *desktop, if(wl_show_ws_names || wl_submenus) { ws_name = wnck_workspace_get_name(wnck_workspace); - - if(wnck_workspace == active_workspace) { - if(ws_name == NULL || *ws_name == '\0') - ws_label = g_strdup_printf(_("<b>Workspace %d</b>"), i+1); - else { - gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name)); - ws_label = g_strdup_printf("<b>%s</b>", ws_name_esc); - g_free(ws_name_esc); - } - } else { /* don't italicise if we're showing stuff in submenus */ - if(ws_name == NULL || *ws_name == '\0') { - if(wl_submenus) - ws_label = g_strdup_printf(_("Workspace %d"), i+1); - else - ws_label = g_strdup_printf(_("<i>Workspace %d</i>"), i+1); - } else { - gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name)); - if(wl_submenus) - ws_label = ws_name_esc; - else { - ws_label = g_strdup_printf("<i>%s</i>", ws_name_esc); - g_free(ws_name_esc); - } - } + + /* Workspace header */ + if(ws_name == NULL || *ws_name == '\0') + ws_label = g_strdup_printf(_("<b>Workspace %d</b>"), i+1); + else { + gchar *ws_name_esc = g_markup_escape_text(ws_name, strlen(ws_name)); + ws_label = g_strdup_printf("<b>%s</b>", ws_name_esc); + g_free(ws_name_esc); } mi = gtk_menu_item_new_with_label(ws_label); g_free(ws_label); label = gtk_bin_get_child(GTK_BIN(mi)); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + /* center the workspace header */ + gtk_misc_set_alignment(GTK_MISC(label), 0.4f, 0); + /* If it's not the active workspace, make the color insensitive */ + if(wnck_workspace != active_workspace) + { + GtkWidget *lbl = gtk_bin_get_child(GTK_BIN(mi)); + gtk_widget_modify_fg(lbl, GTK_STATE_NORMAL, + &(style->fg[GTK_STATE_INSENSITIVE])); + } gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); if(!wl_submenus) { @@ -290,15 +299,11 @@ windowlist_populate(XfceDesktop *desktop, if(wl_submenus) { submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), submenu); - } else { - mi = gtk_separator_menu_item_new(); - gtk_widget_show(mi); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); } } windows = wnck_screen_get_windows_stacked(wnck_screen); - is_empty_workspace = TRUE; + for(l = windows; l; l = l->next) { wnck_window = l->data; @@ -321,16 +326,15 @@ windowlist_populate(XfceDesktop *desktop, mi = menu_item_from_wnck_window(wnck_window, w, h); if(!mi) continue; - is_empty_workspace = FALSE; + if(wnck_workspace != active_workspace - && (!wnck_window_is_sticky(wnck_window) - || wnck_workspace != active_workspace)) + && (!wnck_window_is_sticky(wnck_window) || wnck_workspace != active_workspace)) { GtkWidget *lbl = gtk_bin_get_child(GTK_BIN(mi)); gtk_widget_modify_fg(lbl, GTK_STATE_NORMAL, &(style->fg[GTK_STATE_INSENSITIVE])); - gtk_widget_modify_font(lbl, italic_font_desc); } + gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), mi); g_object_weak_ref(G_OBJECT(wnck_window), @@ -341,7 +345,7 @@ windowlist_populate(XfceDesktop *desktop, G_CALLBACK(mi_destroyed_cb), wnck_window); } - if(!wl_submenus && !is_empty_workspace) { + if(!wl_submenus) { mi = gtk_separator_menu_item_new(); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), mi); @@ -350,12 +354,6 @@ windowlist_populate(XfceDesktop *desktop, pango_font_description_free(italic_font_desc); - if(wl_submenus) { - mi = gtk_separator_menu_item_new(); - gtk_widget_show(mi); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); - } - /* 'add workspace' item */ if(wl_show_icons) { img = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); |