Commit dd87907c760c3b362a7f9c9acb52d2e7dd98e61e

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

Trabalhando no suporte atk

src/gtk/actions.c
@@ -45,7 +45,7 @@ static void lib3270_action(GtkAction *action, GtkWidget *widget) @@ -45,7 +45,7 @@ static void lib3270_action(GtkAction *action, GtkWidget *widget)
45 { 45 {
46 int (*call)(H3270 *h) = (int (*)(H3270 *h)) g_object_get_data(G_OBJECT(action),"lib3270_call"); 46 int (*call)(H3270 *h) = (int (*)(H3270 *h)) g_object_get_data(G_OBJECT(action),"lib3270_call");
47 trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); 47 trace("Action %s activated on widget %p",gtk_action_get_name(action),widget);
48 - call(GTK_V3270(widget)->host); 48 + call(v3270_get_session(widget));
49 } 49 }
50 50
51 static void connect_action(GtkAction *action, GtkWidget *widget) 51 static void connect_action(GtkAction *action, GtkWidget *widget)
@@ -116,7 +116,7 @@ static void paste_clipboard_action(GtkAction *action, GtkWidget *widget) @@ -116,7 +116,7 @@ static void paste_clipboard_action(GtkAction *action, GtkWidget *widget)
116 static void paste_next_action(GtkAction *action, GtkWidget *widget) 116 static void paste_next_action(GtkAction *action, GtkWidget *widget)
117 { 117 {
118 trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); 118 trace("Action %s activated on widget %p",gtk_action_get_name(action),widget);
119 - lib3270_pastenext(GTK_V3270(widget)->host); 119 + lib3270_pastenext(v3270_get_session(widget));
120 } 120 }
121 121
122 static void connect_standard_action(GtkAction *action, GtkWidget *widget, const gchar *name) 122 static void connect_standard_action(GtkAction *action, GtkWidget *widget, const gchar *name)
@@ -197,20 +197,20 @@ static void lib3270_toggle_action(GtkToggleAction *action,GtkWidget *widget) @@ -197,20 +197,20 @@ static void lib3270_toggle_action(GtkToggleAction *action,GtkWidget *widget)
197 if(toggle == TOGGLE_GDKDEBUG) 197 if(toggle == TOGGLE_GDKDEBUG)
198 gdk_window_set_debug_updates(gtk_toggle_action_get_active(action)); 198 gdk_window_set_debug_updates(gtk_toggle_action_get_active(action));
199 else if(toggle < LIB3270_TOGGLE_COUNT) 199 else if(toggle < LIB3270_TOGGLE_COUNT)
200 - lib3270_set_toggle(GTK_V3270(widget)->host,toggle,gtk_toggle_action_get_active(action)); 200 + lib3270_set_toggle(v3270_get_session(widget),toggle,gtk_toggle_action_get_active(action));
201 } 201 }
202 202
203 static void selection_move_action(GtkAction *action, GtkWidget *widget) 203 static void selection_move_action(GtkAction *action, GtkWidget *widget)
204 { 204 {
205 trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); 205 trace("Action %s activated on widget %p",gtk_action_get_name(action),widget);
206 - lib3270_move_selection(GTK_V3270(widget)->host,(LIB3270_DIRECTION) g_object_get_data(G_OBJECT(action),"direction")); 206 + lib3270_move_selection(v3270_get_session(widget),(LIB3270_DIRECTION) g_object_get_data(G_OBJECT(action),"direction"));
207 } 207 }
208 208
209 static void cursor_move_action(GtkAction *action, GtkWidget *widget) 209 static void cursor_move_action(GtkAction *action, GtkWidget *widget)
210 { 210 {
211 int flags = (int) g_object_get_data(G_OBJECT(action),"move_flags"); 211 int flags = (int) g_object_get_data(G_OBJECT(action),"move_flags");
212 trace("Action %s activated on widget %p flags=%04x",gtk_action_get_name(action),widget,(unsigned short) g_object_get_data(G_OBJECT(action),"move_flags")); 212 trace("Action %s activated on widget %p flags=%04x",gtk_action_get_name(action),widget,(unsigned short) g_object_get_data(G_OBJECT(action),"move_flags"));
213 - lib3270_move_cursor(GTK_V3270(widget)->host,(LIB3270_DIRECTION) (flags & 0x03), (flags & 0x80) ); 213 + lib3270_move_cursor(v3270_get_session(widget),(LIB3270_DIRECTION) (flags & 0x03), (flags & 0x80) );
214 } 214 }
215 215
216 static void connect_move_action(GtkAction *action, GtkWidget *widget, const gchar *target, unsigned short flags, GError **error) 216 static void connect_move_action(GtkAction *action, GtkWidget *widget, const gchar *target, unsigned short flags, GError **error)
@@ -244,47 +244,47 @@ static void connect_move_action(GtkAction *action, GtkWidget *widget, const gcha @@ -244,47 +244,47 @@ static void connect_move_action(GtkAction *action, GtkWidget *widget, const gcha
244 static void action_pfkey(GtkAction *action, GtkWidget *widget) 244 static void action_pfkey(GtkAction *action, GtkWidget *widget)
245 { 245 {
246 trace("Action %s activated on widget %p key=%p",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"pfkey")); 246 trace("Action %s activated on widget %p key=%p",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"pfkey"));
247 - lib3270_pfkey(GTK_V3270(widget)->host,(int) g_object_get_data(G_OBJECT(action),"pfkey")); 247 + lib3270_pfkey(v3270_get_session(widget),(int) g_object_get_data(G_OBJECT(action),"pfkey"));
248 } 248 }
249 249
250 static void action_pakey(GtkAction *action, GtkWidget *widget) 250 static void action_pakey(GtkAction *action, GtkWidget *widget)
251 { 251 {
252 trace("Action %s activated on widget %p key=%p",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"pakey")); 252 trace("Action %s activated on widget %p key=%p",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"pakey"));
253 - lib3270_pakey(GTK_V3270(widget)->host,(int) g_object_get_data(G_OBJECT(action),"pakey")); 253 + lib3270_pakey(v3270_get_session(widget),(int) g_object_get_data(G_OBJECT(action),"pakey"));
254 } 254 }
255 255
256 static void action_set_toggle(GtkAction *action, GtkWidget *widget) 256 static void action_set_toggle(GtkAction *action, GtkWidget *widget)
257 { 257 {
258 LIB3270_TOGGLE id = (LIB3270_TOGGLE) g_object_get_data(G_OBJECT(action),"toggle_id"); 258 LIB3270_TOGGLE id = (LIB3270_TOGGLE) g_object_get_data(G_OBJECT(action),"toggle_id");
259 trace("Action %s activated on widget %p toggle=%d",gtk_action_get_name(action),widget,id); 259 trace("Action %s activated on widget %p toggle=%d",gtk_action_get_name(action),widget,id);
260 - lib3270_set_toggle(GTK_V3270(widget)->host,id,1); 260 + lib3270_set_toggle(v3270_get_session(widget),id,1);
261 } 261 }
262 262
263 static void action_reset_toggle(GtkAction *action, GtkWidget *widget) 263 static void action_reset_toggle(GtkAction *action, GtkWidget *widget)
264 { 264 {
265 LIB3270_TOGGLE id = (LIB3270_TOGGLE) g_object_get_data(G_OBJECT(action),"toggle_id"); 265 LIB3270_TOGGLE id = (LIB3270_TOGGLE) g_object_get_data(G_OBJECT(action),"toggle_id");
266 trace("Action %s activated on widget %p toggle=%d",gtk_action_get_name(action),widget,id); 266 trace("Action %s activated on widget %p toggle=%d",gtk_action_get_name(action),widget,id);
267 - lib3270_set_toggle(GTK_V3270(widget)->host,id,0); 267 + lib3270_set_toggle(v3270_get_session(widget),id,0);
268 } 268 }
269 269
270 static void action_select_all(GtkAction *action, GtkWidget *widget) 270 static void action_select_all(GtkAction *action, GtkWidget *widget)
271 { 271 {
272 - lib3270_selectall(GTK_V3270(widget)->host); 272 + lib3270_selectall(v3270_get_session(widget));
273 } 273 }
274 274
275 static void action_select_field(GtkAction *action, GtkWidget *widget) 275 static void action_select_field(GtkAction *action, GtkWidget *widget)
276 { 276 {
277 - lib3270_selectfield(GTK_V3270(widget)->host); 277 + lib3270_selectfield(v3270_get_session(widget));
278 } 278 }
279 279
280 static void action_select_none(GtkAction *action, GtkWidget *widget) 280 static void action_select_none(GtkAction *action, GtkWidget *widget)
281 { 281 {
282 - lib3270_unselect(GTK_V3270(widget)->host); 282 + lib3270_unselect(v3270_get_session(widget));
283 } 283 }
284 284
285 static void action_select_last(GtkAction *action, GtkWidget *widget) 285 static void action_select_last(GtkAction *action, GtkWidget *widget)
286 { 286 {
287 - lib3270_reselect(GTK_V3270(widget)->host); 287 + lib3270_reselect(v3270_get_session(widget));
288 } 288 }
289 289
290 static int id_from_array(const gchar *key, const gchar **array, GError **error) 290 static int id_from_array(const gchar *key, const gchar **array, GError **error)
@@ -598,7 +598,7 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash @@ -598,7 +598,7 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash
598 if(id < LIB3270_TOGGLE_COUNT) 598 if(id < LIB3270_TOGGLE_COUNT)
599 toggle_action[id] = action; 599 toggle_action[id] = action;
600 g_object_set_data(G_OBJECT(action),"toggle_id",(gpointer) id); 600 g_object_set_data(G_OBJECT(action),"toggle_id",(gpointer) id);
601 - gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),(lib3270_get_toggle(GTK_V3270(widget)->host,id) != 0)); 601 + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),(lib3270_get_toggle(v3270_get_session(widget),id) != 0));
602 g_signal_connect(action,"toggled",G_CALLBACK(lib3270_toggle_action),widget); 602 g_signal_connect(action,"toggled",G_CALLBACK(lib3270_toggle_action),widget);
603 break; 603 break;
604 604
src/gtk/dialog.c
@@ -388,7 +388,7 @@ @@ -388,7 +388,7 @@
388 388
389 void save_all_action(GtkAction *action, GtkWidget *widget) 389 void save_all_action(GtkAction *action, GtkWidget *widget)
390 { 390 {
391 - gchar *text = v3270_get_text(widget); 391 + gchar *text = v3270_get_text(widget,0,-1);
392 392
393 trace("Action %s activated on widget %p text=%p",gtk_action_get_name(action),widget,text); 393 trace("Action %s activated on widget %p text=%p",gtk_action_get_name(action),widget,text);
394 394
src/gtk/mainwindow.c
@@ -201,7 +201,7 @@ @@ -201,7 +201,7 @@
201 static void setup_input_method(GtkWidget *widget, GtkWidget *obj) 201 static void setup_input_method(GtkWidget *widget, GtkWidget *obj)
202 { 202 {
203 GtkWidget *menu = gtk_menu_new(); 203 GtkWidget *menu = gtk_menu_new();
204 - gtk_im_multicontext_append_menuitems((GtkIMMulticontext *) GTK_V3270(obj)->input_method,GTK_MENU_SHELL(menu)); 204 + gtk_im_multicontext_append_menuitems((GtkIMMulticontext *) v3270_get_im_context(obj) ,GTK_MENU_SHELL(menu));
205 gtk_widget_show_all(menu); 205 gtk_widget_show_all(menu);
206 gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu); 206 gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu);
207 } 207 }
@@ -281,6 +281,8 @@ @@ -281,6 +281,8 @@
281 GtkWidget **popup; 281 GtkWidget **popup;
282 int f; 282 int f;
283 283
  284 + gtk_widget_set_tooltip_text(terminal,_( "3270 screen"));
  285 +
