]> Pileus Git - ~andy/gtk/commitdiff
added new flag GTK_EXCLUSIVE_GRAB. allow exclusive grabs.
authorTim Janik <timj@gimp.org>
Sun, 15 Mar 1998 13:33:54 +0000 (13:33 +0000)
committerTim Janik <timj@src.gnome.org>
Sun, 15 Mar 1998 13:33:54 +0000 (13:33 +0000)
Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>

        * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
                * gtk/gtkmain.c: allow exclusive grabs.

                        * gtk/gtkmenu.c: grab exclusively.
                                * gtk/gtkmenushell.c: grab exclusively.

                                        * gtk/gtkmenushell.c: don't activate insensitive menu items when
                                                in click-selects mode.

                                                        * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
                                                                on popup.

                                                                        * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
                                                                                *additional* button presses into account.

                                                                                        * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
                                                                                                foreign button releases into account.

oh boy, please check this out people, hope i covered all cases.

14 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkmain.c
gtk/gtkmenu.c
gtk/gtkmenushell.c
gtk/gtktipsquery.c
gtk/gtkwidget.h
gtk/testgtk.c
tests/testgtk.c

index 915963aee19b968b208834c7be6232044e49e2c9..d5bceb87ed791b00fb165d0715a53861a2612fd2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
+       * gtk/gtkmain.c: allow exclusive grabs.
+
+       * gtk/gtkmenu.c: grab exclusively.
+       * gtk/gtkmenushell.c: grab exclusively.
+
+       * gtk/gtkmenushell.c: don't activate insensitive menu items when
+       in click-selects mode.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
+       on popup.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
+       *additional* button presses into account.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
+       foreign button releases into account.
+
 Sun Mar 15 08:27:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtktipsquery.c (gtk_tips_query_set_labels): changed run type
index 915963aee19b968b208834c7be6232044e49e2c9..d5bceb87ed791b00fb165d0715a53861a2612fd2 100644 (file)
@@ -1,3 +1,23 @@
+Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
+       * gtk/gtkmain.c: allow exclusive grabs.
+
+       * gtk/gtkmenu.c: grab exclusively.
+       * gtk/gtkmenushell.c: grab exclusively.
+
+       * gtk/gtkmenushell.c: don't activate insensitive menu items when
+       in click-selects mode.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
+       on popup.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
+       *additional* button presses into account.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
+       foreign button releases into account.
+
 Sun Mar 15 08:27:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtktipsquery.c (gtk_tips_query_set_labels): changed run type
index 915963aee19b968b208834c7be6232044e49e2c9..d5bceb87ed791b00fb165d0715a53861a2612fd2 100644 (file)
@@ -1,3 +1,23 @@
+Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
+       * gtk/gtkmain.c: allow exclusive grabs.
+
+       * gtk/gtkmenu.c: grab exclusively.
+       * gtk/gtkmenushell.c: grab exclusively.
+
+       * gtk/gtkmenushell.c: don't activate insensitive menu items when
+       in click-selects mode.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
+       on popup.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
+       *additional* button presses into account.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
+       foreign button releases into account.
+
 Sun Mar 15 08:27:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtktipsquery.c (gtk_tips_query_set_labels): changed run type
index 915963aee19b968b208834c7be6232044e49e2c9..d5bceb87ed791b00fb165d0715a53861a2612fd2 100644 (file)
@@ -1,3 +1,23 @@
+Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
+       * gtk/gtkmain.c: allow exclusive grabs.
+
+       * gtk/gtkmenu.c: grab exclusively.
+       * gtk/gtkmenushell.c: grab exclusively.
+
+       * gtk/gtkmenushell.c: don't activate insensitive menu items when
+       in click-selects mode.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
+       on popup.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
+       *additional* button presses into account.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
+       foreign button releases into account.
+
 Sun Mar 15 08:27:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtktipsquery.c (gtk_tips_query_set_labels): changed run type
index 915963aee19b968b208834c7be6232044e49e2c9..d5bceb87ed791b00fb165d0715a53861a2612fd2 100644 (file)
@@ -1,3 +1,23 @@
+Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
+       * gtk/gtkmain.c: allow exclusive grabs.
+
+       * gtk/gtkmenu.c: grab exclusively.
+       * gtk/gtkmenushell.c: grab exclusively.
+
+       * gtk/gtkmenushell.c: don't activate insensitive menu items when
+       in click-selects mode.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
+       on popup.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
+       *additional* button presses into account.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
+       foreign button releases into account.
+
 Sun Mar 15 08:27:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtktipsquery.c (gtk_tips_query_set_labels): changed run type
