Commit 1582d4afa30577c5fabe19658a733f2e19cb6aaf

Authored by Perry Werneck
1 parent df99d559
Exists in master and in 1 other branch develop

Refactoring accelerator engine.

src/include/v3270/actions.h
... ... @@ -88,7 +88,7 @@
88 88 LIB3270_EXPORT void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr);
89 89 LIB3270_EXPORT void v3270_accelerator_map_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name);
90 90 LIB3270_EXPORT gboolean v3270_accelerator_map_load_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name);
91   - LIB3270_EXPORT V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data);
  91 + LIB3270_EXPORT V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, const gchar *accelerator, GCallback callback, gpointer data);
92 92  
93 93 LIB3270_EXPORT const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state);
94 94 LIB3270_EXPORT void v3270_accelerator_activate(const V3270Accelerator * accel, GtkWidget *terminal);
... ... @@ -96,6 +96,7 @@
96 96 LIB3270_EXPORT const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel);
97 97 LIB3270_EXPORT const gchar * v3270_accelerator_get_description(const V3270Accelerator * accel);
98 98 LIB3270_EXPORT const gchar * v3270_accelerator_get_summary(const V3270Accelerator * accel);
  99 + LIB3270_EXPORT void v3270_accelerator_parse(V3270Accelerator * accel, const char *key);
99 100  
100 101 /// @brief Converts the accelerator into a string which can be used to represent the accelerator to the user.
101 102 /// @return A newly-allocated string representing the accelerator.
... ...
src/terminal/keyboard/accelerator.c
... ... @@ -236,6 +236,57 @@
236 236 return "";
237 237 }
238 238  
  239 + void v3270_accelerator_parse(V3270Accelerator * accel, const char *key)
  240 + {
  241 + if(!key)
  242 + return;
  243 +
  244 + guint accelerator_key;
  245 + GdkModifierType accelerator_mods;
  246 +
  247 + gtk_accelerator_parse(key, &accelerator_key, &accelerator_mods);
  248 +
  249 + accel->key = gdk_keyval_to_lower(accelerator_key);
  250 + accel->mods = accelerator_mods & gtk_accelerator_get_default_mod_mask();
  251 +
  252 + /*
  253 + if(!gtk_accelerator_valid(accel->key,accel->mods))
  254 + {
  255 + g_warning("Accelerator \"%s\" is not valid",key);
  256 + }
  257 + */
  258 +
  259 +#ifdef DEBUG
  260 + {
  261 + g_autofree gchar * keyname = gtk_accelerator_name(accel->key,accel->mods);
  262 + debug("%s Name: %s Keyval: %d (%s) State: %04x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  263 + __FUNCTION__,
  264 + v3270_accelerator_get_name(accel),
  265 + accel->key,
  266 + gdk_keyval_name(accel->key),
  267 + accel->mods,
  268 + accel->mods & GDK_SHIFT_MASK ? " GDK_SHIFT_MASK" : "",
  269 + accel->mods & GDK_LOCK_MASK ? " GDK_LOCK_MASK" : "",
  270 + accel->mods & GDK_CONTROL_MASK ? " GDK_CONTROL_MASK" : "",
  271 + accel->mods & GDK_MOD1_MASK ? " GDK_MOD1_MASK" : "",
  272 + accel->mods & GDK_MOD2_MASK ? " GDK_MOD2_MASK" : "",
  273 + accel->mods & GDK_MOD3_MASK ? " GDK_MOD3_MASK" : "",
  274 + accel->mods & GDK_MOD4_MASK ? " GDK_MOD4_MASK" : "",
  275 + accel->mods & GDK_MOD5_MASK ? " GDK_MOD5_MASK" : "",
  276 + accel->mods & GDK_BUTTON1_MASK ? " GDK_BUTTON1_MASK" : "",
  277 + accel->mods & GDK_BUTTON2_MASK ? " GDK_BUTTON2_MASK" : "",
  278 + accel->mods & GDK_BUTTON3_MASK ? " GDK_BUTTON3_MASK" : "",
  279 + accel->mods & GDK_BUTTON4_MASK ? " GDK_BUTTON4_MASK" : "",
  280 + accel->mods & GDK_BUTTON5_MASK ? " GDK_BUTTON5_MASK" : "",
  281 + accel->mods & GDK_RELEASE_MASK ? " GDK_RELEASE_MASK" : "",
  282 + accel->mods & GDK_MODIFIER_MASK ? " GDK_MODIFIER_MASK" : ""
  283 + );
  284 +
  285 + }
  286 +#endif // DEBUG
  287 +
  288 + }
  289 +
