Commit 5c5fa189661b037ecfbc471d5c2f2ae63cb6e4a3

Authored by Perry Werneck
1 parent 8803e9e5

Implementing the new UI.

src/include/pw3270/window.h
... ... @@ -68,6 +68,15 @@
68 68 /// @brief Get the active session handle.
69 69 H3270 * pw3270_window_get_session_handle(GtkWidget *window);
70 70  
  71 + /// @brief Switches to the page number page_num.
  72 + void pw3270_window_set_current_page(GtkWidget *window, gint page_num);
  73 +
  74 + /// @brief Appends a new terminal to window.
  75 + gint pw3270_window_append_page(GtkWidget *window, GFile *file);
  76 +
  77 + /// @brief Set window sub-title (If enabled).
  78 + void pw3270_window_set_subtitle(GtkWidget *window, const gchar *subtitle);
  79 +
71 80 G_END_DECLS
72 81  
73 82  
... ...
src/objects/window/application.c
... ... @@ -42,9 +42,9 @@
42 42 GtkApplication parent;
43 43 };
44 44  
45   - static void startup(GApplication * application);
46   - static void activate(GApplication * application);
47   - static void open(GApplication * application, GFile **files, gint n_files, const gchar *hint);
  45 + static void startup(GApplication * application);
  46 + static void activate(GApplication * application);
  47 + static void open(GApplication * application, GFile **files, gint n_files, const gchar *hint);
48 48  
49 49 G_DEFINE_TYPE(pw3270Application, pw3270Application, GTK_TYPE_APPLICATION);
50 50  
... ... @@ -152,26 +152,39 @@
152 152  
153 153 GtkWidget * window = pw3270_application_window_new(GTK_APPLICATION(application));
154 154  
155   - gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(window),TRUE);
156   -
157 155 // Create terminal widget
158 156 pw3270_terminal_new(window);
159   - pw3270_terminal_new(window);
160   -
161   - // Setup and show main window
162   - gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
163   - gtk_window_set_default_size (GTK_WINDOW (window), 800, 500);
164 157  
165   - // gtk_widget_show_all(window);
  158 + // Present the new window
166 159 gtk_window_present(GTK_WINDOW(window));
  160 + pw3270_window_set_current_page(window,0);
167 161  
168 162 }
169 163  
170 164 void open(GApplication *application, GFile **files, gint n_files, const gchar *hint) {
171 165  
  166 + GtkWindow * window = gtk_application_get_active_window(GTK_APPLICATION(application));
  167 +
  168 + debug("%s was called with %d files (active_window=%p)", __FUNCTION__, n_files, window);
  169 +
  170 + if(!window)
  171 + window = GTK_WINDOW(pw3270_application_window_new(GTK_APPLICATION(application)));
  172 +
  173 + // Add tabs to the window
  174 + gint file;
  175 + gint last = -1;
  176 +
  177 + for(file = 0; file < n_files; file++) {
  178 + last = pw3270_window_append_page(GTK_WIDGET(window), files[file]);
  179 + }
  180 +
  181 + gtk_window_present(window);
  182 +
  183 + if(last != -1)
  184 + pw3270_window_set_current_page(GTK_WIDGET(window),last);
  185 +
172 186 }
173 187  
174 188 PW3270_UI_TYPE pw3270_application_get_ui_type(GApplication *app) {
175 189 return PW3270_UI_STYLE_GNOME;
176 190 }
177   -
... ...
src/objects/window/private.h
... ... @@ -50,7 +50,6 @@
50 50  
51 51 GtkApplicationWindow parent;
52 52  
53   - GtkWidget * terminal;
54 53 GtkNotebook * notebook;
55 54 GtkToolbar * toolbar;
56 55  
... ...
src/objects/window/terminal.c
... ... @@ -29,6 +29,7 @@
29 29  
30 30 #include "private.h"
31 31 #include <pw3270/actions.h>
  32 + #include <lib3270/toggle.h>