index 915963aee19b968b208834c7be6232044e49e2c9..d5bceb87ed791b00fb165d0715a53861a2612fd2 100644 (file)
@@ -1,3 +1,23 @@
+Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
+       * gtk/gtkmain.c: allow exclusive grabs.
+
+       * gtk/gtkmenu.c: grab exclusively.
+       * gtk/gtkmenushell.c: grab exclusively.
+
+       * gtk/gtkmenushell.c: don't activate insensitive menu items when
+       in click-selects mode.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
+       on popup.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
+       *additional* button presses into account.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
+       foreign button releases into account.
+
 Sun Mar 15 08:27:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtktipsquery.c (gtk_tips_query_set_labels): changed run type
index 915963aee19b968b208834c7be6232044e49e2c9..d5bceb87ed791b00fb165d0715a53861a2612fd2 100644 (file)
@@ -1,3 +1,23 @@
+Sun Mar 15 13:25:28 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkwidget.h: added new flag GTK_EXCLUSIVE_GRAB.
+       * gtk/gtkmain.c: allow exclusive grabs.
+
+       * gtk/gtkmenu.c: grab exclusively.
+       * gtk/gtkmenushell.c: grab exclusively.
+
+       * gtk/gtkmenushell.c: don't activate insensitive menu items when
+       in click-selects mode.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_enter_notify): activate submenus
+       on popup.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_release): don't take
+       *additional* button presses into account.
+
+       * gtk/gtkmenushell.c (gtk_menu_shell_button_press): don't take
+       foreign button releases into account.
+
 Sun Mar 15 08:27:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtktipsquery.c (gtk_tips_query_set_labels): changed run type
index 8083233141dcab862a2f2aee2025a2ecfd79912e..b9156ec8593917ec3e249758b784f5eb2aa981af 100644 (file)
@@ -510,7 +510,8 @@ gtk_main_iteration_do (gboolean blocking)
           *  then we send the event to the original event widget.
           *  This is the key to implementing modality.
           */
-         if (gtk_widget_is_ancestor (event_widget, grab_widget))
+         if (!GTK_WIDGET_EXCLUSIVE_GRAB (grab_widget) &&
+             gtk_widget_is_ancestor (event_widget, grab_widget))
            grab_widget = event_widget;
        }
       else
index 2e2e098223f2bebeef4c458fc68116387f1b96a2..0ed1b49dcacbba4e0cd7fa866a14b1c93a9e0234 100644 (file)
@@ -293,6 +293,7 @@ gtk_menu_popup (GtkMenu             *menu,
 
   gtk_widget_show (GTK_WIDGET (menu));
   gtk_grab_add (GTK_WIDGET (menu));
+  GTK_WIDGET_SET_FLAGS (menu, GTK_EXCLUSIVE_GRAB);
 }
 
 void
@@ -317,6 +318,7 @@ gtk_menu_popdown (GtkMenu *menu)
 
   gtk_widget_hide (GTK_WIDGET (menu));
   gtk_grab_remove (GTK_WIDGET (menu));
+  GTK_WIDGET_SET_FLAGS (menu, GTK_EXCLUSIVE_GRAB);
 }
 
 GtkWidget*
index 0e815562f4bd1d3cc30c8c8b2ac04390c069f9a0..8b362ee66e7bc9e79f4cdb3fd9a35610b7b8d0b2 100644 (file)
@@ -298,11 +298,17 @@ gtk_menu_shell_button_press (GtkWidget      *widget,
       if (!menu_shell->active)
        {
          gtk_grab_add (GTK_WIDGET (widget));
+         GTK_WIDGET_SET_FLAGS (widget, GTK_EXCLUSIVE_GRAB);
          menu_shell->have_grab = TRUE;
+         menu_shell->active = TRUE;
        }
-      menu_shell->active = TRUE;
+      menu_shell->button = event->button;
 
       menu_item = gtk_get_event_widget ((GdkEvent*) event);
+
+      if (!GTK_WIDGET_IS_SENSITIVE (menu_item))
+       return TRUE;
+
       if (menu_item && GTK_IS_MENU_ITEM (menu_item) &&
          gtk_menu_shell_is_item (menu_shell, menu_item))
        {
@@ -318,13 +324,6 @@ gtk_menu_shell_button_press (GtkWidget      *widget,
              gtk_menu_item_select (GTK_MENU_ITEM (menu_shell->active_menu_item));
            }
        }
-      else if (!menu_shell->button)
-       {
-         gtk_menu_shell_deactivate (menu_shell);
-       }
-      
-      if (menu_shell->active)
-       menu_shell->button = event->button;
     }
   else
     {
@@ -351,16 +350,19 @@ gtk_menu_shell_button_release (GtkWidget      *widget,
   menu_shell = GTK_MENU_SHELL (widget);
   if (menu_shell->active)
     {
-      if (menu_shell->button && (event->button != menu_shell->button))
+      if (event->button != menu_shell->button)
        {
-         menu_shell->button = 0;
          if (menu_shell->parent_menu_shell)
            gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent*) event);
          return TRUE;
        }
-
+      
       menu_shell->button = 0;
       menu_item = gtk_get_event_widget ((GdkEvent*) event);
+      
+      if (!GTK_WIDGET_IS_SENSITIVE (menu_item))
+       return TRUE;
+
       deactivate = TRUE;
 
       if ((event->time - menu_shell->activate_time) > MENU_SHELL_TIMEOUT)
@@ -437,6 +439,8 @@ gtk_menu_shell_enter_notify (GtkWidget        *widget,
              gtk_menu_item_set_placement (GTK_MENU_ITEM (menu_shell->active_menu_item),
                                           MENU_SHELL_CLASS (menu_shell)->submenu_placement);
              gtk_menu_item_select (GTK_MENU_ITEM (menu_shell->active_menu_item));
+             if (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu)
+               gtk_widget_activate (menu_shell->active_menu_item);
            }
        }
       else if (menu_shell->parent_menu_shell)
