Commit 16a8c05ebb637fa70679394dd5a3980cd88f317b

Authored by perry.werneck@gmail.com
1 parent 1ae4cd71

Implementando seleção pelo teclado

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' />