32 33  
33 34 static void session_changed(GtkWidget *terminal, GtkWidget *label) {
34 35  
... ... @@ -40,7 +41,7 @@
40 41  
41 42 pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(toplevel);
42 43  
43   - if(window->terminal == terminal) {
  44 + if(gtk_widget_has_default(terminal)) {
44 45 g_autofree gchar * title = v3270_get_session_title(terminal);
45 46 gtk_window_set_title(GTK_WINDOW(window), title);
46 47 }
... ... @@ -49,39 +50,119 @@
49 50  
50 51 }
51 52  
52   - static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent *event, pw3270ApplicationWindow * window) {
  53 + static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent *event, GtkWindow * window) {
53 54  
54   - // Store the active terminal widget.
55   - window->terminal = terminal;
  55 + // Store the active terminal widget.
  56 + gtk_widget_grab_default(terminal);
  57 + debug("Terminal %p is now default",terminal);
56 58  
57 59 // Change window title
58 60 g_autofree gchar * title = v3270_get_session_title(terminal);
59   - gtk_window_set_title(GTK_WINDOW(window), title);
  61 + gtk_window_set_title(window, title);
  62 +
  63 + pw3270_window_set_subtitle(GTK_WIDGET(window), v3270_is_connected(terminal) ? _("Connected to host") : _("Disconnected from host"));
60 64  
61 65 return FALSE;
62 66 }
63 67  
64   - GtkWidget * pw3270_terminal_new(GtkWidget *widget) {
  68 + static gboolean bg_auto_connect(GtkWidget *terminal) {
  69 + v3270_reconnect(terminal);
  70 + return FALSE;
  71 + }
65 72  
66   - g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),NULL);
  73 + static void disconnected(GtkWidget *terminal, GtkWindow * window) {
  74 +
  75 + debug("%s",__FUNCTION__);
  76 +
  77 + if(terminal != gtk_window_get_default_widget(window))
  78 + return;
  79 +
  80 + pw3270_window_set_subtitle(GTK_WIDGET(window), _("Disconnected from host"));
  81 +
  82 + }
  83 +
  84 + static void connected(GtkWidget *terminal, const gchar *host, GtkWindow * window) {
  85 +
  86 + debug("%s(%s)",__FUNCTION__,host);
  87 +
  88 + if(terminal != gtk_window_get_default_widget(window))
  89 + return;
  90 +
  91 + pw3270_window_set_subtitle(GTK_WIDGET(window), _("Connected to host"));
  92 +
  93 + }
  94 +
  95 + static gint append_terminal_page(pw3270ApplicationWindow * window, GtkWidget * terminal) {
67 96  
68   - pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget);
69   - GtkWidget * terminal = v3270_new();
70 97 GtkWidget * label = gtk_label_new(v3270_get_session_name(terminal));
71 98  
72   - g_signal_connect(G_OBJECT(terminal), "focus-in-event", G_CALLBACK(on_terminal_focus), widget);
  99 + g_signal_connect(G_OBJECT(terminal), "focus-in-event", G_CALLBACK(on_terminal_focus), window);
73 100 g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label);
  101 + g_signal_connect(G_OBJECT(terminal),"disconnected",G_CALLBACK(disconnected),window);
  102 + g_signal_connect(G_OBJECT(terminal),"connected",G_CALLBACK(connected),window);
74 103  
75 104 gtk_widget_show_all(terminal);
76 105 gtk_widget_show_all(label);
77 106  
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);
  107 + gint page = gtk_notebook_append_page(window->notebook,terminal,label);
  108 + gtk_notebook_set_show_tabs(window->notebook,gtk_notebook_get_n_pages(window->notebook) > 1);
80 109  
81 110 gtk_notebook_set_tab_detachable(window->notebook,terminal,TRUE);
82 111 gtk_notebook_set_tab_reorderable(window->notebook,terminal,TRUE);
83 112  
  113 + // Setup session.
  114 +
  115 + H3270 * hSession = v3270_get_session(terminal);
  116 +
  117 + if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_CONNECT_ON_STARTUP))
  118 + g_idle_add((GSourceFunc) bg_auto_connect, terminal);
  119 +
  120 + return page;
  121 +
  122 + }
  123 +
  124 + GtkWidget * pw3270_terminal_new(GtkWidget *widget) {
  125 +
  126 + g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),NULL);
  127 +
  128 + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget);
  129 + GtkWidget * terminal = v3270_new();
  130 +
  131 + append_terminal_page(window,terminal);
  132 +
