]> Pileus Git - ~andy/gtk/commitdiff
set RECEIVES_DEFAULT on init, and a button press on the widget doesn't
authorGeorge Lebl <jirka@5z.com>
Mon, 25 Jan 1999 19:05:58 +0000 (19:05 +0000)
committerGeorge Lebl <jirka@src.gnome.org>
Mon, 25 Jan 1999 19:05:58 +0000 (19:05 +0000)
Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>

        * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
          button press on the widget doesn't grab default anymore

        * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
          unset RECEIVES_DEFAULT on init

        * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
          flags

        * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
          the focused widget if it is a RECEIVES_DEFAULT widget,
          no matter what the current default_widget is

        * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
          flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
          or migrate it back to the default_widget if the focus widget
          doesn't "RECEIVE_DEFAULT"

15 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/gtkbutton.c
gtk/gtkcheckbutton.c
gtk/gtkoptionmenu.c
gtk/gtkplug.c
gtk/gtkradiobutton.c
gtk/gtkwidget.c
gtk/gtkwidget.h
gtk/gtkwindow.c

index b6470b3e96f69e987a3b8ca50d3bf46fd7e77da4..043da65985475a418d8cfab37ff6701c8aac59fd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>
+
+       * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
+         button press on the widget doesn't grab default anymore
+
+       * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
+         unset RECEIVES_DEFAULT on init
+
+       * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
+         flags
+
+       * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
+         the focused widget if it is a RECEIVES_DEFAULT widget,
+         no matter what the current default_widget is
+
+       * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
+         flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
+         or migrate it back to the default_widget if the focus widget
+         doesn't "RECEIVE_DEFAULT"
+
 Sun Jan 24 18:09:24 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gdkdnd.c (motif_read_initiator_info): Byteswap
index b6470b3e96f69e987a3b8ca50d3bf46fd7e77da4..043da65985475a418d8cfab37ff6701c8aac59fd 100644 (file)
@@ -1,3 +1,23 @@
+Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>
+
+       * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
+         button press on the widget doesn't grab default anymore
+
+       * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
+         unset RECEIVES_DEFAULT on init
+
+       * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
+         flags
+
+       * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
+         the focused widget if it is a RECEIVES_DEFAULT widget,
+         no matter what the current default_widget is
+
+       * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
+         flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
+         or migrate it back to the default_widget if the focus widget
+         doesn't "RECEIVE_DEFAULT"
+
 Sun Jan 24 18:09:24 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gdkdnd.c (motif_read_initiator_info): Byteswap
index b6470b3e96f69e987a3b8ca50d3bf46fd7e77da4..043da65985475a418d8cfab37ff6701c8aac59fd 100644 (file)
@@ -1,3 +1,23 @@
+Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>
+
+       * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
+         button press on the widget doesn't grab default anymore
+
+       * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
+         unset RECEIVES_DEFAULT on init
+
+       * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
+         flags
+
+       * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
+         the focused widget if it is a RECEIVES_DEFAULT widget,
+         no matter what the current default_widget is
+
+       * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
+         flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
+         or migrate it back to the default_widget if the focus widget
+         doesn't "RECEIVE_DEFAULT"
+
 Sun Jan 24 18:09:24 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gdkdnd.c (motif_read_initiator_info): Byteswap
index b6470b3e96f69e987a3b8ca50d3bf46fd7e77da4..043da65985475a418d8cfab37ff6701c8aac59fd 100644 (file)
@@ -1,3 +1,23 @@
+Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>
+
+       * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
+         button press on the widget doesn't grab default anymore
+
+       * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
+         unset RECEIVES_DEFAULT on init
+
+       * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
+         flags
+
+       * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
+         the focused widget if it is a RECEIVES_DEFAULT widget,
+         no matter what the current default_widget is
+
+       * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
+         flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
+         or migrate it back to the default_widget if the focus widget
+         doesn't "RECEIVE_DEFAULT"
+
 Sun Jan 24 18:09:24 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gdkdnd.c (motif_read_initiator_info): Byteswap
