From e9bd3b6d9cc97fd7c3fa8fc5e40fc9ef4cf0dd22 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Tue, 10 Apr 2012 18:23:37 +0000 Subject: [PATCH] Implementando avisos de estado --- src/gtk/v3270/accessible.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- src/gtk/v3270/accessible.h | 16 ++++++++++++++-- src/gtk/v3270/oia.c | 3 +++ 3 files changed, 104 insertions(+), 7 deletions(-) diff --git a/src/gtk/v3270/accessible.c b/src/gtk/v3270/accessible.c index 50baacb..7a3145e 100644 --- a/src/gtk/v3270/accessible.c +++ b/src/gtk/v3270/accessible.c @@ -73,7 +73,6 @@ G_DEFINE_TYPE_WITH_CODE (v3270Accessible, v3270_accessible, GTK_TYPE_ACCESSIBLE, /*--[ Implement ]------------------------------------------------------------------------------------*/ -/* static const gchar * v3270_accessible_get_description (AtkObject *accessible) { GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (accessible)); @@ -83,16 +82,15 @@ static const gchar * v3270_accessible_get_description (AtkObject *accessible) return _( "3270 screen" ); } -*/ static void v3270_accessible_class_init(v3270AccessibleClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); -// class->get_description = v3270_accessible_get_description; + class->get_description = v3270_accessible_get_description; /* - + class->focus_event = gtk_widget_accessible_focus_event; klass->notify_gtk = gtk_widget_accessible_notify_gtk; @@ -274,7 +272,7 @@ static void v3270_accessible_get_character_extents( AtkText *text, *width = widget->metrics.width; *height = widget->metrics.height+widget->metrics.descent; - if (coords == ATK_XY_WINDOW) + if(coords == ATK_XY_WINDOW) { // Correct position based on toplevel window = gdk_window_get_toplevel(window); @@ -552,3 +550,87 @@ static void atk_component_interface_init(AtkComponentIface *iface) */ } +void v3270_acessible_set_state(GtkAccessible *obj, LIB3270_MESSAGE id) +{ + #ifdef DEBUG + #define STATE_MESSAGE(x,c) { #x, x, c } + #else + #define STATE_MESSAGE(x,c) { x, c } + #endif + + static const struct _state + { + #ifdef DEBUG + const gchar * dbg; + #endif + AtkStateType atkstate; + V3270_STATE flag; + } table[] = + { + STATE_MESSAGE(ATK_STATE_BUSY, V3270_STATE_BUSY ), + STATE_MESSAGE(ATK_STATE_EDITABLE, V3270_STATE_EDITABLE ), + STATE_MESSAGE(ATK_STATE_ENABLED, V3270_STATE_ENABLED ), + STATE_MESSAGE(ATK_STATE_INVALID_ENTRY, V3270_STATE_INVALID_ENTRY ), + }; + + V3270_STATE state = GTK_V3270_ACCESSIBLE(obj)->state; + V3270_STATE bits; + int f; + + switch(id) + { + case LIB3270_MESSAGE_NONE: + state = V3270_STATE_EDITABLE|V3270_STATE_ENABLED; + break; + + case LIB3270_MESSAGE_SYSWAIT: + case LIB3270_MESSAGE_TWAIT: + case LIB3270_MESSAGE_RESOLVING: + case LIB3270_MESSAGE_CONNECTING: + state = V3270_STATE_BUSY; + break; + + case LIB3270_MESSAGE_CONNECTED: + case LIB3270_MESSAGE_AWAITING_FIRST: + state = V3270_STATE_ENABLED; + break; + + case LIB3270_MESSAGE_DISCONNECTED: + state = 0; + break; + + case LIB3270_MESSAGE_MINUS: + case LIB3270_MESSAGE_INHIBIT: + case LIB3270_MESSAGE_X: + break; + + case LIB3270_MESSAGE_PROTECTED: + case LIB3270_MESSAGE_NUMERIC: + case LIB3270_MESSAGE_OVERFLOW: + case LIB3270_MESSAGE_KYBDLOCK: + state = V3270_STATE_INVALID_ENTRY|V3270_STATE_EDITABLE|V3270_STATE_ENABLED; + break; + + } + + if(state == GTK_V3270_ACCESSIBLE(obj)->state) + return; + + bits = GTK_V3270_ACCESSIBLE(obj)->state ^ state; + + trace("State change from %04x to %04x (bits=%04x)", + GTK_V3270_ACCESSIBLE(obj)->state, + state, bits ); + + for(f=0;fstate = state; +} + diff --git a/src/gtk/v3270/accessible.h b/src/gtk/v3270/accessible.h index b679d9f..380ce73 100644 --- a/src/gtk/v3270/accessible.h +++ b/src/gtk/v3270/accessible.h @@ -41,11 +41,22 @@ G_BEGIN_DECLS typedef struct _v3270Accessible v3270Accessible; typedef struct _v3270AccessibleClass v3270AccessibleClass; +typedef enum _v3270_state +{ + V3270_STATE_NONE = 0x0000, + V3270_STATE_EDITABLE = 0x0001, + V3270_STATE_BUSY = 0x0002, + V3270_STATE_ENABLED = 0x0004, + V3270_STATE_INVALID_ENTRY = 0x0008, + +} V3270_STATE; + struct _v3270Accessible { - GtkAccessible parent; + GtkAccessible parent; + V3270_STATE state; - AtkLayer layer; +// AtkLayer layer; }; struct _v3270AccessibleClass @@ -57,5 +68,6 @@ struct _v3270AccessibleClass GType v3270_accessible_get_type(void); +void v3270_acessible_set_state(GtkAccessible *obj, LIB3270_MESSAGE id); G_END_DECLS diff --git a/src/gtk/v3270/oia.c b/src/gtk/v3270/oia.c index 2b9c6f2..f14c2cb 100644 --- a/src/gtk/v3270/oia.c +++ b/src/gtk/v3270/oia.c @@ -652,6 +652,9 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id) cairo_destroy(cr); gtk_widget_queue_draw_area(GTK_WIDGET(widget),rect->x,rect->y,rect->width,rect->height); + + if(widget->accessible) + v3270_acessible_set_state(widget->accessible,id); } static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, struct v3270_metrics *metrics, int row, int col) -- libgit2 0.21.2