From 8e33538613b9659a7f933bf71468688cb1dfe8ea Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 13 Dec 2019 10:18:50 -0300 Subject: [PATCH] Fixing accelerator settings dialog. --- src/dialogs/settings/accelerator.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/dialogs/settings/host.c | 2 +- src/include/internals.h | 1 + src/terminal/keyboard/accelerator.c | 34 ++++++++++++++++++++++++++-------- src/terminal/keyboard/init.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- src/terminal/keyboard/keyfile.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------- src/terminal/keyboard/private.h | 2 ++ 7 files changed, 170 insertions(+), 58 deletions(-) diff --git a/src/dialogs/settings/accelerator.c b/src/dialogs/settings/accelerator.c index 789fe6c..4809921 100644 --- a/src/dialogs/settings/accelerator.c +++ b/src/dialogs/settings/accelerator.c @@ -111,6 +111,8 @@ static void V3270AcceleratorSettings_init(V3270AcceleratorSettings *widget) { + size_t ix; + // Create description list GtkCellRenderer * text_renderer = gtk_cell_renderer_text_new(); @@ -171,8 +173,8 @@ NULL ); - gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_min_width(column, 500); + gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_insert_column( GTK_TREE_VIEW(view), @@ -201,6 +203,13 @@ NULL ); + for(ix = 1; ix < 3; ix++) + { + GtkTreeViewColumn * column = gtk_tree_view_get_column(GTK_TREE_VIEW(view), ix); + gtk_tree_view_column_set_min_width(column, 200); + gtk_tree_view_column_set_resizable(column, TRUE); + } + // Create scroller view { GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); @@ -405,7 +414,7 @@ static void accel_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar *path change_accel(widget, path, accel_key, mask, MAIN_VALUE, MAIN_MASK); } -static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar *path, guint accel_key, GdkModifierType mask, guint G_GNUC_UNUSED(hardware_keycode), V3270AcceleratorSettings *widget) +static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*renderer), gchar *path, guint accel_key, GdkModifierType mask, guint G_GNUC_UNUSED(hardware_keycode), V3270AcceleratorSettings *widget) { #ifdef DEBUG { @@ -413,6 +422,43 @@ static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar debug("%s(%s) = %u/%d (%s)",__FUNCTION__,path,accel_key,mask,keyname); } #endif // DEBUG + + // Check for "single-accel" actions + V3270Accelerator *accel = NULL; + GtkTreePath * tree_path = gtk_tree_path_new_from_string(path); + GtkTreeIter iter; + if(gtk_tree_model_get_iter(GTK_TREE_MODEL(widget->store),&iter,tree_path)) + { + GValue value; + memset(&value,0,sizeof(value)); + gtk_tree_model_get_value(GTK_TREE_MODEL(widget->store), &iter, ACTION, &value); + accel = (V3270Accelerator *) g_value_get_pointer(&value); + g_value_unset(&value); + } + gtk_tree_path_free(tree_path); + + if(accel && accel->type == V3270_ACCELERATOR_TYPE_PFKEY) + { + GtkWidget * dialog = + gtk_message_dialog_new_with_markup( + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CANCEL, + _( "The action \"%s\" can't manage alternative keys" ), + v3270_accelerator_get_description(accel) + ); + + gtk_window_set_title(GTK_WINDOW(dialog),_("Rejected by action")); + gtk_widget_show_all(dialog); + + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); + + return; + } + + // Call the common validation. change_accel(widget, path, accel_key, mask, ALTERNATIVE_VALUE, ALTERNATIVE_MASK); } diff --git a/src/dialogs/settings/host.c b/src/dialogs/settings/host.c index fdfccff..fd822d5 100644 --- a/src/dialogs/settings/host.c +++ b/src/dialogs/settings/host.c @@ -626,7 +626,7 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) g_return_if_fail(GTK_IS_V3270(widget)); GtkWidget * dialog = v3270_settings_dialog_new(); - GtkWidget * settings = v3270_host_select_new(); + GtkWidget * settings = v3270_host_settings_new(); gtk_window_set_title(GTK_WINDOW(dialog), v3270_settings_get_title(settings)); gtk_container_add(GTK_CONTAINER(dialog), settings); diff --git a/src/include/internals.h b/src/include/internals.h index 39deb61..df87e74 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -176,6 +176,7 @@ { struct _V3270Accelerator parent; const gchar *name; + const gchar *description; unsigned short keycode; } V3270PFKeyAccelerator; diff --git a/src/terminal/keyboard/accelerator.c b/src/terminal/keyboard/accelerator.c index afd6ee5..e303eb5 100644 --- a/src/terminal/keyboard/accelerator.c +++ b/src/terminal/keyboard/accelerator.c @@ -40,16 +40,28 @@ { V3270Accelerator * rc = NULL; - if(accel->type == V3270_ACCELERATOR_TYPE_CUSTOM) - { - V3270CustomAccelerator * customAccel = g_new0(V3270CustomAccelerator,1); - *customAccel = *((V3270CustomAccelerator *) accel); - rc = (V3270Accelerator *) customAccel; - } - else - { + switch(accel->type) + { + case V3270_ACCELERATOR_TYPE_CUSTOM: + { + V3270CustomAccelerator * customAccel = g_new0(V3270CustomAccelerator,1); + *customAccel = *((V3270CustomAccelerator *) accel); + rc = (V3270Accelerator *) customAccel; + } + break; + + case V3270_ACCELERATOR_TYPE_PFKEY: + { + V3270PFKeyAccelerator * customAccel = g_new0(V3270PFKeyAccelerator,1); + *customAccel = *((V3270PFKeyAccelerator *) accel); + rc = (V3270Accelerator *) customAccel; + } + break; + + default: rc = g_new0(V3270Accelerator,1); *rc = *accel; + } return rc; @@ -174,6 +186,9 @@ case V3270_ACCELERATOR_TYPE_PFKEY: + if( ((V3270PFKeyAccelerator *)accel)->description ) + return ((V3270PFKeyAccelerator *)accel)->description; + if( ((V3270PFKeyAccelerator *)accel)->name ) return ((V3270PFKeyAccelerator *)accel)->name; @@ -200,6 +215,9 @@ case V3270_ACCELERATOR_TYPE_CUSTOM: return ((V3270CustomAccelerator *) accel)->name; + case V3270_ACCELERATOR_TYPE_PFKEY: + return ((V3270PFKeyAccelerator *) accel)->name; + } return NULL; diff --git a/src/terminal/keyboard/init.c b/src/terminal/keyboard/init.c index 1219410..6611134 100644 --- a/src/terminal/keyboard/init.c +++ b/src/terminal/keyboard/init.c @@ -143,7 +143,6 @@ // Create accelerators for lib3270 toggles. { const LIB3270_TOGGLE * toggles = lib3270_get_toggles(); - size_t ix; for(ix = 0; toggles[ix].name; ix++) { @@ -164,8 +163,6 @@ // Create accelerators for internal actions. { - size_t ix; - const V3270_ACTION * actions = v3270_get_actions(); for(ix = 0 ; actions[ix].name; ix++) @@ -183,6 +180,51 @@ } } + // Create PF-Key accelerators + { + static const struct + { + guint key; + GdkModifierType mods; + const gchar * name; + const gchar * description; + unsigned short pfkey; + } accels[] = + { + { + .key = GDK_Page_Up, + .name = "page-up", + .description = N_( "Previous page" ), + .pfkey = 7 + }, + { + .key = GDK_Page_Down, + .name = "page-down", + .description = N_( "Next page" ), + .pfkey = 8 + } + }; + + for(ix = 0 ; ix < G_N_ELEMENTS(accels); ix++) + { + V3270PFKeyAccelerator * accelerator = g_new0(V3270PFKeyAccelerator,1); + + accelerator->keycode = accels[ix].pfkey; + accelerator->name = accels[ix].name; + accelerator->description = accels[ix].description; + accelerator->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; + accelerator->parent.key = accels[ix].key; + accelerator->parent.mods = accels[ix].mods; + accelerator->parent.arg = (gconstpointer) accelerator; + accelerator->parent.activate = G_CALLBACK(fire_pfkey_action); + + debug("****************************%p [%s]",accelerator,accelerator->name); + widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); + + } + + } + v3270_accelerator_map_sort(widget); } diff --git a/src/terminal/keyboard/keyfile.c b/src/terminal/keyboard/keyfile.c index 46b28fe..b6f7bff 100644 --- a/src/terminal/keyboard/keyfile.c +++ b/src/terminal/keyboard/keyfile.c @@ -49,12 +49,12 @@ // It's a PF-Key action! g_autofree gchar * key = g_strdup_printf("pf%u",((V3270PFKeyAccelerator *)accel)->keycode); - debug("%s=%s",((V3270PFKeyAccelerator *)accel)->name,key); + debug("%p %s=%s",accel,v3270_accelerator_get_name(accel),key); g_key_file_set_string( ((struct Args *) ptr)->key_file, ((struct Args *) ptr)->group_name, - ((V3270PFKeyAccelerator *)accel)->name, + v3270_accelerator_get_name(accel), key ); @@ -86,7 +86,7 @@ } - static int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel) + int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel) { return lib3270_pfkey(v3270_get_session(widget),(int) accel->keycode); } @@ -126,61 +126,64 @@ if(!accel) { - // Is a special PFKey action? + g_warning("Can't parse accelerator %s",name); + return; + } - // Page_Down=pf8 + debug("Recreating accelerators for action \"%s\"",v3270_accelerator_get_name(accel)); - unsigned int pfkey = 0; + { + size_t ix; + gchar ** keycodes = g_strsplit(keys," ",-1); - if(sscanf(keys,"pf%u",&pfkey) == 1) + for(ix=0;keycodes[ix];ix++) { - guint key; - GdkModifierType mods; - debug("Creating special accelerator for PF%u",pfkey); - - gtk_accelerator_parse(name,&key,&mods); - - if(!key) + if(accel->type == V3270_ACCELERATOR_TYPE_PFKEY) { - g_warning("Can't parse accelerator %s",name); - return; - } + unsigned int pfkey = 0; - // Remap PFKey accelerator - V3270PFKeyAccelerator *pfAccel = g_new0(V3270PFKeyAccelerator,1); + if(sscanf(keycodes[ix],"pf%u",&pfkey) != 1) + { + g_warning("Can't parse accelerator %s",keys); + return; + } - pfAccel->keycode = (unsigned short) pfkey; - pfAccel->name = g_intern_string(name); - pfAccel->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; - pfAccel->parent.key = key; - pfAccel->parent.mods = mods; - pfAccel->parent.arg = (gconstpointer) pfAccel; - pfAccel->parent.activate = G_CALLBACK(fire_pfkey_action); + // It's a PFKey redirector + guint key; + GdkModifierType mods; - terminal->accelerators = g_slist_prepend(terminal->accelerators,pfAccel); + debug("Creating special accelerator %s",v3270_accelerator_get_name(accel)); + gtk_accelerator_parse(keycodes[ix],&key,&mods); - } - else - { - debug("Can't find accelerator \"%s\"",name); - g_warning("Can't find accelerator \"%s\"",name); - } + if(!key) + { + g_warning("Can't parse accelerator %s",v3270_accelerator_get_name(accel)); + return; + } - return; - } + // Remap PFKey accelerator + V3270PFKeyAccelerator *pfAccel = g_new0(V3270PFKeyAccelerator,1); - debug("Recreating accelerators for action \"%s\"",v3270_accelerator_get_name(accel)); + pfAccel->keycode = (unsigned short) pfkey; + pfAccel->name = ((V3270PFKeyAccelerator *) accel)->name; + pfAccel->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; + pfAccel->parent.key = key; + pfAccel->parent.mods = mods; + pfAccel->parent.arg = (gconstpointer) pfAccel; + pfAccel->parent.activate = G_CALLBACK(fire_pfkey_action); - { - size_t ix; - gchar ** keycodes = g_strsplit(keys," ",-1); + terminal->accelerators = g_slist_prepend(terminal->accelerators,pfAccel); + + } + else + { + // Standard accelerator. + V3270Accelerator * acc = v3270_accelerator_copy(accel); + gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods); + terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); + } - for(ix=0;keycodes[ix];ix++) - { - V3270Accelerator * acc = v3270_accelerator_copy(accel); - gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods); - terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); } g_strfreev(keycodes); diff --git a/src/terminal/keyboard/private.h b/src/terminal/keyboard/private.h index fb81161..7ef626b 100644 --- a/src/terminal/keyboard/private.h +++ b/src/terminal/keyboard/private.h @@ -32,5 +32,7 @@ #include #include + G_GNUC_INTERNAL int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel); + -- libgit2 0.21.2