index b6470b3e96f69e987a3b8ca50d3bf46fd7e77da4..043da65985475a418d8cfab37ff6701c8aac59fd 100644 (file)
@@ -1,3 +1,23 @@
+Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>
+
+       * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
+         button press on the widget doesn't grab default anymore
+
+       * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
+         unset RECEIVES_DEFAULT on init
+
+       * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
+         flags
+
+       * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
+         the focused widget if it is a RECEIVES_DEFAULT widget,
+         no matter what the current default_widget is
+
+       * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
+         flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
+         or migrate it back to the default_widget if the focus widget
+         doesn't "RECEIVE_DEFAULT"
+
 Sun Jan 24 18:09:24 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gdkdnd.c (motif_read_initiator_info): Byteswap
index b6470b3e96f69e987a3b8ca50d3bf46fd7e77da4..043da65985475a418d8cfab37ff6701c8aac59fd 100644 (file)
@@ -1,3 +1,23 @@
+Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>
+
+       * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
+         button press on the widget doesn't grab default anymore
+
+       * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
+         unset RECEIVES_DEFAULT on init
+
+       * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
+         flags
+
+       * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
+         the focused widget if it is a RECEIVES_DEFAULT widget,
+         no matter what the current default_widget is
+
+       * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
+         flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
+         or migrate it back to the default_widget if the focus widget
+         doesn't "RECEIVE_DEFAULT"
+
 Sun Jan 24 18:09:24 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gdkdnd.c (motif_read_initiator_info): Byteswap
index b6470b3e96f69e987a3b8ca50d3bf46fd7e77da4..043da65985475a418d8cfab37ff6701c8aac59fd 100644 (file)
@@ -1,3 +1,23 @@
+Mon Jan 25 11:05:10 1999  George Lebl  <jirka@5z.com>
+
+       * gtk/gtkbutton.c: set RECEIVES_DEFAULT on init, and a
+         button press on the widget doesn't grab default anymore
+
+       * gtk/gtkcheckbutton.c,gtk/gtkoptionmenu.c,gtk/gtkradiobutton.c:
+         unset RECEIVES_DEFAULT on init
+
+       * gtk/gtkwidget.[ch]: add a RECEIVES_DEFAULT flag to widget
+         flags
+
+       * gtk/gtkwindow.c,gtk/gtkplug.c: on pressing <enter>, activate
+         the focused widget if it is a RECEIVES_DEFAULT widget,
+         no matter what the current default_widget is
+
+       * gtk/gtkwindow.c: on focus change, migrate the HAS_DEFAULT
+         flag to CAN_DEFAULT widgets if they RECEIVE_DEFAULT as well
+         or migrate it back to the default_widget if the focus widget
+         doesn't "RECEIVE_DEFAULT"
+
 Sun Jan 24 18:09:24 1999  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/gdkdnd.c (motif_read_initiator_info): Byteswap
index 60e6dbf661bd0781ba2faf5ca00b432f91650e9c..8e3593bff95d51dbb83f0b67978a11282f0666e5 100644 (file)
@@ -205,7 +205,7 @@ gtk_button_class_init (GtkButtonClass *klass)
 static void
 gtk_button_init (GtkButton *button)
 {
-  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_FOCUS);
+  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_FOCUS | GTK_RECEIVES_DEFAULT);
   GTK_WIDGET_UNSET_FLAGS (button, GTK_NO_WINDOW);
 
   button->child = NULL;
