diff --git a/src/include/pw3270/settings.h b/src/include/pw3270/settings.h index d01ea78..4fbbbac 100644 --- a/src/include/pw3270/settings.h +++ b/src/include/pw3270/settings.h @@ -43,6 +43,8 @@ Pw3270SettingsPage * pw3270_toolbar_settings_new(); + GtkWidget * pw3270_frame_new(GtkWidget * child, const gchar *title); + G_END_DECLS #endif // PW3270_SETTINGS_H_INCLUDED diff --git a/src/main/main.c b/src/main/main.c index 99fe4cf..30e0eaa 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -38,9 +38,34 @@ #include #include #include + #ifdef G_OS_UNIX + #include + #endif // G_OS_UNIX /*---[ Implement ]----------------------------------------------------------------------------------*/ +static gboolean quit_signal(GtkApplication *app) { + + debug("%s",__FUNCTION__); + g_message("Terminating by signal"); + + /* + 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(app)); + return FALSE; +} + int main (int argc, char **argv) { GtkApplication *app; @@ -67,6 +92,11 @@ int main (int argc, char **argv) { g_set_application_name(G_STRINGIFY(PRODUCT_NAME)); app = pw3270_application_new("br.com.bb." G_STRINGIFY(PRODUCT_NAME),G_APPLICATION_HANDLES_OPEN); +#ifdef G_OS_UNIX + // Termination + g_unix_signal_add(SIGTERM, (GSourceFunc) quit_signal, app); +#endif // G_OS_UNIX + status = g_application_run(G_APPLICATION (app), argc, argv); g_object_unref (app); diff --git a/src/main/tools.c b/src/main/tools.c index 99d2c8b..0ddfd2f 100644 --- a/src/main/tools.c +++ b/src/main/tools.c @@ -35,6 +35,7 @@ #include "private.h" #include + #include /*---[ Implement ]----------------------------------------------------------------------------------*/ @@ -62,4 +63,22 @@ } + GtkWidget * pw3270_frame_new(GtkWidget * child, const gchar *title) { + + GtkFrame * frame = GTK_FRAME(gtk_frame_new("")); + g_autofree gchar * markup = g_strdup_printf("%s",title); + GtkWidget * label = gtk_label_new(NULL); + + gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_NONE); + gtk_label_set_markup(GTK_LABEL(label),markup); + gtk_frame_set_label_widget(GTK_FRAME(frame),label); + gtk_container_set_border_width(GTK_CONTAINER(child),12); + + gtk_container_add(GTK_CONTAINER(frame),GTK_WIDGET(child)); + + g_object_set(G_OBJECT(frame),"margin-top",6,NULL); + + return GTK_WIDGET(frame); + + } diff --git a/src/objects/toolbar/private.h b/src/objects/toolbar/private.h index 90c8fe1..804d8c2 100644 --- a/src/objects/toolbar/private.h +++ b/src/objects/toolbar/private.h @@ -50,4 +50,8 @@ G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_style_model_new(); G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_icon_size_model_new(); + G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value); + G_GNUC_INTERNAL guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter); + + #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/toolbar/settings.c b/src/objects/toolbar/settings.c index 0bb1637..3fcccf4 100644 --- a/src/objects/toolbar/settings.c +++ b/src/objects/toolbar/settings.c @@ -31,16 +31,36 @@ #include #include + static const struct _comboboxes { + const gchar * name; + const gchar * label; + } comboboxes[] = { + + { + .name = "toolbar-icon-size", + .label = N_("Icon Size"), + }, + + { + .name = "toolbar-style", + .label = N_("Style") + } + + }; + 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, GSettings *settings) { size_t ix; + ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg; debug("%s",__FUNCTION__); @@ -57,12 +77,12 @@ if(g_ascii_strcasecmp(actions[ix],"separator")) { // It's an action - action_list = pw3270_action_list_move_action(action_list,actions[ix],((ToolbarSettingsPage *) pg)->views[0]); + action_list = pw3270_action_list_move_action(action_list,actions[ix],page->views[0]); } else { // It's a separator - pw3270_action_view_append(((ToolbarSettingsPage *) pg)->views[0], _( "Separator"), NULL, "separator", 2); + pw3270_action_view_append(page->views[0], _( "Separator"), NULL, "separator", 2); } @@ -71,23 +91,53 @@ g_strfreev(actions); // Load available actions. - pw3270_action_view_set_actions(((ToolbarSettingsPage *) pg)->views[1], action_list); - pw3270_action_view_append(((ToolbarSettingsPage *) pg)->views[1], _( "Separator"), NULL, "separator", 1); + 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), GSettings *settings) { + size_t ix; + ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg; + debug("%s",__FUNCTION__); - g_autofree gchar * action_names = pw3270_action_view_get_action_names(((ToolbarSettingsPage *) pg)->views[0]); + 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) + ); + + } + + } } static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) { @@ -107,7 +157,6 @@ Pw3270SettingsPage * pw3270_toolbar_settings_new() { size_t ix; - GtkTreeSelection * selection; ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1); @@ -116,94 +165,155 @@ page->parent.label = _("Toolbar"); page->parent.title = _("Setup toolbar"); - page->parent.widget = gtk_grid_new(); - gtk_grid_set_row_homogeneous(GTK_GRID(page->parent.widget),FALSE); + page->parent.widget = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + + // // Create views - static const gchar *labels[G_N_ELEMENTS(page->views)] = { - N_("Selected"), - N_("Available") - }; + // + { + GtkTreeSelection * selection; - for(ix = 0; ix < G_N_ELEMENTS(page->views); ix++) { + GtkGrid * grid = GTK_GRID(gtk_grid_new()); + gtk_grid_set_row_homogeneous(grid,FALSE); - GtkWidget * label = gtk_label_new(gettext(labels[ix])); - gtk_label_set_xalign(GTK_LABEL(label),0); + gtk_box_pack_start( + GTK_BOX(page->parent.widget), + pw3270_frame_new(GTK_WIDGET(grid), _("Actions")), + TRUE, + TRUE, + 0 + ); - page->views[ix] = pw3270_action_view_new(); + static const gchar *labels[G_N_ELEMENTS(page->views)] = { + N_("Selected"), + N_("Available") + }; - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])); - gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + for(ix = 0; ix < G_N_ELEMENTS(page->views); ix++) { - gtk_grid_attach( - GTK_GRID(page->parent.widget), - label, - ix * 3,0,2,1 + GtkWidget * label = gtk_label_new(gettext(labels[ix])); + gtk_label_set_xalign(GTK_LABEL(label),0); + + page->views[ix] = pw3270_action_view_new(); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + + gtk_grid_attach( + grid, + label, + ix * 3,0,2,1 + ); + + GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(box),page->views[ix]); + + gtk_grid_attach( + grid, + box, + ix * 3,1,2,4 + ); + + } + + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE); + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->views[1]))), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); + + // Create buttons + static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = { + "go-next", + "go-previous" + }; + + GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); + gtk_widget_set_hexpand(box,FALSE); + gtk_widget_set_vexpand(box,FALSE); + + for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) { + page->buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND); + + gtk_widget_set_focus_on_click(page->buttons[ix],FALSE); + gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE); + gtk_widget_set_sensitive(page->buttons[ix],FALSE); + + g_signal_connect( + gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])), + "changed", + G_CALLBACK(selection_changed), + page->buttons[ix] + ); + + } + + gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0); + gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0); + + g_signal_connect( + page->buttons[0], + "clicked", + G_CALLBACK(toolbar_remove), + page ); - GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(box),page->views[ix]); + g_signal_connect( + page->buttons[1], + "clicked", + G_CALLBACK(toolbar_insert), + page + ); gtk_grid_attach( - GTK_GRID(page->parent.widget), + grid, box, - ix * 3,1,2,4 + 2,2,1,1 ); } - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE); - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->views[1]))), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); + // + // Create style & icon size settings. + // + { + GtkGrid * grid = GTK_GRID(gtk_grid_new()); - // Create buttons - static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = { - "go-next", - "go-previous" - }; + gtk_box_pack_start( + GTK_BOX(page->parent.widget), + pw3270_frame_new(GTK_WIDGET(grid), _("Options")), + TRUE, + TRUE, + 0 + ); - GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); - gtk_widget_set_hexpand(box,FALSE); - gtk_widget_set_vexpand(box,FALSE); + // https://developer.gnome.org/hig/stable/visual-layout.html.en + gtk_grid_set_row_spacing(grid,6); + gtk_grid_set_column_spacing(grid,12); + gtk_widget_set_hexpand(GTK_WIDGET(grid),TRUE); - for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) { - page->buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND); + page->models[0] = pw3270_toolbar_icon_size_model_new(); + page->models[1] = pw3270_toolbar_style_model_new(); - gtk_widget_set_focus_on_click(page->buttons[ix],FALSE); - gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE); - gtk_widget_set_sensitive(page->buttons[ix],FALSE); + GtkCellRenderer * renderer = gtk_cell_renderer_text_new(); - g_signal_connect( - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])), - "changed", - G_CALLBACK(selection_changed), - page->buttons[ix] - ); + for(ix = 0; ix < G_N_ELEMENTS(page->models); ix++) { - } + GtkWidget * label = gtk_label_new(gettext(comboboxes[ix].label)); + gtk_label_set_xalign(GTK_LABEL(label),1); + + gtk_grid_attach(grid,label,(ix*3),0,1,1); - gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0); - gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0); - - g_signal_connect( - page->buttons[0], - "clicked", - G_CALLBACK(toolbar_remove), - page - ); - - g_signal_connect( - page->buttons[1], - "clicked", - G_CALLBACK(toolbar_insert), - page - ); - - gtk_grid_attach( - GTK_GRID(page->parent.widget), - box, - 2,2,1,1 - ); + page->combos[ix] = gtk_combo_box_new_with_model(page->models[ix]); + gtk_widget_set_hexpand(page->combos[ix],TRUE); + + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->combos[ix]), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(page->combos[ix]), renderer, "text", 0, NULL); + + gtk_grid_attach(grid,page->combos[ix],(ix*3)+1,0,2,1); + + } + + } return (Pw3270SettingsPage *) page; } diff --git a/src/objects/toolbar/toolbar.c b/src/objects/toolbar/toolbar.c index 2e94815..50bb9d9 100644 --- a/src/objects/toolbar/toolbar.c +++ b/src/objects/toolbar/toolbar.c @@ -420,3 +420,33 @@ return GTK_TREE_MODEL(model); } + + void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value) { + + if(gtk_tree_model_get_iter_first(model,iter)) { + + do { + + GValue gVal = { 0, }; + gtk_tree_model_get_value(model,iter,1,&gVal); + guint iVal = g_value_get_uint(&gVal); + g_value_unset(&gVal); + + if(iVal == value) { + return; + } + + } while(gtk_tree_model_iter_next(model,iter)); + + } + + } + + guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter) { + GValue gVal = { 0, }; + gtk_tree_model_get_value(model,iter,1,&gVal); + guint iVal = g_value_get_uint(&gVal); + g_value_unset(&gVal); + return iVal; +} + -- libgit2 0.21.2