284 if(uri) 286 if(uri)
285 { 287 {
286 lib3270_set_host(host,uri); 288 lib3270_set_host(host,uri);
src/gtk/v3270/accessible.c
@@ -27,9 +27,18 @@ @@ -27,9 +27,18 @@
27 * 27 *
28 */ 28 */
29 29
  30 + #include <lib3270/config.h>
  31 +
  32 + #define ENABLE_NLS
  33 + #define GETTEXT_PACKAGE PACKAGE_NAME
  34 +
30 #include <gtk/gtk.h> 35 #include <gtk/gtk.h>
  36 + #include <libintl.h>
  37 + #include <glib/gi18n.h>
  38 +
31 #include <pw3270.h> 39 #include <pw3270.h>
32 #include "v3270.h" 40 #include "v3270.h"
  41 + #include "private.h"
33 #include "accessible.h" 42 #include "accessible.h"
34 43
35 // References: 44 // References:
@@ -41,44 +50,55 @@ @@ -41,44 +50,55 @@
41 /*--[ Prototipes ]-----------------------------------------------------------------------------------*/ 50 /*--[ Prototipes ]-----------------------------------------------------------------------------------*/
42 51
43 static void atk_component_interface_init (AtkComponentIface *iface); 52 static void atk_component_interface_init (AtkComponentIface *iface);
44 -static void atk_editable_text_interface_init (AtkEditableTextIface *iface);  
45 53
46 static void v3270_accessible_class_init (v3270AccessibleClass *klass); 54 static void v3270_accessible_class_init (v3270AccessibleClass *klass);
47 static void v3270_accessible_init (v3270Accessible *widget); 55 static void v3270_accessible_init (v3270Accessible *widget);
48 56
  57 +static void atk_text_interface_init (AtkTextIface *iface);
  58 +
49 /*--[ Widget definition ]----------------------------------------------------------------------------*/ 59 /*--[ Widget definition ]----------------------------------------------------------------------------*/
50 60
51 G_DEFINE_TYPE_WITH_CODE (v3270Accessible, v3270_accessible, GTK_TYPE_ACCESSIBLE, 61 G_DEFINE_TYPE_WITH_CODE (v3270Accessible, v3270_accessible, GTK_TYPE_ACCESSIBLE,
52 G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init) 62 G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init)
53 - G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init) ) 63 + G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init) )
54 64
  65 +// G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init) )
