[Xfce4-commits] <xfwm4:master> Tabwin buttons are clickable

Nick Schermer noreply at xfce.org
Sun Feb 23 21:10:16 CET 2014


Updating branch refs/heads/master
         to 1fd1b311af442d85b57e275fec5b45cac0776981 (commit)
       from 7c87af29befcc91ba2e890dd822a4a69cb3263d9 (commit)

commit 1fd1b311af442d85b57e275fec5b45cac0776981
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Tue Nov 19 06:50:52 2013 +0300

    Tabwin buttons are clickable
    
    Signed-off-by: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>

 src/cycle.c  |   50 ++++++++++++++++++++++++++++++++++++++-----------
 src/tabwin.c |   59 +++++++++++++++++++++++++++++++++++++++++++++-------------
 src/tabwin.h |    1 +
 3 files changed, 86 insertions(+), 24 deletions(-)

diff --git a/src/cycle.c b/src/cycle.c
index 6913ff4..d405d9b 100644
--- a/src/cycle.c
+++ b/src/cycle.c
@@ -361,14 +361,11 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
             break;
         case ButtonPress:
         case ButtonRelease:
+            status = EVENT_FILTER_CONTINUE;
             /* window of the event, we might accept it later */
             mouse_window = xevent->xbutton.window;
             break;
-        case EnterNotify:
-        case LeaveNotify:
-            /* window of the event, we might accept it later */
-            mouse_window = xevent->xcrossing.window;
-            break;
+
         default:
             status = EVENT_FILTER_CONTINUE;
             break;
@@ -376,13 +373,39 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
     
     if (mouse_window != 0)
     {
+        Client *c2 = NULL;
+
         /* only accept events for the tab windows */
         for (li = passdata->tabwin->tabwin_list; li != NULL; li = li->next)
+        {
             if (GDK_WINDOW_XID (gtk_widget_get_window (li->data)) == mouse_window)
             {
-                status = EVENT_FILTER_CONTINUE;
+                c2 = tabwinSelectWidget (passdata->tabwin, li->data);
+                if (c2)
+                {
+                    c = c2;
+                }
+
+                if (c)
+                {
+                    if (passdata->wireframe)
+                    {
+                        wireframeUpdate (c, passdata->wireframe);
+                    }
+                }
+                else
+                {
+                    cycling = FALSE;
+                }
                 break;
             }
+        }
+
+        if (c2 == NULL)
+        {
+            status = EVENT_FILTER_STOP;
+            cycling = FALSE;
+        }
     }
 
     if (!cycling)
@@ -391,6 +414,14 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
         gtk_main_quit ();
     }
 
+    if (status == EVENT_FILTER_STOP)
+    {
+        /* If there's any chance of a leftover grab, release it. This happens
+         * when the user clicks outside of the tabwin window area onto another
+         * window */
+        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
+    }
+
     return status;
 }
 
@@ -401,7 +432,7 @@ clientCycle (Client * c, XKeyEvent * ev)
     DisplayInfo *display_info;
     ClientCycleData passdata;
     GList *client_list, *selected;
-    gboolean g1, g2;
+    gboolean g1;
     int key, modifier;
     Client *c2;
 
@@ -448,15 +479,13 @@ clientCycle (Client * c, XKeyEvent * ev)
     }
 
     g1 = myScreenGrabKeyboard (screen_info, ev->time);
-    g2 = myScreenGrabPointer (screen_info, EnterWindowMask | LeaveWindowMask | ButtonPressMask | ButtonMotionMask | PointerMotionMask  | ButtonReleaseMask,  None, ev->time);
 
-    if (!g1 || !g2)
+    if (!g1)
     {
         TRACE ("grab failed in clientCycle");
 
         gdk_beep ();
         myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
         g_list_free (client_list);
 
         return;
@@ -496,7 +525,6 @@ clientCycle (Client * c, XKeyEvent * ev)
     g_list_free (client_list);
 
     myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
 }
 
 gboolean
diff --git a/src/tabwin.c b/src/tabwin.c
index bad1e56..747ec2f 100644
--- a/src/tabwin.c
+++ b/src/tabwin.c
@@ -365,6 +365,7 @@ createWindowlist (ScreenInfo *screen_info, TabwinWidget *tbw)
         {
             selected = window_button;
             selected_label = buttonlabel;
+            gtk_widget_grab_focus (selected);
         }
     }
     if (selected)
@@ -493,20 +494,12 @@ tabwinCreateWidget (Tabwin *tabwin, ScreenInfo *screen_info, gint monitor_num)
     gtk_label_set_use_markup (GTK_LABEL (tbw->label), TRUE);
     gtk_label_set_justify (GTK_LABEL (tbw->label), GTK_JUSTIFY_CENTER);
     gtk_label_set_ellipsize (GTK_LABEL (tbw->label), PANGO_ELLIPSIZE_END);
