Re: [jirka 5z com: new version of the default patch]




George <jirka@5z.com> writes:

> ok here's an updated version of the patch adressing the ugly if statement
> issue and has the migration of the HAS_DEFAULT flag ... and adds gtkplug
> fix for defaults ... it seems to work fine for me

OK, this looks quite nice.

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.

Regards,
                                        Owen


> 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 09:41:46
> @@ -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;
> @@ -540,6 +540,7 @@
>        gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height);
>  
>        if (GTK_WIDGET_HAS_DEFAULT (widget) &&
> +          GTK_WIDGET_CAN_DEFAULT (widget) &&
>  	  GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL)
>  	{
>  	  gtk_paint_box (widget->style, widget->window,
> 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 09:41:47
> @@ -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 09:41:47
> @@ -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 09:41:47
> @@ -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 09:41:47
> @@ -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 09:41:47
> @@ -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 09:41:48
> @@ -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 09:41:48
> @@ -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_HAS_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,31 @@
>        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)
> +            {
> +	      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
> 
> --6c2NcOVqGQ03X4Wi--



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]