Commit 5c6e7a077d29d32682866e23cb3e85751295e307
1 parent
d0bf1b0d
Exists in
master
and in
5 other branches
Implementando popup menus
Showing
5 changed files
with
52 additions
and
10 deletions
Show diff stats
pw3270.cbp
@@ -58,6 +58,7 @@ | @@ -58,6 +58,7 @@ | ||
58 | <Unit filename="src/gtk/mainwindow.c"> | 58 | <Unit filename="src/gtk/mainwindow.c"> |
59 | <Option compilerVar="CC" /> | 59 | <Option compilerVar="CC" /> |
60 | </Unit> | 60 | </Unit> |
61 | + <Unit filename="src/gtk/uiparser/Makefile.in" /> | ||
61 | <Unit filename="src/gtk/uiparser/accelerator.c"> | 62 | <Unit filename="src/gtk/uiparser/accelerator.c"> |
62 | <Option compilerVar="CC" /> | 63 | <Option compilerVar="CC" /> |
63 | </Unit> | 64 | </Unit> |
@@ -80,7 +81,13 @@ | @@ -80,7 +81,13 @@ | ||
80 | <Option compilerVar="CC" /> | 81 | <Option compilerVar="CC" /> |
81 | </Unit> | 82 | </Unit> |
82 | <Unit filename="src/gtk/uiparser/parser.h" /> | 83 | <Unit filename="src/gtk/uiparser/parser.h" /> |
84 | + <Unit filename="src/gtk/uiparser/popup.c"> | ||
85 | + <Option compilerVar="CC" /> | ||
86 | + </Unit> | ||
83 | <Unit filename="src/gtk/uiparser/private.h" /> | 87 | <Unit filename="src/gtk/uiparser/private.h" /> |
88 | + <Unit filename="src/gtk/uiparser/script.c"> | ||
89 | + <Option compilerVar="CC" /> | ||
90 | + </Unit> | ||
84 | <Unit filename="src/gtk/uiparser/separator.c"> | 91 | <Unit filename="src/gtk/uiparser/separator.c"> |
85 | <Option compilerVar="CC" /> | 92 | <Option compilerVar="CC" /> |
86 | </Unit> | 93 | </Unit> |
src/gtk/mainwindow.c
@@ -114,9 +114,30 @@ | @@ -114,9 +114,30 @@ | ||
114 | set_integer_to_config("terminal","model",id); | 114 | set_integer_to_config("terminal","model",id); |
115 | } | 115 | } |
116 | 116 | ||
117 | - static gboolean popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, gpointer popup) | 117 | + static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup) |
118 | { | 118 | { |
119 | - trace("Popup on widget %p online=%s selected=%s",widget,online ? "Yes" : "No", selected ? "Yes" : "No"); | 119 | + GtkWidget *menu = NULL; |
120 | + | ||
121 | + if(!online) | ||
122 | + menu = popup[POPUP_OFFLINE] ? popup[POPUP_OFFLINE] : popup[POPUP_DEFAULT]; | ||
123 | + else if(selected && popup[POPUP_SELECTION]) | ||
124 | + menu = popup[POPUP_SELECTION]; | ||
125 | + else if(popup[POPUP_ONLINE]) | ||
126 | + menu = popup[POPUP_ONLINE]; | ||
127 | + else | ||
128 | + menu = popup[POPUP_DEFAULT]; | ||
129 | + | ||
130 | + trace("Popup %p on widget %p online=%s selected=%s",menu,widget,online ? "Yes" : "No", selected ? "Yes" : "No"); | ||
131 | + | ||
132 | + if(!menu) | ||
133 | + return FALSE; | ||
134 | + | ||
135 | + trace("Showing popup \"%s\"",gtk_widget_get_name(menu)); | ||
136 | + | ||
137 | + gtk_widget_show_all(menu); | ||
138 | + gtk_menu_set_screen(GTK_MENU(menu), gtk_widget_get_screen(widget)); | ||
139 | + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,event->time); | ||
140 | + | ||
120 | return TRUE; | 141 | return TRUE; |
121 | } | 142 | } |
122 | 143 | ||
@@ -205,6 +226,7 @@ | @@ -205,6 +226,7 @@ | ||
205 | H3270 * host = v3270_get_session(terminal); | 226 | H3270 * host = v3270_get_session(terminal); |
206 | gchar * path = build_data_filename("ui",NULL); | 227 | gchar * path = build_data_filename("ui",NULL); |
207 | GtkActionGroup **group; | 228 | GtkActionGroup **group; |
229 | + GtkWidget **popup; | ||
208 | int f; | 230 | int f; |
209 | 231 | ||
210 | // Initialize terminal config | 232 | // Initialize terminal config |
@@ -226,7 +248,8 @@ | @@ -226,7 +248,8 @@ | ||
226 | 248 | ||
227 | // Create window | 249 | // Create window |
228 | window = ui_parse_xml_folder(path,groupname,popupname,terminal,widget_setup); | 250 | window = ui_parse_xml_folder(path,groupname,popupname,terminal,widget_setup); |
229 | - group = g_object_get_data(G_OBJECT(window),"action_groups"); | 251 | + group = g_object_get_data(G_OBJECT(window),"action_groups"); |
252 | + popup = g_object_get_data(G_OBJECT(window),"popup_menus"); | ||
230 | 253 | ||
231 | // Setup action groups | 254 | // Setup action groups |
232 | gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],FALSE); | 255 | gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],FALSE); |
@@ -242,7 +265,7 @@ | @@ -242,7 +265,7 @@ | ||
242 | g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0); | 265 | g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0); |
243 | g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0); | 266 | g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0); |
244 | g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group); | 267 | g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group); |
245 | - g_signal_connect(terminal,"popup",G_CALLBACK(popup),NULL); | 268 | + g_signal_connect(terminal,"popup",G_CALLBACK(popup_menu),popup); |
246 | 269 | ||
247 | g_free(path); | 270 | g_free(path); |
248 | gtk_widget_grab_focus(terminal); | 271 | gtk_widget_grab_focus(terminal); |
src/gtk/uiparser/parser.c
@@ -255,8 +255,11 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con | @@ -255,8 +255,11 @@ GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, con | ||
255 | p.toplevel = gtk_window_new(GTK_WINDOW_TOPLEVEL); | 255 | p.toplevel = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
256 | p.center_widget = widget; | 256 | p.center_widget = widget; |
257 | p.group = groupname; | 257 | p.group = groupname; |
258 | - p.popup = popupname; | 258 | + p.popupname = popupname; |
259 | p.strings = g_string_chunk_new(0); | 259 | p.strings = g_string_chunk_new(0); |
260 | + p.popup = g_new0(GtkWidget *,(g_strv_length((gchar **) p.popupname)+1)); | ||
261 | + | ||
262 | + g_object_set_data_full(G_OBJECT(p.toplevel),"popup_menus",(gpointer) p.popup, g_free); | ||
260 | 263 | ||
261 | for(current = g_list_first(file);current;current = g_list_next(current)) | 264 | for(current = g_list_first(file);current;current = g_list_next(current)) |
262 | { | 265 | { |
src/gtk/uiparser/popup.c
@@ -62,9 +62,9 @@ | @@ -62,9 +62,9 @@ | ||
62 | return NULL; | 62 | return NULL; |
63 | } | 63 | } |
64 | 64 | ||
65 | - for(f=0;info->popup[f] && pos < 0;pos++) | 65 | + for(f=0;info->popupname[f] && pos < 0;f++) |
66 | { | 66 | { |
67 | - if(!g_strcasecmp(info->popup[f],id)) | 67 | + if(!g_strcasecmp(info->popupname[f],id)) |
68 | { | 68 | { |
69 | pos = f; | 69 | pos = f; |
70 | break; | 70 | break; |
@@ -76,10 +76,18 @@ | @@ -76,10 +76,18 @@ | ||
76 | *error = g_error_new(ERROR_DOMAIN,EINVAL,_( "Unknown popup type \"%s\""),id); | 76 | *error = g_error_new(ERROR_DOMAIN,EINVAL,_( "Unknown popup type \"%s\""),id); |
77 | return NULL; | 77 | return NULL; |
78 | } | 78 | } |
79 | + else | ||
80 | + { | ||
81 | + widget = info->popup[pos]; | ||
82 | + } | ||
79 | 83 | ||
80 | - widget = gtk_menu_new(); | 84 | + if(!widget) |
85 | + { | ||
86 | + info->popup[pos] = widget = gtk_menu_new(); | ||
87 | + gtk_widget_show_all(widget); | ||
88 | + } | ||
81 | 89 | ||
82 | - g_object_set_data(G_OBJECT(widget),"popup_id",(gpointer) pos); | 90 | + trace("popup(%s): %p id=\"%s\" (%d)",id,widget,info->popupname[pos],pos); |
83 | 91 | ||
84 | return G_OBJECT(ui_insert_element(info, action, UI_ELEMENT_POPUP, names, values, G_OBJECT(widget), error)); | 92 | return G_OBJECT(ui_insert_element(info, action, UI_ELEMENT_POPUP, names, values, G_OBJECT(widget), error)); |
85 | } | 93 | } |
src/gtk/uiparser/private.h
@@ -56,9 +56,10 @@ | @@ -56,9 +56,10 @@ | ||
56 | GtkWidget * toplevel; | 56 | GtkWidget * toplevel; |
57 | GObject * element; | 57 | GObject * element; |
58 | GtkWidget * center_widget; | 58 | GtkWidget * center_widget; |
59 | + GtkWidget ** popup; /**< Popup widgets */ | ||
59 | GStringChunk * strings; | 60 | GStringChunk * strings; |
60 | const gchar ** group; /**< Action group list */ | 61 | const gchar ** group; /**< Action group list */ |
61 | - const gchar ** popup; /**< Popup names */ | 62 | + const gchar ** popupname; /**< Popup names */ |
62 | GHashTable * actions; /**< List of actions */ | 63 | GHashTable * actions; /**< List of actions */ |
63 | GHashTable * element_list[UI_ELEMENT_COUNT]; | 64 | GHashTable * element_list[UI_ELEMENT_COUNT]; |
64 | }; | 65 | }; |