diff --git a/Makefile.in b/Makefile.in
index cffdf87..87ea00b 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -38,6 +38,7 @@ SOURCES= \
$(wildcard src/objects/window/actions/*.c) \
$(wildcard src/objects/terminal/*.c) \
$(wildcard src/objects/toolbar/*.c) \
+ $(wildcard src/objects/settings/*.c) \
$(wildcard src/main/*.c) \
$(wildcard src/main/@OSNAME@/*.c) \
$(wildcard src/main/@OSNAME@/*.rc)
diff --git a/pw3270.cbp b/pw3270.cbp
index 5a3d824..e35998a 100644
--- a/pw3270.cbp
+++ b/pw3270.cbp
@@ -109,6 +109,12 @@
+
+
+
+
+
+
diff --git a/src/include/pw3270.h b/src/include/pw3270.h
index 936a1b8..b9c88c3 100644
--- a/src/include/pw3270.h
+++ b/src/include/pw3270.h
@@ -52,7 +52,8 @@
#define I_(string) g_intern_static_string (string)
- void pw3270_load_placeholders(GtkBuilder * builder);
+ void pw3270_load_placeholders(GtkBuilder * builder);
+ GtkWidget * pw3270_frame_new(GtkWidget * child, const gchar *title);
// Application settings widget
typedef struct _Pw3270SettingsPage Pw3270SettingsPage;
@@ -73,8 +74,6 @@
/// @brief Check if the terminal has a customized session file.
gboolean v3270_allow_custom_settings(GtkWidget *widget);
- GtkWidget * pw3270_settings_dialog_new(const gchar *title, GtkWindow *parent);
-
G_END_DECLS
#endif // PW3270_H_INCLUDED
diff --git a/src/include/pw3270/settings.h b/src/include/pw3270/settings.h
index 4fbbbac..95a5d30 100644
--- a/src/include/pw3270/settings.h
+++ b/src/include/pw3270/settings.h
@@ -27,24 +27,66 @@
*
*/
-/**
- * @brief Declares the pw3270 Application Settings widget.
- *
- */
+#ifndef PW3270SETTINGS_H_INCLUDED
+
+ #define PW3270SETTINGS_H_INCLUDED 1
+
+#ifdef _WIN32
+ #include
+#endif // _WIN32
+
+ #include
+
+ G_BEGIN_DECLS
+
+/*--[ PW3270 Settings Widget ]-----------------------------------------------------------------------*/
+
+ #define GTK_TYPE_PW3270_SETTINGS (PW3270Settings_get_type())
+ #define GTK_PW3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PW3270_SETTINGS, PW3270Settings))
+ #define GTK_PW3270_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PW3270_SETTINGS, PW3270SettingsClass))
+ #define GTK_IS_PW3270_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PW3270_SETTINGS))
+ #define GTK_IS_PW3270_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PW3270_SETTINGS))
+ #define GTK_PW3270_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PW3270_SETTINGS, PW3270SettingsClass))
+
+ typedef struct _PW3270SettingsPrivate PW3270SettingsPrivate;
+
+ typedef struct _PW3270Settings {
+
+ GtkGrid parent;
+
+ PW3270SettingsPrivate * settings; ///< @brief Private Data.
+ const gchar * label; ///< @brief Page lagel.
+ const gchar * title; ///< @brief Page title.
+
+ void (*load)(GtkWidget *widget, PW3270SettingsPrivate *settings); ///< @brief Method to load the properties from terminal widget
+ void (*apply)(GtkWidget *widget, PW3270SettingsPrivate *settings); ///< @brief Method for GTK_RESPONSE_APPLY
+ void (*revert)(GtkWidget *widget, PW3270SettingsPrivate *settings); ///< @brief Method for GTK_RESPONSE_CANCEL
+
+ } PW3270Settings;
+
+ typedef struct _PW3270SettingsClass {
+
+ GtkGridClass parent_class;
-#ifndef PW3270_SETTINGS_H_INCLUDED
+ } PW3270SettingsClass;
- #define PW3270_SETTINGS_H_INCLUDED
+ PW3270Settings * pw3270_settings_new();
- #include
- #include
+/*--[ PW3270 Settings Dialog ]-----------------------------------------------------------------------*/
- G_BEGIN_DECLS
+ #define GTK_TYPE_PW3270_SETTINGS_DIALOG (PW3270SettingsDialog_get_type())
+ #define GTK_PW3270_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PW3270_SETTINGS_DIALOG, PW3270SettingsDialog))
+ #define GTK_PW3270_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PW3270_SETTINGS_DIALOG, PW3270SettingsDialogClass))
+ #define GTK_IS_PW3270_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PW3270_SETTINGS_DIALOG))
+ #define GTK_IS_PW3270_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PW3270_SETTINGS_DIALOG))
+ #define GTK_PW3270_SETTINGS_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PW3270_SETTINGS_DIALOG, PW3270SettingsDialogClass))
- Pw3270SettingsPage * pw3270_toolbar_settings_new();
+ typedef struct _PW3270SettingsDialog PW3270SettingsDialog;
+ typedef struct _PW3270SettingsDialogClass PW3270SettingsDialogClass;
- GtkWidget * pw3270_frame_new(GtkWidget * child, const gchar *title);
+ GType PW3270SettingsDialog_get_type(void);
+ GtkWidget * pw3270_settings_dialog_new();
- G_END_DECLS
+ G_END_DECLS
-#endif // PW3270_SETTINGS_H_INCLUDED
+#endif // V3270SETTINGS_H_INCLUDED
diff --git a/src/include/pw3270/toolbar.h b/src/include/pw3270/toolbar.h
index f34e6cd..ec78991 100644
--- a/src/include/pw3270/toolbar.h
+++ b/src/include/pw3270/toolbar.h
@@ -55,6 +55,7 @@
GType pw3270ToolBar_get_type(void) G_GNUC_CONST;
GtkWidget * pw3270_toolbar_new(void);
+ GtkWidget * pw3270_toolbar_settings_new(void);
// GtkWidget * pw3270_toolbar_insert_lib3270_action(GtkWidget *toolbar, const LIB3270_ACTION *action, gint pos);
GtkWidget * pw3270_toolbar_insert_action(GtkWidget *toolbar, const gchar *name, gint pos);
diff --git a/src/main/tools.c b/src/main/tools.c
index 0638fea..b19061e 100644
--- a/src/main/tools.c
+++ b/src/main/tools.c
@@ -110,6 +110,7 @@
}
+ /*
GtkWidget * pw3270_settings_dialog_new(const gchar *title, GtkWindow *parent) {
gboolean use_header;
@@ -139,5 +140,6 @@
return dialog;
}
+ */
diff --git a/src/objects/actions/dialog.c b/src/objects/actions/dialog.c
index b0e2dad..094aeef 100644
--- a/src/objects/actions/dialog.c
+++ b/src/objects/actions/dialog.c
@@ -116,16 +116,18 @@ static void on_destroy(GtkWidget *dialog, PW3270DialogAction *action) {
if(action->dialog) {
GtkWindow * window = gtk_application_get_active_window(application);
+ pw3270_action_notify_enabled(G_ACTION(action));
+
if(window) {
+ gtk_window_set_destroy_with_parent(GTK_WINDOW(action->dialog), TRUE);
+ gtk_window_set_modal(GTK_WINDOW(action->dialog), TRUE);
gtk_window_set_attached_to(GTK_WINDOW(action->dialog), GTK_WIDGET(window));
gtk_window_set_transient_for(GTK_WINDOW(action->dialog),window);
+ g_signal_connect(action->dialog,"destroy",G_CALLBACK(on_destroy),action);
+ g_signal_connect(action->dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);
+ gtk_widget_show(GTK_WIDGET(action->dialog));
}
- pw3270_action_notify_enabled(G_ACTION(action));
- g_signal_connect(action->dialog,"destroy",G_CALLBACK(on_destroy),action);
- g_signal_connect(action->dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);
- gtk_widget_show(GTK_WIDGET(action->dialog));
-
}
}
diff --git a/src/objects/application/actions/preferences.c b/src/objects/application/actions/preferences.c
index b96f33c..0b26052 100644
--- a/src/objects/application/actions/preferences.c
+++ b/src/objects/application/actions/preferences.c
@@ -30,8 +30,40 @@
#include "../private.h"
#include
#include
+ #include
#include
+ #include
+ static GtkWidget * factory(PW3270Action G_GNUC_UNUSED(*action), GtkApplication G_GNUC_UNUSED(*application)) {
+
+ size_t ix;
+ GtkWidget * dialog = pw3270_settings_dialog_new();
+
+ GtkWidget * pages[] = {
+ pw3270_toolbar_settings_new()
+ };
+
+ for(ix = 0; ix < G_N_ELEMENTS(pages); ix++) {
+ gtk_container_add(GTK_CONTAINER(dialog),pages[ix]);
+ }
+
+ gtk_widget_show_all(dialog);
+ return dialog;
+
+ }
+
+ GAction * pw3270_preferences_action_new() {
+
+ PW3270Action * action = pw3270_dialog_action_new(factory);
+
+ action->name = "preferences";
+ action->label = _("Application preferences");
+ action->icon_name = "preferences-system";
+
+ return G_ACTION(action);
+ }
+
+ /*
typedef struct _Pw3270SettingsDialog {
GApplication * application;
GSimpleAction * action;
@@ -181,3 +213,4 @@
}
+*/
diff --git a/src/objects/application/application.c b/src/objects/application/application.c
index 2160bcb..b6174b7 100644
--- a/src/objects/application/application.c
+++ b/src/objects/application/application.c
@@ -377,7 +377,8 @@
*/
GAction * actions[] = {
- pw3270_about_action_new()
+ pw3270_about_action_new(),
+ pw3270_preferences_action_new()
};
for(ix = 0; ix < G_N_ELEMENTS(actions); ix++) {
diff --git a/src/objects/application/private.h b/src/objects/application/private.h
index edebd5a..d4c24ff 100644
--- a/src/objects/application/private.h
+++ b/src/objects/application/private.h
@@ -51,6 +51,7 @@
// Actions
G_GNUC_INTERNAL GAction * pw3270_about_action_new();
+ G_GNUC_INTERNAL GAction * pw3270_preferences_action_new();
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);
diff --git a/src/objects/settings/dialog.c b/src/objects/settings/dialog.c
new file mode 100644
index 0000000..4c29196
--- /dev/null
+++ b/src/objects/settings/dialog.c
@@ -0,0 +1,160 @@
+/*
+ * "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
+ #include
+ #include
+ #include
+
+ struct _PW3270SettingsDialog {
+ GtkDialog parent;
+ GtkNotebook * tabs;
+ gboolean has_subtitle;
+ };
+
+ struct _PW3270SettingsDialogClass {
+ GtkDialogClass parent_class;
+ };
+
+ G_DEFINE_TYPE(PW3270SettingsDialog, PW3270SettingsDialog, GTK_TYPE_DIALOG);
+
+ static void add(GtkContainer *container, GtkWidget *widget);
+ static void page_changed(GtkNotebook *notebook, GtkWidget *child, guint page_num, PW3270SettingsDialog *dialog);
+ static void switch_page(GtkNotebook *notebook, GtkWidget *settings, guint page_num, PW3270SettingsDialog *dialog);
+ static void dialog_close(GtkDialog *dialog);
+ static void response(GtkDialog *dialog, gint response_id);
+
+/*--[ Implement ]------------------------------------------------------------------------------------*/
+
+static void PW3270SettingsDialog_class_init(PW3270SettingsDialogClass *klass) {
+ GTK_CONTAINER_CLASS(klass)->add = add;
+ GTK_DIALOG_CLASS(klass)->close = dialog_close;
+ GTK_DIALOG_CLASS(klass)->response = response;
+}
+
+static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog)
+{
+ GtkWidget * content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+
+ // Get use of header bar.
+ g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &dialog->has_subtitle, NULL);
+
+ // https://developer.gnome.org/hig/stable/visual-layout.html.en
+ //gtk_box_set_spacing(GTK_BOX(content_area),18);
+ //gtk_container_set_border_width(GTK_CONTAINER(content_area),18);
+
+ gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
+ gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
+
+ gtk_dialog_add_buttons(
+ GTK_DIALOG(dialog),
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_Apply"), GTK_RESPONSE_APPLY,
+ NULL
+ );
+
+ // Create notebook for settings widgets
+ dialog->tabs = GTK_NOTEBOOK(gtk_notebook_new());
+
+ gtk_notebook_set_scrollable(dialog->tabs,TRUE);
+ gtk_notebook_set_show_tabs(dialog->tabs,FALSE);
+ g_signal_connect(G_OBJECT(dialog->tabs), "page-added", G_CALLBACK(page_changed), dialog);
+ g_signal_connect(G_OBJECT(dialog->tabs), "page-removed", G_CALLBACK(page_changed), dialog);
+ g_signal_connect(G_OBJECT(dialog->tabs), "switch-page", G_CALLBACK(switch_page), dialog);
+ gtk_box_pack_start(GTK_BOX(content_area),GTK_WIDGET(dialog->tabs),TRUE,TRUE,0);
+
+ gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
+
+}
+
+GtkWidget * pw3270_settings_dialog_new() {
+#if GTK_CHECK_VERSION(3,12,0)
+
+ gboolean use_header;
+ g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
+
+ GtkWidget * dialog =
+ GTK_WIDGET(g_object_new(
+ GTK_TYPE_PW3270_SETTINGS_DIALOG,
+ "use-header-bar", (use_header ? 1 : 0),
+ NULL
+ ));
+
+#else
+
+ GtkWidget * dialog = GTK_WIDGET(g_object_new(GTK_TYPE_PW3270_SETTINGS_DIALOG, NULL));
+
+#endif // GTK 3.12
+
+ return dialog;
+
+}
+
+void dialog_close(GtkDialog *dialog) {
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+}
+
+void response(GtkDialog *dialog, gint response_id) {
+
+ debug("%s(%d)",__FUNCTION__,response_id);
+
+ gtk_widget_destroy(GTK_WIDGET(dialog));
+}
+
+void add(GtkContainer *container, GtkWidget *widget) {
+
+ GtkWidget * label = NULL;
+
+ gtk_notebook_append_page(
+ GTK_PW3270_SETTINGS_DIALOG(container)->tabs,
+ widget,
+ label
+ );
+
+}
+
+void page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog G_GNUC_UNUSED(*dialog)) {
+ gtk_notebook_set_show_tabs(notebook,gtk_notebook_get_n_pages(notebook) > 1);
+}
+
+void switch_page(GtkNotebook G_GNUC_UNUSED(*notebook), GtkWidget *settings, guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog *dialog) {
+
+ /*
+ debug("title: %s",settings->title);
+ debug("label: %s",settings->label);
+
+ if(dialog->has_subtitle) {
+ GtkWidget * header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
+ if(header_bar) {
+ gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar),settings->title);
+ }
+ }
+ */
+}
+
diff --git a/src/objects/settings/widget.c b/src/objects/settings/widget.c
new file mode 100644
index 0000000..3cebe6c
--- /dev/null
+++ b/src/objects/settings/widget.c
@@ -0,0 +1,84 @@
+/*
+ * "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
+ #include
+ #include
+ #include
+
+ G_DEFINE_TYPE(PW3270Settings, PW3270Settings, GTK_TYPE_GRID);
+
+ static void load(GtkWidget *widget, PW3270SettingsPrivate *settings);
+ static void apply(GtkWidget *widget, PW3270SettingsPrivate *settings);
+ static void revert(GtkWidget *widget, PW3270SettingsPrivate *settings);
+ static void finalize(GObject *object);
+
+/*--[ Implement ]------------------------------------------------------------------------------------*/
+
+ PW3270Settings * pw3270_settings_new() {
+ return GTK_PW3270_SETTINGS(g_object_new(GTK_TYPE_PW3270_SETTINGS,NULL));
+ }
+
+ static void PW3270Settings_class_init(PW3270SettingsClass *klass) {
+
+ G_OBJECT_CLASS(klass)->finalize = finalize;
+ }
+
+ static void PW3270Settings_init(PW3270Settings *widget) {
+
+ // https://developer.gnome.org/hig/stable/visual-layout.html.en
+ gtk_grid_set_row_spacing(GTK_GRID(widget),6);
+ gtk_grid_set_column_spacing(GTK_GRID(widget),12);
+
+ widget->settings = NULL; // Just in case.
+ widget->load = load;
+ widget->apply = apply;
+ widget->revert = revert;
+
+ }
+
+ static void finalize(GObject *object) {
+
+ PW3270Settings * settings = GTK_PW3270_SETTINGS(object);
+ if(settings->settings) {
+ g_free(settings->settings);
+ settings->settings = NULL;
+ }
+
+}
+
+ void load(GtkWidget G_GNUC_UNUSED(*widget), PW3270SettingsPrivate G_GNUC_UNUSED(*settings)) {
+ }
+
+ void apply(GtkWidget G_GNUC_UNUSED(*widget), PW3270SettingsPrivate G_GNUC_UNUSED(*settings)) {
+ }
+
+ void revert(GtkWidget G_GNUC_UNUSED(*widget), PW3270SettingsPrivate G_GNUC_UNUSED(*settings)) {
+ }
+
diff --git a/src/objects/toolbar/settings.c b/src/objects/toolbar/settings.c
index 4c78296..7486374 100644
--- a/src/objects/toolbar/settings.c
+++ b/src/objects/toolbar/settings.c
@@ -28,10 +28,17 @@
*/
#include "private.h"
+ #include
#include
+ #include
#include
#include
+ static void load(GtkWidget *widget, PW3270SettingsPrivate *settings);
+ static void apply(GtkWidget *widget, PW3270SettingsPrivate *settings);
+
+ /*--[ Constants ]------------------------------------------------------------------------------------*/
+
static const struct _comboboxes {
const gchar * name;
const gchar * label;
@@ -49,127 +56,42 @@
};
- typedef struct _ToolbarSettingsPage {
- Pw3270SettingsPage parent;
+ struct _PW3270SettingsPrivate {
GtkWidget * views[2];
GtkWidget * buttons[2];
GtkTreeModel * models[2];
GtkWidget * combos[G_N_ELEMENTS(comboboxes)];
+ };
- } ToolbarSettingsPage;
-
- static void load(Pw3270SettingsPage *pg, GtkApplication *application) {
-
- size_t ix;
- ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg;
- g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
-
- debug("%s",__FUNCTION__);
-
- // Populate views
- Pw3270ActionList * action_list = pw3270_action_list_new(application);
-
- // Load current values.
- g_autofree gchar * action_names = g_settings_get_string(settings,"toolbar-action-names");
-
- gchar ** actions = g_strsplit(action_names,",",-1);
-
- for(ix = 0; actions[ix]; ix++) {
-
- if(g_ascii_strcasecmp(actions[ix],"separator")) {
-
- // It's an action
- action_list = pw3270_action_list_move_action(action_list,actions[ix],page->views[0]);
-
- } else {
-
- // It's a separator
- pw3270_action_view_append(page->views[0], _( "Separator"), NULL, "separator", 2);
-
- }
-
- }
-
- g_strfreev(actions);
-
- // Load available actions.
- pw3270_action_view_set_actions(page->views[1], action_list);
- pw3270_action_view_append(page->views[1], _( "Separator"), NULL, "separator", 1);
-
- pw3270_action_list_free(action_list);
-
- GtkTreeIter iter;
-
- for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
-
- pw3270_model_get_iter_from_value(
- gtk_combo_box_get_model(GTK_COMBO_BOX(page->combos[ix])),
- &iter,
- (guint) g_settings_get_int(settings,comboboxes[ix].name)
- );
-
- gtk_combo_box_set_active_iter(GTK_COMBO_BOX(page->combos[ix]),&iter);
-
- }
-
- }
-
- static void apply(Pw3270SettingsPage *pg, GtkApplication G_GNUC_UNUSED(*application)) {
-
- size_t ix;
- ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg;
- g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
-
- debug("%s",__FUNCTION__);
-
- g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]);
- g_settings_set_string(settings,"toolbar-action-names",action_names);
-
- debug("[%s]",action_names);
-
- GtkTreeIter iter;
- for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
-
- if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(page->combos[ix]),&iter)) {
-
- g_settings_set_int(
- settings,
- comboboxes[ix].name,
- (gint) pw3270_model_get_value_from_iter(gtk_combo_box_get_model(GTK_COMBO_BOX(page->combos[ix])),&iter)
- );
-
- }
-
- }
- }
+ /*--[ Implement ]------------------------------------------------------------------------------------*/
static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) {
gtk_widget_set_sensitive(button,gtk_tree_selection_count_selected_rows(selection) > 0);
}
- void toolbar_insert(GtkButton G_GNUC_UNUSED(*button), ToolbarSettingsPage *settings) {
+ void toolbar_insert(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) {
debug("%s(%p)",__FUNCTION__,settings);
pw3270_action_view_move_selected(settings->views[1],settings->views[0]);
}
- void toolbar_remove(GtkButton G_GNUC_UNUSED(*button), ToolbarSettingsPage *settings) {
+ void toolbar_remove(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) {
debug("%s(%p)",__FUNCTION__,settings);
pw3270_action_view_move_selected(settings->views[0],settings->views[1]);
}
- Pw3270SettingsPage * pw3270_toolbar_settings_new() {
-
- size_t ix;
-
- ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1);
+ GtkWidget * pw3270_toolbar_settings_new() {
- page->parent.load = load;
- page->parent.apply = apply;
- page->parent.label = _("Toolbar");
- page->parent.title = _("Setup toolbar");
+ size_t ix;
- page->parent.widget = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
+ // Create page widget.
+ PW3270Settings * settings = pw3270_settings_new();
+ settings->label = _("Toolbar");
+ settings->title = _("Setup toolbar");
+ settings->apply = apply;
+ settings->load = load;
+ // Create private data.
+ PW3270SettingsPrivate * page = settings->settings = g_new0(PW3270SettingsPrivate,1);
//
// Create views
@@ -180,13 +102,11 @@
GtkGrid * grid = GTK_GRID(gtk_grid_new());
gtk_grid_set_row_homogeneous(grid,FALSE);
- gtk_box_pack_start(
- GTK_BOX(page->parent.widget),
- pw3270_frame_new(GTK_WIDGET(grid), _("Actions")),
- TRUE,
- TRUE,
- 0
- );
+ gtk_grid_attach(
+ GTK_GRID(settings),
+ pw3270_frame_new(GTK_WIDGET(grid), _("Actions")),
+ 0,0,4,3
+ );
static const gchar *labels[G_N_ELEMENTS(page->views)] = {
N_("Selected"),
@@ -281,13 +201,11 @@
{
GtkGrid * grid = GTK_GRID(gtk_grid_new());
- gtk_box_pack_start(
- GTK_BOX(page->parent.widget),
- pw3270_frame_new(GTK_WIDGET(grid), _("Options")),
- FALSE,
- TRUE,
- 0
- );
+ gtk_grid_attach(
+ GTK_GRID(settings),
+ pw3270_frame_new(GTK_WIDGET(grid), _("Options")),
+ 0,5,4,1
+ );
// https://developer.gnome.org/hig/stable/visual-layout.html.en
gtk_grid_set_row_spacing(grid,6);
@@ -318,5 +236,133 @@
}
+ return GTK_WIDGET(settings);
+ }
+
+ void load(GtkWidget G_GNUC_UNUSED(*widget), PW3270SettingsPrivate *page) {
+
+ size_t ix;
+ g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
+
+ // Populate views
+ Pw3270ActionList * action_list = pw3270_action_list_new(GTK_APPLICATION(g_application_get_default()));
+
+ // Load current values.
+ g_autofree gchar * action_names = g_settings_get_string(settings,"toolbar-action-names");
+
+ gchar ** actions = g_strsplit(action_names,",",-1);
+
+ for(ix = 0; actions[ix]; ix++) {
+
+ if(g_ascii_strcasecmp(actions[ix],"separator")) {
+
+ // It's an action
+ action_list = pw3270_action_list_move_action(action_list,actions[ix],page->views[0]);
+
+ } else {
+
+ // It's a separator
+ pw3270_action_view_append(page->views[0], _( "Separator"), NULL, "separator", 2);
+
+ }
+
+ }
+
+ g_strfreev(actions);
+
+ // Load available actions.
+ pw3270_action_view_set_actions(page->views[1], action_list);
+ pw3270_action_view_append(page->views[1], _( "Separator"), NULL, "separator", 1);
+
+ pw3270_action_list_free(action_list);
+
+ GtkTreeIter iter;
+
+ for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
+
+ pw3270_model_get_iter_from_value(
+ gtk_combo_box_get_model(GTK_COMBO_BOX(page->combos[ix])),
+ &iter,
+ (guint) g_settings_get_int(settings,comboboxes[ix].name)
+ );
+
+ gtk_combo_box_set_active_iter(GTK_COMBO_BOX(page->combos[ix]),&iter);
+
+ }
+
+ }
+
+ void apply(GtkWidget G_GNUC_UNUSED(*widget), PW3270SettingsPrivate *page) {
+
+ size_t ix;
+ g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
+
+ debug("%s",__FUNCTION__);
+
+ g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]);
+ g_settings_set_string(settings,"toolbar-action-names",action_names);
+
+ debug("[%s]",action_names);
+
+ GtkTreeIter iter;
+ for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
+
+ if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(page->combos[ix]),&iter)) {
+
+ g_settings_set_int(
+ settings,
+ comboboxes[ix].name,
+ (gint) pw3270_model_get_value_from_iter(gtk_combo_box_get_model(GTK_COMBO_BOX(page->combos[ix])),&iter)
+ );
+
+ }
+
+ }
+
+ }
+
+ /*
+
+ typedef struct _ToolbarSettingsPage {
+ Pw3270SettingsPage parent;
+ GtkWidget * views[2];
+ GtkWidget * buttons[2];
+ GtkTreeModel * models[2];
+ GtkWidget * combos[G_N_ELEMENTS(comboboxes)];
+
+ } ToolbarSettingsPage;
+
+ static void load(Pw3270SettingsPage *pg, GtkApplication *application) {
+
+ size_t ix;
+ ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg;
+ g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
+
+ debug("%s",__FUNCTION__);
+
+
+ }
+
+ static void apply(Pw3270SettingsPage *pg, GtkApplication G_GNUC_UNUSED(*application)) {
+
+ }
+
+
+ Pw3270SettingsPage * pw3270_toolbar_settings_new() {
+
+ size_t ix;
+
+ ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1);
+
+ page->parent.load = load;
+ page->parent.apply = apply;
+ page->parent.label = _("Toolbar");
+ page->parent.title = _("Setup toolbar");
+
+ page->parent.widget = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
+
+
+
return (Pw3270SettingsPage *) page;
}
+ */
diff --git a/src/objects/window/page.c b/src/objects/window/page.c
index 2da9e5b..0bc5d6e 100644
--- a/src/objects/window/page.c
+++ b/src/objects/window/page.c
@@ -240,6 +240,7 @@
debug("%s",__FUNCTION__);
+ /*
GtkWidget * dialog = pw3270_settings_dialog_new(
_("Rename session"),
GTK_WINDOW(gtk_widget_get_toplevel(terminal))
@@ -290,7 +291,7 @@
}
gtk_widget_destroy(dialog);
-
+ */
}
--
libgit2 0.21.2