Commit e8267e3592222ad66fd88b2ae3fd8e51d5318281

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

Adding support for customized accelerators.

src/include/internals.h
@@ -148,7 +148,7 @@ @@ -148,7 +148,7 @@
148 { 148 {
149 V3270_ACCELERATOR_TYPE_INTERNAL, ///< @brief Accelerator is internal. 149 V3270_ACCELERATOR_TYPE_INTERNAL, ///< @brief Accelerator is internal.
150 V3270_ACCELERATOR_TYPE_LIB3270_ACTION, ///< @brief Accelerator is a lib3270 action. 150 V3270_ACCELERATOR_TYPE_LIB3270_ACTION, ///< @brief Accelerator is a lib3270 action.
151 - V3270_ACCELERATOR_TYPE_GTK_ACTION, ///< @brief Accelerator is a GTK Action (Deprececated). 151 + V3270_ACCELERATOR_TYPE_CUSTOM, ///< @brief Custom (application based) accelerator.
152 }; 152 };
153 153
154 struct _V3270Accelerator 154 struct _V3270Accelerator
@@ -160,6 +160,12 @@ @@ -160,6 +160,12 @@
160 GCallback activate; 160 GCallback activate;
161 }; 161 };
162 162
  163 + typedef struct _V3270CustomAccelerator
  164 + {
  165 + struct _V3270Accelerator parent;
  166 + const gchar *name;
  167 + } V3270CustomAccelerator;
  168 +
163 typedef enum v3270_toggleable_dialog 169 typedef enum v3270_toggleable_dialog
164 { 170 {
165 V3270_TOGGLEABLE_DIALOG_PASTE_FAILED, 171 V3270_TOGGLEABLE_DIALOG_PASTE_FAILED,
src/include/v3270/actions.h
@@ -56,10 +56,9 @@ @@ -56,10 +56,9 @@
56 56
57 /// @brief Reset accelerator map to defaults. 57 /// @brief Reset accelerator map to defaults.
58 LIB3270_EXPORT void v3270_accelerator_map_reset(GtkWidget *widget); 58 LIB3270_EXPORT void v3270_accelerator_map_reset(GtkWidget *widget);
59 -  
60 LIB3270_EXPORT void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr); 59 LIB3270_EXPORT void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr);
61 -  
62 LIB3270_EXPORT void v3270_accelerator_map_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); 60 LIB3270_EXPORT void v3270_accelerator_map_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name);
  61 + LIB3270_EXPORT V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data);
63 62
64 LIB3270_EXPORT const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state); 63 LIB3270_EXPORT const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state);
65 LIB3270_EXPORT void v3270_accelerator_activate(const V3270Accelerator * accel, GtkWidget *terminal); 64 LIB3270_EXPORT void v3270_accelerator_activate(const V3270Accelerator * accel, GtkWidget *terminal);
src/terminal/keyboard/accelerator.c
@@ -79,11 +79,20 @@ @@ -79,11 +79,20 @@
79 79
80 const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state) 80 const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state)
81 { 81 {
82 - GSList * acccelerator;  
83 - for(acccelerator = GTK_V3270(widget)->accelerators; acccelerator; acccelerator = g_slist_next(acccelerator)) 82 + GSList * ix;
  83 +
  84 + debug("%s: %u %u",__FUNCTION__,(unsigned int) keyval, (unsigned int) state);
  85 +
  86 + for(ix = GTK_V3270(widget)->accelerators; ix; ix = g_slist_next(ix))
84 { 87 {
85 - if(v3270_accelerator_compare((V3270Accelerator *) acccelerator->data, keyval, state))  
86 - return (V3270Accelerator *) acccelerator->data; 88 + debug(
  89 + "%s: %u %u",
  90 + v3270_accelerator_get_name((V3270Accelerator *) ix->data),
  91 + (unsigned int) ((V3270Accelerator *) ix->data)->key,
  92 + (unsigned int) ((V3270Accelerator *) ix->data)->mods
  93 + );
  94 + if(v3270_accelerator_compare((V3270Accelerator *) ix->data, keyval, state))
  95 + return (V3270Accelerator *) ix->data;
87 } 96 }
88 97
89 return NULL; 98 return NULL;
@@ -112,8 +121,8 @@ @@ -112,8 +121,8 @@
112 case V3270_ACCELERATOR_TYPE_LIB3270_ACTION: 121 case V3270_ACCELERATOR_TYPE_LIB3270_ACTION:
113 return gettext(((LIB3270_ACTION *) accel->arg)->name); 122 return gettext(((LIB3270_ACTION *) accel->arg)->name);
114 123
115 - // case V3270_ACCELERATOR_TYPE_INTERNAL:  
116 - // case V3270_ACCELERATOR_TYPE_GTK_ACTION: 124 + case V3270_ACCELERATOR_TYPE_CUSTOM:
  125 + return ((V3270CustomAccelerator *) accel)->name;
117 126
118 } 127 }
119 128
@@ -140,9 +149,11 @@ @@ -140,9 +149,11 @@
140 if(str->str[0]) 149 if(str->str[0])
141 g_string_append(str," "); 150 g_string_append(str," ");
142 151
143 - g_autofree gchar * keyname = gtk_accelerator_name(accel->key,accel->mods);  
144 - g_string_append(str,keyname);  
145 - 152 + if(accel->key)
  153 + {
  154 + g_autofree gchar * keyname = gtk_accelerator_name(accel->key,accel->mods);
  155 + g_string_append(str,keyname);
  156 + }
