[Xfce4-commits] <xfwm4:ochosi/tabwin> Don't select the window when it gets mouse focus

Simon Steinbeiss noreply at xfce.org
Tue Nov 26 14:26:01 CET 2013


Updating branch refs/heads/ochosi/tabwin
         to 3838e97f85af98b5daebdb55a3a0879624d9a2ef (commit)
       from fe99c2fb53ab9c0532e006f7f974b369b1295003 (commit)

commit 3838e97f85af98b5daebdb55a3a0879624d9a2ef
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Tue Nov 26 16:14:05 2013 +0300

    Don't select the window when it gets mouse focus
    
    Instead of selecting the window, just update the labels in the
    tabwin window when the window icon gets the focus. If the user
    clicks on the window icon then the widget the mouse is hovering
    over will be selected and the tabwin window will disappear.
    
    Signed-off-by: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>

 src/cycle.c  |   33 +++++++++++----------------
 src/tabwin.c |   71 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
 src/tabwin.h |    4 +++-
 3 files changed, 80 insertions(+), 28 deletions(-)

diff --git a/src/cycle.c b/src/cycle.c
index 79989ed..3af6aea 100644
--- a/src/cycle.c
+++ b/src/cycle.c
@@ -227,7 +227,6 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
     DisplayInfo *display_info;
     ClientCycleData *passdata;
     Client *c, *removed;
-    static Client *last_selected = NULL;
     eventFilterStatus status;
     KeyCode cancel, left, right, up, down;
     int key, modifiers;
@@ -329,8 +328,18 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
                     {
                         cycling = FALSE;
                     }
+                }
 
-                    if (!c)
+                if (cycling)
+                {
+                    if (c)
+                    {
+                        if (passdata->wireframe)
+                        {
+                            wireframeUpdate (c, passdata->wireframe);
+                        }
+                    }
+                    else
                     {
                         cycling = FALSE;
                     }
@@ -357,11 +366,6 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
             /* window of the event, we might accept it later */
             mouse_window = xevent->xbutton.window;
             break;
-        case MotionNotify:
-            status = EVENT_FILTER_CONTINUE;
-            /* window of the event, we might accept it later */
-            mouse_window = xevent->xcrossing.window;
-            break;
         default:
             status = EVENT_FILTER_CONTINUE;
             break;
@@ -374,20 +378,9 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
         {
             if (GDK_WINDOW_XID (gtk_widget_get_window (li->data)) == mouse_window)
             {
-                c = tabwinSelectWidget (passdata->tabwin, li->data);
-                break;
-            }
-        }
-    }
+                c = tabwinSelectHoveredWidget (passdata->tabwin);
 
-    if (cycling)
-    {
-        if (c)
-        {
-            if (passdata->wireframe && last_selected != c)
-            {
-                last_selected = c;
-                wireframeUpdate (c, passdata->wireframe);
+                break;
             }
         }
     }
diff --git a/src/tabwin.c b/src/tabwin.c
index 0758d36..35e96b8 100644
--- a/src/tabwin.c
+++ b/src/tabwin.c
@@ -312,15 +312,54 @@ getMinMonitorWidth (ScreenInfo *screen_info)
 static gboolean
 cb_window_button_enter (GtkWidget *widget, GdkEvent *event, gpointer user_data)
 {
-    Tabwin *t = user_data;
+    TabwinWidget *tbw = user_data;
+    Client *c;
+    GtkWidget *buttonbox, *buttonlabel;
+    gchar *classname;
+
+    TRACE ("entering");
+
+    g_return_val_if_fail (tbw != NULL, FALSE);
+
+    c = g_object_get_data (G_OBJECT (widget), "client-ptr-val");
+
+    /* keep track of which widget we're hovered over */
+    tbw->tabwin->hovered = widget;
+
+    /* when hovering over a window icon, display it's label but don't
+     * select it */
+    if (c != NULL)
+    {
+        buttonbox = GTK_WIDGET( gtk_container_get_children(GTK_CONTAINER(widget))[0].data );
+        buttonlabel = GTK_WIDGET( g_list_nth_data( gtk_container_get_children(GTK_CONTAINER(buttonbox)), 1) );
+
+        classname = g_strdup(c->class.res_class);
+        tabwinSetLabel (tbw, buttonlabel, classname, c->name, c->win_workspace);
+        g_free (classname);
+    }
+
+    return FALSE;
+}
+
+static gboolean
+cb_window_button_leave (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+    TabwinWidget *tbw = user_data;
 
     TRACE ("entering");
 
-    g_return_val_if_fail (t != NULL, FALSE);
+    g_return_val_if_fail (tbw != NULL, FALSE);
+
+    /* don't do anything if we have the focus */
+    if (gtk_widget_is_focus (widget))
+    {
+        return FALSE;
+    }
+
+    tbw->tabwin->hovered = NULL;
 
-    /* On mouse over we grab the focus for the window button and select it */
-    gtk_widget_grab_focus (widget);
-    tabwinSelectWidget (t, widget);
+    /* reselect the selected widget, it will clear everything else out */
+    tabwinSelectWidget (tbw->tabwin);
 
     return FALSE;
 }
