From d008acb5f0b13d5faa725988972959c497b2e6cb Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Tue, 29 Oct 2019 13:54:23 -0300 Subject: [PATCH] Refactoring window & application actions. --- Makefile.in | 2 ++ pw3270.cbp | 19 ++++++++++++++++--- src/objects/application/actions/about.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/application/actions/preferences.c | 38 ++++++++++++++++++++++++++++++++++++++ src/objects/application/actions/window.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/application/application.c | 334 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/application/private.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/window/actions/about.c | 128 -------------------------------------------------------------------------------------------------------------------------------- src/objects/window/actions/close.c | 37 +++++++++++++++++++++++++++++++++++++ src/objects/window/actions/open.c | 37 +++++++++++++++++++++++++++++++++++++ src/objects/window/actions/preferences.c | 37 +++++++++++++++++++++++++++++++++++++ src/objects/window/actions/window.c | 71 ----------------------------------------------------------------------- src/objects/window/application.c | 341 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/objects/window/private.h | 8 +++----- src/objects/window/window.c | 6 +++--- 15 files changed, 763 insertions(+), 551 deletions(-) create mode 100644 src/objects/application/actions/about.c create mode 100644 src/objects/application/actions/preferences.c create mode 100644 src/objects/application/actions/window.c create mode 100644 src/objects/application/application.c create mode 100644 src/objects/application/private.h delete mode 100644 src/objects/window/actions/about.c create mode 100644 src/objects/window/actions/close.c create mode 100644 src/objects/window/actions/open.c create mode 100644 src/objects/window/actions/preferences.c delete mode 100644 src/objects/window/actions/window.c delete mode 100644 src/objects/window/application.c diff --git a/Makefile.in b/Makefile.in index 0655d04..d870f95 100644 --- a/Makefile.in +++ b/Makefile.in @@ -33,6 +33,8 @@ INSTALL_PACKAGES=@INSTALL_PACKAGES@ SOURCES= \ $(wildcard src/objects/actions/*.c) \ $(wildcard src/objects/actions/lib3270/*.c) \ + $(wildcard src/objects/application/*.c) \ + $(wildcard src/objects/application/actions/*.c) \ $(wildcard src/objects/window/*.c) \ $(wildcard src/objects/window/actions/*.c) \ $(wildcard src/objects/terminal/*.c) \ diff --git a/pw3270.cbp b/pw3270.cbp index 0855b26..5b99b7f 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -79,6 +79,19 @@ + + + + + + + + + @@ -89,13 +102,13 @@ - + - + - + diff --git a/src/objects/application/actions/about.c b/src/objects/application/actions/about.c new file mode 100644 index 0000000..a77a795 --- /dev/null +++ b/src/objects/application/actions/about.c @@ -0,0 +1,128 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "../private.h" + #include + + void pw3270_application_about_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { + + static const gchar *authors[] = + { + "Perry Werneck ", + "Paul Mattes ", + "Georgia Tech Research Corporation (GTRC)", + "and others", + NULL + }; + + static const gchar *license = + N_( "This program is free software; you can redistribute it and/or " + "modify it under the terms of the GNU General Public License as " + "published by the Free Software Foundation; either version 2 of the " + "License, or (at your option) any later version.\n\n" + "This program is distributed in the hope that it will be useful, " + "but WITHOUT ANY WARRANTY; without even the implied warranty of " + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " + "GNU General Public License for more details.\n\n" + "You should have received a copy of the GNU General Public License " + "along with this program; if not, write to the Free Software " + "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 " + "USA" ); + + GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); + + // Associate with the window + { + GtkWindow * window = gtk_application_get_active_window(GTK_APPLICATION(application)); + if(window) { + gtk_window_set_transient_for(GTK_WINDOW(dialog), window); + } + } + + // Get application logo + { + lib3270_autoptr(char) logo = lib3270_build_data_filename(G_STRINGIFY(PRODUCT_NAME) "-logo.png",NULL); + + if(g_file_test(logo,G_FILE_TEST_EXISTS)) { + GError * error = NULL; + GdkPixbuf * pix = gdk_pixbuf_new_from_file(logo,&error); + + gtk_about_dialog_set_logo(dialog,pix); + + if(pix) { + + g_object_unref(pix); + + } else { + + g_warning("Can't load %s: %s",logo,error->message); + g_error_free(error); + + } + + } else { + + g_message("%s: %s",logo,strerror(ENOENT)); + + } + + } + + // Set version + { +#ifdef PACKAGE_RELEASE + g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,G_STRINGIFY(PACKAGE_RELEASE)); +#else + g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,G_STRINGIFY(BUILD_DATE)); +#endif // PACKAGE_REVISION + + gtk_about_dialog_set_version(dialog,version); + } + + // Set comments + { + g_autofree gchar * comments = g_strdup_printf(_( "3270 terminal emulator for GTK %d.%d" ),GTK_MAJOR_VERSION,GTK_MINOR_VERSION); + gtk_about_dialog_set_comments(dialog, comments); + } + + gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." ); + gtk_about_dialog_set_license(dialog, gettext( license ) ); + gtk_about_dialog_set_wrap_license(dialog,TRUE); + gtk_about_dialog_set_website(dialog,"https://portal.softwarepublico.gov.br/social/pw3270/"); + gtk_about_dialog_set_website_label(dialog,_( "Brazilian Public Software Portal" )); + gtk_about_dialog_set_authors(dialog,authors); + gtk_about_dialog_set_translator_credits(dialog,_("translator-credits")); + + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); + gtk_widget_show_all(GTK_WIDGET(dialog)); + + + } + diff --git a/src/objects/application/actions/preferences.c b/src/objects/application/actions/preferences.c new file mode 100644 index 0000000..812635f --- /dev/null +++ b/src/objects/application/actions/preferences.c @@ -0,0 +1,38 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "../private.h" + #include + + void pw3270_application_preferences_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { + + debug("%s",__FUNCTION__); + + } + diff --git a/src/objects/application/actions/window.c b/src/objects/application/actions/window.c new file mode 100644 index 0000000..65ff5c4 --- /dev/null +++ b/src/objects/application/actions/window.c @@ -0,0 +1,71 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + * References: + * + * https://fossies.org/linux/gtk+/examples/plugman.c + * + */ + + #include "../private.h" + #include + + + void pw3270_application_quit_activated(GSimpleAction * action, GVariant *parameter, gpointer application) { + + g_print("Exiting application\n"); + + /* + GList *list = gtk_application_get_windows(GTK_APPLICATION(application)); + + while(list) { + + GtkWidget * window = GTK_WIDGET(list->data); + list = list->next; + + gtk_widget_destroy(window); + + } + */ + + g_application_quit(G_APPLICATION(application)); + + } + + void pw3270_application_new_tab_activated(GSimpleAction * action, GVariant *parameter, gpointer application) { + + debug("%s",__FUNCTION__); + pw3270_terminal_new(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application)))); + + } + + void pw3270_application_new_window_activated(GSimpleAction * action, GVariant *parameter, gpointer application) { + + debug("%s",__FUNCTION__); + g_application_activate(application); + + } diff --git a/src/objects/application/application.c b/src/objects/application/application.c new file mode 100644 index 0000000..b7ffb2d --- /dev/null +++ b/src/objects/application/application.c @@ -0,0 +1,334 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + * References: + * + * https://fossies.org/linux/gtk+/examples/plugman.c + * + */ + + #include "private.h" + #include + + enum { + PROP_ZERO, + PROP_UI_STYLE, + + NUM_PROPERTIES + }; + + static GParamSpec * props[NUM_PROPERTIES]; + + struct _pw3270ApplicationClass { + GtkApplicationClass parent_class; + }; + + struct _pw3270Application { + GtkApplication parent; + + GSettings * settings; + + PW3270_UI_STYLE ui_style; + + }; + + 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 finalize(GObject *object); + + G_DEFINE_TYPE(pw3270Application, pw3270Application, GTK_TYPE_APPLICATION); + + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { + + switch (prop_id) { + case PROP_UI_STYLE: + g_value_set_uint(value,pw3270_application_get_ui_style(G_APPLICATION(object))); + break; + + default: + g_assert_not_reached (); + } + + } + + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { + + switch (prop_id) { + case PROP_UI_STYLE: + pw3270_application_set_ui_style(G_APPLICATION(object),g_value_get_uint(value)); + break; + + default: + g_assert_not_reached (); + } + + } + + static void pw3270Application_class_init(pw3270ApplicationClass *klass) { + + GApplicationClass *application_class = G_APPLICATION_CLASS(klass); + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->get_property = get_property; + object_class->set_property = set_property; + object_class->finalize = finalize; + + application_class->startup = startup; + application_class->activate = activate; + application_class->open = open; + + props[PROP_UI_STYLE] = + g_param_spec_uint( + "ui-style", + _("UI Type"), + _("The code of the User interface type"), + PW3270_UI_STYLE_CLASSICAL, + PW3270_UI_STYLE_GNOME, +#ifdef _WIN32 + PW3270_UI_STYLE_CLASSICAL, +#else + PW3270_UI_STYLE_GNOME, +#endif // _WIN32 + G_PARAM_READABLE|G_PARAM_WRITABLE + ); + + + g_object_class_install_properties(object_class, NUM_PROPERTIES, props); + + } + + static void pw3270Application_init(pw3270Application *app) { + +#ifdef _WIN32 + app->ui_style = PW3270_UI_STYLE_CLASSICAL; +#else + app->ui_style = PW3270_UI_STYLE_GNOME; +#endif // _WIN32 + + // Get settings + { + g_autofree gchar * path = g_strconcat("/apps/" PACKAGE_NAME "/", g_get_application_name(),"/",NULL); + debug("path=%s",path); + +#ifdef DEBUG + GError * error = NULL; + GSettingsSchemaSource * source = + g_settings_schema_source_new_from_directory( + ".", + NULL, + TRUE, + &error + ); + + g_assert_no_error(error); + + GSettingsSchema * schema = + g_settings_schema_source_lookup( + source, + "br.com.bb." PACKAGE_NAME, + TRUE); + + g_settings_schema_source_unref(source); + + app->settings = g_settings_new_full(schema, NULL, path); + +#else + + app->settings = g_settings_new_with_path("br.com.bb." PACKAGE_NAME, path); + +#endif // DEBUG + + } + + // Bind properties + if(app->settings) { + g_object_ref_sink(G_OBJECT(app->settings)); + g_settings_bind(app->settings, "ui-style", app, "ui-style", G_SETTINGS_BIND_DEFAULT); + } + + } + + static void finalize(GObject *object) { + + pw3270Application * application = PW3270_APPLICATION(object); + + if(application->settings) { + g_object_unref(application->settings); + application->settings = NULL; + } + + + G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); + + } + + GtkApplication * pw3270_application_new(const gchar *application_id, GApplicationFlags flags) { + + return g_object_new( + PW3270_TYPE_APPLICATION, + "application-id", application_id, + "flags", flags, + NULL); + + } + + void startup(GApplication *application) { + + G_APPLICATION_CLASS(pw3270Application_parent_class)->startup(application); + + // + // Setup application default actions. + // + static GActionEntry actions[] = { + { + .name = "about", + .activate = pw3270_application_about_activated, + }, + + { + .name = "preferences", + .activate = pw3270_application_preferences_activated, + }, + + { + .name = "quit", + .activate = pw3270_application_quit_activated, + }, + + { + .name = "new.tab", + .activate = pw3270_application_new_tab_activated, + }, + + { + .name = "new.window", + .activate = pw3270_application_new_window_activated, + }, + + { + .name = "open", + .activate = pw3270_application_generic_activated, + }, + + { + .name = "open.tab", + .activate = pw3270_application_generic_activated, + }, + + { + .name = "open.window", + .activate = pw3270_application_generic_activated, + }, + }; + + g_action_map_add_action_entries( + G_ACTION_MAP(application), + actions, + G_N_ELEMENTS(actions), + application + ); + + // + // Setup application menus + // + GtkBuilder * builder = gtk_builder_new_from_file("ui/application.xml"); + + if(gtk_application_prefers_app_menu(GTK_APPLICATION(application))) + gtk_application_set_app_menu(GTK_APPLICATION (application), G_MENU_MODEL(gtk_builder_get_object (builder, "app-menu"))); + + if(pw3270_application_get_ui_style(application) == PW3270_UI_STYLE_CLASSICAL) + gtk_application_set_menubar(GTK_APPLICATION (application), G_MENU_MODEL(gtk_builder_get_object (builder, "menubar"))); + + g_object_unref(builder); + + } + + void activate(GApplication *application) { + + GtkWidget * window = pw3270_application_window_new(GTK_APPLICATION(application)); + + // Create terminal widget + pw3270_terminal_new(window); + pw3270_window_set_current_page(window,0); + + // Present the new window + gtk_window_present(GTK_WINDOW(window)); + + } + + void open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*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); + + } + + void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type) { + + g_return_if_fail(PW3270_IS_APPLICATION(app)); + + pw3270Application * application = PW3270_APPLICATION(app); + + if(application->ui_style == type) + return; + + application->ui_style = type; + g_object_notify_by_pspec(G_OBJECT(app), props[PROP_UI_STYLE]); + + } + + PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app) { + + g_return_val_if_fail(PW3270_IS_APPLICATION(app),PW3270_UI_STYLE_CLASSICAL); + return PW3270_APPLICATION(app)->ui_style; + + } + + GSettings * pw3270_application_get_settings(GApplication *app) { + + g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL); + return PW3270_APPLICATION(app)->settings; + + } diff --git a/src/objects/application/private.h b/src/objects/application/private.h new file mode 100644 index 0000000..e7285c1 --- /dev/null +++ b/src/objects/application/private.h @@ -0,0 +1,57 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +#ifndef PRIVATE_H_INCLUDED + + #define PRIVATE_H_INCLUDED + + #include + + #ifndef GETTEXT_PACKAGE + #define GETTEXT_PACKAGE PACKAGE_NAME + #endif + + #include + #include + #include + + #include + #include + #include + #include + + // Actions + G_GNUC_INTERNAL void pw3270_application_generic_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_application_quit_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_application_new_tab_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_application_new_window_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_application_about_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_application_preferences_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + +#endif // PRIVATE_H_INCLUDED diff --git a/src/objects/window/actions/about.c b/src/objects/window/actions/about.c deleted file mode 100644 index a77a795..0000000 --- a/src/objects/window/actions/about.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin - * St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Este programa está nomeado como - e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * - */ - - #include "../private.h" - #include - - void pw3270_application_about_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { - - static const gchar *authors[] = - { - "Perry Werneck ", - "Paul Mattes ", - "Georgia Tech Research Corporation (GTRC)", - "and others", - NULL - }; - - static const gchar *license = - N_( "This program is free software; you can redistribute it and/or " - "modify it under the terms of the GNU General Public License as " - "published by the Free Software Foundation; either version 2 of the " - "License, or (at your option) any later version.\n\n" - "This program is distributed in the hope that it will be useful, " - "but WITHOUT ANY WARRANTY; without even the implied warranty of " - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " - "GNU General Public License for more details.\n\n" - "You should have received a copy of the GNU General Public License " - "along with this program; if not, write to the Free Software " - "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 " - "USA" ); - - GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); - - // Associate with the window - { - GtkWindow * window = gtk_application_get_active_window(GTK_APPLICATION(application)); - if(window) { - gtk_window_set_transient_for(GTK_WINDOW(dialog), window); - } - } - - // Get application logo - { - lib3270_autoptr(char) logo = lib3270_build_data_filename(G_STRINGIFY(PRODUCT_NAME) "-logo.png",NULL); - - if(g_file_test(logo,G_FILE_TEST_EXISTS)) { - GError * error = NULL; - GdkPixbuf * pix = gdk_pixbuf_new_from_file(logo,&error); - - gtk_about_dialog_set_logo(dialog,pix); - - if(pix) { - - g_object_unref(pix); - - } else { - - g_warning("Can't load %s: %s",logo,error->message); - g_error_free(error); - - } - - } else { - - g_message("%s: %s",logo,strerror(ENOENT)); - - } - - } - - // Set version - { -#ifdef PACKAGE_RELEASE - g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,G_STRINGIFY(PACKAGE_RELEASE)); -#else - g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,G_STRINGIFY(BUILD_DATE)); -#endif // PACKAGE_REVISION - - gtk_about_dialog_set_version(dialog,version); - } - - // Set comments - { - g_autofree gchar * comments = g_strdup_printf(_( "3270 terminal emulator for GTK %d.%d" ),GTK_MAJOR_VERSION,GTK_MINOR_VERSION); - gtk_about_dialog_set_comments(dialog, comments); - } - - gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." ); - gtk_about_dialog_set_license(dialog, gettext( license ) ); - gtk_about_dialog_set_wrap_license(dialog,TRUE); - gtk_about_dialog_set_website(dialog,"https://portal.softwarepublico.gov.br/social/pw3270/"); - gtk_about_dialog_set_website_label(dialog,_( "Brazilian Public Software Portal" )); - gtk_about_dialog_set_authors(dialog,authors); - gtk_about_dialog_set_translator_credits(dialog,_("translator-credits")); - - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); - gtk_widget_show_all(GTK_WIDGET(dialog)); - - - } - diff --git a/src/objects/window/actions/close.c b/src/objects/window/actions/close.c new file mode 100644 index 0000000..2e81363 --- /dev/null +++ b/src/objects/window/actions/close.c @@ -0,0 +1,37 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "../private.h" + + void pw3270_window_close_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { + + debug("%s",__FUNCTION__); + + } + diff --git a/src/objects/window/actions/open.c b/src/objects/window/actions/open.c new file mode 100644 index 0000000..f2bf091 --- /dev/null +++ b/src/objects/window/actions/open.c @@ -0,0 +1,37 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "../private.h" + + void pw3270_window_open_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { + + debug("%s",__FUNCTION__); + + } + diff --git a/src/objects/window/actions/preferences.c b/src/objects/window/actions/preferences.c new file mode 100644 index 0000000..5fb5f8e --- /dev/null +++ b/src/objects/window/actions/preferences.c @@ -0,0 +1,37 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "../private.h" + + void pw3270_window_preferences_activated(GSimpleAction G_GNUC_UNUSED(* action), GVariant G_GNUC_UNUSED(*parameter), gpointer application) { + + debug("%s",__FUNCTION__); + + } + diff --git a/src/objects/window/actions/window.c b/src/objects/window/actions/window.c deleted file mode 100644 index 65ff5c4..0000000 --- a/src/objects/window/actions/window.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin - * St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Este programa está nomeado como - e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * - * References: - * - * https://fossies.org/linux/gtk+/examples/plugman.c - * - */ - - #include "../private.h" - #include - - - void pw3270_application_quit_activated(GSimpleAction * action, GVariant *parameter, gpointer application) { - - g_print("Exiting application\n"); - - /* - GList *list = gtk_application_get_windows(GTK_APPLICATION(application)); - - while(list) { - - GtkWidget * window = GTK_WIDGET(list->data); - list = list->next; - - gtk_widget_destroy(window); - - } - */ - - g_application_quit(G_APPLICATION(application)); - - } - - void pw3270_application_new_tab_activated(GSimpleAction * action, GVariant *parameter, gpointer application) { - - debug("%s",__FUNCTION__); - pw3270_terminal_new(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application)))); - - } - - void pw3270_application_new_window_activated(GSimpleAction * action, GVariant *parameter, gpointer application) { - - debug("%s",__FUNCTION__); - g_application_activate(application); - - } diff --git a/src/objects/window/application.c b/src/objects/window/application.c deleted file mode 100644 index 91d2847..0000000 --- a/src/objects/window/application.c +++ /dev/null @@ -1,341 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin - * St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Este programa está nomeado como - e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * - * References: - * - * https://fossies.org/linux/gtk+/examples/plugman.c - * - */ - - #include "private.h" - #include - - enum { - PROP_ZERO, - PROP_UI_STYLE, - - NUM_PROPERTIES - }; - - static GParamSpec * props[NUM_PROPERTIES]; - - struct _pw3270ApplicationClass { - GtkApplicationClass parent_class; - }; - - struct _pw3270Application { - GtkApplication parent; - - GSettings * settings; - - PW3270_UI_STYLE ui_style; - - }; - - 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 finalize(GObject *object); - - G_DEFINE_TYPE(pw3270Application, pw3270Application, GTK_TYPE_APPLICATION); - - static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - - switch (prop_id) { - case PROP_UI_STYLE: - g_value_set_uint(value,pw3270_application_get_ui_style(G_APPLICATION(object))); - break; - - default: - g_assert_not_reached (); - } - - } - - static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - - switch (prop_id) { - case PROP_UI_STYLE: - pw3270_application_set_ui_style(G_APPLICATION(object),g_value_get_uint(value)); - break; - - default: - g_assert_not_reached (); - } - - } - - static void pw3270Application_class_init(pw3270ApplicationClass *klass) { - - GApplicationClass *application_class = G_APPLICATION_CLASS(klass); - GObjectClass *object_class = G_OBJECT_CLASS(klass); - - object_class->get_property = get_property; - object_class->set_property = set_property; - object_class->finalize = finalize; - - application_class->startup = startup; - application_class->activate = activate; - application_class->open = open; - - props[PROP_UI_STYLE] = - g_param_spec_uint( - "ui-style", - _("UI Type"), - _("The code of the User interface type"), - PW3270_UI_STYLE_CLASSICAL, - PW3270_UI_STYLE_GNOME, -#ifdef _WIN32 - PW3270_UI_STYLE_CLASSICAL, -#else - PW3270_UI_STYLE_GNOME, -#endif // _WIN32 - G_PARAM_READABLE|G_PARAM_WRITABLE - ); - - - g_object_class_install_properties(object_class, NUM_PROPERTIES, props); - - } - - static void pw3270Application_init(pw3270Application *app) { - -#ifdef _WIN32 - app->ui_style = PW3270_UI_STYLE_CLASSICAL; -#else - app->ui_style = PW3270_UI_STYLE_GNOME; -#endif // _WIN32 - - // Get settings - { - g_autofree gchar * path = g_strconcat("/apps/" PACKAGE_NAME "/", g_get_application_name(),"/",NULL); - debug("path=%s",path); - -#ifdef DEBUG - GError * error = NULL; - GSettingsSchemaSource * source = - g_settings_schema_source_new_from_directory( - ".", - NULL, - TRUE, - &error - ); - - g_assert_no_error(error); - - GSettingsSchema * schema = - g_settings_schema_source_lookup( - source, - "br.com.bb." PACKAGE_NAME, - TRUE); - - g_settings_schema_source_unref(source); - - app->settings = g_settings_new_full(schema, NULL, path); - -#else - - app->settings = g_settings_new_with_path("br.com.bb." PACKAGE_NAME, path); - -#endif // DEBUG - - } - - // Bind properties - if(app->settings) { - g_object_ref_sink(G_OBJECT(app->settings)); - g_settings_bind(app->settings, "ui-style", app, "ui-style", G_SETTINGS_BIND_DEFAULT); - } - - } - - static void finalize(GObject *object) { - - pw3270Application * application = PW3270_APPLICATION(object); - - if(application->settings) { - g_object_unref(application->settings); - application->settings = NULL; - } - - - G_OBJECT_CLASS(pw3270Application_parent_class)->finalize(object); - - } - - GtkApplication * pw3270_application_new(const gchar *application_id, GApplicationFlags flags) { - - return g_object_new( - PW3270_TYPE_APPLICATION, - "application-id", application_id, - "flags", G_APPLICATION_HANDLES_OPEN, - NULL); - - } - - void startup(GApplication *application) { - - G_APPLICATION_CLASS(pw3270Application_parent_class)->startup(application); - - // - // Setup application default actions. - // - static GActionEntry actions[] = { - { - .name = "about", - .activate = pw3270_application_about_activated, - }, - - { - .name = "preferences", - .activate = pw3270_application_generic_activated, - }, - - { - .name = "quit", - .activate = pw3270_application_quit_activated, - }, - - { - .name = "new.tab", - .activate = pw3270_application_new_tab_activated, - }, - - { - .name = "new.window", - .activate = pw3270_application_new_window_activated, - }, - - { - .name = "open", - .activate = pw3270_application_generic_activated, - }, - - { - .name = "open.tab", - .activate = pw3270_application_generic_activated, - }, - - { - .name = "open.window", - .activate = pw3270_application_generic_activated, - }, - }; - - g_action_map_add_action_entries( - G_ACTION_MAP(application), - actions, - G_N_ELEMENTS(actions), - application - ); - - // - // Setup application menus - // - GtkBuilder * builder = gtk_builder_new_from_file("ui/application.xml"); - - if(gtk_application_prefers_app_menu(GTK_APPLICATION(application))) - gtk_application_set_app_menu(GTK_APPLICATION (application), G_MENU_MODEL(gtk_builder_get_object (builder, "app-menu"))); - - if(pw3270_application_get_ui_style(application) == PW3270_UI_STYLE_CLASSICAL) - gtk_application_set_menubar(GTK_APPLICATION (application), G_MENU_MODEL(gtk_builder_get_object (builder, "menubar"))); - - g_object_unref(builder); - - } - - void activate(GApplication *application) { - - GtkWidget * window = pw3270_application_window_new(GTK_APPLICATION(application)); - - debug("%s","************************************************"); - debug("Action win.copy is %p",g_action_map_lookup_action(G_ACTION_MAP(window),"win.copy")); - debug("Action app.copy is %p",g_action_map_lookup_action(G_ACTION_MAP(window),"app.copy")); - debug("Action win.copy is %p",g_action_map_lookup_action(G_ACTION_MAP(application),"win.copy")); - debug("Action copy is %p",g_action_map_lookup_action(G_ACTION_MAP(application),"copy")); - debug("%s","************************************************"); - - // Create terminal widget - pw3270_terminal_new(window); - pw3270_window_set_current_page(window,0); - - // Present the new window - gtk_window_present(GTK_WINDOW(window)); - - } - - 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); - - } - - void pw3270_application_set_ui_style(GApplication *app, PW3270_UI_STYLE type) { - - g_return_if_fail(PW3270_IS_APPLICATION(app)); - - pw3270Application * application = PW3270_APPLICATION(app); - - if(application->ui_style == type) - return; - - application->ui_style = type; - g_object_notify_by_pspec(G_OBJECT(app), props[PROP_UI_STYLE]); - - } - - PW3270_UI_STYLE pw3270_application_get_ui_style(GApplication *app) { - - g_return_val_if_fail(PW3270_IS_APPLICATION(app),PW3270_UI_STYLE_CLASSICAL); - return PW3270_APPLICATION(app)->ui_style; - - } - - GSettings * pw3270_application_get_settings(GApplication *app) { - - g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL); - return PW3270_APPLICATION(app)->settings; - - } diff --git a/src/objects/window/private.h b/src/objects/window/private.h index 40cbf34..10fc5f8 100644 --- a/src/objects/window/private.h +++ b/src/objects/window/private.h @@ -65,10 +65,8 @@ G_GNUC_INTERNAL GtkWidget * pw3270_setup_image_button(GtkWidget *button, const gchar *image_name); // Actions - G_GNUC_INTERNAL void pw3270_application_generic_activated(GSimpleAction * action, GVariant *parameter, gpointer application); - G_GNUC_INTERNAL void pw3270_application_quit_activated(GSimpleAction * action, GVariant *parameter, gpointer application); - G_GNUC_INTERNAL void pw3270_application_new_tab_activated(GSimpleAction * action, GVariant *parameter, gpointer application); - G_GNUC_INTERNAL void pw3270_application_new_window_activated(GSimpleAction * action, GVariant *parameter, gpointer application); - G_GNUC_INTERNAL void pw3270_application_about_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_window_open_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_window_close_activated(GSimpleAction * action, GVariant *parameter, gpointer application); + G_GNUC_INTERNAL void pw3270_window_preferences_activated(GSimpleAction * action, GVariant *parameter, gpointer application); #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/window/window.c b/src/objects/window/window.c index 7f4e5e9..c592cf2 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -102,17 +102,17 @@ { .name = "open", - .activate = pw3270_application_generic_activated, + .activate = pw3270_window_open_activated, }, { .name = "close", - .activate = pw3270_application_generic_activated, + .activate = pw3270_window_close_activated, }, { .name = "preferences", - .activate = pw3270_application_generic_activated, + .activate = pw3270_window_preferences_activated, }, }; -- libgit2 0.21.2