diff --git a/pw3270.cbp b/pw3270.cbp index ef91e4a..89b897c 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -58,6 +58,7 @@ + @@ -80,7 +81,13 @@ + + + + diff --git a/src/gtk/mainwindow.c b/src/gtk/mainwindow.c index c2a5a92..d40eedc 100644 --- a/src/gtk/mainwindow.c +++ b/src/gtk/mainwindow.c @@ -114,9 +114,30 @@ set_integer_to_config("terminal","model",id); } - static gboolean popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, gpointer popup) + static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup) { - trace("Popup on widget %p online=%s selected=%s",widget,online ? "Yes" : "No", selected ? "Yes" : "No"); + GtkWidget *menu = NULL; + + if(!online) + menu = popup[POPUP_OFFLINE] ? popup[POPUP_OFFLINE] : popup[POPUP_DEFAULT]; + else if(selected && popup[POPUP_SELECTION]) + menu = popup[POPUP_SELECTION]; + else if(popup[POPUP_ONLINE]) + menu = popup[POPUP_ONLINE]; + else + menu = popup[POPUP_DEFAULT]; + + trace("Popup %p on widget %p online=%s selected=%s",menu,widget,online ? "Yes" : "No", selected ? "Yes" : "No"); + + if(!menu) + return FALSE; + + trace("Showing popup \"%s\"",gtk_widget_get_name(menu)); + + gtk_widget_show_all(menu); + gtk_menu_set_screen(GTK_MENU(menu), gtk_widget_get_screen(widget)); + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,event->time); + return TRUE; } @@ -205,6 +226,7 @@ H3270 * host = v3270_get_session(terminal); gchar * path = build_data_filename("ui",NULL); GtkActionGroup **group; + GtkWidget **popup; int f; // Initialize terminal config @@ -226,7 +248,8 @@ // Create window window = ui_parse_xml_folder(path,groupname,popupname,terminal,widget_setup); - group = g_object_get_data(G_OBJECT(window),"action_groups"); + group = g_object_get_data(G_OBJECT(window),"action_groups"); + popup = g_object_get_data(G_OBJECT(window),"popup_menus"); // Setup action groups gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],FALSE); @@ -242,7 +265,7 @@ g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0); g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0); g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group); - g_signal_connect(terminal,"popup",G_CALLBACK(popup),NULL); + g_signal_connect(terminal,"popup",G_CALLBACK(popup_menu),popup); g_free(path); gtk_widget_grab_focus(terminal); diff --git a/src/gtk/uiparser/parser.c b/src/gtk/uiparser/parser.c index 6599100..16dca4b 100644 --- a/src/gtk/uiparser/parser.c +++ b/src/gtk/uiparser/parser.c @@ -255,8 +255,11 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con p.toplevel = gtk_window_new(GTK_WINDOW_TOPLEVEL); p.center_widget = widget; p.group = groupname; - p.popup = popupname; + p.popupname = popupname; p.strings = g_string_chunk_new(0); + p.popup = g_new0(GtkWidget *,(g_strv_length((gchar **) p.popupname)+1)); + + g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, g_free); for(current = g_list_first(file);current;current = g_list_next(current)) { diff --git a/src/gtk/uiparser/popup.c b/src/gtk/uiparser/popup.c index d5b2c2e..563ed87 100644 --- a/src/gtk/uiparser/popup.c +++ b/src/gtk/uiparser/popup.c @@ -62,9 +62,9 @@ return NULL; } - for(f=0;info->popup[f] && pos < 0;pos++) + for(f=0;info->popupname[f] && pos < 0;f++) { - if(!g_strcasecmp(info->popup[f],id)) + if(!g_strcasecmp(info->popupname[f],id)) { pos = f; break; @@ -76,10 +76,18 @@ *error = g_error_new(ERROR_DOMAIN,EINVAL,_( "Unknown popup type \"%s\""),id); return NULL; } + else + { + widget = info->popup[pos]; + } - widget = gtk_menu_new(); + if(!widget) + { + info->popup[pos] = widget = gtk_menu_new(); + gtk_widget_show_all(widget); + } - g_object_set_data(G_OBJECT(widget),"popup_id",(gpointer) pos); + trace("popup(%s): %p id=\"%s\" (%d)",id,widget,info->popupname[pos],pos); return G_OBJECT(ui_insert_element(info, action, UI_ELEMENT_POPUP, names, values, G_OBJECT(widget), error)); } diff --git a/src/gtk/uiparser/private.h b/src/gtk/uiparser/private.h index 36035a6..452a9fb 100644 --- a/src/gtk/uiparser/private.h +++ b/src/gtk/uiparser/private.h @@ -56,9 +56,10 @@ GtkWidget * toplevel; GObject * element; GtkWidget * center_widget; + GtkWidget ** popup; /**< Popup widgets */ GStringChunk * strings; const gchar ** group; /**< Action group list */ - const gchar ** popup; /**< Popup names */ + const gchar ** popupname; /**< Popup names */ GHashTable * actions; /**< List of actions */ GHashTable * element_list[UI_ELEMENT_COUNT]; }; -- libgit2 0.21.2