From 74f58ec3c51e4872caf8d6980d32f5c868cff141 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 5 Dec 2019 16:04:10 -0300 Subject: [PATCH] Implemeting "copy-based" actions. --- src/include/pw3270/actions.h | 28 ++++++++++++++++++++++++++++ src/objects/actions/private.h | 4 ++-- src/objects/actions/v3270/copy.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- src/objects/actions/window.c | 2 -- src/objects/application/application.c | 11 +++++++++++ 5 files changed, 110 insertions(+), 9 deletions(-) diff --git a/src/include/pw3270/actions.h b/src/include/pw3270/actions.h index 0f71357..c02fefa 100644 --- a/src/include/pw3270/actions.h +++ b/src/include/pw3270/actions.h @@ -215,6 +215,34 @@ GAction * v3270_property_action_new(GtkWidget *widget, const gchar *property_name); + // + // V3270 Copy action + // + #define V3270_TYPE_COPY_ACTION (v3270CopyAction_get_type()) + #define V3270_COPY_ACTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), V3270_TYPE_COPY_ACTION, v3270CopyAction)) + #define V3270_COPY_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), V3270_TYPE_COPY_ACTION, v3270CopyActionClass)) + #define V3270_IS_COPY_ACTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), V3270_TYPE_COPY_ACTION)) + #define V3270_IS_COPY_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), V3270_TYPE_COPY_ACTION)) + #define V3270_COPY_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), V3270_TYPE_COPY_ACTION, v3270CopyActionClass)) + + typedef struct _v3270CopyAction { + + pw3270SimpleAction parent; + + GParamSpec *pspec; + + } v3270CopyAction; + + typedef struct _v3270CopyActionClass { + + pw3270SimpleActionClass parent_class; + + } v3270CopyActionClass; + + GType v3270CopyAction_get_type(void) G_GNUC_CONST; + + GAction * v3270_copy_action_new(GtkWidget *widget); + G_END_DECLS #endif // PW3270_ACTIONS_H_INCLUDED diff --git a/src/objects/actions/private.h b/src/objects/actions/private.h index bc60f47..c6ddba9 100644 --- a/src/objects/actions/private.h +++ b/src/objects/actions/private.h @@ -69,11 +69,11 @@ G_GNUC_INTERNAL GAction * pw3270_action_save_new(void); G_GNUC_INTERNAL GAction * pw3270_action_save_screen_new(void); G_GNUC_INTERNAL GAction * pw3270_action_save_selected_new(void); - G_GNUC_INTERNAL GAction * pw3270_action_save_copy_new(void); + G_GNUC_INTERNAL GAction * pw3270_action_save_copy_new(GtkWidget *widget); G_GNUC_INTERNAL GAction * pw3270_action_print_new(void); G_GNUC_INTERNAL GAction * pw3270_action_print_screen_new(void); G_GNUC_INTERNAL GAction * pw3270_action_print_selected_new(void); - G_GNUC_INTERNAL GAction * pw3270_action_print_copy_new(void); + G_GNUC_INTERNAL GAction * pw3270_action_print_copy_new(GtkWidget *widget); #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/actions/v3270/copy.c b/src/objects/actions/v3270/copy.c index 5b26856..7afba4d 100644 --- a/src/objects/actions/v3270/copy.c +++ b/src/objects/actions/v3270/copy.c @@ -28,17 +28,81 @@ */ /** - * @brief Implement PW3270 save actions. + * @brief Implement PW3270 copy actions. * */ #include "../private.h" #include + static void v3270CopyAction_class_init(v3270CopyActionClass *klass); + static void v3270CopyAction_init(v3270CopyAction *action); + static GVariant * get_state(GAction *action, GtkWidget *terminal); + static void change_widget(GAction *object, GtkWidget *from, GtkWidget *to); - GAction * pw3270_action_print_copy_new(void) { + G_DEFINE_TYPE(v3270CopyAction, v3270CopyAction, PW3270_TYPE_SIMPLE_ACTION); - pw3270SimpleAction * action = pw3270_simple_action_new(); + void v3270CopyAction_class_init(v3270CopyActionClass *klass) { + klass->parent_class.parent_class.change_widget = change_widget; + } + + static void v3270CopyAction_init(v3270CopyAction *action) { + + action->parent.parent.get_state_property = get_state; + + } + + GVariant * get_state(GAction *object, GtkWidget *terminal) { + + + return NULL; + + } + + static void activate(GAction *object, GVariant *parameter, GtkWidget *terminal) { + + + } + + static void on_notify(GtkWidget G_GNUC_UNUSED(*terminal), GParamSpec G_GNUC_UNUSED(*pspec), GAction *action) { + + debug("%s: State of action %s has changed",__FUNCTION__, g_action_get_name(G_ACTION(action))); + pw3270_action_notify_state(action); + + } + + void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { + + v3270CopyAction * action = V3270_COPY_ACTION(object); + + if(from) { + gulong handler = g_signal_handler_find( + "has-text", + G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA, + 0, + 0, + NULL, + G_CALLBACK(on_notify), + action + ); + + if(handler) + g_signal_handler_disconnect(from, handler); + + } + + PW3270_ACTION_CLASS(v3270CopyAction_parent_class)->change_widget(object,from,to); + + if(to) { + g_signal_connect(G_OBJECT(to),"has-text",G_CALLBACK(on_notify),action); + } + + } + + + GAction * pw3270_action_print_copy_new(GtkWidget *widget) { + + pw3270SimpleAction * action = (pw3270SimpleAction *) g_object_new(V3270_TYPE_COPY_ACTION, NULL);; action->group.id = LIB3270_ACTION_GROUP_ONLINE; action->parent.name = "print_copy"; @@ -48,9 +112,9 @@ } - GAction * pw3270_action_save_copy_new(void) { + GAction * pw3270_action_save_copy_new(GtkWidget *widget) { - pw3270SimpleAction * action = pw3270_simple_action_new(); + pw3270SimpleAction * action = (pw3270SimpleAction *) g_object_new(V3270_TYPE_COPY_ACTION, NULL);; action->group.id = LIB3270_ACTION_GROUP_ONLINE; action->parent.name = "save_copy"; diff --git a/src/objects/actions/window.c b/src/objects/actions/window.c index 3fa27c7..f51aa64 100644 --- a/src/objects/actions/window.c +++ b/src/objects/actions/window.c @@ -76,11 +76,9 @@ pw3270_action_save_screen_new(), pw3270_action_save_selected_new(), - pw3270_action_save_copy_new(), pw3270_action_print_screen_new(), pw3270_action_print_selected_new(), - pw3270_action_print_copy_new() }; diff --git a/src/objects/application/application.c b/src/objects/application/application.c index bb996be..7a1b11a 100644 --- a/src/objects/application/application.c +++ b/src/objects/application/application.c @@ -299,6 +299,17 @@ } + // Create copy actions. + g_action_map_add_action( + G_ACTION_MAP(window), + pw3270_action_save_copy_new(terminal) + ); + + g_action_map_add_action( + G_ACTION_MAP(window), + pw3270_action_print_copy_new(terminal) + ); + // Present the new window pw3270_window_set_current_page(window,0); gtk_window_present(GTK_WINDOW(window)); -- libgit2 0.21.2