-    //gtk_widget_set_size_request (GTK_WIDGET (tbw->label), 240, -1);
     gtk_box_pack_end (GTK_BOX (vbox), tbw->label, TRUE, TRUE, 0);
 
     windowlist = createWindowlist (screen_info, tbw);
     tbw->container = windowlist;
     gtk_box_pack_start (GTK_BOX (vbox), windowlist, TRUE, TRUE, 0);
 
-#if 0
-    if (GTK_CHECK_VERSION (2, 6, 2))
-    {
-        gtk_label_set_ellipsize (GTK_LABEL (tbw->label), PANGO_ELLIPSIZE_END);
-    }
-#endif
-
     g_signal_connect_swapped (tbw, "configure-event",
                               GTK_SIGNAL_FUNC (tabwinConfigure), (gpointer) tbw);
     g_signal_connect (tbw, "expose-event", GTK_SIGNAL_FUNC (tabwin_expose), (gpointer) tbw);
@@ -667,11 +660,11 @@ tabwinSelectHead (Tabwin *t)
             buttonbox = GTK_WIDGET( gtk_container_get_children(GTK_CONTAINER(window_button))[0].data );
             buttonlabel = GTK_WIDGET( g_list_nth_data( gtk_container_get_children(GTK_CONTAINER(buttonbox)), 1) );
             if (((Client *) g_object_get_data (G_OBJECT(window_button), "client-ptr-val")) == head->data)
-                {
-                    tabwinSetSelected (tbw, window_button, buttonlabel);
-                    gtk_widget_queue_draw (GTK_WIDGET(tbw));
-                }
+            {
+                tabwinSetSelected (tbw, window_button, buttonlabel);
+                gtk_widget_queue_draw (GTK_WIDGET(tbw));
             }
+        }
     }
 
     return tabwinGetSelected (t);
@@ -787,6 +780,47 @@ tabwinSelectDelta (Tabwin *t, int row_delta, int col_delta)
     return tabwinChange2Selected (t, selected);
 }
 
+Client*
+tabwinSelectWidget (Tabwin *t, GtkWidget * w)
+{
+    GList *tabwin_list, *widgets, *selected;
+    GtkWidget *window_button, *buttonbox, *buttonlabel;
+    TabwinWidget *tbw;
+    Client *c;
+
+    g_return_val_if_fail (t != NULL, NULL);
+    TRACE ("entering tabwinSelectWidget");
+
+    for (tabwin_list = t->tabwin_list; tabwin_list; tabwin_list = g_list_next (tabwin_list))
+    {
+        tbw = (TabwinWidget *) tabwin_list->data;
+        for (widgets = tbw->widgets; widgets; widgets = g_list_next (widgets))
+        {
+            window_button = GTK_WIDGET (widgets->data);
+            gtk_button_set_relief (GTK_BUTTON (window_button), GTK_RELIEF_NONE);
+            buttonbox = GTK_WIDGET( gtk_container_get_children(GTK_CONTAINER (window_button))[0].data );
+            buttonlabel = GTK_WIDGET( g_list_nth_data( gtk_container_get_children (GTK_CONTAINER(buttonbox)), 1) );
+            gtk_label_set_text (GTK_LABEL (buttonlabel), "");
+
+            if (gtk_widget_is_focus (window_button))
+            {
+                c = g_object_get_data (G_OBJECT (window_button), "client-ptr-val");
+                selected = g_list_find (*t->client_list, c);
+
+                if (selected)
+                {
+                    t->selected = selected;
+                }
+
+                tabwinSetSelected (tbw, window_button, buttonlabel);
+                gtk_widget_queue_draw (GTK_WIDGET (tbw));
+            }
+        }
+    }
+
+    return tabwinGetSelected (t);
+}
+
 void
 tabwinDestroy (Tabwin *t)
 {
@@ -796,7 +830,6 @@ tabwinDestroy (Tabwin *t)
     g_return_if_fail (t != NULL);
     TRACE ("entering tabwinDestroy");
 
-    g_return_if_fail (t != NULL);
     for (tabwin_list = t->tabwin_list; tabwin_list; tabwin_list = g_list_next (tabwin_list))
     {
         tbw = (TabwinWidget *) tabwin_list->data;
diff --git a/src/tabwin.h b/src/tabwin.h
index ee1cadb..fb802c4 100644
--- a/src/tabwin.h
+++ b/src/tabwin.h
@@ -75,6 +75,7 @@ Client                  *tabwinSelectHead                       (Tabwin *);
 Client                  *tabwinSelectNext                       (Tabwin *);
 Client                  *tabwinSelectPrev                       (Tabwin *);
 Client                  *tabwinSelectDelta                      (Tabwin *, int, int);
+Client                  *tabwinSelectWidget                     (Tabwin *, GtkWidget *);
 Client                  *tabwinRemoveClient                     (Tabwin *,
                                                                  Client *);
 void                    tabwinDestroy                           (Tabwin *);


More information about the Xfce4-commits mailing list