Patch for panel drawers



  I apologize for submitting a patch the day before the freeze.

  That said, this patch makes drawers behave slightly differently, in that they
open automatically when the mouse moves over them and close when the mouse
leaves them.  There are a few bugs which I'm trying to work out, but I thought
I'd submit it anyway.  I hope this is Ok? (please tell me if it isn't and I'll
stop!)

  Known bugs:

  -> Really lame method of detecting whether to keep the menu open after the
   mouse leaves the button.  It might work though if the menu was right up
   against the edge.  This needs some thought though, maybe use the x-y
   coordinates?
  -> The menu doesn't close if the mouse leaves it after it's been auto-opened,
   you have to go back to the button.
  -> Moving applets to the drawer requires that you go to the button, close
   and open it manually, then grab the applet.  (you might also be able to use
   bug #2.. :-) )
  -> Moving the mouse quickly over the button doesn't seem to let it close,
   maybe because the button can't switch directions while opening? (why
   not?)

  Hope it helps someone out there. :-)
-- 
  Daniel Burrows

"I think that the surest sign that there is intelligent
 life out there is that none of it has tried to contact us."

  -- _Calvin and Hobbes_, Bill Watterson
? drawer.c.diff
Index: drawer-widget.c
===================================================================
RCS file: /cvs/gnome/gnome-core/panel/drawer-widget.c,v
retrieving revision 1.20
diff -c -r1.20 drawer-widget.c
*** drawer-widget.c	1998/11/17 06:19:09	1.20
--- drawer-widget.c	1998/12/15 04:56:57
***************
*** 711,716 ****
--- 711,717 ----
  	drawer->hidebutton_enabled = TRUE;
  	drawer->hidebutton_pixmap_enabled = TRUE;
  	drawer->state = DRAWER_SHOWN;
+ 	drawer->forced_shown = FALSE;
  }
  
  static void
Index: drawer-widget.h
===================================================================
RCS file: /cvs/gnome/gnome-core/panel/drawer-widget.h,v
retrieving revision 1.4
diff -c -r1.4 drawer-widget.h
*** drawer-widget.h	1998/11/17 06:19:10	1.4
--- drawer-widget.h	1998/12/15 04:56:57
***************
*** 43,48 ****
--- 43,49 ----
  	PanelOrientType		orient;
          int                     hidebutton_enabled;
          int                     hidebutton_pixmap_enabled;
+ 	int			forced_shown;
  };
  
  struct _DrawerWidgetClass
Index: drawer.c
===================================================================
RCS file: /cvs/gnome/gnome-core/panel/drawer.c,v
retrieving revision 1.55
diff -c -r1.55 drawer.c
*** drawer.c	1998/12/14 08:20:54	1.55
--- drawer.c	1998/12/15 04:56:57
***************
*** 173,178 ****
--- 173,193 ----
  			    DRAWER_PROPERTIES,dialog);
  }
  
+ static void close_drawer(DrawerWidget *drawer,GtkWidget *panel)
+ {
+ 	drawer_widget_close_drawer(drawer);
+ 	if(IS_SNAPPED_WIDGET(panel))
+ 		SNAPPED_WIDGET(panel)->drawers_open--;
+ 	drawer->forced_shown=FALSE;
+ }
+ 
+ static void open_drawer(DrawerWidget *drawer,GtkWidget *panel)
+ {
+ 	drawer_widget_open_drawer(drawer);
+ 	if(IS_SNAPPED_WIDGET(panel))
+ 		SNAPPED_WIDGET(panel)->drawers_open++;
+ }
+ 
  static void
  drawer_click(GtkWidget *w, Drawer *drawer)
  {
***************
*** 183,196 ****
  	
  	gtk_widget_queue_resize(drawer->drawer);
  
! 	if(drawerw->state == DRAWER_SHOWN) {
! 		drawer_widget_close_drawer(DRAWER_WIDGET(drawer->drawer));
! 		if(IS_SNAPPED_WIDGET(panelw))
! 			SNAPPED_WIDGET(panelw)->drawers_open--;
! 	} else {
! 		drawer_widget_open_drawer(DRAWER_WIDGET(drawer->drawer));
! 		if(IS_SNAPPED_WIDGET(panelw))
! 			SNAPPED_WIDGET(panelw)->drawers_open++;
  	}
  }
  
--- 198,237 ----
  	
  	gtk_widget_queue_resize(drawer->drawer);
  
! 	if(drawerw->state == DRAWER_SHOWN)
! 		close_drawer(drawerw,panelw);
! 	else
! 	{
! 		open_drawer(drawerw,panelw);
! 		drawerw->forced_shown=TRUE;
! 	}
! }
! 
! void
! drawer_enter(Drawer *drawer)
! {
! 	DrawerWidget *drawerw=DRAWER_WIDGET(drawer->drawer);
! 	PanelWidget *parent=PANEL_WIDGET(drawer->button->parent);
! 	GtkWidget *panelw=gtk_object_get_data(GTK_OBJECT(parent),
! 					      PANEL_PARENT);
! 	if(drawerw->state != DRAWER_SHOWN)
! 	{
! 		gtk_widget_queue_resize(drawer->drawer);
! 		open_drawer(drawerw,panelw);
! 	}
! }
! 
! void
! drawer_exit(Drawer *drawer)
! {
! 	DrawerWidget *drawerw=DRAWER_WIDGET(drawer->drawer);
! 	PanelWidget *parent=PANEL_WIDGET(drawer->button->parent);
! 	GtkWidget *panelw=gtk_object_get_data(GTK_OBJECT(parent),
! 					      PANEL_PARENT);
! 	if(drawerw->state == DRAWER_SHOWN)
! 	{
! 		gtk_widget_queue_resize(drawer->drawer);
! 		close_drawer(drawerw,panelw);
  	}
  }
  
***************
*** 213,221 ****
--- 254,272 ----
  
    if (!gnome_win_hints_wm_exists())
      gdk_window_raise(drawer->drawer->window);
+   drawer_enter(drawer);
    return TRUE;
  }
  
+ static int
+ leave_notify_drawer(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
+ {
+ 	Drawer *drawer=data;
+ 	DrawerWidget *drawerw=DRAWER_WIDGET(drawer->drawer);
+ 	if(!event->detail&&!drawerw->forced_shown) drawer_exit(drawer);
+ 	return TRUE;
+ }
+ 
  static Drawer *
  create_drawer_applet(GtkWidget * drawer_panel, char *tooltip, char *pixmap,
  		     PanelOrientType orient)
***************
*** 262,267 ****
--- 313,320 ----
  			    GTK_SIGNAL_FUNC (destroy_drawer), drawer);
  	gtk_signal_connect (GTK_OBJECT (drawer->button), "enter_notify_event",
  			    GTK_SIGNAL_FUNC (enter_notify_drawer), drawer);
+ 	gtk_signal_connect (GTK_OBJECT (drawer->button), "leave_notify_event",
+ 			    GTK_SIGNAL_FUNC (leave_notify_drawer), drawer);
  
  	gtk_object_set_user_data(GTK_OBJECT(drawer->button),drawer);
  	gtk_object_set_data(GTK_OBJECT(drawer_panel),DRAWER_PANEL_KEY,drawer);

PGP signature



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