Commit 8803e9e53bfe6d9095f3ef90e8f09f5cef94686b

Authored by Perry Werneck
1 parent d16909b3

Implement toplevel window & application objects.

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  
... ...
src/objects/window/ui/window.xml 0 → 100644
... ... @@ -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  
... ...