Commit e9bd3b6d9cc97fd7c3fa8fc5e40fc9ef4cf0dd22
1 parent
5a1d9130
Exists in
master
and in
5 other branches
Implementando avisos de estado
Showing
3 changed files
with
104 additions
and
7 deletions
Show diff stats
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) | ... | ... |