Ethereal-dev: Re: [ethereal-dev] Right button menus

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Guy Harris <gharris@xxxxxxxxxxxx>
Date: Wed, 29 Dec 1999 21:54:00 -0800
On Mon, Dec 20, 1999 at 11:41:24PM -0800, Jerry Talkington wrote:
> * Guy Harris (gharris@xxxxxxxxxxxx) done spit this rhetoric:
> > > All three have the problem that the cursor must be above a top-level tree
> > > item to popup the window.  I suppose that one could attach the menu to the
> > > lower widgets also, but I didn't try it.  Trying to attach the menu to the
> > > tv_scrollw had some funky results...
> > 
> > Popping up the menu also causes the top-level tree item you're above to
> > close, if it's open.
> 
> That's the default behavior, so it just carries through, in addition to
> popping up the menu.  I dunno how to make it not do that, I guess it's a
> default action for that widget type...

Your first patch, at least, applies to the new CTree-based code, with
some hand tweaking; the right mouse button doesn't close the current
tree item in a CTree, so that behavior is gone.

I'm not sure which items you classified as "top-level tree items" in
the first paragraph, but the right button appears to pop up the menu
everywhere in the CTree-based code.

I've attached "cvs diff -c" output for the result of applying the first
patch + hand-tweaking to the current CVS tree (which is also the 0.8.0
tree).
Index: gtk/main.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/gtk/main.c,v
retrieving revision 1.77
diff -c -r1.77 main.c
*** main.c	1999/12/29 20:10:10	1.77
--- main.c	1999/12/30 05:57:19
***************
*** 1269,1274 ****
--- 1269,1276 ----
  						pl_style->font);
    }
    gtk_widget_set_usize(packet_list, -1, pl_size);
+   gtk_signal_connect_object(GTK_OBJECT(packet_list), "button_press_event",
+     GTK_SIGNAL_FUNC(popup_menu_handler), GTK_OBJECT(popup_menu_object));
    gtk_widget_show(packet_list);
    
    /* Tree view */
***************
*** 1288,1293 ****
--- 1290,1297 ----
      GTK_SIGNAL_FUNC(tree_view_select_row_cb), NULL);
    gtk_signal_connect(GTK_OBJECT(tree_view), "tree-unselect-row",
      GTK_SIGNAL_FUNC(tree_view_unselect_row_cb), NULL);
+   gtk_signal_connect_object(GTK_OBJECT(tree_view), "button_press_event",
+     GTK_SIGNAL_FUNC(popup_menu_handler), GTK_OBJECT(popup_menu_object));
    gtk_widget_show(tree_view);
  
    item_style = gtk_style_new();
Index: gtk/menu.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/gtk/menu.c,v
retrieving revision 1.12
diff -c -r1.12 menu.c
*** menu.c	1999/12/10 07:04:30	1.12
--- menu.c	1999/12/30 05:57:20
***************
*** 74,79 ****
--- 74,80 ----
                 "<LastBranch>"     -> create a right justified branch 
      */
  
