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 73  
74 74 /*--[ Implement ]------------------------------------------------------------------------------------*/
75 75  
76   -/*
77 76 static const gchar * v3270_accessible_get_description (AtkObject *accessible)
78 77 {
79 78 GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (accessible));
... ... @@ -83,16 +82,15 @@ static const gchar * v3270_accessible_get_description (AtkObject *accessible)
83 82  
84 83 return _( "3270 screen" );
85 84 }
86   -*/
87 85  
88 86 static void v3270_accessible_class_init(v3270AccessibleClass *klass)
89 87 {
90 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 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 272 *width = widget->metrics.width;
275 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 277 // Correct position based on toplevel
280 278 window = gdk_window_get_toplevel(window);
... ... @@ -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 41 typedef struct _v3270Accessible v3270Accessible;
42 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 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 62 struct _v3270AccessibleClass
... ... @@ -57,5 +68,6 @@ struct _v3270AccessibleClass
57 68  
58 69 GType v3270_accessible_get_type(void);
59 70  
  71 +void v3270_acessible_set_state(GtkAccessible *obj, LIB3270_MESSAGE id);
60 72  
61 73 G_END_DECLS
... ...
src/gtk/v3270/oia.c
... ... @@ -652,6 +652,9 @@ void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id)
652 652 cairo_destroy(cr);
653 653  
654 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 660 static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, struct v3270_metrics *metrics, int row, int col)
... ...