diff --git a/src/objects/window/private.h b/src/objects/window/private.h index 87b7190..7e4b49e 100644 --- a/src/objects/window/private.h +++ b/src/objects/window/private.h @@ -46,6 +46,16 @@ #include #include + enum pw3270ApplicationWindowPopup { + PW3270_APP_WINDOW_POPUP_OVER_SELECTED_AREA, + PW3270_APP_WINDOW_POPUP_OVER_UNSELECTED_AREA, + PW3270_APP_WINDOW_POPUP_WHEN_OFFLINE, + + PW3270_APP_WINDOW_POPUP_COUNT + }; + + #define PW3270_APP_WINDOW_POPUP_DEFAULT PW3270_APP_WINDOW_POPUP_OVER_UNSELECTED_AREA + struct _pw3270ApplicationWindow { GtkApplicationWindow parent; @@ -53,6 +63,8 @@ GtkNotebook * notebook; GtkToolbar * toolbar; + GtkWidget * popups[PW3270_APP_WINDOW_POPUP_COUNT]; + }; struct _pw3270ApplicationWindowClass { diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index 933dc6e..cd418b9 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -149,6 +149,28 @@ } + static gboolean on_popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window) { + + GtkWidget * popup = window->popups[PW3270_APP_WINDOW_POPUP_OVER_UNSELECTED_AREA]; + + if(!online && window->popups[PW3270_APP_WINDOW_POPUP_WHEN_OFFLINE]) + popup = window->popups[PW3270_APP_WINDOW_POPUP_WHEN_OFFLINE]; + else if(selected && window->popups[PW3270_APP_WINDOW_POPUP_OVER_SELECTED_AREA]) + popup = window->popups[PW3270_APP_WINDOW_POPUP_OVER_SELECTED_AREA]; + else + popup = window->popups[PW3270_APP_WINDOW_POPUP_DEFAULT]; + + if(!popup) + return FALSE; + + gtk_widget_show_all(popup); + gtk_menu_set_screen(GTK_MENU(popup), gtk_widget_get_screen(widget)); + gtk_menu_popup_at_pointer(GTK_MENU(popup), event); + + return TRUE; + + } + static gint append_terminal_page(pw3270ApplicationWindow * window, GtkWidget * terminal) { GtkWidget * label = gtk_label_new(v3270_get_session_name(terminal)); @@ -164,6 +186,7 @@ g_signal_connect(G_OBJECT(terminal), "disconnected", G_CALLBACK(disconnected),window); g_signal_connect(G_OBJECT(terminal), "connected", G_CALLBACK(connected),window); g_signal_connect(G_OBJECT(terminal), "destroy", G_CALLBACK(on_terminal_destroy),window); + g_signal_connect(G_OBJECT(terminal), "popup", G_CALLBACK(on_popup_menu), window); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_close_tab), terminal); diff --git a/src/objects/window/window.c b/src/objects/window/window.c index 79d8ae2..a17616a 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -37,10 +37,13 @@ static void destroy(GtkWidget *widget) { + size_t ix; + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); + + debug("%s(%p)",__FUNCTION__,widget); // Update actions - size_t ix; gchar ** actions = g_action_group_list_actions(G_ACTION_GROUP(widget)); for(ix = 0; actions[ix]; ix++) { @@ -54,6 +57,15 @@ g_strfreev(actions); + // Destroy popups + for(ix = 0; ix < G_N_ELEMENTS(window->popups); ix++) { + if(window->popups[ix]) { + gtk_widget_destroy(window->popups[ix]); + window->popups[ix] = NULL; + } + } + + GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->destroy(widget); } @@ -179,6 +191,7 @@ GtkWidget * pw3270_application_window_new(GtkApplication * application) { + size_t ix; const gchar * title = _( "IBM 3270 Terminal emulator" ); g_autoptr(GSettings) settings = pw3270_application_get_settings(G_APPLICATION(application)); @@ -235,6 +248,24 @@ g_warning("Unexpected UI"); } + + // Load popup menus. + const gchar * popup_menus[G_N_ELEMENTS(window->popups)] = { + "popup-over-selected-area", + "popup-over-unselected-area", + "popup-when-offline" + }; + + for(ix = 0; ix < G_N_ELEMENTS(popup_menus); ix++) { + + GObject * model = gtk_builder_get_object(builder, popup_menus[ix]); + if(model) { + window->popups[ix] = gtk_menu_new_from_model(G_MENU_MODEL(model)); + gtk_menu_attach_to_widget(GTK_MENU(window->popups[ix]),GTK_WIDGET(window),NULL); + } + + } + g_object_unref(builder); } diff --git a/ui/window.xml b/ui/window.xml index b5a576f..1ad625a 100644 --- a/ui/window.xml +++ b/ui/window.xml @@ -69,4 +69,106 @@ + + + +
+ + + Save selected + win.save_selected + + + + Print selected + win.print_selected + + +
+ +
+ + + Show toolbar + win.toolbar + + + + Show menu + win.menubar + + +
+ +
+ + + +
+ + + Send/Receive files + win.file.transfer + + + + Disconnect + win.disconnect + + +
+ +
+ + + Show toolbar + win.toolbar + + + + Show menu + win.menubar + + +
+ +
+ + + +
+ + + _Connect + win.connect + + + + Configure host + win.set.host + + +
+ +
+ + + Show toolbar + win.toolbar + + + + Show menu + win.menubar + + +
+ + + Quit application + app.quit + + +
+ -- libgit2 0.21.2