55 // G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init) 66 // G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
56 // G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init) 67 // G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init)
57 // G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init) 68 // G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init)
58 69
59 /*--[ Implement ]------------------------------------------------------------------------------------*/ 70 /*--[ Implement ]------------------------------------------------------------------------------------*/
60 71
  72 +/*
  73 +static const gchar * v3270_accessible_get_description(AtkObject *accessible)
  74 +{
  75 + return _( "3270 screen" );
  76 +}
  77 +*/
  78 +
61 static void v3270_accessible_class_init(v3270AccessibleClass *klass) 79 static void v3270_accessible_class_init(v3270AccessibleClass *klass)
62 { 80 {
  81 + AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
  82 +
63 trace("******************************* %s",__FUNCTION__); 83 trace("******************************* %s",__FUNCTION__);
  84 +
64 /* 85 /*
65 - AtkObjectClass *class = ATK_OBJECT_CLASS (klass);  
66 -  
67 - klass->notify_gtk = gtk_widget_accessible_notify_gtk;  
68 -  
69 - class->get_description = gtk_widget_accessible_get_description;  
70 - class->get_parent = gtk_widget_accessible_get_parent;  
71 - class->ref_relation_set = gtk_widget_accessible_ref_relation_set;  
72 - class->ref_state_set = gtk_widget_accessible_ref_state_set;  
73 - class->get_index_in_parent = gtk_widget_accessible_get_index_in_parent;  
74 - class->initialize = gtk_widget_accessible_initialize;  
75 - class->get_attributes = gtk_widget_accessible_get_attributes;  
76 - class->focus_event = gtk_widget_accessible_focus_event; 86 + class->get_description = v3270_accessible_get_description;
  87 +
  88 +
  89 + klass->notify_gtk = gtk_widget_accessible_notify_gtk;
  90 +
  91 + class->get_parent = gtk_widget_accessible_get_parent;
  92 + class->ref_relation_set = gtk_widget_accessible_ref_relation_set;
  93 + class->ref_state_set = gtk_widget_accessible_ref_state_set;
  94 + class->get_index_in_parent = gtk_widget_accessible_get_index_in_parent;
  95 + class->initialize = gtk_widget_accessible_initialize;
  96 + class->get_attributes = gtk_widget_accessible_get_attributes;
  97 + class->focus_event = gtk_widget_accessible_focus_event;
77 */ 98 */
78 } 99 }
79 100
80 -static void  
81 -atk_component_interface_init(AtkComponentIface *iface) 101 +static void atk_component_interface_init(AtkComponentIface *iface)
82 { 102 {
83 /* 103 /*
84 iface->get_extents = gtk_widget_accessible_get_extents; 104 iface->get_extents = gtk_widget_accessible_get_extents;
@@ -91,23 +111,164 @@ atk_component_interface_init(AtkComponentIface *iface) @@ -91,23 +111,164 @@ atk_component_interface_init(AtkComponentIface *iface)
91 */ 111 */
92 } 112 }
93 113
94 -static void v3270_accessible_init(v3270Accessible *widget) 114 +static gunichar v3270_accessible_get_character_at_offset(AtkText *atk_text, gint offset)
  115 +{
  116 + GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (atk_text));
  117 +
  118 + trace("*********** %s %p",__FUNCTION__,widget);
  119 +
  120 + if (widget == NULL)
  121 + return '\0';
  122 +
  123 + return 'X';
  124 +}
  125 +
  126 +static gint v3270_accessible_get_caret_offset(AtkText *text)
  127 +{
  128 + GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE(text));
  129 +
  130 + if (widget == NULL)
  131 + return 0;
  132 +
  133 + return lib3270_get_cursor_address(GTK_V3270(widget)->host);
  134 +}
  135 +
  136 +static gint v3270_accessible_get_character_count(AtkText *text)
  137 +{
  138 + int rows,cols;
  139 + GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE(text));
  140 +
  141 + trace("*********** %s %p len=%d",__FUNCTION__,widget,lib3270_get_length(GTK_V3270(widget)->host));
  142 +
  143 + if(!widget)
  144 + return 0;
  145 +
  146 + return lib3270_get_length(GTK_V3270(widget)->host);
  147 +}
  148 +
  149 +static gint v3270_accessible_get_offset_at_point(AtkText *atk_text, gint x, gint y, AtkCoordType coords)
