Commit 1ae4cd71e10761e19c7e35b66f7d808815a4bad2

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

Implementando movimentação da caixa de seleção

src/gtk/actions.c
... ... @@ -177,9 +177,56 @@ void ui_connect_toggle(GtkAction *action, GtkWidget *widget, const gchar *name,
177 177 gtk_action_set_sensitive(action,FALSE);
178 178 }
179 179  
  180 +static void selection_move_action(GtkAction *action, GtkWidget *widget)
  181 +{
  182 + trace("Action %s activated on widget %p dir=%d",gtk_action_get_name(action),widget,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 +}
  185 +
180 186 void ui_connect_target_action(GtkAction *action, GtkWidget *widget, const gchar *target, const gchar *direction, GError **error)
181 187 {
182   - #warning TODO: Implementar
  188 + static const gchar *dirname[] = { "up", "down", "left", "right" };
  189 +
  190 + LIB3270_DIRECTION dir = (LIB3270_DIRECTION) -1;
  191 + int f;
  192 +
  193 + if(!(direction && target))
  194 + {
  195 + gtk_action_set_sensitive(action,FALSE);
  196 + return;
  197 + }
  198 +
  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"))
  217 + {
  218 + g_object_set_data(G_OBJECT(action),"direction",(gpointer) dir);
  219 + g_signal_connect(action,"activate",G_CALLBACK(selection_move_action),widget);
  220 +
  221 + }
  222 + else
  223 + {
  224 + *error = g_error_new( g_quark_from_static_string(PACKAGE_NAME),
  225 + ENOENT,
  226 + _( "Unexpected target \"%s\""),
  227 + target);
  228 + }
  229 +
183 230 }
184 231  
185 232 static void action_pfkey(GtkAction *action, GtkWidget *widget)
... ...
src/gtk/uiparser/parsefile.c
... ... @@ -155,8 +155,8 @@
155 155 }
156 156 else if(!g_strcasecmp(name,"move"))
157 157 {
158   - const gchar *target = ui_get_attribute("target",names,values);
159   - const gchar *direction = ui_get_attribute("direction",names,values);
  158 + target = ui_get_attribute("target",names,values);
  159 + direction = ui_get_attribute("direction",names,values);
160 160  
161 161 if(!(target && direction))
162 162 {
... ... @@ -214,10 +214,10 @@
214 214  
215 215 if(ix >= 0)
216 216 ui_connect_index_action(info->action[ix] = action,info->center_widget,ix,info->action);
217   - else if(g_strcasecmp(name,"quit"))
218   - connect(action,info->center_widget,name,id);
219 217 else if(target)
220 218 ui_connect_target_action(action,info->center_widget,target,direction,error);
  219 + else if(g_strcasecmp(name,"quit"))
  220 + connect(action,info->center_widget,name,id);
221 221 else
222 222 g_signal_connect(action,"activate",G_CALLBACK(gtk_main_quit), NULL);
223 223  
... ...
src/lib3270/selection.c
... ... @@ -376,7 +376,7 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir
376 376 break;
377 377  
378 378 case LIB3270_DIR_RIGHT:
379   - if( (hSession->select.end % hSession->cols) >= hSession->cols)
  379 + if( (hSession->select.end % hSession->cols) >= (hSession->cols-1))
380 380 return EINVAL;
381 381 hSession->select.begin++;
382 382 hSession->select.end++;
... ... @@ -387,5 +387,7 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir
387 387 }
388 388  
389 389 update_selection(hSession);
  390 + lib3270_set_cursor_address(hSession,hSession->select.end);
  391 +
390 392 return 0;
391 393 }
... ...
ui/00default.xml
... ... @@ -194,10 +194,10 @@
194 194 <accelerator action='SelectUp' key='<Shift>Up' group='online' />
195 195 <accelerator action='SelectDown' key='<Shift>Down' group='online' />
196 196  
197   - <accelerator action='SelectionRight' key='<alt>Right' />
198   - <accelerator action='SelectionLeft' key='<alt>Left' />
199   - <accelerator action='SelectionUp' key='<alt>Up' />
200   - <accelerator action='SelectionDown' key='<alt>Down' />
  197 + <accelerator action='move' target='selection' direction='right' key='<alt>Right' />
  198 + <accelerator action='move' target='selection' direction='left' key='<alt>Left' />
  199 + <accelerator action='move' target='selection' direction='up' key='<alt>Up' />
  200 + <accelerator action='move' target='selection' direction='down' key='<alt>Down' />
201 201  
202 202 <accelerator action='CursorRight' key='Right' group='online' />
203 203 <accelerator action='CursorLeft' key='Left' group='online' />
... ...