[Xfce4-commits] <xfdesktop:master> Merge branch 'eric/middle-click-menu'

Eric Koegel noreply at xfce.org
Sat Aug 31 03:38:06 CEST 2013


Updating branch refs/heads/master
         to aff26e01b106738488060121557c52e16e70f645 (commit)
       from af35570486899140425227767e27385fb5b3fa70 (commit)

commit aff26e01b106738488060121557c52e16e70f645
Merge: af35570 c551f08
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sat Aug 31 04:37:11 2013 +0300

    Merge branch 'eric/middle-click-menu'

commit c551f08ab5c2a7e039285ff159b2fe00b12137b6
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Fri Aug 30 08:42:12 2013 +0300

    Always have a seperator between workspaces

commit 4acec356cb8ce03bfbed5366db3dc14ea0ce2327
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sun Aug 25 08:20:45 2013 +0300

    Fix double-free crash

commit 5407011db19c870d701978f49af8549144a4281f
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sun Aug 25 08:12:06 2013 +0300

    Make inactive workspace headers insensitive in color

commit b5d1ce1c99780579a4cc6b3c1be42d75eafd4c8c
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sat Aug 17 15:51:29 2013 +0300

    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).

 src/windowlist.c |  144 +++++++++++++++++++++++++++---------------------------
 1 file changed, 71 insertions(+), 73 deletions(-)

diff --git a/src/windowlist.c b/src/windowlist.c
index e337a6e..f228ca3 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);


More information about the Xfce4-commits mailing list