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 | 101 | NULL, |
102 | 102 | NULL |
103 | 103 | }, |
104 | + | |
104 | 105 | { |
105 | 106 | "app.quit", |
106 | 107 | action_activated, |
107 | 108 | NULL, |
108 | 109 | NULL, |
109 | 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 | 131 | g_action_map_add_action_entries( | ... | ... |
src/objects/window/terminal.c
... | ... | @@ -75,8 +75,11 @@ |
75 | 75 | gtk_widget_show_all(terminal); |
76 | 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 | 84 | return terminal; |
82 | 85 | ... | ... |
... | ... | @@ -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 | 29 | |
30 | 30 | #include "private.h" |
31 | 31 | #include <pw3270/toolbar.h> |
32 | + #include <pw3270/application.h> | |
32 | 33 | |
33 | 34 | G_DEFINE_TYPE(pw3270ApplicationWindow, pw3270ApplicationWindow, GTK_TYPE_APPLICATION_WINDOW); |
34 | 35 | |
... | ... | @@ -60,6 +61,7 @@ |
60 | 61 | |
61 | 62 | gtk_notebook_set_show_tabs(widget->notebook,FALSE); |
62 | 63 | gtk_notebook_set_show_border(widget->notebook, FALSE); |
64 | + gtk_notebook_set_group_name(widget->notebook,PACKAGE_NAME ":Terminals"); | |
63 | 65 | |
64 | 66 | gtk_box_pack_start(vBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); |
65 | 67 | gtk_box_pack_start(vBox,GTK_WIDGET(widget->notebook),TRUE,TRUE,0); |
... | ... | @@ -71,12 +73,67 @@ |
71 | 73 | |
72 | 74 | GtkWidget * pw3270_application_window_new(GtkApplication * application) { |
73 | 75 | |
76 | + const gchar * title = _( "IBM 3270 Terminal emulator" ); | |
77 | + | |
74 | 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 | ... | ... |