Commit 9db919eec90ef7b120cb04bb8231bc290255cb54
1 parent
1bc88320
Exists in
master
and in
4 other branches
Fixing file transfer action state.
Showing
3 changed files
with
69 additions
and
5 deletions
Show diff stats
src/include/pw3270/actions.h
| ... | ... | @@ -132,6 +132,12 @@ |
| 132 | 132 | const gchar * label; |
| 133 | 133 | const gchar * tooltip; |
| 134 | 134 | |
| 135 | + // Lib3270 Action group | |
| 136 | + struct { | |
| 137 | + LIB3270_ACTION_GROUP id; | |
| 138 | + const void * listener; | |
| 139 | + } group; | |
| 140 | + | |
| 135 | 141 | /// @brief Activation method. |
| 136 | 142 | void (*activate)(GAction *action, GVariant *parameter, GtkWidget *terminal); |
| 137 | 143 | ... | ... |
src/objects/actions/simple.c
| ... | ... | @@ -33,20 +33,25 @@ |
| 33 | 33 | */ |
| 34 | 34 | |
| 35 | 35 | #include "private.h" |
| 36 | + #include <v3270.h> | |
| 36 | 37 | |
| 37 | 38 | static void pw3270SimpleAction_class_init(pw3270SimpleActionClass *klass); |
| 38 | 39 | static void pw3270SimpleAction_init(pw3270SimpleAction *action); |
| 40 | + static void change_widget(GAction *object, GtkWidget *from, GtkWidget *to); | |
| 39 | 41 | |
| 40 | 42 | G_DEFINE_TYPE(pw3270SimpleAction, pw3270SimpleAction, PW3270_TYPE_ACTION); |
| 41 | 43 | |
| 42 | - static void activate(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkWidget *terminal) { | |
| 43 | - | |
| 44 | + static void activate(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkWidget G_GNUC_UNUSED(*terminal)) { | |
| 44 | 45 | debug("%s",__FUNCTION__); |
| 45 | - | |
| 46 | 46 | } |
| 47 | 47 | |
| 48 | 48 | static gboolean get_enabled(GAction *action, GtkWidget *terminal) { |
| 49 | - return TRUE; | |
| 49 | + | |
| 50 | + if(terminal) { | |
| 51 | + return lib3270_action_group_get_activatable(v3270_get_session(terminal),PW3270_SIMPLE_ACTION(action)->group.id); | |
| 52 | + } | |
| 53 | + | |
| 54 | + return FALSE; | |
| 50 | 55 | } |
| 51 | 56 | |
| 52 | 57 | static const gchar * get_icon_name(GAction *action) { |
| ... | ... | @@ -61,14 +66,27 @@ |
| 61 | 66 | return PW3270_SIMPLE_ACTION(action)->tooltip; |
| 62 | 67 | } |
| 63 | 68 | |
| 69 | + static void dispose(GObject *object) { | |
| 70 | + | |
| 71 | + pw3270SimpleAction *action = PW3270_SIMPLE_ACTION(object); | |
| 72 | + | |
| 73 | + if(action->group.listener) { | |
| 74 | + lib3270_unregister_action_group_listener(pw3270_action_get_session(G_ACTION(object)),action->group.id,action->group.listener); | |
| 75 | + action->group.listener = NULL; | |
| 76 | + } | |
| 77 | + | |
| 78 | + G_OBJECT_CLASS(pw3270SimpleAction_parent_class)->dispose(object); | |
| 79 | + } | |
| 80 | + | |
| 64 | 81 | static void pw3270SimpleAction_class_init(pw3270SimpleActionClass *klass) { |
| 65 | 82 | |
| 66 | 83 | klass->parent_class.get_icon_name = get_icon_name; |
| 67 | 84 | klass->parent_class.get_label = get_label; |
| 68 | 85 | klass->parent_class.get_tooltip = get_tooltip; |
| 69 | 86 | klass->parent_class.get_enabled = get_enabled; |
| 87 | + klass->parent_class.change_widget = change_widget; | |
| 70 | 88 | |
| 71 | - debug("%s:%p",__FUNCTION__,klass->parent_class.get_icon_name); | |
| 89 | + G_OBJECT_CLASS(klass)->dispose = dispose; | |
| 72 | 90 | |
| 73 | 91 | } |
| 74 | 92 | |
| ... | ... | @@ -78,6 +96,9 @@ |
| 78 | 96 | action->label = N_( "No label" ); |
| 79 | 97 | action->tooltip = NULL; |
| 80 | 98 | |
| 99 | + action->group.id = LIB3270_ACTION_GROUP_NONE; | |
| 100 | + action->group.listener = NULL; | |
| 101 | + | |
| 81 | 102 | } |
| 82 | 103 | |
| 83 | 104 | pw3270SimpleAction * pw3270_simple_action_new_from_lib3270(const LIB3270_ACTION * definition, const gchar *name) { |
| ... | ... | @@ -107,3 +128,39 @@ |
| 107 | 128 | return (pw3270SimpleAction *) g_object_new(PW3270_TYPE_SIMPLE_ACTION, NULL); |
| 108 | 129 | } |
| 109 | 130 | |
| 131 | + static gboolean bg_notify_enabled(GAction *action) { | |
| 132 | + pw3270_action_notify_enabled(action); | |
| 133 | + return FALSE; | |
| 134 | + } | |
| 135 | + | |
| 136 | + static void event_listener(H3270 G_GNUC_UNUSED(*hSession), void *object) { | |
| 137 | + g_idle_add((GSourceFunc) bg_notify_enabled, G_ACTION(object)); | |
| 138 | + } | |
| 139 | + | |
| 140 | + void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { | |
| 141 | + | |
| 142 | + // Remove old listener | |
| 143 | + pw3270SimpleAction * action = PW3270_SIMPLE_ACTION(object); | |
| 144 | + | |
| 145 | + if(action->group.listener) { | |
| 146 | + lib3270_unregister_action_group_listener(pw3270_action_get_session(object),action->group.id,action->group.listener); | |
| 147 | + action->group.listener = NULL; | |
| 148 | + } | |
| 149 | + | |
| 150 | + // Get the current "enabled" state | |
| 151 | + gboolean enabled = g_action_get_enabled(object); | |
| 152 | + | |
| 153 | + // Change widget | |
| 154 | + PW3270_ACTION_CLASS(pw3270SimpleAction_parent_class)->change_widget(object,from,to); | |
| 155 | + | |
| 156 | + // Setup new listener | |
| 157 | + if(action->group.id != LIB3270_ACTION_GROUP_NONE && to) { | |
| 158 | + action->group.listener = lib3270_register_action_group_listener(pw3270_action_get_session(object),action->group.id,event_listener,object); | |
| 159 | + } | |
| 160 | + | |
| 161 | + // Does the "enabled" state has changed? If yes notify customers. | |
| 162 | + if(g_action_get_enabled(object) != enabled) | |
| 163 | + pw3270_action_notify_enabled(object); | |
| 164 | + | |
| 165 | + } | |
| 166 | + | ... | ... |
src/objects/window/actions/filetransfer.c
| ... | ... | @@ -39,6 +39,7 @@ |
| 39 | 39 | pw3270SimpleAction * action = pw3270_simple_action_new(); |
| 40 | 40 | |
| 41 | 41 | action->parent.activate = activate; |
| 42 | + action->group.id = LIB3270_ACTION_GROUP_ONLINE; | |
| 42 | 43 | action->parent.name = "file.transfer"; |
| 43 | 44 | action->icon_name = "drive-harddisk"; |
| 44 | 45 | action->label = N_("Send/Receive"); | ... | ... |