[George <jirka 5z com>] Re: [jirka 5z com: new version of the default patch]
- From: Owen Taylor <otaylor redhat com>
- To: gtk-devel-list redhat com
- Subject: [George <jirka@5z.com>] Re: [jirka@5z.com: new version of the default patch]
- Date: 21 Jan 1999 18:39:08 -0500
------- Start of forwarded message -------
Message-ID: <19990121122415.F654@julia.linux.bogus>
Date: Thu, 21 Jan 1999 12:24:15 -0800
From: George <jirka@5z.com>
To: gnome-hackers@nuclecu.unam.mx, gtk-devel-list@redhat.com
Subject: Re: [jirka@5z.com: new version of the default patch]
References: <19990121020417.D1343@julia.linux.bogus> <ybeg194tn96.fsf@fresnel.labs.redhat.com>
--FL5UXtIhxfXey3p5
Content-Type: text/plain; charset=us-ascii
On Thu, Jan 21, 1999 at 02:54:45PM -0500, Owen Taylor wrote:
> The flags handling is still not quite right - I think that
> only CAN_DEFAULT widgets should get HAS_DEFAULT.
>
> RECEIVES_DEFAULT widgets that are are not CAN_DEFAULT should
> just get an "activate" signal when the user hits return.
>
> This will help preserve backwards compatibility with
> button-derived widgets that probably assume they'll
> never get HAS_DEFAULT if they are CAN_DEFAULT.
>
> I don't think that complicates the code much.
actually it makes the code a very tiny bit simpler in a way
here's then a patch that does this (has default is only
set if CAN_DEFAULT and implies drawing of the border)
George
--
------------------------------------------------------------------------------
George Lebl <jirka@5z.com> http://www.5z.com/jirka/
------------------------------------------------------------------------------
The following implements RSA in perl and is illegal to export from the US:
#!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj
$/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1
lK[d2%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*',/((..)*)$/)
--FL5UXtIhxfXey3p5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="def3.patch"
Index: gtkbutton.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkbutton.c,v
retrieving revision 1.37
diff -u -r1.37 gtkbutton.c
--- gtkbutton.c 1999/01/14 06:04:32 1.37
+++ gtkbutton.c 1999/01/21 20:21:36
@@ -205,7 +205,7 @@
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;
Index: gtkcheckbutton.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkcheckbutton.c,v
retrieving revision 1.17
diff -u -r1.17 gtkcheckbutton.c
--- gtkcheckbutton.c 1999/01/15 16:00:13 1.17
+++ gtkcheckbutton.c 1999/01/21 20:21:36
@@ -95,6 +95,7 @@
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: gtkoptionmenu.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkoptionmenu.c,v
retrieving revision 1.22
diff -u -r1.22 gtkoptionmenu.c
--- gtkoptionmenu.c 1998/12/22 20:55:30 1.22
+++ gtkoptionmenu.c 1999/01/21 20:21:36
@@ -131,7 +131,7 @@
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: gtkplug.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkplug.c,v
retrieving revision 1.3
diff -u -r1.3 gtkplug.c
--- gtkplug.c 1998/11/30 19:06:30 1.3
+++ gtkplug.c 1999/01/21 20:21:36
@@ -204,7 +204,9 @@
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: gtkradiobutton.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkradiobutton.c,v
retrieving revision 1.17
diff -u -r1.17 gtkradiobutton.c
--- gtkradiobutton.c 1999/01/12 15:12:09 1.17
+++ gtkradiobutton.c 1999/01/21 20:21:36
@@ -99,6 +99,7 @@
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);
radio_button->group = g_slist_prepend (NULL, radio_button);
}
Index: gtkwidget.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkwidget.c,v
retrieving revision 1.135
diff -u -r1.135 gtkwidget.c
--- gtkwidget.c 1999/01/17 23:12:16 1.135
+++ gtkwidget.c 1999/01/21 20:21:37
@@ -107,6 +107,7 @@
ARG_HAS_FOCUS,
ARG_CAN_DEFAULT,
ARG_HAS_DEFAULT,
+ ARG_RECEIVES_DEFAULT,
ARG_COMPOSITE_CHILD,
ARG_STYLE,
ARG_EVENTS,
@@ -276,6 +277,7 @@
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 @@
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);
@@ -939,6 +947,9 @@
break;
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);
Index: gtkwidget.h
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkwidget.h,v
retrieving revision 1.57
diff -u -r1.57 gtkwidget.h
--- gtkwidget.h 1999/01/17 23:12:18 1.57
+++ gtkwidget.h 1999/01/21 20:21:37
@@ -51,7 +51,8 @@
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 @@
#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: gtkwindow.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkwindow.c,v
retrieving revision 1.65
diff -u -r1.65 gtkwindow.c
--- gtkwindow.c 1999/01/11 12:22:51 1.65
+++ gtkwindow.c 1999/01/21 20:21:37
@@ -1033,7 +1033,9 @@
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 @@
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 @@
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
--FL5UXtIhxfXey3p5--
------- End of forwarded message -------
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]