@@ -359,7 +398,8 @@ createWindowlist (ScreenInfo *screen_info, TabwinWidget *tbw)
         gtk_button_set_relief (GTK_BUTTON (window_button), GTK_RELIEF_NONE);
         gtk_widget_set_size_request (GTK_WIDGET (window_button), icon_size+24, icon_size+24);
         g_object_set_data (G_OBJECT (window_button), "client-ptr-val", c);
-        g_signal_connect (window_button, "enter-notify-event", G_CALLBACK (cb_window_button_enter), t);
+        g_signal_connect (window_button, "enter-notify-event", G_CALLBACK (cb_window_button_enter), tbw);
+        g_signal_connect (window_button, "leave-notify-event", G_CALLBACK (cb_window_button_leave), tbw);
         gtk_widget_add_events (window_button, GDK_ENTER_NOTIFY_MASK);
 
         buttonbox = gtk_vbox_new (FALSE, 0);
@@ -800,7 +840,7 @@ tabwinSelectDelta (Tabwin *t, int row_delta, int col_delta)
 }
 
 Client*
-tabwinSelectWidget (Tabwin *t, GtkWidget * w)
+tabwinSelectWidget (Tabwin *t)
 {
     GList *tabwin_list, *widgets, *selected;
     GtkWidget *window_button, *buttonbox, *buttonlabel;
@@ -840,6 +880,23 @@ tabwinSelectWidget (Tabwin *t, GtkWidget * w)
     return tabwinGetSelected (t);
 }
 
+Client*
+tabwinSelectHoveredWidget (Tabwin *t)
+{
+    TRACE ("entering");
+
+    g_return_val_if_fail (t != NULL, NULL);
+
+    if (!t->hovered)
+    {
+        return NULL;
+    }
+
+    gtk_widget_grab_focus (t->hovered);
+
+    return tabwinSelectWidget (t);
+}
+
 void
 tabwinDestroy (Tabwin *t)
 {
diff --git a/src/tabwin.h b/src/tabwin.h
index fb802c4..67e5dd2 100644
--- a/src/tabwin.h
+++ b/src/tabwin.h
@@ -40,6 +40,7 @@ struct _Tabwin
     GList *tabwin_list;
     GList **client_list;
     GList *selected;
+    GtkWidget *hovered;
     gboolean display_workspace;
 };
 
@@ -75,7 +76,8 @@ Client                  *tabwinSelectHead                       (Tabwin *);
 Client                  *tabwinSelectNext                       (Tabwin *);
 Client                  *tabwinSelectPrev                       (Tabwin *);
 Client                  *tabwinSelectDelta                      (Tabwin *, int, int);
-Client                  *tabwinSelectWidget                     (Tabwin *, GtkWidget *);
+Client                  *tabwinSelectWidget                     (Tabwin *);
+Client                  *tabwinSelectHoveredWidget              (Tabwin *);
 Client                  *tabwinRemoveClient                     (Tabwin *,
                                                                  Client *);
 void                    tabwinDestroy                           (Tabwin *);


More information about the Xfce4-commits mailing list