Commit 16a8c05ebb637fa70679394dd5a3980cd88f317b
1 parent
1ae4cd71
Exists in
master
and in
5 other branches
Implementando seleção pelo teclado
Showing
6 changed files
with
110 additions
and
45 deletions
Show diff stats
src/gtk/actions.c
@@ -183,41 +183,32 @@ static void selection_move_action(GtkAction *action, GtkWidget *widget) | @@ -183,41 +183,32 @@ static void selection_move_action(GtkAction *action, GtkWidget *widget) | ||
183 | lib3270_move_selection(GTK_V3270(widget)->host,(LIB3270_DIRECTION) g_object_get_data(G_OBJECT(action),"direction")); | 183 | lib3270_move_selection(GTK_V3270(widget)->host,(LIB3270_DIRECTION) g_object_get_data(G_OBJECT(action),"direction")); |
184 | } | 184 | } |
185 | 185 | ||
186 | -void ui_connect_target_action(GtkAction *action, GtkWidget *widget, const gchar *target, const gchar *direction, GError **error) | 186 | +static void cursor_move_action(GtkAction *action, GtkWidget *widget) |
187 | { | 187 | { |
188 | - static const gchar *dirname[] = { "up", "down", "left", "right" }; | 188 | + int flags = (int) g_object_get_data(G_OBJECT(action),"move_flags"); |
189 | + trace("Action %s activated on widget %p flags=%04x",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"move_flags")); | ||
190 | + lib3270_move_cursor(GTK_V3270(widget)->host,(LIB3270_DIRECTION) (flags & 0x03), (flags & 0x80) ); | ||
191 | +} | ||
189 | 192 | ||
190 | - LIB3270_DIRECTION dir = (LIB3270_DIRECTION) -1; | 193 | +void ui_connect_target_action(GtkAction *action, GtkWidget *widget, const gchar *target, unsigned short flags, GError **error) |
194 | +{ | ||
191 | int f; | 195 | int f; |
192 | 196 | ||
193 | - if(!(direction && target)) | 197 | + if(!target) |
194 | { | 198 | { |
195 | gtk_action_set_sensitive(action,FALSE); | 199 | gtk_action_set_sensitive(action,FALSE); |
196 | return; | 200 | return; |
197 | } | 201 | } |
198 | 202 | ||
199 | - for(f=0;f<G_N_ELEMENTS(dirname) && dir == -1;f++) | ||
200 | - { | ||
201 | - if(!g_strcasecmp(direction,dirname[f])) | ||
202 | - { | ||
203 | - dir = f; | ||
204 | - break; | ||
205 | - } | ||
206 | - } | ||
207 | - | ||
208 | - if(dir == -1) | ||
209 | - { | ||
210 | - *error = g_error_new( g_quark_from_static_string(PACKAGE_NAME), | ||
211 | - ENOENT, | ||
212 | - _( "Unexpected direction \"%s\""), | ||
213 | - direction); | ||
214 | - } | ||
215 | - | ||
216 | if(!g_strcasecmp(target,"selection")) | 203 | if(!g_strcasecmp(target,"selection")) |
217 | { | 204 | { |
218 | - g_object_set_data(G_OBJECT(action),"direction",(gpointer) dir); | 205 | + g_object_set_data(G_OBJECT(action),"direction",(gpointer) (flags & 3)); |
219 | g_signal_connect(action,"activate",G_CALLBACK(selection_move_action),widget); | 206 | g_signal_connect(action,"activate",G_CALLBACK(selection_move_action),widget); |
220 | - | 207 | + } |
208 | + else if(!g_strcasecmp(target,"cursor")) | ||
209 | + { | ||
210 | + g_object_set_data(G_OBJECT(action),"move_flags",(gpointer) ((int) flags)); | ||
211 | + g_signal_connect(action,"activate",G_CALLBACK(cursor_move_action),widget); | ||
221 | } | 212 | } |
222 | else | 213 | else |
223 | { | 214 | { |
src/gtk/uiparser/parsefile.c
@@ -139,13 +139,32 @@ | @@ -139,13 +139,32 @@ | ||
139 | 139 | ||
140 | static GtkAction * get_action(const gchar *name, struct parser *info, const gchar **names, const gchar **values, GError **error) | 140 | static GtkAction * get_action(const gchar *name, struct parser *info, const gchar **names, const gchar **values, GError **error) |
141 | { | 141 | { |
142 | - const gchar * target = NULL; | ||
143 | - const gchar * direction = NULL; | ||
144 | - const gchar * id = ui_get_attribute("id",names,values); | ||
145 | - GtkAction * action; | ||
146 | - gchar * nm; | ||
147 | - void (*connect)(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id) = ui_connect_action; | ||
148 | - GtkAction * (*create)(const gchar *,const gchar *,const gchar *,const gchar *) = gtk_action_new; | 142 | + const gchar * target = NULL; |
143 | + const gchar * direction = ui_get_attribute("direction",names,values); | ||
144 | + const gchar * id = ui_get_attribute("id",names,values); | ||
145 | + unsigned short flags = 0; | ||
146 | + GtkAction * action; | ||
147 | + gchar * nm; | ||
148 | + void (*connect)(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id) = ui_connect_action; | ||
149 | + GtkAction * (*create)(const gchar *,const gchar *,const gchar *,const gchar *) = gtk_action_new; | ||
150 | + | ||
151 | + if(direction) | ||
152 | + { | ||
153 | + static const gchar *dirname[] = { "up", "down", "left", "right" }; | ||
154 | + int f; | ||
155 | + | ||
156 | + for(f=0;f<G_N_ELEMENTS(dirname);f++) | ||
157 | + { | ||
158 | + if(!g_strcasecmp(direction,dirname[f])) | ||
159 | + { | ||
160 | + flags |= f; | ||
161 | + break; | ||
162 | + } | ||
163 | + } | ||
164 | + } | ||
165 | + | ||
166 | + if(ui_get_bool_attribute("selecting",names,values,FALSE)) | ||
167 | + flags |= 0x80; | ||
149 | 168 | ||
150 | if(!g_strcasecmp(name,"toggle")) | 169 | if(!g_strcasecmp(name,"toggle")) |
151 | { | 170 | { |
@@ -155,8 +174,7 @@ | @@ -155,8 +174,7 @@ | ||
155 | } | 174 | } |
156 | else if(!g_strcasecmp(name,"move")) | 175 | else if(!g_strcasecmp(name,"move")) |
157 | { | 176 | { |
158 | - target = ui_get_attribute("target",names,values); | ||
159 | - direction = ui_get_attribute("direction",names,values); | 177 | + target = ui_get_attribute("target",names,values); |
160 | 178 | ||
161 | if(!(target && direction)) | 179 | if(!(target && direction)) |
162 | { | 180 | { |
@@ -164,7 +182,8 @@ | @@ -164,7 +182,8 @@ | ||
164 | return NULL; | 182 | return NULL; |
165 | } | 183 | } |
166 | 184 | ||
167 | - nm = g_strconcat("move",target,direction,NULL); | 185 | + nm = g_strconcat((flags & 0x80) ? "select" : "move",target,direction, NULL); |
186 | + | ||
168 | } | 187 | } |
169 | else if(!g_strcasecmp(name,"toggleset")) | 188 | else if(!g_strcasecmp(name,"toggleset")) |
170 | { | 189 | { |
@@ -215,7 +234,7 @@ | @@ -215,7 +234,7 @@ | ||
215 | if(ix >= 0) | 234 | if(ix >= 0) |
216 | ui_connect_index_action(info->action[ix] = action,info->center_widget,ix,info->action); | 235 | ui_connect_index_action(info->action[ix] = action,info->center_widget,ix,info->action); |
217 | else if(target) | 236 | else if(target) |
218 | - ui_connect_target_action(action,info->center_widget,target,direction,error); | 237 | + ui_connect_target_action(action,info->center_widget,target,flags,error); |
219 | else if(g_strcasecmp(name,"quit")) | 238 | else if(g_strcasecmp(name,"quit")) |
220 | connect(action,info->center_widget,name,id); | 239 | connect(action,info->center_widget,name,id); |
221 | else | 240 | else |
src/gtk/uiparser/parser.h
@@ -53,7 +53,7 @@ | @@ -53,7 +53,7 @@ | ||
53 | 53 | ||
54 | GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, const gchar **actionname, GtkWidget *widget, const UI_WIDGET_SETUP *itn); | 54 | GtkWidget * ui_parse_xml_folder(const gchar *path, const gchar ** groupname, const gchar **popupname, const gchar **actionname, GtkWidget *widget, const UI_WIDGET_SETUP *itn); |
55 | void ui_connect_action(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id); | 55 | void ui_connect_action(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id); |
56 | - void ui_connect_target_action(GtkAction *action, GtkWidget *widget, const gchar *target, const gchar *direction, GError **error); | 56 | + void ui_connect_target_action(GtkAction *action, GtkWidget *widget, const gchar *target, unsigned short flags, GError **error); |
57 | void ui_connect_index_action(GtkAction *action, GtkWidget *widget, int ix, GtkAction **lst); | 57 | void ui_connect_index_action(GtkAction *action, GtkWidget *widget, int ix, GtkAction **lst); |
58 | void ui_connect_toggle(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id); | 58 | void ui_connect_toggle(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id); |
59 | void ui_connect_pfkey(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id); | 59 | void ui_connect_pfkey(GtkAction *action, GtkWidget *widget, const gchar *name, const gchar *id); |
src/include/lib3270.h
@@ -388,6 +388,17 @@ | @@ -388,6 +388,17 @@ | ||
388 | LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr); | 388 | LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr); |
389 | 389 | ||
390 | /** | 390 | /** |
391 | + * Move cursor | ||
392 | + * | ||
393 | + * @param h Session handle. | ||
394 | + * @param dir Direction to move | ||
395 | + * @param sel Non zero to move and selected to the current cursor position | ||
396 | + * | ||
397 | + * @return 0 if the movement can be done, non zero if failed. | ||
398 | + */ | ||
399 | + LIB3270_EXPORT int lib3270_move_cursor(H3270 *h, LIB3270_DIRECTION dir, unsigned char sel); | ||
400 | + | ||
401 | + /** | ||
391 | * get cursor address. | 402 | * get cursor address. |
392 | * | 403 | * |
393 | * @param h Session handle. | 404 | * @param h Session handle. |
src/lib3270/selection.c
@@ -202,14 +202,14 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) | @@ -202,14 +202,14 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) | ||
202 | if(!lib3270_connected(session)) | 202 | if(!lib3270_connected(session)) |
203 | return; | 203 | return; |
204 | 204 | ||
205 | - lib3270_set_cursor_address(session,session->select.end = baddr); | ||
206 | - | ||
207 | if(!session->selected) | 205 | if(!session->selected) |
208 | { | 206 | { |
209 | session->select.begin = session->cursor_addr; | 207 | session->select.begin = session->cursor_addr; |
210 | set_selected(session); | 208 | set_selected(session); |
211 | } | 209 | } |
212 | 210 | ||
211 | + lib3270_set_cursor_address(session,session->select.end = baddr); | ||
212 | + | ||
213 | update_selection(session); | 213 | update_selection(session); |
214 | 214 | ||
215 | } | 215 | } |
@@ -391,3 +391,47 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir | @@ -391,3 +391,47 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir | ||
391 | 391 | ||
392 | return 0; | 392 | return 0; |
393 | } | 393 | } |
394 | + | ||
395 | +LIB3270_EXPORT int lib3270_move_cursor(H3270 *hSession, LIB3270_DIRECTION dir, unsigned char sel) | ||
396 | +{ | ||
397 | + int cursor_addr = hSession->cursor_addr; | ||
398 | + | ||
399 | + if(!lib3270_connected(hSession)) | ||
400 | + return -1; | ||
401 | + | ||
402 | + switch(dir) | ||
403 | + { | ||
404 | + case LIB3270_DIR_UP: | ||
405 | + if(cursor_addr <= hSession->cols) | ||
406 | + return EINVAL; | ||
407 | + cursor_addr -= hSession->cols; | ||
408 | + break; | ||
409 | + | ||
410 | + case LIB3270_DIR_DOWN: | ||
411 | + if(cursor_addr >= (hSession->cols * (hSession->rows-1))) | ||
412 | + return EINVAL; | ||
413 | + cursor_addr += hSession->cols; | ||
414 | + break; | ||
415 | + | ||
416 | + case LIB3270_DIR_LEFT: | ||
417 | + if( (cursor_addr % hSession->cols) < 1) | ||
418 | + return EINVAL; | ||
419 | + cursor_addr--; | ||
420 | + break; | ||
421 | + | ||
422 | + case LIB3270_DIR_RIGHT: | ||
423 | + if( (cursor_addr % hSession->cols) >= (hSession->cols-1)) | ||
424 | + return EINVAL; | ||
425 | + cursor_addr++; | ||
426 | + break; | ||
427 | + | ||
428 | + default: | ||
429 | + return -1; | ||
430 | + } | ||
431 | + | ||
432 | + if(sel) | ||
433 | + lib3270_select_to(hSession,cursor_addr); | ||
434 | + else | ||
435 | + lib3270_set_cursor_address(hSession,cursor_addr); | ||
436 | + | ||
437 | +} |
ui/00default.xml
@@ -189,20 +189,20 @@ | @@ -189,20 +189,20 @@ | ||
189 | <accelerator action='SysREQ' key='Sys_Req' group='online' /> | 189 | <accelerator action='SysREQ' key='Sys_Req' group='online' /> |
190 | <accelerator action='SysREQ' key='<shift>Print' group='online' /> | 190 | <accelerator action='SysREQ' key='<shift>Print' group='online' /> |
191 | 191 | ||
192 | - <accelerator action='SelectRight' key='<Shift>Right' group='online' /> | ||
193 | - <accelerator action='SelectLeft' key='<Shift>Left' group='online' /> | ||
194 | - <accelerator action='SelectUp' key='<Shift>Up' group='online' /> | ||
195 | - <accelerator action='SelectDown' key='<Shift>Down' group='online' /> | 192 | + <accelerator action='move' target='cursor' direction='right' selecting='yes' key='<Shift>Right' group='online' /> |
193 | + <accelerator action='move' target='cursor' direction='left' selecting='yes' key='<Shift>Left' group='online' /> | ||
194 | + <accelerator action='move' target='cursor' direction='up' selecting='yes' key='<Shift>Up' group='online' /> | ||
195 | + <accelerator action='move' target='cursor' direction='down' selecting='yes' key='<Shift>Down' group='online' /> | ||
196 | 196 | ||
197 | <accelerator action='move' target='selection' direction='right' key='<alt>Right' /> | 197 | <accelerator action='move' target='selection' direction='right' key='<alt>Right' /> |
198 | <accelerator action='move' target='selection' direction='left' key='<alt>Left' /> | 198 | <accelerator action='move' target='selection' direction='left' key='<alt>Left' /> |
199 | <accelerator action='move' target='selection' direction='up' key='<alt>Up' /> | 199 | <accelerator action='move' target='selection' direction='up' key='<alt>Up' /> |
200 | <accelerator action='move' target='selection' direction='down' key='<alt>Down' /> | 200 | <accelerator action='move' target='selection' direction='down' key='<alt>Down' /> |
201 | 201 | ||
202 | - <accelerator action='CursorRight' key='Right' group='online' /> | ||
203 | - <accelerator action='CursorLeft' key='Left' group='online' /> | ||
204 | - <accelerator action='CursorUp' key='Up' group='online' /> | ||
205 | - <accelerator action='CursorDown' key='Down' group='online' /> | 202 | + <accelerator action='move' target='cursor' direction='right' key='Right' group='online' /> |
203 | + <accelerator action='move' target='cursor' direction='left' key='Left' group='online' /> | ||
204 | + <accelerator action='move' target='cursor' direction='up' key='Up' group='online' /> | ||
205 | + <accelerator action='move' target='cursor' direction='down' key='Down' group='online' /> | ||
206 | 206 | ||
207 | <accelerator action='PreviousField' key='ISO_Left_Tab' group='online' /> | 207 | <accelerator action='PreviousField' key='ISO_Left_Tab' group='online' /> |
208 | <accelerator action='NextField' key='Tab' group='online' /> | 208 | <accelerator action='NextField' key='Tab' group='online' /> |