Commit e9bd3b6d9cc97fd7c3fa8fc5e40fc9ef4cf0dd22

Authored by perry.werneck@gmail.com
1 parent 5a1d9130

Implementando avisos de estado

src/gtk/v3270/accessible.c
@@ -73,7 +73,6 @@ G_DEFINE_TYPE_WITH_CODE (v3270Accessible, v3270_accessible, GTK_TYPE_ACCESSIBLE, @@ -73,7 +73,6 @@ G_DEFINE_TYPE_WITH_CODE (v3270Accessible, v3270_accessible, GTK_TYPE_ACCESSIBLE,
73 73
74 /*--[ Implement ]------------------------------------------------------------------------------------*/ 74 /*--[ Implement ]------------------------------------------------------------------------------------*/
75 75
76 -/*  
77 static const gchar * v3270_accessible_get_description (AtkObject *accessible) 76 static const gchar * v3270_accessible_get_description (AtkObject *accessible)
78 { 77 {
79 GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (accessible)); 78 GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (accessible));
@@ -83,16 +82,15 @@ static const gchar * v3270_accessible_get_description (AtkObject *accessible) @@ -83,16 +82,15 @@ static const gchar * v3270_accessible_get_description (AtkObject *accessible)
83 82
84 return _( "3270 screen" ); 83 return _( "3270 screen" );
85 } 84 }
86 -*/  
87 85
88 static void v3270_accessible_class_init(v3270AccessibleClass *klass) 86 static void v3270_accessible_class_init(v3270AccessibleClass *klass)
89 { 87 {
90 AtkObjectClass *class = ATK_OBJECT_CLASS (klass); 88 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
91 89
92 -// class->get_description = v3270_accessible_get_description; 90 + class->get_description = v3270_accessible_get_description;
93 91
94 /* 92 /*
95 - 93 + class->focus_event = gtk_widget_accessible_focus_event;
96 94
97 klass->notify_gtk = gtk_widget_accessible_notify_gtk; 95 klass->notify_gtk = gtk_widget_accessible_notify_gtk;
98 96
@@ -274,7 +272,7 @@ static void v3270_accessible_get_character_extents( AtkText *text, @@ -274,7 +272,7 @@ static void v3270_accessible_get_character_extents( AtkText *text,
274 *width = widget->metrics.width; 272 *width = widget->metrics.width;
275 *height = widget->metrics.height+widget->metrics.descent; 273 *height = widget->metrics.height+widget->metrics.descent;
276 274
277 - if (coords == ATK_XY_WINDOW) 275 + if(coords == ATK_XY_WINDOW)
278 { 276 {
279 // Correct position based on toplevel 277 // Correct position based on toplevel
280 window = gdk_window_get_toplevel(window); 278 window = gdk_window_get_toplevel(window);
@@ -552,3 +550,87 @@ static void atk_component_interface_init(AtkComponentIface *iface) @@ -552,3 +550,87 @@ static void atk_component_interface_init(AtkComponentIface *iface)
552 */ 550 */
553 } 551 }
554 552
  553 +void v3270_acessible_set_state(GtkAccessible *obj, LIB3270_MESSAGE id)
  554 +{
  555 + #ifdef DEBUG
  556 + #define STATE_MESSAGE(x,c) { #x, x, c }
  557 + #else
  558 + #define STATE_MESSAGE(x,c) { x, c }
  559 + #endif
  560 +
  561 + static const struct _state
  562 + {
  563 + #ifdef DEBUG
  564 + const gchar * dbg;
  565 + #endif
  566 + AtkStateType atkstate;
  567 + V3270_STATE flag;
  568 + } table[] =
  569 + {
  570 + STATE_MESSAGE(ATK_STATE_BUSY, V3270_STATE_BUSY ),
  571 + STATE_MESSAGE(ATK_STATE_EDITABLE, V3270_STATE_EDITABLE ),
  572 + STATE_MESSAGE(ATK_STATE_ENABLED, V3270_STATE_ENABLED ),
  573 + STATE_MESSAGE(ATK_STATE_INVALID_ENTRY, V3270_STATE_INVALID_ENTRY ),
  574 + };
  575 +
  576 + V3270_STATE state = GTK_V3270_ACCESSIBLE(obj)->state;
  577 + V3270_STATE bits;
  578 + int f;
  579 +
  580 + switch(id)
  581 + {
  582 + case LIB3270_MESSAGE_NONE:
  583 + state = V3270_STATE_EDITABLE|V3270_STATE_ENABLED;
  584 + break;
  585 +
  586 + case LIB3270_MESSAGE_SYSWAIT:
  587 + case LIB3270_MESSAGE_TWAIT:
  588 + case LIB3270_MESSAGE_RESOLVING:
  589 + case LIB3270_MESSAGE_CONNECTING:
  590 + state = V3270_STATE_BUSY;
  591 + break;
  592 +
  593 + case LIB3270_MESSAGE_CONNECTED:
  594 + case LIB3270_MESSAGE_AWAITING_FIRST:
  595 + state = V3270_STATE_ENABLED;
  596 + break;
  597 +
  598 + case LIB3270_MESSAGE_DISCONNECTED:
  599 + state = 0;
  600 + break;
  601 +
  602 + case LIB3270_MESSAGE_MINUS:
  603 + case LIB3270_MESSAGE_INHIBIT:
  604 + case LIB3270_MESSAGE_X:
  605 + break;
  606 +
  607 + case LIB3270_MESSAGE_PROTECTED:
  608 + case LIB3270_MESSAGE_NUMERIC:
  609 + case LIB3270_MESSAGE_OVERFLOW:
  610 + case LIB3270_MESSAGE_KYBDLOCK:
  611 + state = V3270_STATE_INVALID_ENTRY|V3270_STATE_EDITABLE|V3270_STATE_ENABLED;
  612 + break;
  613 +
  614 + }
  615 +
  616 + if(state == GTK_V3270_ACCESSIBLE(obj)->state)
  617 + return;
  618 +
  619 + bits = GTK_V3270_ACCESSIBLE(obj)->state ^ state;
  620 +
  621 + trace("State change from %04x to %04x (bits=%04x)",
  622 + GTK_V3270_ACCESSIBLE(obj)->state,
  623 + state, bits );
  624 +
  625 + for(f=0;f<G_N_ELEMENTS(table);f++)
  626 + {
  627 + if(bits & table[f].flag)
  628 + {
  629 + trace("State %s is %s",table[f].dbg,(state & table[f].flag) ? "Yes" : "No");
  630 + atk_object_notify_state_change(ATK_OBJECT(obj),table[f].atkstate,(state & table[f].flag) ? TRUE : FALSE);
  631 + }
  632 + }
  633 +
  634 + GTK_V3270_ACCESSIBLE(obj)->state = state;
  635 +}
  636 +
src/gtk/v3270/accessible.h
@@ -41,11 +41,22 @@ G_BEGIN_DECLS @@ -41,11 +41,22 @@ G_BEGIN_DECLS
41 typedef struct _v3270Accessible v3270Accessible; 41 typedef struct _v3270Accessible v3270Accessible;
42 typedef struct _v3270AccessibleClass v3270AccessibleClass; 42 typedef struct _v3270AccessibleClass v3270AccessibleClass;
43 43
  44 +typedef enum _v3270_state
  45 +{
  46 + V3270_STATE_NONE = 0x0000,
  47 + V3270_STATE_EDITABLE = 0x0001,
  48 + V3270_STATE_BUSY = 0x0002,
  49 + V3270_STATE_ENABLED = 0x0004,
  50 + V3270_STATE_INVALID_ENTRY = 0x0008,
  51 +
  52 +} V3270_STATE;
  53 +
44 struct _v3270Accessible 54 struct _v3270Accessible
45 { 55 {
46 - GtkAccessible parent; 56 + GtkAccessible parent;
  57 + V3270_STATE state;
47 58
48 - AtkLayer layer; 59 +// AtkLayer layer;
49 }; 60 };
50 61
51 struct _v3270AccessibleClass 62 struct _v3270AccessibleClass
@@ -57,5 +68,6 @@ struct _v3270AccessibleClass @@ -57,5 +68,6 @@ struct _v3270AccessibleClass
57 68
58 GType v3270_accessible_get_type(void); 69 GType v3270_accessible_get_type(void);
59 70
  71 +void v3270_acessible_set_state(GtkAccessible *obj, LIB3270_MESSAGE id);
60 72
61 G_END_DECLS 73 G_END_DECLS
src/gtk/v3270/oia.c
@@ -652,6 +652,9 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id) @@ -652,6 +652,9 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id)
652 cairo_destroy(cr); 652 cairo_destroy(cr);
653 653
654 gtk_widget_queue_draw_area(GTK_WIDGET(widget),rect->x,rect->y,rect->width,rect->height); 654 gtk_widget_queue_draw_area(GTK_WIDGET(widget),rect->x,rect->y,rect->width,rect->height);
  655 +
  656 + if(widget->accessible)
  657 + v3270_acessible_set_state(widget->accessible,id);
655 } 658 }
656 659
657 static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, struct v3270_metrics *metrics, int row, int col) 660 static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, struct v3270_metrics *metrics, int row, int col)