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,6 +111,8 @@ | ||
111 | 111 | ||
112 | static void V3270AcceleratorSettings_init(V3270AcceleratorSettings *widget) | 112 | static void V3270AcceleratorSettings_init(V3270AcceleratorSettings *widget) |
113 | { | 113 | { |
114 | + size_t ix; | ||
115 | + | ||
114 | // Create description list | 116 | // Create description list |
115 | GtkCellRenderer * text_renderer = gtk_cell_renderer_text_new(); | 117 | GtkCellRenderer * text_renderer = gtk_cell_renderer_text_new(); |
116 | 118 | ||
@@ -171,8 +173,8 @@ | @@ -171,8 +173,8 @@ | ||
171 | NULL | 173 | NULL |
172 | ); | 174 | ); |
173 | 175 | ||
174 | - gtk_tree_view_column_set_resizable(column, TRUE); | ||
175 | gtk_tree_view_column_set_min_width(column, 500); | 176 | gtk_tree_view_column_set_min_width(column, 500); |
177 | + gtk_tree_view_column_set_resizable(column, TRUE); | ||
176 | 178 | ||
177 | gtk_tree_view_insert_column( | 179 | gtk_tree_view_insert_column( |
178 | GTK_TREE_VIEW(view), | 180 | GTK_TREE_VIEW(view), |
@@ -201,6 +203,13 @@ | @@ -201,6 +203,13 @@ | ||
201 | NULL | 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 | // Create scroller view | 213 | // Create scroller view |
205 | { | 214 | { |
206 | GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); | 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,7 +414,7 @@ static void accel_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar *path | ||
405 | change_accel(widget, path, accel_key, mask, MAIN_VALUE, MAIN_MASK); | 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 | #ifdef DEBUG | 419 | #ifdef DEBUG |
411 | { | 420 | { |
@@ -413,6 +422,43 @@ static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar | @@ -413,6 +422,43 @@ static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*accel), gchar | ||
413 | debug("%s(%s) = %u/%d (%s)",__FUNCTION__,path,accel_key,mask,keyname); | 422 | debug("%s(%s) = %u/%d (%s)",__FUNCTION__,path,accel_key,mask,keyname); |
414 | } | 423 | } |
415 | #endif // DEBUG | 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 | change_accel(widget, path, accel_key, mask, ALTERNATIVE_VALUE, ALTERNATIVE_MASK); | 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,7 +626,7 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) | ||
626 | g_return_if_fail(GTK_IS_V3270(widget)); | 626 | g_return_if_fail(GTK_IS_V3270(widget)); |
627 | 627 | ||
628 | GtkWidget * dialog = v3270_settings_dialog_new(); | 628 | GtkWidget * dialog = v3270_settings_dialog_new(); |
629 | - GtkWidget * settings = v3270_host_select_new(); | 629 | + GtkWidget * settings = v3270_host_settings_new(); |
630 | 630 | ||
631 | gtk_window_set_title(GTK_WINDOW(dialog), v3270_settings_get_title(settings)); | 631 | gtk_window_set_title(GTK_WINDOW(dialog), v3270_settings_get_title(settings)); |
632 | gtk_container_add(GTK_CONTAINER(dialog), settings); | 632 | gtk_container_add(GTK_CONTAINER(dialog), settings); |
src/include/internals.h
@@ -176,6 +176,7 @@ | @@ -176,6 +176,7 @@ | ||
176 | { | 176 | { |
177 | struct _V3270Accelerator parent; | 177 | struct _V3270Accelerator parent; |
178 | const gchar *name; | 178 | const gchar *name; |
179 | + const gchar *description; | ||
179 | unsigned short keycode; | 180 | unsigned short keycode; |
180 | } V3270PFKeyAccelerator; | 181 | } V3270PFKeyAccelerator; |
181 | 182 |
src/terminal/keyboard/accelerator.c
@@ -40,16 +40,28 @@ | @@ -40,16 +40,28 @@ | ||
40 | { | 40 | { |
41 | V3270Accelerator * rc = NULL; | 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 | rc = g_new0(V3270Accelerator,1); | 62 | rc = g_new0(V3270Accelerator,1); |
52 | *rc = *accel; | 63 | *rc = *accel; |
64 | + | ||
53 | } | 65 | } |
54 | 66 | ||
55 | return rc; | 67 | return rc; |
@@ -174,6 +186,9 @@ | @@ -174,6 +186,9 @@ | ||
174 | 186 | ||
175 | case V3270_ACCELERATOR_TYPE_PFKEY: | 187 | case V3270_ACCELERATOR_TYPE_PFKEY: |
176 | 188 | ||
189 | + if( ((V3270PFKeyAccelerator *)accel)->description ) | ||
190 | + return ((V3270PFKeyAccelerator *)accel)->description; | ||
191 | + | ||
177 | if( ((V3270PFKeyAccelerator *)accel)->name ) | 192 | if( ((V3270PFKeyAccelerator *)accel)->name ) |
178 | return ((V3270PFKeyAccelerator *)accel)->name; | 193 | return ((V3270PFKeyAccelerator *)accel)->name; |
179 | 194 | ||
@@ -200,6 +215,9 @@ | @@ -200,6 +215,9 @@ | ||
200 | case V3270_ACCELERATOR_TYPE_CUSTOM: | 215 | case V3270_ACCELERATOR_TYPE_CUSTOM: |
201 | return ((V3270CustomAccelerator *) accel)->name; | 216 | return ((V3270CustomAccelerator *) accel)->name; |
202 | 217 | ||
218 | + case V3270_ACCELERATOR_TYPE_PFKEY: | ||
219 | + return ((V3270PFKeyAccelerator *) accel)->name; | ||
220 | + | ||
203 | } | 221 | } |
204 | 222 | ||
205 | return NULL; | 223 | return NULL; |
src/terminal/keyboard/init.c
@@ -143,7 +143,6 @@ | @@ -143,7 +143,6 @@ | ||
143 | // Create accelerators for lib3270 toggles. | 143 | // Create accelerators for lib3270 toggles. |
144 | { | 144 | { |
145 | const LIB3270_TOGGLE * toggles = lib3270_get_toggles(); | 145 | const LIB3270_TOGGLE * toggles = lib3270_get_toggles(); |
146 | - size_t ix; | ||
147 | 146 | ||
148 | for(ix = 0; toggles[ix].name; ix++) | 147 | for(ix = 0; toggles[ix].name; ix++) |
149 | { | 148 | { |
@@ -164,8 +163,6 @@ | @@ -164,8 +163,6 @@ | ||
164 | 163 | ||
165 | // Create accelerators for internal actions. | 164 | // Create accelerators for internal actions. |
166 | { | 165 | { |
167 | - size_t ix; | ||
168 | - | ||
169 | const V3270_ACTION * actions = v3270_get_actions(); | 166 | const V3270_ACTION * actions = v3270_get_actions(); |
170 | 167 | ||
171 | for(ix = 0 ; actions[ix].name; ix++) | 168 | for(ix = 0 ; actions[ix].name; ix++) |
@@ -183,6 +180,51 @@ | @@ -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 | v3270_accelerator_map_sort(widget); | 228 | v3270_accelerator_map_sort(widget); |
187 | 229 | ||
188 | } | 230 | } |
src/terminal/keyboard/keyfile.c
@@ -49,12 +49,12 @@ | @@ -49,12 +49,12 @@ | ||
49 | // It's a PF-Key action! | 49 | // It's a PF-Key action! |
50 | g_autofree gchar * key = g_strdup_printf("pf%u",((V3270PFKeyAccelerator *)accel)->keycode); | 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 | g_key_file_set_string( | 54 | g_key_file_set_string( |
55 | ((struct Args *) ptr)->key_file, | 55 | ((struct Args *) ptr)->key_file, |
56 | ((struct Args *) ptr)->group_name, | 56 | ((struct Args *) ptr)->group_name, |
57 | - ((V3270PFKeyAccelerator *)accel)->name, | 57 | + v3270_accelerator_get_name(accel), |
58 | key | 58 | key |
59 | ); | 59 | ); |
60 | 60 | ||
@@ -86,7 +86,7 @@ | @@ -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 | return lib3270_pfkey(v3270_get_session(widget),(int) accel->keycode); | 91 | return lib3270_pfkey(v3270_get_session(widget),(int) accel->keycode); |
92 | } | 92 | } |
@@ -126,61 +126,64 @@ | @@ -126,61 +126,64 @@ | ||
126 | 126 | ||
127 | if(!accel) | 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 | g_strfreev(keycodes); | 189 | g_strfreev(keycodes); |
src/terminal/keyboard/private.h