95 { 150 {
96 - trace("*********************************** %s",__FUNCTION__); 151 + GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (atk_text));
  152 +
  153 + trace("*********** %s %p",__FUNCTION__,widget);
  154 +
  155 + if(!widget)
  156 + return -1;
  157 +
97 158
  159 + return 1;
98 } 160 }
99 161
100 -static void atk_editable_text_interface_init(AtkEditableTextIface *iface) 162 +static gchar * v3270_accessible_get_text_at_offset(AtkText *atk_text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset)
101 { 163 {
102 - trace("********************************** %s",__FUNCTION__); 164 + GtkWidget * widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (atk_text));
  165 + H3270 * host;
  166 + char * text;
  167 + int rows,cols,first;
  168 +
  169 + trace("*********** %s %p offset=%d",__FUNCTION__,widget,offset);
  170 +
  171 + if(!widget)
  172 + return NULL;
  173 +
  174 + host = GTK_V3270(widget)->host;
  175 + lib3270_get_screen_size(host,&rows,&cols);
  176 +
  177 + switch(boundary_type)
  178 + {
  179 + case ATK_TEXT_BOUNDARY_CHAR: // Boundary is the boundary between characters
  180 + // (including non-printing characters)
  181 +
  182 + text = lib3270_get_text(host,offset,1);
  183 + break;
  184 +
  185 + case ATK_TEXT_BOUNDARY_WORD_START: // Boundary is the start (i.e. first character) of a word.
  186 + return g_strdup("ATK_TEXT_BOUNDARY_WORD_START");
  187 + break;
  188 +
  189 + case ATK_TEXT_BOUNDARY_WORD_END: // Boundary is the end (i.e. last character) of a word.
  190 + return g_strdup("ATK_TEXT_BOUNDARY_WORD_END");
  191 + break;
  192 +
  193 + case ATK_TEXT_BOUNDARY_SENTENCE_START: // Boundary is the first character in a sentence.
  194 + return g_strdup("ATK_TEXT_BOUNDARY_SENTENCE_START");
  195 + break;
  196 +
  197 + case ATK_TEXT_BOUNDARY_SENTENCE_END: // Boundary is the last (terminal) character in
  198 + // a sentence; in languages which use "sentence stop" punctuation such as English, the boundary is thus the '.', '?', or
  199 + // similar terminal punctuation character.
  200 + return g_strdup("ATK_TEXT_BOUNDARY_SENTENCE_END");
  201 + break;
  202 +
  203 +
  204 + case ATK_TEXT_BOUNDARY_LINE_START: // Boundary is the initial character of the content or a character immediately following a newline,
  205 + // linefeed, or return character.
  206 + first = (offset/cols)*cols;
  207 + if(first == offset)
  208 + offset++;
  209 + text = lib3270_get_text(host,first,(offset-first));
  210 + break;
  211 +
  212 +
  213 + case ATK_TEXT_BOUNDARY_LINE_END: // Boundary is the linefeed, or return character.
  214 + return g_strdup("ATK_TEXT_BOUNDARY_LINE_END");
  215 + break;
  216 +
  217 + }
  218 +
  219 + if(text)
  220 + {
  221 + gsize bytes_written;
  222 + GError * error = NULL;
  223 + gchar * utfchar = g_convert_with_fallback( text,
  224 + -1,
  225 + "UTF-8",
  226 + lib3270_get_charset(host),
  227 + " ",
  228 + NULL,
  229 + &bytes_written,
  230 + &error );
  231 +
  232 + if(error)
  233 + {
  234 + g_warning("%s failed: %s",__FUNCTION__,error->message);
  235 + g_error_free(error);
  236 + }
  237 + return utfchar;
  238 + }
  239 +
  240 + return NULL;
  241 +}
  242 +
  243 +static void atk_text_interface_init(AtkTextIface *iface)
  244 +{
  245 + iface->get_character_at_offset = v3270_accessible_get_character_at_offset;
  246 + iface->get_caret_offset = v3270_accessible_get_caret_offset;
  247 + iface->get_character_count = v3270_accessible_get_character_count;
  248 + iface->get_offset_at_point = v3270_accessible_get_offset_at_point;
  249 + iface->get_text_at_offset = v3270_accessible_get_text_at_offset;
103 /* 250 /*
104 - iface->set_text_contents = gtk_entry_accessible_set_text_contents;  
105 - iface->insert_text = gtk_entry_accessible_insert_text;  
106 - iface->copy_text = gtk_entry_accessible_copy_text;  
107 - iface->cut_text = gtk_entry_accessible_cut_text;  
108 - iface->delete_text = gtk_entry_accessible_delete_text;  
109 - iface->paste_text = gtk_entry_accessible_paste_text;  
110 - iface->set_run_attributes = NULL; 251 + iface->get_text = gtk_entry_accessible_get_text;
  252 + iface->get_text_before_offset = gtk_entry_accessible_get_text_before_offset;
  253 + iface->get_text_at_offset = gtk_entry_accessible_get_text_at_offset;
  254 + iface->get_text_after_offset = gtk_entry_accessible_get_text_after_offset;
  255 + iface->get_caret_offset = gtk_entry_accessible_get_caret_offset;
  256 + iface->set_caret_offset = gtk_entry_accessible_set_caret_offset;
  257 + iface->get_n_selections = gtk_entry_accessible_get_n_selections;
  258 + iface->get_selection = gtk_entry_accessible_get_selection;
  259 + iface->add_selection = gtk_entry_accessible_add_selection;
  260 + iface->remove_selection = gtk_entry_accessible_remove_selection;
  261 + iface->set_selection = gtk_entry_accessible_set_selection;
  262 + iface->get_run_attributes = gtk_entry_accessible_get_run_attributes;
  263 + iface->get_default_attributes = gtk_entry_accessible_get_default_attributes;
  264 + iface->get_character_extents = gtk_entry_accessible_get_character_extents;
111 */ 265 */
112 } 266 }
113 267
  268 +
  269 +static void v3270_accessible_init(v3270Accessible *widget)
  270 +{
  271 +}
  272 +
  273 +
  274 +