239 290 const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel)
240 291 {
241 292 switch(accel->type)
... ...
src/terminal/keyboard/init.c
... ... @@ -103,7 +103,7 @@
103 103  
104 104 // debug("%s=%s",actions[ix].name,keys[key]);
105 105  
106   - gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods);
  106 + v3270_accelerator_parse(accelerator,keys[key]);
107 107  
108 108 widget->accelerators = g_slist_prepend(widget->accelerators,accelerator);
109 109  
... ... @@ -139,8 +139,7 @@
139 139 accelerator->arg = (gconstpointer) &toggles[ix];
140 140 accelerator->activate = G_CALLBACK(fire_lib3270_toggle);
141 141  
142   - if(toggles[ix].key)
143   - gtk_accelerator_parse(toggles[ix].key,&accelerator->key,&accelerator->mods);
  142 + v3270_accelerator_parse(accelerator,toggles[ix].key);
144 143  
145 144 widget->accelerators = g_slist_prepend(widget->accelerators,accelerator);
146 145  
... ... @@ -168,7 +167,7 @@
168 167 accelerator->arg = (gconstpointer) &actions[ix];
169 168 accelerator->activate = G_CALLBACK(actions[ix].activate);
170 169  
171   - gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods);
  170 + v3270_accelerator_parse(accelerator,keys[key]);
172 171  
173 172 widget->accelerators = g_slist_prepend(widget->accelerators,accelerator);
174 173  
... ...
src/terminal/keyboard/map.c
... ... @@ -101,7 +101,7 @@
101 101  
102 102 }
103 103  
104   - V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data)
  104 + V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, const gchar *accelerator, GCallback callback, gpointer data)
105 105 {
106 106 GSList * ix;
107 107 v3270 * terminal = GTK_V3270(widget);
... ... @@ -135,21 +135,24 @@
135 135  
136 136 accel->arg = data;
137 137 accel->activate = callback;
138   - accel->key = accel_key;
139   - accel->mods = accel_mods;
140 138  
141   - // Any other accell in the same key? If yes, clear it.
142   - for(ix = terminal->accelerators; ix; ix = g_slist_next(ix))
  139 + v3270_accelerator_parse(accel, accelerator);
  140 +
  141 + if(accel->key)
143 142 {
144   - V3270Accelerator * acc = (V3270Accelerator *) ix->data;
145   - if((acc == accel) || !(acc->key == accel->key && acc->mods == accel->mods))
146   - continue;
  143 + // Any other accell in the same key and modifier? If yes, clear it.
  144 + for(ix = terminal->accelerators; ix; ix = g_slist_next(ix))
  145 + {
  146 + V3270Accelerator * acc = (V3270Accelerator *) ix->data;
  147 + if((acc == accel) || !(acc->key == accel->key && acc->mods == accel->mods))
  148 + continue;
147 149  
148   - debug("Resetting accelerator \"%s\"",v3270_accelerator_get_name(acc));
  150 + debug("Resetting accelerator \"%s\"",v3270_accelerator_get_name(acc));
149 151  
150   - acc->key = 0;
151   - acc->mods = 0;
  152 + acc->key = 0;
  153 + acc->mods = 0;
152 154  
  155 + }
153 156 }
154 157  
155 158 // Sort!
... ... @@ -167,7 +170,7 @@
167 170 keyval = gdk_keyval_to_lower(keyval);
168 171  
169 172 // Remove unnecessary modifiers
170   - state &= (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK);
  173 + state &= gtk_accelerator_get_default_mod_mask(); // (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK);
171 174  
172 175 GSList * ix;
173 176 for(ix = GTK_V3270(widget)->accelerators; ix; ix = g_slist_next(ix))
... ...