Commit 8e33538613b9659a7f933bf71468688cb1dfe8ea
1 parent
101ba80b
Exists in
master
and in
1 other branch
Fixing accelerator settings dialog.
Showing
7 changed files
with
170 additions
and
58 deletions
Show diff stats
src/dialogs/settings/accelerator.c
| ... | ... | @@ -111,6 +111,8 @@ |
| 111 | 111 | |
| 112 | 112 | static void V3270AcceleratorSettings_init(V3270AcceleratorSettings *widget) |
| 113 | 113 | { |
| 114 | + size_t ix; | |
| 115 | + | |
| 114 | 116 | // Create description list |
| 115 | 117 | GtkCellRenderer * text_renderer = gtk_cell_renderer_text_new(); |
| 116 | 118 | |
| ... | ... | @@ -171,8 +173,8 @@ |
| 171 | 173 | NULL |
| 172 | 174 | ); |
| 173 | 175 | |
| 174 | - gtk_tree_view_column_set_resizable(column, TRUE); | |
| 175 | 176 | gtk_tree_view_column_set_min_width(column, 500); |
| 177 | + gtk_tree_view_column_set_resizable(column, TRUE); | |
| 176 | 178 | |
| 177 | 179 | gtk_tree_view_insert_column( |
| 178 | 180 | GTK_TREE_VIEW(view), |
| ... | ... | @@ -201,6 +203,13 @@ |
| 201 | 203 | NULL |
| 202 | 204 | ); |
| 203 | 205 | |
| 206 | + for(ix = 1; ix < 3; ix++) | |
| 207 | + { | |
| 208 | + GtkTreeViewColumn * column = gtk_tree_view_get_column(GTK_TREE_VIEW(view), ix); | |
| 209 | + gtk_tree_view_column_set_min_width(column, 200); | |
| 210 | + gtk_tree_view_column_set_resizable(column, TRUE); | |
| 211 | + } | |
| 212 | + | |
| 204 | 213 | // Create scroller view |
| 205 | 214 | { |
| 206 | 215 | GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); |
| ... | ... | @@ -405,7 +414,7 @@ static void accel_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar *path |
| 405 | 414 | change_accel(widget, path, accel_key, mask, MAIN_VALUE, MAIN_MASK); |
| 406 | 415 | } |
| 407 | 416 | |
| 408 | -static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar *path, guint accel_key, GdkModifierType mask, guint G_GNUC_UNUSED(hardware_keycode), V3270AcceleratorSettings *widget) | |
| 417 | +static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*renderer), gchar *path, guint accel_key, GdkModifierType mask, guint G_GNUC_UNUSED(hardware_keycode), V3270AcceleratorSettings *widget) | |
| 409 | 418 | { |
| 410 | 419 | #ifdef DEBUG |
| 411 | 420 | { |
| ... | ... | @@ -413,6 +422,43 @@ static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar |
| 413 | 422 | debug("%s(%s) = %u/%d (%s)",__FUNCTION__,path,accel_key,mask,keyname); |
| 414 | 423 | } |
| 415 | 424 | #endif // DEBUG |
| 425 | + | |
| 426 | + // Check for "single-accel" actions | |
| 427 | + V3270Accelerator *accel = NULL; | |
| 428 | + GtkTreePath * tree_path = gtk_tree_path_new_from_string(path); | |
| 429 | + GtkTreeIter iter; | |
| 430 | + if(gtk_tree_model_get_iter(GTK_TREE_MODEL(widget->store),&iter,tree_path)) | |
| 431 | + { | |
| 432 | + GValue value; | |
| 433 | + memset(&value,0,sizeof(value)); | |
| 434 | + gtk_tree_model_get_value(GTK_TREE_MODEL(widget->store), &iter, ACTION, &value); | |
| 435 | + accel = (V3270Accelerator *) g_value_get_pointer(&value); | |
| 436 | + g_value_unset(&value); | |
| 437 | + } | |
| 438 | + gtk_tree_path_free(tree_path); | |
| 439 | + | |
| 440 | + if(accel && accel->type == V3270_ACCELERATOR_TYPE_PFKEY) | |
| 441 | + { | |
| 442 | + GtkWidget * dialog = | |
| 443 | + gtk_message_dialog_new_with_markup( | |
| 444 | + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))), | |
| 445 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 446 | + GTK_MESSAGE_ERROR, | |
| 447 | + GTK_BUTTONS_CANCEL, | |
| 448 | + _( "The action \"%s\" can't manage alternative keys" ), | |
| 449 | + v3270_accelerator_get_description(accel) | |
| 450 | + ); | |
| 451 | + | |
| 452 | + gtk_window_set_title(GTK_WINDOW(dialog),_("Rejected by action")); | |
| 453 | + gtk_widget_show_all(dialog); | |
| 454 | + | |
| 455 | + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); | |
| 456 | + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); | |
| 457 | + | |
| 458 | + return; | |
| 459 | + } | |
| 460 | + | |
| 461 | + // Call the common validation. | |
| 416 | 462 | change_accel(widget, path, accel_key, mask, ALTERNATIVE_VALUE, ALTERNATIVE_MASK); |
| 417 | 463 | } |
| 418 | 464 | ... | ... |
src/dialogs/settings/host.c
| ... | ... | @@ -626,7 +626,7 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) |
| 626 | 626 | g_return_if_fail(GTK_IS_V3270(widget)); |
| 627 | 627 | |
| 628 | 628 | GtkWidget * dialog = v3270_settings_dialog_new(); |
| 629 | - GtkWidget * settings = v3270_host_select_new(); | |
| 629 | + GtkWidget * settings = v3270_host_settings_new(); | |
| 630 | 630 | |
| 631 | 631 | gtk_window_set_title(GTK_WINDOW(dialog), v3270_settings_get_title(settings)); |
| 632 | 632 | gtk_container_add(GTK_CONTAINER(dialog), settings); | ... | ... |
src/include/internals.h
src/terminal/keyboard/accelerator.c
| ... | ... | @@ -40,16 +40,28 @@ |
| 40 | 40 | { |
| 41 | 41 | V3270Accelerator * rc = NULL; |
| 42 | 42 | |
| 43 | - if(accel->type == V3270_ACCELERATOR_TYPE_CUSTOM) | |
| 44 | - { | |
| 45 | - V3270CustomAccelerator * customAccel = g_new0(V3270CustomAccelerator,1); | |
| 46 | - *customAccel = *((V3270CustomAccelerator *) accel); | |
| 47 | - rc = (V3270Accelerator *) customAccel; | |
| 48 | - } | |
| 49 | - else | |
| 50 | - { | |
| 43 | + switch(accel->type) | |
| 44 | + { | |
| 45 | + case V3270_ACCELERATOR_TYPE_CUSTOM: | |
| 46 | + { | |
| 47 | + V3270CustomAccelerator * customAccel = g_new0(V3270CustomAccelerator,1); | |
| 48 | + *customAccel = *((V3270CustomAccelerator *) accel); | |
| 49 | + rc = (V3270Accelerator *) customAccel; | |
| 50 | + } | |
| 51 | + break; | |
| 52 | + | |
| 53 | + case V3270_ACCELERATOR_TYPE_PFKEY: | |
| 54 | + { | |
| 55 | + V3270PFKeyAccelerator * customAccel = g_new0(V3270PFKeyAccelerator,1); | |
| 56 | + *customAccel = *((V3270PFKeyAccelerator *) accel); | |
| 57 | + rc = (V3270Accelerator *) customAccel; | |
| 58 | + } | |
| 59 | + break; | |
| 60 | + | |
| 61 | + default: | |
| 51 | 62 | rc = g_new0(V3270Accelerator,1); |
| 52 | 63 | *rc = *accel; |
| 64 | + | |
| 53 | 65 | } |
| 54 | 66 | |
| 55 | 67 | return rc; |
| ... | ... | @@ -174,6 +186,9 @@ |
| 174 | 186 | |
| 175 | 187 | case V3270_ACCELERATOR_TYPE_PFKEY: |
| 176 | 188 | |
| 189 | + if( ((V3270PFKeyAccelerator *)accel)->description ) | |
| 190 | + return ((V3270PFKeyAccelerator *)accel)->description; | |
| 191 | + | |
| 177 | 192 | if( ((V3270PFKeyAccelerator *)accel)->name ) |
| 178 | 193 | return ((V3270PFKeyAccelerator *)accel)->name; |
| 179 | 194 | |
| ... | ... | @@ -200,6 +215,9 @@ |
| 200 | 215 | case V3270_ACCELERATOR_TYPE_CUSTOM: |
| 201 | 216 | return ((V3270CustomAccelerator *) accel)->name; |
| 202 | 217 | |
| 218 | + case V3270_ACCELERATOR_TYPE_PFKEY: | |
| 219 | + return ((V3270PFKeyAccelerator *) accel)->name; | |
| 220 | + | |
| 203 | 221 | } |
| 204 | 222 | |
| 205 | 223 | return NULL; | ... | ... |
src/terminal/keyboard/init.c
| ... | ... | @@ -143,7 +143,6 @@ |
| 143 | 143 | // Create accelerators for lib3270 toggles. |
| 144 | 144 | { |
| 145 | 145 | const LIB3270_TOGGLE * toggles = lib3270_get_toggles(); |
| 146 | - size_t ix; | |
| 147 | 146 | |
| 148 | 147 | for(ix = 0; toggles[ix].name; ix++) |
| 149 | 148 | { |
| ... | ... | @@ -164,8 +163,6 @@ |
| 164 | 163 | |
| 165 | 164 | // Create accelerators for internal actions. |
| 166 | 165 | { |
| 167 | - size_t ix; | |
| 168 | - | |
| 169 | 166 | const V3270_ACTION * actions = v3270_get_actions(); |
| 170 | 167 | |
| 171 | 168 | for(ix = 0 ; actions[ix].name; ix++) |
| ... | ... | @@ -183,6 +180,51 @@ |
| 183 | 180 | } |
| 184 | 181 | } |
| 185 | 182 | |
| 183 | + // Create PF-Key accelerators | |
| 184 | + { | |
| 185 | + static const struct | |
| 186 | + { | |
| 187 | + guint key; | |
| 188 | + GdkModifierType mods; | |
| 189 | + const gchar * name; | |
| 190 | + const gchar * description; | |
| 191 | + unsigned short pfkey; | |
| 192 | + } accels[] = | |
| 193 | + { | |
| 194 | + { | |
| 195 | + .key = GDK_Page_Up, | |
| 196 | + .name = "page-up", | |
| 197 | + .description = N_( "Previous page" ), | |
| 198 | + .pfkey = 7 | |
| 199 | + }, | |
| 200 | + { | |
| 201 | + .key = GDK_Page_Down, | |
| 202 | + .name = "page-down", | |
| 203 | + .description = N_( "Next page" ), | |
| 204 | + .pfkey = 8 | |
| 205 | + } | |
| 206 | + }; | |
| 207 | + | |
| 208 | + for(ix = 0 ; ix < G_N_ELEMENTS(accels); ix++) | |
| 209 | + { | |
| 210 | + V3270PFKeyAccelerator * accelerator = g_new0(V3270PFKeyAccelerator,1); | |
| 211 | + | |
| 212 | + accelerator->keycode = accels[ix].pfkey; | |
| 213 | + accelerator->name = accels[ix].name; | |
| 214 | + accelerator->description = accels[ix].description; | |
| 215 | + accelerator->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; | |
| 216 | + accelerator->parent.key = accels[ix].key; | |
| 217 | + accelerator->parent.mods = accels[ix].mods; | |
| 218 | + accelerator->parent.arg = (gconstpointer) accelerator; | |
| 219 | + accelerator->parent.activate = G_CALLBACK(fire_pfkey_action); | |
| 220 | + | |
| 221 | + debug("****************************%p [%s]",accelerator,accelerator->name); | |
| 222 | + widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); | |
| 223 | + | |
| 224 | + } | |
| 225 | + | |
| 226 | + } | |
| 227 | + | |
| 186 | 228 | v3270_accelerator_map_sort(widget); |
| 187 | 229 | |
| 188 | 230 | } | ... | ... |
src/terminal/keyboard/keyfile.c
| ... | ... | @@ -49,12 +49,12 @@ |
| 49 | 49 | // It's a PF-Key action! |
| 50 | 50 | g_autofree gchar * key = g_strdup_printf("pf%u",((V3270PFKeyAccelerator *)accel)->keycode); |
| 51 | 51 | |
| 52 | - debug("%s=%s",((V3270PFKeyAccelerator *)accel)->name,key); | |
| 52 | + debug("%p %s=%s",accel,v3270_accelerator_get_name(accel),key); | |
| 53 | 53 | |
| 54 | 54 | g_key_file_set_string( |
| 55 | 55 | ((struct Args *) ptr)->key_file, |
| 56 | 56 | ((struct Args *) ptr)->group_name, |
| 57 | - ((V3270PFKeyAccelerator *)accel)->name, | |
| 57 | + v3270_accelerator_get_name(accel), | |
| 58 | 58 | key |
| 59 | 59 | ); |
| 60 | 60 | |
| ... | ... | @@ -86,7 +86,7 @@ |
| 86 | 86 | |
| 87 | 87 | } |
| 88 | 88 | |
| 89 | - static int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel) | |
| 89 | + int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel) | |
| 90 | 90 | { |
| 91 | 91 | return lib3270_pfkey(v3270_get_session(widget),(int) accel->keycode); |
| 92 | 92 | } |
| ... | ... | @@ -126,61 +126,64 @@ |
| 126 | 126 | |
| 127 | 127 | if(!accel) |
| 128 | 128 | { |
| 129 | - // Is a special PFKey action? | |
| 129 | + g_warning("Can't parse accelerator %s",name); | |
| 130 | + return; | |
| 131 | + } | |
| 130 | 132 | |
| 131 | - // Page_Down=pf8 | |
| 133 | + debug("Recreating accelerators for action \"%s\"",v3270_accelerator_get_name(accel)); | |
| 132 | 134 | |
| 133 | - unsigned int pfkey = 0; | |
| 135 | + { | |
| 136 | + size_t ix; | |
| 137 | + gchar ** keycodes = g_strsplit(keys," ",-1); | |
| 134 | 138 | |
| 135 | - if(sscanf(keys,"pf%u",&pfkey) == 1) | |
| 139 | + for(ix=0;keycodes[ix];ix++) | |
| 136 | 140 | { |
| 137 | - guint key; | |
| 138 | - GdkModifierType mods; | |
| 139 | 141 | |
| 140 | - debug("Creating special accelerator for PF%u",pfkey); | |
| 141 | - | |
| 142 | - gtk_accelerator_parse(name,&key,&mods); | |
| 143 | - | |
| 144 | - if(!key) | |
| 142 | + if(accel->type == V3270_ACCELERATOR_TYPE_PFKEY) | |
| 145 | 143 | { |
| 146 | - g_warning("Can't parse accelerator %s",name); | |
| 147 | - return; | |
| 148 | - } | |
| 144 | + unsigned int pfkey = 0; | |
| 149 | 145 | |
| 150 | - // Remap PFKey accelerator | |
| 151 | - V3270PFKeyAccelerator *pfAccel = g_new0(V3270PFKeyAccelerator,1); | |
| 146 | + if(sscanf(keycodes[ix],"pf%u",&pfkey) != 1) | |
| 147 | + { | |
| 148 | + g_warning("Can't parse accelerator %s",keys); | |
| 149 | + return; | |
| 150 | + } | |
| 152 | 151 | |
| 153 | - pfAccel->keycode = (unsigned short) pfkey; | |
| 154 | - pfAccel->name = g_intern_string(name); | |
| 155 | - pfAccel->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; | |
| 156 | - pfAccel->parent.key = key; | |
| 157 | - pfAccel->parent.mods = mods; | |
| 158 | - pfAccel->parent.arg = (gconstpointer) pfAccel; | |
| 159 | - pfAccel->parent.activate = G_CALLBACK(fire_pfkey_action); | |
| 152 | + // It's a PFKey redirector | |
| 153 | + guint key; | |
| 154 | + GdkModifierType mods; | |
| 160 | 155 | |
| 161 | - terminal->accelerators = g_slist_prepend(terminal->accelerators,pfAccel); | |
| 156 | + debug("Creating special accelerator %s",v3270_accelerator_get_name(accel)); | |
| 157 | + gtk_accelerator_parse(keycodes[ix],&key,&mods); | |
| 162 | 158 | |
| 163 | - } | |
| 164 | - else | |
| 165 | - { | |
| 166 | - debug("Can't find accelerator \"%s\"",name); | |
| 167 | - g_warning("Can't find accelerator \"%s\"",name); | |
| 168 | - } | |
| 159 | + if(!key) | |
| 160 | + { | |
| 161 | + g_warning("Can't parse accelerator %s",v3270_accelerator_get_name(accel)); | |
| 162 | + return; | |
| 163 | + } | |
| 169 | 164 | |
| 170 | - return; | |
| 171 | - } | |
| 165 | + // Remap PFKey accelerator | |
| 166 | + V3270PFKeyAccelerator *pfAccel = g_new0(V3270PFKeyAccelerator,1); | |
| 172 | 167 | |
| 173 | - debug("Recreating accelerators for action \"%s\"",v3270_accelerator_get_name(accel)); | |
| 168 | + pfAccel->keycode = (unsigned short) pfkey; | |
| 169 | + pfAccel->name = ((V3270PFKeyAccelerator *) accel)->name; | |
| 170 | + pfAccel->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; | |
| 171 | + pfAccel->parent.key = key; | |
| 172 | + pfAccel->parent.mods = mods; | |
| 173 | + pfAccel->parent.arg = (gconstpointer) pfAccel; | |
| 174 | + pfAccel->parent.activate = G_CALLBACK(fire_pfkey_action); | |
| 174 | 175 | |
| 175 | - { | |
| 176 | - size_t ix; | |
| 177 | - gchar ** keycodes = g_strsplit(keys," ",-1); | |
| 176 | + terminal->accelerators = g_slist_prepend(terminal->accelerators,pfAccel); | |
| 177 | + | |
| 178 | + } | |
| 179 | + else | |
| 180 | + { | |
| 181 | + // Standard accelerator. | |
| 182 | + V3270Accelerator * acc = v3270_accelerator_copy(accel); | |
| 183 | + gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods); | |
| 184 | + terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); | |
| 185 | + } | |
| 178 | 186 | |
| 179 | - for(ix=0;keycodes[ix];ix++) | |
| 180 | - { | |
| 181 | - V3270Accelerator * acc = v3270_accelerator_copy(accel); | |
| 182 | - gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods); | |
| 183 | - terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); | |
| 184 | 187 | } |
| 185 | 188 | |
| 186 | 189 | g_strfreev(keycodes); | ... | ... |