src/gtk/v3270/clipboard.c
@@ -75,7 +75,7 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, @@ -75,7 +75,7 @@ static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection,
75 } 75 }
76 } 76 }
77 77
78 -gchar * v3270_get_text(GtkWidget *widget) 78 +gchar * v3270_get_text(GtkWidget *widget, int offset, int len)
79 { 79 {
80 v3270 * terminal; 80 v3270 * terminal;
81 gchar * text; 81 gchar * text;
@@ -85,7 +85,7 @@ gchar * v3270_get_text(GtkWidget *widget) @@ -85,7 +85,7 @@ gchar * v3270_get_text(GtkWidget *widget)
85 85
86 terminal = GTK_V3270(widget); 86 terminal = GTK_V3270(widget);
87 87
88 - str = lib3270_get_text(terminal->host); 88 + str = lib3270_get_text(terminal->host, offset, len);
89 89
90 if(!str) 90 if(!str)
91 return NULL; 91 return NULL;
src/gtk/v3270/mouse.c
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 37
38 /*--[ Implement ]------------------------------------------------------------------------------------*/ 38 /*--[ Implement ]------------------------------------------------------------------------------------*/
39 39
40 -static int decode_position(v3270 *widget, gdouble x, gdouble y) 40 +gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y)
41 { 41 {
42 GdkPoint point; 42 GdkPoint point;
43 int r,c; 43 int r,c;
@@ -120,7 +120,7 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) @@ -120,7 +120,7 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event)
120 120
121 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) 121 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event)
122 { 122 {
123 - int baddr = decode_position(GTK_V3270(widget),event->x,event->y); 123 + int baddr = v3270_get_offset_at_point(GTK_V3270(widget),event->x,event->y);
124 124
125 if(baddr < 0) 125 if(baddr < 0)
126 return FALSE; 126 return FALSE;
@@ -167,7 +167,7 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) @@ -167,7 +167,7 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event)
167 gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) 167 gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event)
168 { 168 {
169 v3270 * terminal = GTK_V3270(widget); 169 v3270 * terminal = GTK_V3270(widget);
170 - int baddr = decode_position(terminal,event->x,event->y); 170 + int baddr = v3270_get_offset_at_point(terminal,event->x,event->y);
171 171
172 if(baddr < 0) 172 if(baddr < 0)
173 return FALSE; 173 return FALSE;
src/gtk/v3270/oia.c
@@ -726,6 +726,10 @@ void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, @@ -726,6 +726,10 @@ void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col,
726 726
727 gtk_widget_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height); 727 gtk_widget_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height);
728 } 728 }
  729 +
  730 + if(terminal->accessible)
  731 + g_signal_emit_by_name(ATK_TEXT(terminal->accessible),"text-caret-moved",lib3270_get_cursor_address(session));
  732 +
