Commit d784dee6aaa939d82d66c9a4c2239ce9fc2999d2

Authored by Perry Werneck
1 parent 62d8ad06

Implemeting action group listeners.

src/objects/actions/abstract.c
@@ -355,11 +355,10 @@ @@ -355,11 +355,10 @@
355 355
356 } 356 }
357 357
358 - void pw3270_action_set_enabled(GAction *object, gboolean G_GNUC_UNUSED(state)) { 358 + void pw3270_action_notify_enabled(GAction *object) {
359 g_object_notify_by_pspec(G_OBJECT(object), PW3270_ACTION_GET_CLASS(object)->properties.enabled); 359 g_object_notify_by_pspec(G_OBJECT(object), PW3270_ACTION_GET_CLASS(object)->properties.enabled);
360 } 360 }
361 361
362 -  
363 static void change_widget(GAction *action, GtkWidget G_GNUC_UNUSED(*from), GtkWidget *to) { 362 static void change_widget(GAction *action, GtkWidget G_GNUC_UNUSED(*from), GtkWidget *to) {
364 PW3270_ACTION(action)->terminal = to; 363 PW3270_ACTION(action)->terminal = to;
365 } 364 }
@@ -440,3 +439,6 @@ @@ -440,3 +439,6 @@
440 return NULL; 439 return NULL;
441 } 440 }
442 441
  442 + H3270 * pw3270_action_get_session(GAction *action) {
  443 + return v3270_get_session(PW3270_ACTION(action)->terminal);
  444 + }
src/objects/actions/lib3270/action.c
@@ -48,6 +48,7 @@ @@ -48,6 +48,7 @@
48 pw3270Action parent; 48 pw3270Action parent;
49 49
50 const LIB3270_ACTION * definition; 50 const LIB3270_ACTION * definition;
  51 + const void * listener;
51 52
52 } Lib3270Action; 53 } Lib3270Action;
53 54
@@ -82,6 +83,18 @@ @@ -82,6 +83,18 @@
82 return PW3270_LIB3270_ACTION(action)->definition->summary; 83 return PW3270_LIB3270_ACTION(action)->definition->summary;
83 } 84 }
84 85
  86 + static void dispose(GObject *object) {
  87 +
  88 + Lib3270Action *action = PW3270_LIB3270_ACTION(object);
  89 +
  90 + if(action->listener) {
  91 + lib3270_unregister_action_group_listener(pw3270_action_get_session(G_ACTION(object)),action->definition->group,action->listener);
  92 + action->listener = NULL;
  93 + }
  94 +
  95 + G_OBJECT_CLASS(Lib3270Action_parent_class)->dispose(object);
  96 + }
  97 +