+ /* main menu */
  static GtkItemFactoryEntry menu_items[] =
  {
    {"/_File", NULL, NULL, 0, "<Branch>" },
***************
*** 122,129 ****
--- 123,147 ----
  /* calculate the number of menu_items */
  static int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
  
+ /* packet list popup */
+ static GtkItemFactoryEntry popup_menu_items[] =
+ {
+ 	{"/Match Selected", NULL, GTK_MENU_FUNC(match_selected_cb), 0, NULL},
+ 	{"/Follow TCP Stream", NULL, GTK_MENU_FUNC(follow_stream_cb), 0, NULL},
+ 	{"/Filters...", NULL, GTK_MENU_FUNC(filter_dialog_cb), 0, NULL},
+ 	{"/<separator>", NULL, NULL, 0, "<Separator>"},
+ 	{"/Colorize Display...", NULL, GTK_MENU_FUNC(color_display_cb), 0, NULL},
+ 	{"/Print...", NULL, GTK_MENU_FUNC(file_print_cmd_cb), 0, NULL},
+   	{"/Print Packet", NULL, GTK_MENU_FUNC(file_print_packet_cmd_cb), 0, NULL},
+ 	{"/<separator>", NULL, NULL, 0, "<Separator>"},
+ 	{"/Collapse All", NULL, GTK_MENU_FUNC(collapse_all_cb), 0, NULL},
+ 	{"/Expand All", NULL, GTK_MENU_FUNC(expand_all_cb), 0, NULL}
+ };
+ 
+ 
  static int initialize = TRUE;
  static GtkItemFactory *factory = NULL;
+ static GtkItemFactory *popup_menu_factory;
  
  void
  get_main_menu(GtkWidget ** menubar, GtkAccelGroup ** table) {
***************
*** 147,153 ****
--- 165,174 ----
      initialize = FALSE;
  
      factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", grp);
+     popup_menu_factory = gtk_item_factory_new(GTK_TYPE_MENU, "<main>", NULL);
      gtk_item_factory_create_items_ac(factory, nmenu_items, menu_items, NULL,2);
+     gtk_item_factory_create_items_ac(popup_menu_factory, sizeof(popup_menu_items)/sizeof(popup_menu_items[0]), popup_menu_items, NULL,2);
+     popup_menu_object = popup_menu_factory->widget;
      set_menu_sensitivity("/File/Close", FALSE);
      set_menu_sensitivity("/File/Save", FALSE);
      set_menu_sensitivity("/File/Save As...", FALSE);
***************
*** 173,189 ****
--- 194,237 ----
  void
  set_menu_sensitivity (gchar *path, gint val) {
    GtkWidget *menu;
+   gchar *shortpath = rindex(path, '/');
  
    if ((menu = gtk_item_factory_get_widget(factory, path)) != NULL)
      gtk_widget_set_sensitive(menu, val);
+   
+   if ((menu = gtk_item_factory_get_widget(popup_menu_factory, shortpath)) != NULL)
+     gtk_widget_set_sensitive(menu, val);
  }
  
  void
  set_menu_object_data (gchar *path, gchar *key, gpointer data) {
    GtkWidget *menu;
+   gchar *shortpath = rindex(path, '/');
    
    if ((menu = gtk_item_factory_get_widget(factory, path)) != NULL)
      gtk_object_set_data(GTK_OBJECT(menu), key, data);
+   
+   if ((menu = gtk_item_factory_get_widget(popup_menu_factory, shortpath)) != NULL)
+     gtk_object_set_data(GTK_OBJECT(menu), key, data);
+     
  }
  
+ void
+ popup_menu_handler(GtkWidget *widget, GdkEvent *event)
+ {
+ 	GtkWidget *menu = NULL;
+ 	GdkEventButton *event_button = NULL;
  
+ 	if(widget == NULL || event == NULL) {
+ 		return;
+ 	}
+ 	
+ 	menu = widget;
+ 	if(event->type == GDK_BUTTON_PRESS) {
+ 		event_button = (GdkEventButton *) event;
+ 		
+ 		if(event_button->button == 3) {
+ 			gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event_button->button, event_button->time);
+ 		}
+ 	}
+ }
Index: gtk/menu.h
===================================================================
RCS file: /usr/local/cvsroot/ethereal/gtk/menu.h,v
retrieving revision 1.1
diff -c -r1.1 menu.h
*** menu.h	1999/09/01 03:04:23	1.1
--- menu.h	1999/12/30 05:57:20
***************
*** 38,44 ****
--- 38,46 ----
  void set_menu_sensitivity (gchar *, gint);
  void set_menu_object_data (gchar *path, gchar *key, gpointer data);
  void menus_create (GtkMenuEntry *, int);
+ void popup_menu_handler(GtkWidget *widget, GdkEvent *event);
  
+ GtkWidget           *popup_menu_object;
  
  #ifdef __cplusplus
  }