729 } 733 }
730 734
731 struct timer_info 735 struct timer_info
src/gtk/v3270/private.h
@@ -37,7 +37,9 @@ @@ -37,7 +37,9 @@
37 #include <libintl.h> 37 #include <libintl.h>
38 #include <glib/gi18n.h> 38 #include <glib/gi18n.h>
39 39
40 -#include <lib3270.h> 40 +#ifndef V3270_H_INCLUDED
  41 + #include "v3270.h"
  42 +#endif
41 43
42 G_BEGIN_DECLS 44 G_BEGIN_DECLS
43 45
@@ -98,6 +100,84 @@ G_BEGIN_DECLS @@ -98,6 +100,84 @@ G_BEGIN_DECLS
98 100
99 #define V3270_CURSOR_COUNT LIB3270_CURSOR_USER+9 101 #define V3270_CURSOR_COUNT LIB3270_CURSOR_USER+9
100 102
  103 +
  104 + struct v3270_metrics
  105 + {
  106 + guint width;
  107 + guint height;
  108 + guint ascent;
  109 + guint descent;
  110 +
  111 + guint spacing;
  112 +
  113 + guint left;
  114 + guint top;
  115 + };
  116 +
  117 +/*--[ Widget data ]----------------------------------------------------------------------------------*/
  118 +
  119 + struct _v3270
  120 + {
  121 + GtkWidget parent;
  122 +
  123 + // private
  124 + int selecting : 1; /**< Selecting region */
  125 + int moving : 1; /**< Moving selected region */
  126 + int resizing : 1; /**< Resizing selected region */
  127 +
  128 +#if GTK_CHECK_VERSION(3,0,0)
  129 +
  130 +#else
  131 + gint width;
  132 + gint height;
  133 +#endif // GTK_CHECK_VERSION(3,0,0)
  134 +
  135 + GSource * timer;
  136 + GtkIMContext * input_method;
  137 + unsigned short keyflags;
  138 + gchar * clipboard; /**< Clipboard contents (text only) */
  139 +
  140 + LIB3270_CURSOR pointer_id;
  141 + unsigned char pointer; /** Mouse pointer ID */
  142 + int selection_addr; /** Selection addr */
  143 +
  144 + // Font info
  145 + gchar * font_family;
  146 + cairo_font_weight_t font_weight;
  147 + cairo_scaled_font_t * font_scaled;
  148 + cairo_surface_t * surface;
  149 +
  150 + struct v3270_metrics metrics;
  151 +
  152 + gint minimum_width;
  153 + gint minimum_height;
  154 +
  155 + // Colors
  156 + GdkColor color[V3270_COLOR_COUNT]; /**< Terminal widget colors */
  157 +
  158 + // Regions
  159 + GdkRectangle oia_rect[V3270_OIA_FIELD_COUNT];
  160 +
  161 + struct
  162 + {
  163 + unsigned char show; /**< Cursor flag */
  164 + unsigned char chr; /**< Char at cursor position */
  165 + unsigned short attr; /**< Attribute at cursor position */
  166 + GdkRectangle rect; /**< Cursor rectangle */
  167 + GSource * timer; /**< Cursor blinking timer */
  168 + cairo_surface_t * surface; /**< Cursor image */
  169 + } cursor;
  170 +
  171 + // Acessibility
  172 + GtkAccessible * accessible;
  173 +
  174 + // lib3270 stuff
  175 + H3270 * host; /**< Related 3270 session */
  176 +
  177 + };
  178 +
  179 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  180 +
