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 |