@@ -672,8 +672,6 @@ gtk_button_button_press (GtkWidget      *widget,
     {
       button = GTK_BUTTON (widget);
 
-      if (GTK_WIDGET_CAN_DEFAULT (widget) && (event->button == 1))
-       gtk_widget_grab_default (widget);
       if (!GTK_WIDGET_HAS_FOCUS (widget))
        gtk_widget_grab_focus (widget);
 
index 1e69eb56d9ba625f1007e73fdcbdcc7555de66cd..429cd25e63c09fc85c1103d02f8c5e8d1e4986d7 100644 (file)
@@ -95,6 +95,7 @@ static void
 gtk_check_button_init (GtkCheckButton *check_button)
 {
   GTK_WIDGET_SET_FLAGS (check_button, GTK_NO_WINDOW);
+  GTK_WIDGET_UNSET_FLAGS (check_button, GTK_RECEIVES_DEFAULT);
   GTK_TOGGLE_BUTTON (check_button)->draw_indicator = TRUE;
 }
 
index 025331db478f9bb3cada0955a46fcc6c896b1169..bf42d863e8d27c959783c53029a8747386ef5b5f 100644 (file)
@@ -131,7 +131,7 @@ static void
 gtk_option_menu_init (GtkOptionMenu *option_menu)
 {
   GTK_WIDGET_SET_FLAGS (option_menu, GTK_CAN_FOCUS);
-  GTK_WIDGET_UNSET_FLAGS (option_menu, GTK_CAN_DEFAULT);
+  GTK_WIDGET_UNSET_FLAGS (option_menu, GTK_CAN_DEFAULT | GTK_RECEIVES_DEFAULT);
 
   option_menu->menu = NULL;
   option_menu->menu_item = NULL;
index ba2e906486dc79cb04427670be8c402a83d3b585..3e6a564d20d51598529170ac933332adc328499e 100644 (file)
@@ -204,7 +204,9 @@ gtk_plug_key_press_event (GtkWidget   *widget,
          break;
        case GDK_Return:
        case GDK_KP_Enter:
-         if (window->default_widget)
+         if (window->default_widget &&
+             (!window->focus_widget || 
+              !GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget)))
            {
              gtk_widget_activate (window->default_widget);
              return_val = TRUE;
index b517214d6bfe3a488d27064092a3047d3c693491..2f2498795dd51933c1b79f4dec75d6fc1c40a346 100644 (file)
@@ -99,6 +99,7 @@ static void
 gtk_radio_button_init (GtkRadioButton *radio_button)
 {
   GTK_WIDGET_SET_FLAGS (radio_button, GTK_NO_WINDOW);
+  GTK_WIDGET_UNSET_FLAGS (radio_button, GTK_RECEIVES_DEFAULT);
 
   GTK_TOGGLE_BUTTON (radio_button)->active = TRUE;
 
index b73581e959b3bbb2db7f44b3f1e334195a634612..6bda63275f3f5c3031abab24c40bc0ff8db6b8d5 100644 (file)
@@ -107,6 +107,7 @@ enum {
   ARG_HAS_FOCUS,
   ARG_CAN_DEFAULT,
   ARG_HAS_DEFAULT,
+  ARG_RECEIVES_DEFAULT,
   ARG_COMPOSITE_CHILD,
   ARG_STYLE,
   ARG_EVENTS,
@@ -276,6 +277,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
   gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
   gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
+  gtk_object_add_arg_type ("GtkWidget::receives_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_RECEIVES_DEFAULT);
   gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
   gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
   gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
@@ -838,6 +840,12 @@ gtk_widget_set_arg (GtkObject   *object,
       if (GTK_VALUE_BOOL (*arg))
        gtk_widget_grab_default (widget);
       break;
+    case ARG_RECEIVES_DEFAULT:
+      if (GTK_VALUE_BOOL (*arg))
+       GTK_WIDGET_SET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
+      else
+       GTK_WIDGET_UNSET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
+      break;
     case ARG_COMPOSITE_CHILD:
       if (GTK_VALUE_BOOL(*arg))
        GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
@@ -940,6 +948,9 @@ gtk_widget_get_arg (GtkObject   *object,
     case ARG_HAS_DEFAULT:
       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
       break;
+    case ARG_RECEIVES_DEFAULT:
+      GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_RECEIVES_DEFAULT (widget) != FALSE);
+      break;
     case ARG_COMPOSITE_CHILD:
       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
       break;
index c2f30d58edf04e2feef3124a1d627ca1af7494eb..f41442cb46319438ef89f4d4b4f96e12563895f2 100644 (file)
@@ -51,7 +51,8 @@ typedef enum
   GTK_RC_STYLE        = 1 << 16,
   GTK_COMPOSITE_CHILD  = 1 << 17,
   GTK_NO_REPARENT      = 1 << 18,
-  GTK_APP_PAINTABLE    = 1 << 19
+  GTK_APP_PAINTABLE    = 1 << 19,
+  GTK_RECEIVES_DEFAULT = 1 << 20
 } GtkWidgetFlags;
 
 /* Macro for casting a pointer to a GtkWidget or GtkWidgetClass pointer.
@@ -90,6 +91,7 @@ typedef enum
 #define GTK_WIDGET_RC_STYLE(wid)         ((GTK_WIDGET_FLAGS (wid) & GTK_RC_STYLE) != 0)
 #define GTK_WIDGET_COMPOSITE_CHILD(wid)          ((GTK_WIDGET_FLAGS (wid) & GTK_COMPOSITE_CHILD) != 0)
 #define GTK_WIDGET_APP_PAINTABLE(wid)    ((GTK_WIDGET_FLAGS (wid) & GTK_APP_PAINTABLE) != 0)
+#define GTK_WIDGET_RECEIVES_DEFAULT(wid)  ((GTK_WIDGET_FLAGS (wid) & GTK_RECEIVES_DEFAULT) != 0)
   
 /* Macros for setting and clearing widget flags.
  */
index 21b997fcd5042b0bd2c03d4058522c1e41f52a94..cff07387978970116c997d8741eb698c02c8b16b 100644 (file)
@@ -1033,7 +1033,9 @@ gtk_window_key_press_event (GtkWidget   *widget,
          break;
        case GDK_Return:
        case GDK_KP_Enter:
-         if (window->default_widget)
+         if (window->default_widget &&
+             (!window->focus_widget || 
+              !GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget)))
            {
              gtk_widget_activate (window->default_widget);
              handled = TRUE;
@@ -1494,16 +1496,31 @@ gtk_window_real_set_focus (GtkWindow *window,
                           GtkWidget *focus)
 {
   GdkEventFocus event;
+  gboolean def_flags = 0;
 
   g_return_if_fail (window != NULL);
   g_return_if_fail (GTK_IS_WINDOW (window));
-
+  
+  if (window->default_widget)
+    def_flags = GTK_WIDGET_HAS_DEFAULT (window->default_widget);
+  
   if (window->focus_widget)
     {
       event.type = GDK_FOCUS_CHANGE;
       event.window = window->focus_widget->window;
       event.in = FALSE;
       
+      if (GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget) &&
+         (window->focus_widget != window->default_widget))
+        {
+         GTK_WIDGET_UNSET_FLAGS (window->focus_widget, GTK_HAS_DEFAULT);
+         /* if any widget had the default set there should be
+            a default_widget, but might not so this is a sanity
+            check */
+         if (window->default_widget)
+           GTK_WIDGET_SET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
+        }
+       
       gtk_widget_event (window->focus_widget, (GdkEvent*) &event);
     }
   
@@ -1514,9 +1531,32 @@ gtk_window_real_set_focus (GtkWindow *window,
       event.type = GDK_FOCUS_CHANGE;
       event.window = window->focus_widget->window;
       event.in = TRUE;
+
+      if (window->default_widget)
+        {
+          if (GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget) &&
+             (window->focus_widget != window->default_widget))
+            {
+             if (GTK_WIDGET_CAN_DEFAULT (window->focus_widget))
+               GTK_WIDGET_SET_FLAGS (window->focus_widget, GTK_HAS_DEFAULT);
+             GTK_WIDGET_UNSET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
+            }
+         else
+           {
+             GTK_WIDGET_SET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
+           }
+       }
       
       gtk_widget_event (window->focus_widget, (GdkEvent*) &event);
     }
+  else if (window->default_widget)
+    {
+      GTK_WIDGET_SET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
+    }
+  
+  if (window->default_widget &&
+      (def_flags != GTK_WIDGET_FLAGS (window->default_widget)))
+    gtk_widget_queue_draw (window->default_widget);
 }
 
 static void