101 G_GNUC_INTERNAL guint v3270_widget_signal[LAST_SIGNAL]; 181 G_GNUC_INTERNAL guint v3270_widget_signal[LAST_SIGNAL];
102 G_GNUC_INTERNAL GdkCursor * v3270_cursor[V3270_CURSOR_COUNT]; 182 G_GNUC_INTERNAL GdkCursor * v3270_cursor[V3270_CURSOR_COUNT];
103 183
@@ -147,5 +227,6 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event); @@ -147,5 +227,6 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event);
147 gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event); 227 gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event);
148 gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event); 228 gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event);
149 void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event); 229 void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event);
  230 +gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y);
150 231
151 G_END_DECLS 232 G_END_DECLS
src/gtk/v3270/v3270.h
@@ -128,79 +128,6 @@ @@ -128,79 +128,6 @@
128 #define v3270char void 128 #define v3270char void
129 #endif // v3270_char 129 #endif // v3270_char
130 130
131 - struct v3270_metrics  
132 - {  
133 - guint width;  
134 - guint height;  
135 - guint ascent;  
136 - guint descent;  
137 -  
138 - guint spacing;  
139 -  
140 - guint left;  
141 - guint top;  
142 - };  
143 -  
144 - struct _v3270  
145 - {  
146 - GtkWidget parent;  
147 -  
148 - // private  
149 - int selecting : 1; /**< Selecting region */  
150 - int moving : 1; /**< Moving selected region */  
151 - int resizing : 1; /**< Resizing selected region */  
152 -  
153 -#if GTK_CHECK_VERSION(3,0,0)  
154 -  
155 -#else  
156 - gint width;  
157 - gint height;  
158 -#endif // GTK_CHECK_VERSION(3,0,0)  
159 -  
160 - GSource * timer;  
161 - GtkIMContext * input_method;  
162 - unsigned short keyflags;  
163 - gchar * clipboard; /**< Clipboard contents (text only) */  
164 -  
165 - LIB3270_CURSOR pointer_id;  
166 - unsigned char pointer; /** Mouse pointer ID */  
167 - int selection_addr; /** Selection addr */  
168 -  
169 - // Font info  
170 - gchar * font_family;  
171 - cairo_font_weight_t font_weight;  
172 - cairo_scaled_font_t * font_scaled;  
173 - cairo_surface_t * surface;  
174 -  
175 - struct v3270_metrics metrics;  
176 -  
177 - gint minimum_width;  
178 - gint minimum_height;  
179 -  
180 - // Colors  
181 - GdkColor color[V3270_COLOR_COUNT]; /**< Terminal widget colors */  
182 -  
183 - // Regions  
184 - GdkRectangle oia_rect[V3270_OIA_FIELD_COUNT];  
185 -  
186 - struct  
187 - {  
188 - unsigned char show; /**< Cursor flag */  
189 - unsigned char chr; /**< Char at cursor position */  
190 - unsigned short attr; /**< Attribute at cursor position */  
191 - GdkRectangle rect; /**< Cursor rectangle */  
192 - GSource * timer; /**< Cursor blinking timer */  
193 - cairo_surface_t * surface; /**< Cursor image */  
194 - } cursor;  
195 -  
196 - // Acessibility  
197 - GtkAccessible * accessible;  
198 -  
199 - // lib3270 stuff  
200 - H3270 * host; /**< Related 3270 session */  
201 -  
202 - };  
203 -  
204 GtkWidget * v3270_new(void); 131 GtkWidget * v3270_new(void);
205 GType v3270_get_type(void); 132 GType v3270_get_type(void);
206 133
@@ -217,7 +144,7 @@ @@ -217,7 +144,7 @@
217 // Clipboard 144 // Clipboard
218 const gchar * v3270_get_selected_text(GtkWidget *widget); 145 const gchar * v3270_get_selected_text(GtkWidget *widget);
219 const gchar * v3270_get_copy(GtkWidget *widget); 146 const gchar * v3270_get_copy(GtkWidget *widget);
220 - gchar * v3270_get_text(GtkWidget *widget); 147 + gchar * v3270_get_text(GtkWidget *widget,int offset, int len);
221 const gchar * v3270_copy(GtkWidget *widget); 148 const gchar * v3270_copy(GtkWidget *widget);
222 const gchar * v3270_copy_append(GtkWidget *widget); 149 const gchar * v3270_copy_append(GtkWidget *widget);
223 150
@@ -233,6 +160,10 @@ @@ -233,6 +160,10 @@
233 void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color); 160 void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color);
234 GdkColor * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id); 161 GdkColor * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id);
235 162
  163 + // Misc
  164 + GtkIMContext * v3270_get_im_context(GtkWidget *widget);
  165 +
  166 +
