Commit dd87907c760c3b362a7f9c9acb52d2e7dd98e61e
1 parent
f9c12c35
Exists in
master
and in
5 other branches
Trabalhando no suporte atk
Showing
13 changed files
with
358 additions
and
128 deletions
Show diff stats
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 |