@@ -574,6 +578,7 @@ gtk_real_menu_shell_deactivate (GtkMenuShell *menu_shell)
        {
          menu_shell->have_grab = FALSE;
          gtk_grab_remove (GTK_WIDGET (menu_shell));
+         GTK_WIDGET_UNSET_FLAGS (menu_shell, GTK_EXCLUSIVE_GRAB);
        }
       if (menu_shell->have_xgrab)
        {
index 6c1b1b90c900e4e2264d26bc0ceb75059e5a39f9..5c2a97239b99da0a4cab651e78949c57f10371de 100644 (file)
@@ -17,8 +17,6 @@
  * You should have received a copy of the GNU Library General Public
  * License along with this library; if not, write to the Free
  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
  */
 #include       "gtktipsquery.h"
 #include       "gtksignal.h"
index a313a2af0dc5fb47ddbcfdc6a66d62f5f5a1a7c0..87338b076b27fbde88e89f65464d4ec34bf5b4cf 100644 (file)
@@ -48,7 +48,7 @@ enum
   GTK_HAS_DEFAULT      = 1 << 14,
   GTK_HAS_GRAB         = 1 << 15,
   GTK_BASIC            = 1 << 16,
-  GTK_RESERVED_3       = 1 << 17,
+  GTK_EXCLUSIVE_GRAB   = 1 << 17,
   GTK_RC_STYLE         = 1 << 18
 };
 
@@ -86,6 +86,7 @@ enum
 #define GTK_WIDGET_HAS_DEFAULT(wid)      (GTK_WIDGET_FLAGS (wid) & GTK_HAS_DEFAULT)
 #define GTK_WIDGET_HAS_GRAB(wid)         (GTK_WIDGET_FLAGS (wid) & GTK_HAS_GRAB)
 #define GTK_WIDGET_BASIC(wid)            (GTK_WIDGET_FLAGS (wid) & GTK_BASIC)
+#define GTK_WIDGET_EXCLUSIVE_GRAB(wid)   (GTK_WIDGET_FLAGS (wid) & GTK_EXCLUSIVE_GRAB)
 #define GTK_WIDGET_RC_STYLE(wid)         (GTK_WIDGET_FLAGS (wid) & GTK_RC_STYLE)
   
 /* Macros for setting and clearing widget flags.
index 068666749d6e683f1b5a362ff603855b8eab1be9..8f05ebddb90ba9e9152240dc87c93073c15132f5 100644 (file)
@@ -1924,6 +1924,8 @@ create_menu (int depth)
        gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
       gtk_menu_append (GTK_MENU (menu), menuitem);
       gtk_widget_show (menuitem);
+      if (i == 3)
+       gtk_widget_set_sensitive (menuitem, FALSE);
 
       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1));
     }
index 068666749d6e683f1b5a362ff603855b8eab1be9..8f05ebddb90ba9e9152240dc87c93073c15132f5 100644 (file)
@@ -1924,6 +1924,8 @@ create_menu (int depth)
        gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
       gtk_menu_append (GTK_MENU (menu), menuitem);
       gtk_widget_show (menuitem);
+      if (i == 3)
+       gtk_widget_set_sensitive (menuitem, FALSE);
 
       gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1));
     }