84 133 return terminal;
85 134  
86 135 }
87 136  
  137 + gint pw3270_window_append_page(GtkWidget *widget, GFile * file) {
  138 +
  139 + g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),-1);
  140 +
  141 + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget);
  142 + GtkWidget * terminal = v3270_new();
  143 +
  144 + // Identify argument.
  145 + g_autofree gchar * scheme = g_file_get_uri_scheme(file);
  146 +
  147 + if(!(g_ascii_strcasecmp(scheme,"tn3270") && g_ascii_strcasecmp(scheme,"tn3270s"))) {
  148 +
  149 + // Is a 3270 URL.
  150 + g_autofree gchar * uri = g_file_get_uri(file);
  151 + size_t sz = strlen(uri);
  152 +
  153 + if(sz > 0 && uri[sz-1] == '/')
  154 + uri[sz-1] = 0;
  155 +
  156 + v3270_set_url(terminal,uri);
  157 +
  158 + } else {
  159 +
  160 + g_message("Unexpected URI scheme: \"%s\"",scheme);
  161 +
  162 + }
  163 +
  164 + return append_terminal_page(window, terminal);
  165 +
  166 + }
  167 +
  168 +
... ...
src/objects/window/testprogram/testprogram.c
... ... @@ -63,6 +63,11 @@ GtkWidget * pw3270_toolbar_new(void) {
63 63  
64 64 GtkToolItem * button = gtk_tool_button_new(gtk_image_new_from_icon_name(itens[item].icon,GTK_ICON_SIZE_LARGE_TOOLBAR),itens[item].label);
65 65 gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(button),TRUE);
  66 +
  67 + gtk_widget_set_can_focus(GTK_WIDGET(button),FALSE);
  68 + gtk_widget_set_can_default(GTK_WIDGET(button),FALSE);
  69 + gtk_widget_set_focus_on_click(GTK_WIDGET(button),FALSE);
  70 +
66 71 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button, -1);
67 72  
68 73 }
... ...
src/objects/window/window.c
... ... @@ -56,7 +56,6 @@
56 56 GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0));
57 57  
58 58 widget->notebook = GTK_NOTEBOOK(gtk_notebook_new());
59   - widget->terminal = pw3270_terminal_new(GTK_WIDGET(widget));
60 59 widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new());
61 60  
62 61 gtk_notebook_set_show_tabs(widget->notebook,FALSE);
... ... @@ -102,7 +101,8 @@
102 101 gtk_header_bar_set_show_close_button(header,TRUE);
103 102  
104 103 gtk_header_bar_set_title(header,title);
105   - gtk_header_bar_set_subtitle(header,_("Disconnected from host"));
  104 + // gtk_header_bar_set_subtitle(header,_("Disconnected from host"));
  105 + gtk_header_bar_set_has_subtitle(header,TRUE);
106 106  
107 107 // Create gear button
108 108 // https://wiki.gnome.org/Initiatives/GnomeGoals/GearIcons
... ... @@ -133,7 +133,37 @@
133 133  
134 134 }
135 135  
  136 + // Setup and show main window
  137 + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(window),TRUE);
  138 +
  139 + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  140 + gtk_window_set_default_size (GTK_WINDOW (window), 800, 500);
  141 +
136 142 return GTK_WIDGET(window);
137 143  
138 144 }
139 145  
  146 + void pw3270_window_set_current_page(GtkWidget *window, gint page_num) {
  147 +
  148 + g_return_if_fail(PW3270_IS_APPLICATION_WINDOW(window));
  149 +
  150 + GtkNotebook * notebook = PW3270_APPLICATION_WINDOW(window)->notebook;
  151 +
  152 + debug("Selecting tab %d", page_num);
  153 +
  154 + gtk_notebook_set_current_page(notebook, page_num);
  155 + gtk_widget_grab_focus(gtk_notebook_get_nth_page(notebook, page_num));
  156 +
  157 + }
  158 +
  159 + void pw3270_window_set_subtitle(GtkWidget *window, const gchar *subtitle) {
  160 +
  161 + g_return_if_fail(PW3270_IS_APPLICATION_WINDOW(window));
  162 +
  163 + GtkWidget * title_bar = gtk_window_get_titlebar(GTK_WINDOW(window));
  164 +
  165 + if(title_bar && GTK_IS_HEADER_BAR(title_bar) && gtk_header_bar_get_has_subtitle(GTK_HEADER_BAR(title_bar))) {
  166 + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(title_bar), subtitle);
  167 + }
  168 +
  169 + }
... ...