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