85 void Lib3270Action_class_init(Lib3270ActionClass *klass) { 98 void Lib3270Action_class_init(Lib3270ActionClass *klass) {
86 99
87 pw3270ActionClass * action = PW3270_ACTION_CLASS(klass); 100 pw3270ActionClass * action = PW3270_ACTION_CLASS(klass);
@@ -93,6 +106,8 @@ @@ -93,6 +106,8 @@
93 action->get_label = get_label; 106 action->get_label = get_label;
94 action->get_tooltip = get_tooltip; 107 action->get_tooltip = get_tooltip;
95 108
  109 + G_OBJECT_CLASS(klass)->dispose = dispose;
  110 +
96 } 111 }
97 112
98 void Lib3270Action_init(Lib3270Action G_GNUC_UNUSED(*action)) { 113 void Lib3270Action_init(Lib3270Action G_GNUC_UNUSED(*action)) {
@@ -101,7 +116,10 @@ @@ -101,7 +116,10 @@
101 GAction * pw3270_action_new_from_lib3270(const LIB3270_ACTION * definition) { 116 GAction * pw3270_action_new_from_lib3270(const LIB3270_ACTION * definition) {
102 117
103 Lib3270Action * action = (Lib3270Action *) g_object_new(PW3270_TYPE_LIB3270_ACTION, NULL); 118 Lib3270Action * action = (Lib3270Action *) g_object_new(PW3270_TYPE_LIB3270_ACTION, NULL);
  119 +
  120 + // Setup hooks.
104 action->definition = definition; 121 action->definition = definition;
  122 + action->listener = NULL;
105 123
106 // Setup the default name. 124 // Setup the default name.
107 pw3270Action * abstract = PW3270_ACTION(action); 125 pw3270Action * abstract = PW3270_ACTION(action);
@@ -114,14 +132,31 @@ @@ -114,14 +132,31 @@
114 return G_ACTION(action); 132 return G_ACTION(action);
115 } 133 }
116 134
  135 + static void event_listener(H3270 G_GNUC_UNUSED(*hSession), void *object) {
  136 + pw3270_action_notify_enabled(G_ACTION(object));
  137 + }
  138 +
117 void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { 139 void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) {
118 140
  141 + // Remove old listener
  142 + Lib3270Action * action = PW3270_LIB3270_ACTION(object);
  143 + if(action->listener) {
  144 + lib3270_unregister_action_group_listener(pw3270_action_get_session(object),action->definition->group,action->listener);
  145 + action->listener = NULL;
  146 + }
  147 +
  148 + // Change widget
119 PW3270_ACTION_CLASS(Lib3270Action_parent_class)->change_widget(object,from,to); 149 PW3270_ACTION_CLASS(Lib3270Action_parent_class)->change_widget(object,from,to);
120 150
  151 + // Setup new listener
  152 + if(action->definition->group && to) {
  153 + action->listener = lib3270_register_action_group_listener(pw3270_action_get_session(object),action->definition->group,event_listener,object);
  154 + }
  155 +
121 // Does the "enabled" state has changed? If yes notify customers. 156 // Does the "enabled" state has changed? If yes notify customers.
122 gboolean enabled = get_enabled(object,to); 157 gboolean enabled = get_enabled(object,to);
123 if(get_enabled(object,from) != enabled) 158 if(get_enabled(object,from) != enabled)
124 - pw3270_action_set_enabled(object,enabled); 159 + pw3270_action_notify_enabled(object);
125 160
126 } 161 }
127 162
src/objects/actions/lib3270/pakey.c
@@ -135,7 +135,7 @@ @@ -135,7 +135,7 @@
135 // Does the "enabled" state has changed? If yes notify customers. 135 // Does the "enabled" state has changed? If yes notify customers.
136 gboolean enabled = get_enabled(object,to); 136 gboolean enabled = get_enabled(object,to);
137 if(get_enabled(object,from) != enabled) 137 if(get_enabled(object,from) != enabled)
138 - pw3270_action_set_enabled(object,enabled); 138 + pw3270_action_notify_enabled(object);
139 139
140 } 140 }
141 141
src/objects/actions/lib3270/pfkey.c
@@ -135,7 +135,7 @@ @@ -135,7 +135,7 @@
135 // Does the "enabled" state has changed? If yes notify customers. 135 // Does the "enabled" state has changed? If yes notify customers.
136 gboolean enabled = get_enabled(object,to); 136 gboolean enabled = get_enabled(object,to);
137 if(get_enabled(object,from) != enabled) 137 if(get_enabled(object,from) != enabled)
138 - pw3270_action_set_enabled(object,enabled); 138 + pw3270_action_notify_enabled(object);
139 139
140 } 140 }
141 141
src/objects/actions/private.h
@@ -85,7 +85,7 @@ @@ -85,7 +85,7 @@
85 G_GNUC_INTERNAL GAction * pw3270_action_new_pakey(void); 85 G_GNUC_INTERNAL GAction * pw3270_action_new_pakey(void);
86 86
87 G_GNUC_INTERNAL void pw3270_action_change_state_boolean(GAction *action, gboolean state); 87 G_GNUC_INTERNAL void pw3270_action_change_state_boolean(GAction *action, gboolean state);
88 - G_GNUC_INTERNAL void pw3270_action_set_enabled(GAction *action, gboolean state); 88 + G_GNUC_INTERNAL void pw3270_action_notify_enabled(GAction *action);
89 89
90 90
91 #endif // PRIVATE_H_INCLUDED 91 #endif // PRIVATE_H_INCLUDED
src/objects/toolbar/actions.c
@@ -141,6 +141,7 @@ @@ -141,6 +141,7 @@
141 gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(item),TRUE); 141 gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(item),TRUE);
142 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), pos); 142 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), pos);
143 gtk_widget_show_all(GTK_WIDGET(item)); 143 gtk_widget_show_all(GTK_WIDGET(item));
  144 + gtk_widget_set_sensitive(GTK_WIDGET(item),g_action_get_enabled(action));
144 145
145 g_signal_connect(G_OBJECT(item),"clicked",G_CALLBACK(clicked),action); 146 g_signal_connect(G_OBJECT(item),"clicked",G_CALLBACK(clicked),action);
146 g_signal_connect(G_OBJECT(action),"notify",G_CALLBACK(notify),item); 147 g_signal_connect(G_OBJECT(action),"notify",G_CALLBACK(notify),item);