146 157
147 } 158 }
148 159
@@ -157,7 +168,65 @@ @@ -157,7 +168,65 @@
157 168
158 } 169 }
159 170
160 - LIB3270_EXPORT gchar * v3270_accelerator_get_label(const V3270Accelerator * accel) 171 + gchar * v3270_accelerator_get_label(const V3270Accelerator * accel)
161 { 172 {
162 return gtk_accelerator_get_label(accel->key,accel->mods); 173 return gtk_accelerator_get_label(accel->key,accel->mods);
163 } 174 }
  175 +
  176 + V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data)
  177 + {
  178 + GSList * ix;
  179 + v3270 * terminal = GTK_V3270(widget);
  180 + V3270Accelerator * accel = NULL;
  181 +
  182 + // Find accel by name
  183 + for(ix = terminal->accelerators; ix; ix = g_slist_next(ix))
  184 + {
  185 + const gchar * nm = v3270_accelerator_get_name((V3270Accelerator *) ix->data);
  186 + if(nm && !g_ascii_strcasecmp(name,nm))
  187 + {
  188 + accel = (V3270Accelerator *) ix->data;
  189 + break;
  190 + }
  191 + }
  192 +
  193 + if(!accel)
  194 + {
  195 + // Not found, create a custom accelerator.
  196 + debug("%s: Adding accelerator %s",__FUNCTION__,name);
  197 +
  198 + V3270CustomAccelerator *customAccel = g_new0(V3270CustomAccelerator,1);
  199 +
  200 + customAccel->parent.type = V3270_ACCELERATOR_TYPE_CUSTOM;
  201 + customAccel->name = name;
  202 +
  203 + terminal->accelerators = g_slist_prepend(terminal->accelerators,customAccel);
  204 +
  205 + accel = (V3270Accelerator *) customAccel;
  206 + }
  207 +
  208 + accel->arg = data;
  209 + accel->activate = callback;
  210 + accel->key = accel_key;
  211 + accel->mods = accel_mods;
  212 +
  213 + // Any other accell in the same key? If yes, clear it.
  214 + for(ix = terminal->accelerators; ix; ix = g_slist_next(ix))
  215 + {
  216 + V3270Accelerator * acc = (V3270Accelerator *) ix->data;
  217 + if((acc == accel) || !(acc->key == accel->key && acc->mods == accel->mods))
  218 + continue;
  219 +
  220 + debug("Resetting accelerator \"%s\"",v3270_accelerator_get_name(acc));
  221 +
  222 + acc->key = 0;
  223 + acc->mods = 0;
  224 +
  225 + }
  226 +
  227 + // Sort!
  228 + v3270_accelerator_map_sort(terminal);
  229 +
  230 + return accel;
  231 +
  232 + }
src/terminal/keyboard/keyfile.c
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 ((struct Args *) ptr)->key_file, 53 ((struct Args *) ptr)->key_file,
54 ((struct Args *) ptr)->group_name, 54 ((struct Args *) ptr)->group_name,
55 key, 55 key,
56 - keys 56 + (keys ? keys : "")
57 ); 57 );
58 58
59 } 59 }
src/testprogram/testprogram.c
@@ -40,7 +40,9 @@ @@ -40,7 +40,9 @@
40 #include <v3270/settings.h> 40 #include <v3270/settings.h>
41 #include <v3270/trace.h> 41 #include <v3270/trace.h>
42 #include <lib3270/log.h> 42 #include <lib3270/log.h>
  43 + #include <v3270/actions.h>
43 #include <stdlib.h> 44 #include <stdlib.h>
  45 + #include <gdk/gdkkeysyms-compat.h>
44 46
45 /*---[ Implement ]----------------------------------------------------------------------------------*/ 47 /*---[ Implement ]----------------------------------------------------------------------------------*/
46 48
@@ -118,6 +120,13 @@ @@ -118,6 +120,13 @@
118 120
119 #endif // _WIN32 121 #endif // _WIN32
120 122
  123 + static void accel_copy(GtkWidget *widget, GtkWidget *window) {
  124 + debug("%s",__FUNCTION__);
  125 + }
  126 +
  127 + static void accel_paste(GtkWidget *widget, GtkWidget *window) {
  128 + debug("%s",__FUNCTION__);
  129 + }
121 130
122 static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { 131 static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
123 132
@@ -164,16 +173,13 @@ @@ -164,16 +173,13 @@
164 173
165 } 174 }
166 175
  176 + // Set accelerators
  177 + v3270_accelerator_map_add_entry(terminal, "copy", 'c', GDK_CONTROL_MASK, G_CALLBACK(accel_copy), window);
  178 + v3270_accelerator_map_add_entry(terminal, "paste", 'v', GDK_CONTROL_MASK, G_CALLBACK(accel_paste), window);
  179 +
167 // Create trace window 180 // Create trace window
168 v3270_set_trace(terminal,TRUE); 181 v3270_set_trace(terminal,TRUE);
169 182
170 - /*  
171 - GtkWidget *trace = v3270_trace_new(terminal);  
172 - debug("Trace=%p",trace);  
173 - gtk_notebook_append_page(GTK_NOTEBOOK(notebook),trace,gtk_label_new("Trace"));  
174 - // v3270_trace_window_new(terminal,NULL);  
175 - */  
176 -  
177 // Setup and show main window 183 // Setup and show main window
178 gtk_window_set_title(GTK_WINDOW(window),v3270_get_session_title(terminal)); 184 gtk_window_set_title(GTK_WINDOW(window),v3270_get_session_title(terminal));
179 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); 185 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);