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); | ... | ... |