Commit a4e0ef9b2f3c76edde28ae22e3b6ff78e6e6a497
1 parent
228b06a6
Exists in
master
and in
5 other branches
Iniciando implementação de seleção acessível
Showing
7 changed files
with
165 additions
and
24 deletions
Show diff stats
src/gtk/actions.c
@@ -307,7 +307,7 @@ static void action_select_field(GtkAction *action, GtkWidget *widget) | @@ -307,7 +307,7 @@ static void action_select_field(GtkAction *action, GtkWidget *widget) | ||
307 | 307 | ||
308 | static void action_select_none(GtkAction *action, GtkWidget *widget) | 308 | static void action_select_none(GtkAction *action, GtkWidget *widget) |
309 | { | 309 | { |
310 | - lib3270_unselect(v3270_get_session(widget)); | 310 | + v3270_unselect(widget); |
311 | } | 311 | } |
312 | 312 | ||
313 | static void action_select_last(GtkAction *action, GtkWidget *widget) | 313 | static void action_select_last(GtkAction *action, GtkWidget *widget) |
src/gtk/print.c
@@ -501,7 +501,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | @@ -501,7 +501,7 @@ static gchar * enum_to_string(GType type, guint enum_value) | ||
501 | 501 | ||
502 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | 502 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); |
503 | 503 | ||
504 | - if(lib3270_get_selected_addr(info->session,&start,&end)) | 504 | + if(!lib3270_get_selection_bounds(info->session,&start,&end)) |
505 | { | 505 | { |
506 | g_warning("Can't get selected addresses for action %s",gtk_action_get_name(action)); | 506 | g_warning("Can't get selected addresses for action %s",gtk_action_get_name(action)); |
507 | g_object_unref(print); | 507 | g_object_unref(print); |
src/gtk/v3270/accessible.c
@@ -431,6 +431,40 @@ static gboolean v3270_set_caret_offset(AtkText *text, gint offset) | @@ -431,6 +431,40 @@ static gboolean v3270_set_caret_offset(AtkText *text, gint offset) | ||
431 | return TRUE; | 431 | return TRUE; |
432 | } | 432 | } |
433 | 433 | ||
434 | +static gboolean v3270_accessible_remove_selection(AtkText *text, gint selection_num) | ||
435 | +{ | ||
436 | + GtkWidget * widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); | ||
437 | + | ||
438 | + if (widget == NULL || selection_num != 0) | ||
439 | + return FALSE; | ||
440 | + | ||
441 | + v3270_unselect(widget); | ||
442 | + | ||
443 | + return TRUE; | ||
444 | +} | ||
445 | + | ||
446 | +static gint v3270_accessible_get_n_selections (AtkText *text) | ||
447 | +{ | ||
448 | + GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); | ||
449 | + | ||
450 | + if(!widget) | ||
451 | + return 0; | ||
452 | + | ||
453 | + return v3270_get_selection_bounds(widget, NULL, NULL) ? 1 : 0; | ||
454 | +} | ||
455 | + | ||
456 | +static gchar * v3270_accessible_get_selection (AtkText *atk_text, gint selection_num, gint *start_pos, gint *end_pos) | ||
457 | +{ | ||
458 | + GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (atk_text)); | ||
459 | + | ||
460 | + if (widget == NULL ||selection_num != 0) | ||
461 | + return NULL; | ||
462 | + | ||
463 | + if(v3270_get_selection_bounds(widget, start_pos, end_pos)) | ||
464 | + return v3270_get_region(widget, *start_pos, *end_pos, FALSE); | ||
465 | + | ||
466 | + return NULL; | ||
467 | +} | ||
434 | static void atk_text_interface_init(AtkTextIface *iface) | 468 | static void atk_text_interface_init(AtkTextIface *iface) |
435 | { | 469 | { |
436 | iface->get_text = v3270_accessible_get_text; | 470 | iface->get_text = v3270_accessible_get_text; |
@@ -444,14 +478,18 @@ static void atk_text_interface_init(AtkTextIface *iface) | @@ -444,14 +478,18 @@ static void atk_text_interface_init(AtkTextIface *iface) | ||
444 | 478 | ||
445 | iface->get_character_extents = v3270_accessible_get_character_extents; | 479 | iface->get_character_extents = v3270_accessible_get_character_extents; |
446 | iface->get_offset_at_point = v3270_accessible_get_offset_at_point; | 480 | iface->get_offset_at_point = v3270_accessible_get_offset_at_point; |
481 | + iface->remove_selection = v3270_accessible_remove_selection; | ||
482 | + | ||
483 | + iface->get_n_selections = v3270_accessible_get_n_selections; | ||
484 | + iface->get_selection = v3270_accessible_get_selection; | ||
447 | 485 | ||
448 | /* | 486 | /* |
487 | +http://git.gnome.org/browse/gtk+/tree/gtk/a11y/gtklabelaccessible.c | ||
488 | + | ||
449 | iface->get_text_before_offset = gtk_label_accessible_get_text_before_offset; | 489 | iface->get_text_before_offset = gtk_label_accessible_get_text_before_offset; |
450 | 490 | ||
451 | iface->get_text_after_offset = gtk_label_accessible_get_text_after_offset; | 491 | iface->get_text_after_offset = gtk_label_accessible_get_text_after_offset; |
452 | 492 | ||
453 | - iface->get_n_selections = gtk_label_accessible_get_n_selections; | ||
454 | - iface->get_selection = gtk_label_accessible_get_selection; | ||
455 | iface->add_selection = gtk_label_accessible_add_selection; | 493 | iface->add_selection = gtk_label_accessible_add_selection; |
456 | iface->remove_selection = gtk_label_accessible_remove_selection; | 494 | iface->remove_selection = gtk_label_accessible_remove_selection; |
457 | iface->set_selection = gtk_label_accessible_set_selection; | 495 | iface->set_selection = gtk_label_accessible_set_selection; |
@@ -461,14 +499,12 @@ static void atk_text_interface_init(AtkTextIface *iface) | @@ -461,14 +499,12 @@ static void atk_text_interface_init(AtkTextIface *iface) | ||
461 | */ | 499 | */ |
462 | } | 500 | } |
463 | 501 | ||
464 | - | ||
465 | static void v3270_accessible_init(v3270Accessible *widget) | 502 | static void v3270_accessible_init(v3270Accessible *widget) |
466 | { | 503 | { |
467 | - AtkObject *obj = ATK_OBJECT(widget); | ||
468 | - obj->role = ATK_ROLE_TEXT; | 504 | + AtkObject *obj = ATK_OBJECT(widget); |
505 | + obj->role = ATK_ROLE_TEXT; | ||
469 | } | 506 | } |
470 | 507 | ||
471 | - | ||
472 | void v3270_accessible_get_extents(AtkComponent *component, gint *x, gint *y,gint *width,gint *height, AtkCoordType coord_type) | 508 | void v3270_accessible_get_extents(AtkComponent *component, gint *x, gint *y,gint *width,gint *height, AtkCoordType coord_type) |
473 | { | 509 | { |
474 | GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (component)); | 510 | GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (component)); |
@@ -546,18 +582,33 @@ static gboolean v3270_accessible_grab_focus(AtkComponent *component) | @@ -546,18 +582,33 @@ static gboolean v3270_accessible_grab_focus(AtkComponent *component) | ||
546 | return TRUE; | 582 | return TRUE; |
547 | } | 583 | } |
548 | 584 | ||
585 | +static AtkLayer v3270_accessible_get_layer (AtkComponent *component) | ||
586 | +{ | ||
587 | + return ATK_LAYER_WIDGET; | ||
588 | +} | ||
589 | + | ||
590 | +static gboolean v3270_accessible_set_size(AtkComponent *component, gint width, gint height) | ||
591 | +{ | ||
592 | + GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (component)); | ||
593 | + | ||
594 | + if (widget == NULL) | ||
595 | + return FALSE; | ||
596 | + | ||
597 | + gtk_widget_set_size_request(widget, width, height); | ||
598 | + return TRUE; | ||
599 | +} | ||
549 | 600 | ||
550 | static void atk_component_interface_init(AtkComponentIface *iface) | 601 | static void atk_component_interface_init(AtkComponentIface *iface) |
551 | { | 602 | { |
552 | iface->get_extents = v3270_accessible_get_extents; | 603 | iface->get_extents = v3270_accessible_get_extents; |
553 | iface->get_size = v3270_accessible_get_size; | 604 | iface->get_size = v3270_accessible_get_size; |
554 | iface->grab_focus = v3270_accessible_grab_focus; | 605 | iface->grab_focus = v3270_accessible_grab_focus; |
606 | + iface->get_layer = v3270_accessible_get_layer; | ||
607 | + iface->set_size = v3270_accessible_set_size; | ||
555 | 608 | ||
556 | /* | 609 | /* |
557 | - iface->get_layer = gtk_widget_accessible_get_layer; | ||
558 | iface->set_extents = gtk_widget_accessible_set_extents; | 610 | iface->set_extents = gtk_widget_accessible_set_extents; |
559 | iface->set_position = gtk_widget_accessible_set_position; | 611 | iface->set_position = gtk_widget_accessible_set_position; |
560 | - iface->set_size = gtk_widget_accessible_set_size; | ||
561 | */ | 612 | */ |
562 | } | 613 | } |
563 | 614 |
src/gtk/v3270/clipboard.c
@@ -438,3 +438,33 @@ void v3270_paste(GtkWidget *widget) | @@ -438,3 +438,33 @@ void v3270_paste(GtkWidget *widget) | ||
438 | gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); | 438 | gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); |
439 | } | 439 | } |
440 | 440 | ||
441 | +void v3270_unselect(GtkWidget *widget) | ||
442 | +{ | ||
443 | + lib3270_unselect(v3270_get_session(widget)); | ||
444 | +} | ||
445 | + | ||
446 | +gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end) | ||
447 | +{ | ||
448 | + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); | ||
449 | + return lib3270_get_selection_bounds(GTK_V3270(widget)->host,start,end) == 0 ? FALSE : TRUE; | ||
450 | +} | ||
451 | + | ||
452 | +gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all) | ||
453 | +{ | ||
454 | + char * str; | ||
455 | + gchar * utftext; | ||
456 | + | ||
457 | + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | ||
458 | + | ||
459 | + str = lib3270_get_region(GTK_V3270(widget)->host,start_pos,end_pos,all); | ||
460 | + if(!str) | ||
461 | + return NULL; | ||
462 | + | ||
463 | + utftext = g_convert(str, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL); | ||
464 | + | ||
465 | + free(str); | ||
466 | + | ||
467 | + return utftext; | ||
468 | +} | ||
469 | + | ||
470 | + |
src/gtk/v3270/v3270.h
@@ -156,7 +156,11 @@ | @@ -156,7 +156,11 @@ | ||
156 | const gchar * v3270_get_selected_text(GtkWidget *widget); | 156 | const gchar * v3270_get_selected_text(GtkWidget *widget); |
157 | const gchar * v3270_get_copy(GtkWidget *widget); | 157 | const gchar * v3270_get_copy(GtkWidget *widget); |
158 | gchar * v3270_get_text(GtkWidget *widget,int offset, int len); | 158 | gchar * v3270_get_text(GtkWidget *widget,int offset, int len); |
159 | + gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all); | ||
159 | 160 | ||
161 | + // Cut & Paste | ||
162 | + gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end); | ||
163 | + void v3270_unselect(GtkWidget *widget); | ||
160 | void v3270_paste(GtkWidget *widget); | 164 | void v3270_paste(GtkWidget *widget); |
161 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); | 165 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); |
162 | 166 |
src/include/lib3270/selection.h
@@ -101,16 +101,16 @@ | @@ -101,16 +101,16 @@ | ||
101 | LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int origin, int baddr); | 101 | LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int origin, int baddr); |
102 | 102 | ||
103 | /** | 103 | /** |
104 | - * Get addresses of selected area. | 104 | + * Gets the selected range of characters in the screen |
105 | * | 105 | * |
106 | * @param h Session handle. | 106 | * @param h Session handle. |
107 | - * @param begin Pointer to the begin value. | ||
108 | - * @param end Pointer to the end value. | 107 | + * @param start return location for start of selection, as a character offset. |
108 | + * @param end return location for end of selection, as a character offset. | ||
109 | * | 109 | * |
110 | - * @return 0 if the selected area was get, non zero if unselected or unavailable. | 110 | + * @return Non 0 if selection is non-empty |
111 | * | 111 | * |
112 | */ | 112 | */ |
113 | - LIB3270_EXPORT int lib3270_get_selected_addr(H3270 *hSession, int *begin, int *end); | 113 | + LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end); |
114 | 114 | ||
115 | /** | 115 | /** |
116 | * Get bitmasked flag for the current selection. | 116 | * Get bitmasked flag for the current selection. |
@@ -124,4 +124,17 @@ | @@ -124,4 +124,17 @@ | ||
124 | */ | 124 | */ |
125 | LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *h, int baddr); | 125 | LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *h, int baddr); |
126 | 126 | ||
127 | + /** | ||
128 | + * Get a string from required region. | ||
129 | + * | ||
130 | + * @param h Session handle. | ||
131 | + * @param start_pos First char to get. | ||
132 | + * @param end_pos Last char to get. | ||
133 | + * @param all zero to get only selected chars. | ||
134 | + * | ||
135 | + * @return String with selected region (release it with free() | ||
136 | + * | ||
137 | + */ | ||
138 | + LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, unsigned char all); | ||
139 | + | ||
127 | #endif // LIB3270_SELECTION_H_INCLUDED | 140 | #endif // LIB3270_SELECTION_H_INCLUDED |
src/lib3270/selection.c
@@ -407,6 +407,41 @@ static char * get_text(H3270 *hSession,unsigned char all) | @@ -407,6 +407,41 @@ static char * get_text(H3270 *hSession,unsigned char all) | ||
407 | return ret; | 407 | return ret; |
408 | } | 408 | } |
409 | 409 | ||
410 | +LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, unsigned char all) | ||
411 | +{ | ||
412 | + char * text; | ||
413 | + int maxlen; | ||
414 | + int sz = 0; | ||
415 | + int baddr; | ||
416 | + | ||
417 | + CHECK_SESSION_HANDLE(h); | ||
418 | + | ||
419 | + if(!lib3270_connected(h)) | ||
420 | + return NULL; | ||
421 | + | ||
422 | + maxlen = h->rows * (h->cols+1); | ||
423 | + | ||
424 | + if(start_pos < 0 || start_pos > maxlen || end_pos < 0 || end_pos > maxlen || end_pos < start_pos) | ||
425 | + return NULL; | ||
426 | + | ||
427 | + text = malloc(maxlen); | ||
428 | + | ||
429 | + for(baddr=start_pos;baddr<end_pos;baddr++) | ||
430 | + { | ||
431 | + if(all || h->text[baddr].attr & LIB3270_ATTR_SELECTED) | ||
432 | + text[sz++] = (h->text[baddr].attr & LIB3270_ATTR_CG) ? ' ' : h->text[baddr].chr; | ||
433 | + | ||
434 | + if((baddr%h->cols) == 0 && sz > 0) | ||
435 | + text[sz++] = '\n'; | ||
436 | + } | ||
437 | + text[sz++] = 0; | ||
438 | + | ||
439 | + return realloc(text,sz); | ||
440 | +} | ||
441 | + | ||
442 | + | ||
443 | + | ||
444 | + | ||
410 | LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) | 445 | LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) |
411 | { | 446 | { |
412 | char * buffer; | 447 | char * buffer; |
@@ -468,25 +503,33 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | @@ -468,25 +503,33 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | ||
468 | return get_text(hSession,0); | 503 | return get_text(hSession,0); |
469 | } | 504 | } |
470 | 505 | ||
471 | -LIB3270_EXPORT int lib3270_get_selected_addr(H3270 *hSession, int *begin, int *end) | 506 | +LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end) |
472 | { | 507 | { |
508 | + int first, last; | ||
509 | + | ||
473 | CHECK_SESSION_HANDLE(hSession); | 510 | CHECK_SESSION_HANDLE(hSession); |
474 | 511 | ||
475 | if(!hSession->selected || hSession->select.begin == hSession->select.end) | 512 | if(!hSession->selected || hSession->select.begin == hSession->select.end) |
476 | - return -1; | 513 | + return 0; |
477 | 514 | ||
478 | if(hSession->select.end > hSession->select.begin) | 515 | if(hSession->select.end > hSession->select.begin) |
479 | { | 516 | { |
480 | - *begin = hSession->select.begin; | ||
481 | - *end = hSession->select.end; | 517 | + first = hSession->select.begin; |
518 | + last = hSession->select.end; | ||
482 | } | 519 | } |
483 | else | 520 | else |
484 | { | 521 | { |
485 | - *begin = hSession->select.end; | ||
486 | - *end = hSession->select.begin; | 522 | + first = hSession->select.end; |
523 | + last = hSession->select.begin; | ||
487 | } | 524 | } |
488 | 525 | ||
489 | - return 0; | 526 | + if(start) |
527 | + *start = first; | ||
528 | + | ||
529 | + if(end) | ||
530 | + *end = last; | ||
531 | + | ||
532 | + return 1; | ||
490 | } | 533 | } |
491 | 534 | ||
492 | LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) | 535 | LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) |
@@ -494,7 +537,7 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) | @@ -494,7 +537,7 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to) | ||
494 | int pos[2]; | 537 | int pos[2]; |
495 | int rows, cols, f, step; | 538 | int rows, cols, f, step; |
496 | 539 | ||
497 | - if(lib3270_get_selected_addr(hSession,&pos[0],&pos[1])) | 540 | + if(!lib3270_get_selection_bounds(hSession,&pos[0],&pos[1])) |
498 | return from; | 541 | return from; |
499 | 542 | ||
500 | rows = (to / hSession->cols) - (from / hSession->cols); | 543 | rows = (to / hSession->cols) - (from / hSession->cols); |
@@ -533,7 +576,7 @@ LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int orig | @@ -533,7 +576,7 @@ LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int orig | ||
533 | { | 576 | { |
534 | int first, last, row, col; | 577 | int first, last, row, col; |
535 | 578 | ||
536 | - if(lib3270_get_selected_addr(h,&first,&last)) | 579 | + if(!lib3270_get_selection_bounds(h,&first,&last)) |
537 | return origin; | 580 | return origin; |
538 | 581 | ||
539 | flag &= 0x1f; | 582 | flag &= 0x1f; |