diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2013-08-17 15:51:29 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2013-08-17 15:54:16 +0300 |
commit | b5d1ce1c99780579a4cc6b3c1be42d75eafd4c8c (patch) | |
tree | b193c407274797caf298d0ddc166bc7be900729d | |
parent | b93d57a91f27e73249da0e061d4d988f06763b0c (diff) | |
download | xfdesktop-b5d1ce1c99780579a4cc6b3c1be42d75eafd4c8c.tar.gz |
Clean up middle-click menu appearance
Center workspace names so they look more like headers. Lower the
number of font states and insensitive color use in the menu. Fade
out the appicon for minimized windows. This patch also adds a
confirmation dialog box when removing a workspace (Bug #7337).
-rw-r--r-- | src/windowlist.c | 129 |
1 files changed, 60 insertions, 69 deletions
diff --git a/src/windowlist.c b/src/windowlist.c index e337a6ef..177f2f8f 100644 --- a/src/windowlist.c +++ b/src/windowlist.c @@ -52,36 +52,46 @@ 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; - - gdk_error_trap_push(); + 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, *rm_label_long; + 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); + + 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); + } - XSendEvent(gdk_x11_get_default_xdisplay(), GDK_WINDOW_XID(groot), False, - SubstructureNotifyMask | SubstructureRedirectMask, - (XEvent *)&sev); + /* 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; + } + } - gdk_flush(); - gdk_error_trap_pop(); + g_free(rm_label_short); + g_free(rm_label_long); + wnck_screen_change_workspace_count(wnck_screen, num); } static void @@ -153,11 +163,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 +171,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); @@ -249,36 +261,21 @@ 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); + gtk_misc_set_alignment(GTK_MISC(label), 0.4f, 0); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); if(!wl_submenus) { @@ -290,10 +287,6 @@ 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); } } @@ -323,14 +316,13 @@ windowlist_populate(XfceDesktop *desktop, 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), @@ -350,11 +342,10 @@ 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); - } + + 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) { |