diff --git a/src/include/pw3270/actions.h b/src/include/pw3270/actions.h index 086cdb2..12f5803 100644 --- a/src/include/pw3270/actions.h +++ b/src/include/pw3270/actions.h @@ -90,13 +90,22 @@ // typedef GSList Pw3270ActionList; + typedef enum _pw3270ActionViewFlag { + PW3270_ACTION_VIEW_FLAG_FIXED = 0, ///< @brief No special options. + PW3270_ACTION_VIEW_FLAG_ALLOW_ADD = 1, ///< @brief Allow add to target widget. + PW3270_ACTION_VIEW_ALLOW_REMOVE = 2, ///< @brief Allow remove from source widget. + PW3270_ACTION_VIEW_ALLOW_MOVE = 3 ///< @brief Allow move from source to target. + } PW3270ActionViewFlag; + + GtkWidget * pw3270_action_view_new(); Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); void pw3270_action_list_free(Pw3270ActionList *action_list); void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list); void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to); - void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, gint flags); + void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags); gchar * pw3270_action_view_get_action_names(GtkWidget *widget); + GtkWidget * pw3270_action_view_extract_button_new(GtkWidget *widget, const gchar *icon_name); Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); diff --git a/src/objects/actions/view.c b/src/objects/actions/view.c index 857c3f2..4d4c0a4 100644 --- a/src/objects/actions/view.c +++ b/src/objects/actions/view.c @@ -106,7 +106,7 @@ return view; } - void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, gint flags) { + void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, PW3270ActionViewFlag flags) { GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))); @@ -118,7 +118,7 @@ COLUMN_PIXBUF, pixbuf, COLUMN_LABEL, label, COLUMN_ACTION_NAME, action_name, - COLUMN_FLAGS, flags, + COLUMN_FLAGS, (gint) flags, -1 ); @@ -169,10 +169,10 @@ gtk_list_store_set( store, &iter, - COLUMN_PIXBUF, element->pixbuf, - COLUMN_LABEL, (label ? label : g_action_get_name(element->action)), + COLUMN_PIXBUF, element->pixbuf, + COLUMN_LABEL, (label ? label : g_action_get_name(element->action)), COLUMN_ACTION_NAME, element->name, - COLUMN_FLAGS, 3, + COLUMN_FLAGS, (gint) PW3270_ACTION_VIEW_ALLOW_MOVE, -1 ); @@ -338,7 +338,7 @@ gint flags = g_value_get_int(&vFlags); g_value_unset(&vFlags); - if(flags & 1) { + if(flags & PW3270_ACTION_VIEW_FLAG_ALLOW_ADD) { // Add on target widget. GValue pixbuf = G_VALUE_INIT; @@ -369,7 +369,7 @@ } - if(flags & 2) { + if(flags & PW3270_ACTION_VIEW_ALLOW_REMOVE) { // Remove from source widget. gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter); @@ -411,3 +411,24 @@ return g_string_free(str,FALSE); } + static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) { + gtk_widget_set_sensitive(button,gtk_tree_selection_count_selected_rows(selection) > 0); + } + + GtkWidget * pw3270_action_view_extract_button_new(GtkWidget *widget, const gchar *icon_name) { + + GtkWidget * button = gtk_button_new_from_icon_name(icon_name,GTK_ICON_SIZE_DND); + + gtk_widget_set_focus_on_click(button,FALSE); + gtk_button_set_relief(GTK_BUTTON(button),GTK_RELIEF_NONE); + gtk_widget_set_sensitive(button,FALSE); + + g_signal_connect( + gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)), + "changed", + G_CALLBACK(selection_changed), + button + ); + + return button; + } diff --git a/src/objects/window/header-settings.c b/src/objects/window/header-settings.c index 7b0e459..0d74f9c 100644 --- a/src/objects/window/header-settings.c +++ b/src/objects/window/header-settings.c @@ -72,10 +72,6 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ - static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) { - gtk_widget_set_sensitive(button,gtk_tree_selection_count_selected_rows(selection) > 0); - } - GtkWidget * pw3270_header_settings_new() { size_t ix; @@ -149,53 +145,13 @@ // Create buttons { - static const gchar * icon_names[] = { - "go-next", - "go-previous", - "go-next", - "go-previous" + GtkWidget *buttons[] = { + pw3270_action_view_extract_button_new(page->views[0],"go-next"), + pw3270_action_view_extract_button_new(page->views[2],"go-previous"), + pw3270_action_view_extract_button_new(page->views[1],"go-next"), + pw3270_action_view_extract_button_new(page->views[2],"go-previous") }; - GtkWidget *buttons[G_N_ELEMENTS(icon_names)]; - - for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) { - buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND); - - gtk_widget_set_focus_on_click(buttons[ix],FALSE); - gtk_button_set_relief(GTK_BUTTON(buttons[ix]),GTK_RELIEF_NONE); - gtk_widget_set_sensitive(buttons[ix],FALSE); - - } - - g_signal_connect( - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[0])), - "changed", - G_CALLBACK(selection_changed), - buttons[0] - ); - - g_signal_connect( - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[1])), - "changed", - G_CALLBACK(selection_changed), - buttons[2] - ); - - g_signal_connect( - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[2])), - "changed", - G_CALLBACK(selection_changed), - buttons[1] - ); - - g_signal_connect( - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[2])), - "changed", - G_CALLBACK(selection_changed), - buttons[3] - ); - - for(ix = 0; ix < 2; ix++) { GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); gtk_widget_set_hexpand(box,FALSE); @@ -242,7 +198,37 @@ gchar ** actions = g_strsplit(views[view],",",-1); for(action = 0; actions[action];action++) { - action_list = pw3270_action_list_move_action(action_list,actions[action],page->views[view]); + + if(g_str_has_prefix(actions[action],"menu.")) { + + GError *error = NULL; + g_autofree gchar * icon_name = g_strconcat(actions[action]+5,"-symbolic",NULL); + + GdkPixbuf * pixbuf = gtk_icon_theme_load_icon( + gtk_icon_theme_get_default(), + icon_name, + GTK_ICON_SIZE_MENU, + GTK_ICON_LOOKUP_GENERIC_FALLBACK, + &error + ); + + if(error) { + g_warning(error->message); + g_error_free(error); + error = NULL; + } + + pw3270_action_view_append( + page->views[view], // Widget + _( "System Menu" ), // label + pixbuf, // Icon + actions[action], // Action name + PW3270_ACTION_VIEW_FLAG_FIXED // Fixed item + ); + + } else { + action_list = pw3270_action_list_move_action(action_list,actions[action],page->views[view]); + } } g_strfreev(actions); diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index 92cedc7..c613533 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -44,11 +44,11 @@ #include #include - static void destroy(GtkWidget *terminal, gpointer GNUC_UNUSED(dunno)) { + static void destroy(GtkWidget *terminal, gpointer G_GNUC_UNUSED(dunno)) { v3270_key_file_close(terminal); } - static void toggle_changed(GtkWidget *widget, G_GNUC_UNUSED LIB3270_TOGGLE_ID toggle_id, gboolean toggle_state, const gchar *toggle_name, gpointer GNUC_UNUSED(dunno)) { + static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE_ID G_GNUC_UNUSED(toggle_id), gboolean toggle_state, const gchar *toggle_name, gpointer G_GNUC_UNUSED(dunno)) { debug("%s(%s)=%s",__FUNCTION__,toggle_name,toggle_state ? "ON" : "OFF"); v3270_key_file_set_boolean(widget,"terminal",toggle_name,toggle_state); } -- libgit2 0.21.2