diff --git a/src/include/pw3270/window.h b/src/include/pw3270/window.h index f9629e2..60fb9a9 100644 --- a/src/include/pw3270/window.h +++ b/src/include/pw3270/window.h @@ -68,6 +68,15 @@ /// @brief Get the active session handle. H3270 * pw3270_window_get_session_handle(GtkWidget *window); + /// @brief Switches to the page number page_num. + void pw3270_window_set_current_page(GtkWidget *window, gint page_num); + + /// @brief Appends a new terminal to window. + gint pw3270_window_append_page(GtkWidget *window, GFile *file); + + /// @brief Set window sub-title (If enabled). + void pw3270_window_set_subtitle(GtkWidget *window, const gchar *subtitle); + G_END_DECLS diff --git a/src/objects/window/application.c b/src/objects/window/application.c index fb9ea15..86e1c28 100644 --- a/src/objects/window/application.c +++ b/src/objects/window/application.c @@ -42,9 +42,9 @@ GtkApplication parent; }; - static void startup(GApplication * application); - static void activate(GApplication * application); - static void open(GApplication * application, GFile **files, gint n_files, const gchar *hint); + static void startup(GApplication * application); + static void activate(GApplication * application); + static void open(GApplication * application, GFile **files, gint n_files, const gchar *hint); G_DEFINE_TYPE(pw3270Application, pw3270Application, GTK_TYPE_APPLICATION); @@ -152,26 +152,39 @@ GtkWidget * window = pw3270_application_window_new(GTK_APPLICATION(application)); - gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(window),TRUE); - // Create terminal widget pw3270_terminal_new(window); - pw3270_terminal_new(window); - - // Setup and show main window - gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); - gtk_window_set_default_size (GTK_WINDOW (window), 800, 500); - // gtk_widget_show_all(window); + // Present the new window gtk_window_present(GTK_WINDOW(window)); + pw3270_window_set_current_page(window,0); } void open(GApplication *application, GFile **files, gint n_files, const gchar *hint) { + GtkWindow * window = gtk_application_get_active_window(GTK_APPLICATION(application)); + + debug("%s was called with %d files (active_window=%p)", __FUNCTION__, n_files, window); + + if(!window) + window = GTK_WINDOW(pw3270_application_window_new(GTK_APPLICATION(application))); + + // Add tabs to the window + gint file; + gint last = -1; + + for(file = 0; file < n_files; file++) { + last = pw3270_window_append_page(GTK_WIDGET(window), files[file]); + } + + gtk_window_present(window); + + if(last != -1) + pw3270_window_set_current_page(GTK_WIDGET(window),last); + } PW3270_UI_TYPE pw3270_application_get_ui_type(GApplication *app) { return PW3270_UI_STYLE_GNOME; } - diff --git a/src/objects/window/private.h b/src/objects/window/private.h index d5bd0d8..20aa4cf 100644 --- a/src/objects/window/private.h +++ b/src/objects/window/private.h @@ -50,7 +50,6 @@ GtkApplicationWindow parent; - GtkWidget * terminal; GtkNotebook * notebook; GtkToolbar * toolbar; diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index a61b7b2..177a0d6 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -29,6 +29,7 @@ #include "private.h" #include + #include static void session_changed(GtkWidget *terminal, GtkWidget *label) { @@ -40,7 +41,7 @@ pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(toplevel); - if(window->terminal == terminal) { + if(gtk_widget_has_default(terminal)) { g_autofree gchar * title = v3270_get_session_title(terminal); gtk_window_set_title(GTK_WINDOW(window), title); } @@ -49,39 +50,119 @@ } - static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent *event, pw3270ApplicationWindow * window) { + static gboolean on_terminal_focus(GtkWidget *terminal, GdkEvent *event, GtkWindow * window) { - // Store the active terminal widget. - window->terminal = terminal; + // Store the active terminal widget. + gtk_widget_grab_default(terminal); + debug("Terminal %p is now default",terminal); // Change window title g_autofree gchar * title = v3270_get_session_title(terminal); - gtk_window_set_title(GTK_WINDOW(window), title); + gtk_window_set_title(window, title); + + pw3270_window_set_subtitle(GTK_WIDGET(window), v3270_is_connected(terminal) ? _("Connected to host") : _("Disconnected from host")); return FALSE; } - GtkWidget * pw3270_terminal_new(GtkWidget *widget) { + static gboolean bg_auto_connect(GtkWidget *terminal) { + v3270_reconnect(terminal); + return FALSE; + } - g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),NULL); + static void disconnected(GtkWidget *terminal, GtkWindow * window) { + + debug("%s",__FUNCTION__); + + if(terminal != gtk_window_get_default_widget(window)) + return; + + pw3270_window_set_subtitle(GTK_WIDGET(window), _("Disconnected from host")); + + } + + static void connected(GtkWidget *terminal, const gchar *host, GtkWindow * window) { + + debug("%s(%s)",__FUNCTION__,host); + + if(terminal != gtk_window_get_default_widget(window)) + return; + + pw3270_window_set_subtitle(GTK_WIDGET(window), _("Connected to host")); + + } + + static gint append_terminal_page(pw3270ApplicationWindow * window, GtkWidget * terminal) { - pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); - GtkWidget * terminal = v3270_new(); GtkWidget * label = gtk_label_new(v3270_get_session_name(terminal)); - g_signal_connect(G_OBJECT(terminal), "focus-in-event", G_CALLBACK(on_terminal_focus), widget); + g_signal_connect(G_OBJECT(terminal), "focus-in-event", G_CALLBACK(on_terminal_focus), window); g_signal_connect(G_OBJECT(terminal), "session_changed", G_CALLBACK(session_changed),label); + g_signal_connect(G_OBJECT(terminal),"disconnected",G_CALLBACK(disconnected),window); + g_signal_connect(G_OBJECT(terminal),"connected",G_CALLBACK(connected),window); gtk_widget_show_all(terminal); gtk_widget_show_all(label); - gtk_notebook_append_page(window->notebook,terminal,label); - gtk_notebook_set_show_tabs(window->notebook,gtk_notebook_get_n_pages(GTK_NOTEBOOK(window->notebook)) > 1); + gint page = gtk_notebook_append_page(window->notebook,terminal,label); + gtk_notebook_set_show_tabs(window->notebook,gtk_notebook_get_n_pages(window->notebook) > 1); gtk_notebook_set_tab_detachable(window->notebook,terminal,TRUE); gtk_notebook_set_tab_reorderable(window->notebook,terminal,TRUE); + // Setup session. + + H3270 * hSession = v3270_get_session(terminal); + + if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_CONNECT_ON_STARTUP)) + g_idle_add((GSourceFunc) bg_auto_connect, terminal); + + return page; + + } + + GtkWidget * pw3270_terminal_new(GtkWidget *widget) { + + g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),NULL); + + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); + GtkWidget * terminal = v3270_new(); + + append_terminal_page(window,terminal); + return terminal; } + gint pw3270_window_append_page(GtkWidget *widget, GFile * file) { + + g_return_val_if_fail(PW3270_IS_APPLICATION_WINDOW(widget),-1); + + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget); + GtkWidget * terminal = v3270_new(); + + // Identify argument. + g_autofree gchar * scheme = g_file_get_uri_scheme(file); + + if(!(g_ascii_strcasecmp(scheme,"tn3270") && g_ascii_strcasecmp(scheme,"tn3270s"))) { + + // Is a 3270 URL. + g_autofree gchar * uri = g_file_get_uri(file); + size_t sz = strlen(uri); + + if(sz > 0 && uri[sz-1] == '/') + uri[sz-1] = 0; + + v3270_set_url(terminal,uri); + + } else { + + g_message("Unexpected URI scheme: \"%s\"",scheme); + + } + + return append_terminal_page(window, terminal); + + } + + diff --git a/src/objects/window/testprogram/testprogram.c b/src/objects/window/testprogram/testprogram.c index 7337a5f..b080c36 100644 --- a/src/objects/window/testprogram/testprogram.c +++ b/src/objects/window/testprogram/testprogram.c @@ -63,6 +63,11 @@ GtkWidget * pw3270_toolbar_new(void) { GtkToolItem * button = gtk_tool_button_new(gtk_image_new_from_icon_name(itens[item].icon,GTK_ICON_SIZE_LARGE_TOOLBAR),itens[item].label); gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(button),TRUE); + + gtk_widget_set_can_focus(GTK_WIDGET(button),FALSE); + gtk_widget_set_can_default(GTK_WIDGET(button),FALSE); + gtk_widget_set_focus_on_click(GTK_WIDGET(button),FALSE); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button, -1); } diff --git a/src/objects/window/window.c b/src/objects/window/window.c index 5bf7c81..cb1fa81 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -56,7 +56,6 @@ GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0)); widget->notebook = GTK_NOTEBOOK(gtk_notebook_new()); - widget->terminal = pw3270_terminal_new(GTK_WIDGET(widget)); widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new()); gtk_notebook_set_show_tabs(widget->notebook,FALSE); @@ -102,7 +101,8 @@ gtk_header_bar_set_show_close_button(header,TRUE); gtk_header_bar_set_title(header,title); - gtk_header_bar_set_subtitle(header,_("Disconnected from host")); + // gtk_header_bar_set_subtitle(header,_("Disconnected from host")); + gtk_header_bar_set_has_subtitle(header,TRUE); // Create gear button // https://wiki.gnome.org/Initiatives/GnomeGoals/GearIcons @@ -133,7 +133,37 @@ } + // Setup and show main window + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(window),TRUE); + + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); + gtk_window_set_default_size (GTK_WINDOW (window), 800, 500); + return GTK_WIDGET(window); } + void pw3270_window_set_current_page(GtkWidget *window, gint page_num) { + + g_return_if_fail(PW3270_IS_APPLICATION_WINDOW(window)); + + GtkNotebook * notebook = PW3270_APPLICATION_WINDOW(window)->notebook; + + debug("Selecting tab %d", page_num); + + gtk_notebook_set_current_page(notebook, page_num); + gtk_widget_grab_focus(gtk_notebook_get_nth_page(notebook, page_num)); + + } + + void pw3270_window_set_subtitle(GtkWidget *window, const gchar *subtitle) { + + g_return_if_fail(PW3270_IS_APPLICATION_WINDOW(window)); + + GtkWidget * title_bar = gtk_window_get_titlebar(GTK_WINDOW(window)); + + if(title_bar && GTK_IS_HEADER_BAR(title_bar) && gtk_header_bar_get_has_subtitle(GTK_HEADER_BAR(title_bar))) { + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(title_bar), subtitle); + } + + } -- libgit2 0.21.2