Commit 8803e9e53bfe6d9095f3ef90e8f09f5cef94686b
1 parent
d16909b3
Exists in
master
and in
4 other branches
Implement toplevel window & application objects.
Showing
4 changed files
with
104 additions
and
6 deletions
Show diff stats
src/objects/window/application.c
| @@ -101,13 +101,31 @@ | @@ -101,13 +101,31 @@ | ||
| 101 | NULL, | 101 | NULL, |
| 102 | NULL | 102 | NULL |
| 103 | }, | 103 | }, |
| 104 | + | ||
| 104 | { | 105 | { |
| 105 | "app.quit", | 106 | "app.quit", |
| 106 | action_activated, | 107 | action_activated, |
| 107 | NULL, | 108 | NULL, |
| 108 | NULL, | 109 | NULL, |
| 109 | NULL | 110 | NULL |
| 111 | + }, | ||
| 112 | + | ||
| 113 | + { | ||
| 114 | + "app.new_tab", | ||
| 115 | + action_activated, | ||
| 116 | + NULL, | ||
| 117 | + NULL, | ||
| 118 | + NULL | ||
| 119 | + }, | ||
| 120 | + | ||
| 121 | + { | ||
| 122 | + "app.new_window", | ||
| 123 | + action_activated, | ||
| 124 | + NULL, | ||
| 125 | + NULL, | ||
| 126 | + NULL | ||
| 110 | } | 127 | } |
| 128 | + | ||
| 111 | }; | 129 | }; |
| 112 | 130 | ||
| 113 | g_action_map_add_action_entries( | 131 | g_action_map_add_action_entries( |
src/objects/window/terminal.c
| @@ -75,8 +75,11 @@ | @@ -75,8 +75,11 @@ | ||
| 75 | gtk_widget_show_all(terminal); | 75 | gtk_widget_show_all(terminal); |
| 76 | gtk_widget_show_all(label); | 76 | gtk_widget_show_all(label); |
| 77 | 77 | ||
| 78 | - gtk_notebook_append_page(GTK_NOTEBOOK(window->notebook),terminal,label); | ||
| 79 | - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(window->notebook),gtk_notebook_get_n_pages(GTK_NOTEBOOK(window->notebook)) > 1); | 78 | + gtk_notebook_append_page(window->notebook,terminal,label); |
| 79 | + gtk_notebook_set_show_tabs(window->notebook,gtk_notebook_get_n_pages(GTK_NOTEBOOK(window->notebook)) > 1); | ||
| 80 | + | ||
| 81 | + gtk_notebook_set_tab_detachable(window->notebook,terminal,TRUE); | ||
| 82 | + gtk_notebook_set_tab_reorderable(window->notebook,terminal,TRUE); | ||
| 80 | 83 | ||
| 81 | return terminal; | 84 | return terminal; |
| 82 | 85 |
| @@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<interface> | ||
| 3 | + <requires lib="gtk+" version="3.0"/> | ||
| 4 | + <menu id="gear-menu"> | ||
| 5 | + <section> | ||
| 6 | + <item> | ||
| 7 | + <attribute name="label" translatable="yes">About PW3270</attribute> | ||
| 8 | + <attribute name="action">app.about</attribute> | ||
| 9 | + </item> | ||
| 10 | + <item> | ||
| 11 | + <attribute name="label" translatable="yes">Preferences</attribute> | ||
| 12 | + <attribute name="action">app.help</attribute> | ||
| 13 | + </item> | ||
| 14 | + <item> | ||
| 15 | + <attribute name="label" translatable="yes">Quit</attribute> | ||
| 16 | + <attribute name="action">app.quit</attribute> | ||
| 17 | + </item> | ||
| 18 | + </section> | ||
| 19 | + </menu> | ||
| 20 | +</interface> |
src/objects/window/window.c
| @@ -29,6 +29,7 @@ | @@ -29,6 +29,7 @@ | ||
| 29 | 29 | ||
| 30 | #include "private.h" | 30 | #include "private.h" |
| 31 | #include <pw3270/toolbar.h> | 31 | #include <pw3270/toolbar.h> |
| 32 | + #include <pw3270/application.h> | ||
| 32 | 33 | ||
| 33 | G_DEFINE_TYPE(pw3270ApplicationWindow, pw3270ApplicationWindow, GTK_TYPE_APPLICATION_WINDOW); | 34 | G_DEFINE_TYPE(pw3270ApplicationWindow, pw3270ApplicationWindow, GTK_TYPE_APPLICATION_WINDOW); |
| 34 | 35 | ||
| @@ -60,6 +61,7 @@ | @@ -60,6 +61,7 @@ | ||
| 60 | 61 | ||
| 61 | gtk_notebook_set_show_tabs(widget->notebook,FALSE); | 62 | gtk_notebook_set_show_tabs(widget->notebook,FALSE); |
| 62 | gtk_notebook_set_show_border(widget->notebook, FALSE); | 63 | gtk_notebook_set_show_border(widget->notebook, FALSE); |
| 64 | + gtk_notebook_set_group_name(widget->notebook,PACKAGE_NAME ":Terminals"); | ||
| 63 | 65 | ||
| 64 | gtk_box_pack_start(vBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); | 66 | gtk_box_pack_start(vBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); |
| 65 | gtk_box_pack_start(vBox,GTK_WIDGET(widget->notebook),TRUE,TRUE,0); | 67 | gtk_box_pack_start(vBox,GTK_WIDGET(widget->notebook),TRUE,TRUE,0); |
| @@ -71,12 +73,67 @@ | @@ -71,12 +73,67 @@ | ||
| 71 | 73 | ||
| 72 | GtkWidget * pw3270_application_window_new(GtkApplication * application) { | 74 | GtkWidget * pw3270_application_window_new(GtkApplication * application) { |
| 73 | 75 | ||
| 76 | + const gchar * title = _( "IBM 3270 Terminal emulator" ); | ||
| 77 | + | ||
| 74 | g_return_val_if_fail(GTK_IS_APPLICATION(application), NULL); | 78 | g_return_val_if_fail(GTK_IS_APPLICATION(application), NULL); |
| 75 | - return g_object_new( | ||
| 76 | - PW3270_TYPE_APPLICATION_WINDOW, | ||
| 77 | - "application", application, | ||
| 78 | - NULL); | 79 | + pw3270ApplicationWindow * window = |
| 80 | + g_object_new( | ||
| 81 | + PW3270_TYPE_APPLICATION_WINDOW, | ||
| 82 | + "application", application, | ||
| 83 | + NULL); | ||
| 84 | + | ||
| 85 | + if(PW3270_IS_APPLICATION(gtk_window_get_application(GTK_WINDOW(window)))) { | ||
| 86 | + | ||
| 87 | + GtkBuilder * builder = gtk_builder_new_from_file("ui/window.xml"); | ||
| 88 | + | ||
| 89 | + switch(pw3270_application_get_ui_type(G_APPLICATION(application))) { | ||
| 90 | + case PW3270_UI_STYLE_CLASSICAL: | ||
| 91 | + { | ||
| 92 | + gtk_window_set_title(GTK_WINDOW(window), title); | ||
| 93 | + | ||
| 94 | + } | ||
| 95 | + break; | ||
| 96 | + | ||
| 97 | + case PW3270_UI_STYLE_GNOME: | ||
| 98 | + { | ||
| 99 | + // Create header bar | ||
| 100 | + GtkHeaderBar * header = GTK_HEADER_BAR(gtk_header_bar_new()); | ||
| 101 | + gtk_window_set_titlebar(GTK_WINDOW(window), GTK_WIDGET(header)); | ||
| 102 | + gtk_header_bar_set_show_close_button(header,TRUE); | ||
| 103 | + | ||
| 104 | + gtk_header_bar_set_title(header,title); | ||
| 105 | + gtk_header_bar_set_subtitle(header,_("Disconnected from host")); | ||
| 106 | + | ||
| 107 | + // Create gear button | ||
| 108 | + // https://wiki.gnome.org/Initiatives/GnomeGoals/GearIcons | ||
| 109 | + GtkWidget * gear_menu = gtk_menu_button_new(); | ||
| 110 | + gtk_button_set_image(GTK_BUTTON(gear_menu),gtk_image_new_from_icon_name("open-menu-symbolic",GTK_ICON_SIZE_MENU)); | ||
| 111 | + | ||
| 112 | + gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(gear_menu), G_MENU_MODEL(gtk_builder_get_object (builder, "gear-menu"))); | ||
| 113 | + | ||
| 114 | + gtk_header_bar_pack_end(header, gear_menu); | ||
| 115 | + | ||
| 116 | + // Create "new tab" bar | ||
| 117 | + GtkWidget * new_tab_button = gtk_button_new_from_icon_name("tab-new-symbolic",GTK_ICON_SIZE_MENU); | ||
| 118 | + gtk_actionable_set_action_name(GTK_ACTIONABLE(new_tab_button),"app.new_tab"); | ||
| 119 | + | ||
| 120 | + gtk_header_bar_pack_start(header, new_tab_button); | ||
| 121 | + | ||
| 122 | + // Show the new header | ||
| 123 | + gtk_widget_show_all(GTK_WIDGET(header)); | ||
| 124 | + } | ||
| 125 | + break; | ||
| 126 | + | ||
| 127 | + default: | ||
| 128 | + g_warning("Unexpected UI"); | ||
| 129 | + | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + g_object_unref(builder); | ||
| 133 | + | ||
| 134 | + } | ||
| 79 | 135 | ||
| 136 | + return GTK_WIDGET(window); | ||
| 80 | 137 | ||
| 81 | } | 138 | } |
| 82 | 139 |