236 G_END_DECLS 167 G_END_DECLS
237 168
238 #endif // V3270_H_INCLUDED 169 #endif // V3270_H_INCLUDED
src/gtk/v3270/widget.c
@@ -1107,8 +1107,15 @@ static AtkObject * v3270_get_accessible(GtkWidget * widget) @@ -1107,8 +1107,15 @@ static AtkObject * v3270_get_accessible(GtkWidget * widget)
1107 { 1107 {
1108 terminal->accessible = g_object_new(GTK_TYPE_V3270_ACCESSIBLE,NULL); 1108 terminal->accessible = g_object_new(GTK_TYPE_V3270_ACCESSIBLE,NULL);
1109 atk_object_initialize(ATK_OBJECT(terminal->accessible), widget); 1109 atk_object_initialize(ATK_OBJECT(terminal->accessible), widget);
  1110 + gtk_accessible_set_widget(GTK_ACCESSIBLE(terminal->accessible),widget);
  1111 + g_object_ref(terminal->accessible);
1110 } 1112 }
1111 1113
1112 return ATK_OBJECT(terminal->accessible); 1114 return ATK_OBJECT(terminal->accessible);
1113 } 1115 }
1114 1116
  1117 +GtkIMContext * v3270_get_im_context(GtkWidget *widget)
  1118 +{
  1119 + return GTK_V3270(widget)->input_method;
  1120 +}
  1121 +
src/include/lib3270.h
@@ -267,6 +267,8 @@ @@ -267,6 +267,8 @@
267 */ 267 */
268 LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c); 268 LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c);
269 269
  270 + LIB3270_EXPORT unsigned int lib3270_get_length(H3270 *h);
  271 +
270 /** 272 /**
271 * Start a new session (INCOMPLETE). 273 * Start a new session (INCOMPLETE).
272 * 274 *
@@ -660,12 +662,14 @@ @@ -660,12 +662,14 @@
660 /** 662 /**
661 * Get all text inside the terminal. 663 * Get all text inside the terminal.
662 * 664 *
663 - * @param h Session Handle. 665 + * @param h Session Handle.
  666 + * @param offset Start position.
  667 + * @param len Text length or -1 to all text.
664 * 668 *
665 - * @return All text if available, or NULL. Release it with free() 669 + * @return Contents at position if available, or NULL. Release it with free()
666 * 670 *
667 */ 671 */
668 - LIB3270_EXPORT char * lib3270_get_text(H3270 *h); 672 + LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len);
669 673
670 /** 674 /**
671 * Get a terminal character and attribute. 675 * Get a terminal character and attribute.
src/lib3270/screen.c
@@ -223,8 +223,15 @@ static unsigned short calc_attrs(H3270 *session, int baddr, int fa_addr, int fa) @@ -223,8 +223,15 @@ static unsigned short calc_attrs(H3270 *session, int baddr, int fa_addr, int fa)
223 return a; 223 return a;
224 } 224 }
225 225
  226 +LIB3270_EXPORT unsigned int lib3270_get_length(H3270 *h)
  227 +{
  228 + CHECK_SESSION_HANDLE(h);
  229 + return h->rows * h->cols;
  230 +}
  231 +
226 LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c) 232 LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c)
227 { 233 {
  234 + CHECK_SESSION_HANDLE(h);
228 *r = h->rows; 235 *r = h->rows;
229 *c = h->cols; 236 *c = h->cols;
230 } 237 }
src/lib3270/selection.c
@@ -407,9 +407,38 @@ static char * get_text(H3270 *hSession,unsigned char all) @@ -407,9 +407,38 @@ 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_text(H3270 *hSession) 410 +LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len)
411 { 411 {
412 - return get_text(hSession,1); 412 + char *buffer;
  413 + int col, maxlen;
  414 + char *ptr;
  415 +
  416 + CHECK_SESSION_HANDLE(h);
  417 +
  418 + maxlen = h->rows * (h->cols+1);
  419 +
  420 + if(len < 0)
  421 + len = (maxlen - offset);
  422 + else if(len > maxlen)
  423 + len = maxlen;
  424 +
  425 + buffer = malloc(len+1);
  426 + col = offset%h->cols;
  427 + ptr = buffer;
  428 +
  429 + while(len-- > 0)
  430 + {
  431 + *(ptr++) = h->text[offset++].chr;
  432 + if(col++ >= h->cols && len > 0)
  433 + {
  434 + col = 0;
  435 + *(ptr++) = '\n';
  436 + len--;
  437 + }
  438 + }
  439 + *ptr = 0;
  440 +
  441 + return buffer;
413 } 442 }
414 443
415 LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) 444 LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession)
@@ -417,6 +446,10 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) @@ -417,6 +446,10 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession)
417 if(!hSession->selected || hSession->select.begin == hSession->select.end) 446 if(!hSession->selected || hSession->select.begin == hSession->select.end)
418 return NULL; 447 return NULL;
419 448
  449 + if(!lib3270_connected(hSession))
  450 + return NULL;
  451 +
  452 +
420 return get_text(hSession,0); 453 return get_text(hSession,0);
421 } 454 }
422 455