Commit aaa5d908a3048a61e81a7a4ca02bd6d8519ee9e2

Authored by perry.werneck@gmail.com
1 parent 5744fa08

Trabalhando em acessibilidade

src/gtk/v3270/accessible.c
@@ -75,8 +75,6 @@ static void v3270_accessible_class_init(v3270AccessibleClass *klass) @@ -75,8 +75,6 @@ static void v3270_accessible_class_init(v3270AccessibleClass *klass)
75 { 75 {
76 AtkObjectClass *class = ATK_OBJECT_CLASS (klass); 76 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
77 77
78 - trace("******************************* %s",__FUNCTION__);  
79 -  
80 /* 78 /*
81 class->get_description = v3270_accessible_get_description; 79 class->get_description = v3270_accessible_get_description;
82 80
@@ -169,15 +167,80 @@ static gint v3270_accessible_get_character_count(AtkText *text) @@ -169,15 +167,80 @@ static gint v3270_accessible_get_character_count(AtkText *text)
169 167
170 static gint v3270_accessible_get_offset_at_point(AtkText *atk_text, gint x, gint y, AtkCoordType coords) 168 static gint v3270_accessible_get_offset_at_point(AtkText *atk_text, gint x, gint y, AtkCoordType coords)
171 { 169 {
172 - GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (atk_text));  
173 -  
174 - g_warning("Call to incomplete function \"%s\"",__FUNCTION__); 170 + gint x_window,
  171 + y_window,
  172 + x_widget,
  173 + y_widget;
  174 + GdkWindow * window;
  175 + GtkWidget * widget = gtk_accessible_get_widget(GTK_ACCESSIBLE(atk_text));
175 176
176 if(!widget) 177 if(!widget)
177 return -1; 178 return -1;
178 179
  180 + window = gtk_widget_get_window(widget);
  181 + gdk_window_get_origin(window, &x_widget, &y_widget);
  182 +
  183 + switch(coords)
  184 + {
  185 + case ATK_XY_SCREEN:
  186 + x -= x_widget;
  187 + y -= y_widget;
  188 + break;
  189 +
  190 + case ATK_XY_WINDOW:
  191 + window = gdk_window_get_toplevel(window);
  192 + gdk_window_get_origin (window, &x_window, &y_window);
  193 + x = x - x_widget + x_window;
  194 + y = y - y_widget + y_window;
  195 + break;
  196 +
  197 + default:
  198 + return -1;
  199 +
  200 + }
  201 +
  202 + return v3270_get_offset_at_point(GTK_V3270(widget),x,y);
  203 +}
  204 +
  205 +static void v3270_accessible_get_character_extents( AtkText *text,
  206 + gint offset,
  207 + gint *x,
  208 + gint *y,
  209 + gint *width,
  210 + gint *height,
  211 + AtkCoordType coords )
  212 +{
  213 + v3270 * widget = (v3270 *) gtk_accessible_get_widget(GTK_ACCESSIBLE (text));
  214 + int rows, cols;
  215 + GdkWindow * window;
  216 + gint x_window, y_window;
  217 +
  218 + trace("**************************** %s",__FUNCTION__);
  219 +
  220 + if (widget == NULL)
  221 + return;
  222 +
  223 + lib3270_get_screen_size(widget->host,&rows,&cols);
  224 +
  225 + // Get screen position
  226 + window = gtk_widget_get_window(GTK_WIDGET(widget));
  227 + gdk_window_get_origin(window, &x_window, &y_window);
  228 +
  229 + // Get screen position
  230 + *x = x_window + widget->metrics.left + ((offset/cols) * widget->metrics.width);
  231 + *y = y_window + widget->metrics.top + ((offset%cols) * widget->metrics.spacing);
  232 + *width = widget->metrics.width;
  233 + *height = widget->metrics.height+widget->metrics.descent;
  234 +
  235 + if (coords == ATK_XY_WINDOW)
  236 + {
  237 + // Correct position based on toplevel
  238 + window = gdk_window_get_toplevel(window);
  239 + gdk_window_get_origin(window, &x_window, &y_window);
  240 + *x -= x_window;
  241 + *y -= y_window;
  242 + }
179 243
180 - return 1;  
181 } 244 }
182 245
183 static gchar * v3270_accessible_get_text_at_offset(AtkText *atk_text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) 246 static gchar * v3270_accessible_get_text_at_offset(AtkText *atk_text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset)
@@ -261,34 +324,97 @@ static gchar * v3270_accessible_get_text_at_offset(AtkText *atk_text, gint offse @@ -261,34 +324,97 @@ static gchar * v3270_accessible_get_text_at_offset(AtkText *atk_text, gint offse
261 return NULL; 324 return NULL;
262 } 325 }
263 326
  327 +static gchar * v3270_accessible_get_text(AtkText *atk_text, gint start_pos, gint end_pos)
  328 +{
  329 + GtkWidget * widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (atk_text));
  330 + char * text;
  331 + H3270 * host;
  332 + gchar * utftext = NULL;
  333 +
  334 + if(widget == NULL)
  335 + return NULL;
  336 +
  337 + host = v3270_get_session(widget);
  338 + if(!host)
  339 + return NULL;
  340 +
  341 + if(!lib3270_connected(host))
  342 + return g_strdup( "" );
  343 +
  344 + text = lib3270_get_text(host,start_pos,end_pos < start_pos ? -1 : (end_pos - start_pos));
  345 +
  346 + if(text)
  347 + {
  348 + gsize bytes_written;
  349 + GError * error = NULL;
  350 +
  351 + utftext = g_convert_with_fallback(text,-1,"UTF-8",lib3270_get_charset(host)," ",NULL,&bytes_written, &error);
  352 +
  353 + if(error)
  354 + {
  355 + g_warning("%s failed: %s",__FUNCTION__,error->message);
  356 + g_error_free(error);
  357 + }
  358 +
  359 + free(text);
  360 +
  361 + trace("%s:\n%s\n",__FUNCTION__,utftext);
  362 +
  363 + }
  364 +
  365 + return utftext;
  366 +}
  367 +
  368 +static gboolean v3270_set_caret_offset(AtkText *text, gint offset)
  369 +{
  370 + GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
  371 + if (widget == NULL)
  372 + return FALSE;
  373 +
  374 + trace("%s - offset=%d",__FUNCTION__,offset);
  375 +
  376 + lib3270_set_cursor_address(GTK_V3270(widget)->host,offset);
  377 +
  378 + return TRUE;
  379 +}
  380 +
264 static void atk_text_interface_init(AtkTextIface *iface) 381 static void atk_text_interface_init(AtkTextIface *iface)
265 { 382 {
  383 + iface->get_text = v3270_accessible_get_text;
266 iface->get_character_at_offset = v3270_accessible_get_character_at_offset; 384 iface->get_character_at_offset = v3270_accessible_get_character_at_offset;
267 - iface->get_caret_offset = v3270_accessible_get_caret_offset; 385 +
  386 + iface->get_text_at_offset = v3270_accessible_get_text_at_offset;
  387 +
268 iface->get_character_count = v3270_accessible_get_character_count; 388 iface->get_character_count = v3270_accessible_get_character_count;
  389 + iface->get_caret_offset = v3270_accessible_get_caret_offset;
  390 + iface->set_caret_offset = v3270_set_caret_offset;
  391 +
  392 + iface->get_character_extents = v3270_accessible_get_character_extents;
269 iface->get_offset_at_point = v3270_accessible_get_offset_at_point; 393 iface->get_offset_at_point = v3270_accessible_get_offset_at_point;
270 - iface->get_text_at_offset = v3270_accessible_get_text_at_offset; 394 +
271 /* 395 /*
272 - iface->get_text = gtk_entry_accessible_get_text;  
273 - iface->get_text_before_offset = gtk_entry_accessible_get_text_before_offset;  
274 - iface->get_text_at_offset = gtk_entry_accessible_get_text_at_offset;  
275 - iface->get_text_after_offset = gtk_entry_accessible_get_text_after_offset;  
276 - iface->get_caret_offset = gtk_entry_accessible_get_caret_offset;  
277 - iface->set_caret_offset = gtk_entry_accessible_set_caret_offset;  
278 - iface->get_n_selections = gtk_entry_accessible_get_n_selections;  
279 - iface->get_selection = gtk_entry_accessible_get_selection;  
280 - iface->add_selection = gtk_entry_accessible_add_selection;  
281 - iface->remove_selection = gtk_entry_accessible_remove_selection;  
282 - iface->set_selection = gtk_entry_accessible_set_selection;  
283 - iface->get_run_attributes = gtk_entry_accessible_get_run_attributes;  
284 - iface->get_default_attributes = gtk_entry_accessible_get_default_attributes;  
285 - iface->get_character_extents = gtk_entry_accessible_get_character_extents; 396 + iface->get_text_before_offset = gtk_label_accessible_get_text_before_offset;
  397 +
  398 + iface->get_text_after_offset = gtk_label_accessible_get_text_after_offset;
  399 +
  400 + iface->get_n_selections = gtk_label_accessible_get_n_selections;
  401 + iface->get_selection = gtk_label_accessible_get_selection;
  402 + iface->add_selection = gtk_label_accessible_add_selection;
  403 + iface->remove_selection = gtk_label_accessible_remove_selection;
  404 + iface->set_selection = gtk_label_accessible_set_selection;
  405 +
  406 + iface->get_run_attributes = gtk_label_accessible_get_run_attributes;
  407 + iface->get_default_attributes = gtk_label_accessible_get_default_attributes;
286 */ 408 */
287 } 409 }
288 410
289 411
290 static void v3270_accessible_init(v3270Accessible *widget) 412 static void v3270_accessible_init(v3270Accessible *widget)
291 { 413 {
  414 + AtkObject *obj = ATK_OBJECT(widget);
  415 +
  416 +
  417 + obj->role = ATK_ROLE_TEXT;
292 } 418 }
293 419
294 420
src/gtk/v3270/widget.c
@@ -619,11 +619,11 @@ static void changed(H3270 *session, int offset, int len) @@ -619,11 +619,11 @@ static void changed(H3270 *session, int offset, int len)
619 619
620 trace("%s: offset=%d len=%d",__FUNCTION__,offset,len) 620 trace("%s: offset=%d len=%d",__FUNCTION__,offset,len)
621 621
622 -// if(obj) 622 + if(obj)
623 { 623 {
624 // Get new text, notify atk 624 // Get new text, notify atk
625 - gsize bytes_written;  
626 - char * text = lib3270_get_text(session,offset,len); 625 + gsize bytes_written = 0;
  626 + char * text = lib3270_get_text(session,offset,len);
627 627
628 if(text) 628 if(text)
629 { 629 {
@@ -644,9 +644,10 @@ static void changed(H3270 *session, int offset, int len) @@ -644,9 +644,10 @@ static void changed(H3270 *session, int offset, int len)
644 g_warning("%s failed: %s",__FUNCTION__,error->message); 644 g_warning("%s failed: %s",__FUNCTION__,error->message);
645 g_error_free(error); 645 g_error_free(error);
646 } 646 }
647 - else 647 +
  648 + if(utfchar)
648 { 649 {
649 - // g_signal_emit_by_name(obj, "text-insert", offset,len,utfchar); 650 + g_signal_emit_by_name(obj, "text-insert", offset, bytes_written, utfchar);
650 g_free(utfchar); 651 g_free(utfchar);
651 } 652 }
652 653
src/lib3270/selection.c
@@ -425,7 +425,7 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) @@ -425,7 +425,7 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len)
425 else if(len > maxlen) 425 else if(len > maxlen)
426 len = maxlen; 426 len = maxlen;
427 427
428 - buffer = malloc(len+2); 428 + buffer = malloc(len+1);
429 ptr = buffer; 429 ptr = buffer;
430 430
431 while(len-- > 0) 431 while(len-- > 0)
@@ -446,7 +446,7 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) @@ -446,7 +446,7 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len)
446 len--; 446 len--;
447 } 447 }
448 } 448 }
449 - buffer[len] = 0; 449 + *ptr = 0;
450 450
451 return buffer; 451 return buffer;
452 } 452 }