diff --git a/src/actions/abstract.c b/src/actions/abstract.c
index 97dfcda..1de5758 100644
--- a/src/actions/abstract.c
+++ b/src/actions/abstract.c
@@ -30,20 +30,168 @@
#include "private.h"
static void pw3270_action_iface_init(GActionInterface *iface);
- static void pw3270_action_class_init(pw3270ActionClass *klass);
- static void pw3270_action_init(pw3270Action *action);
+ static void pw3270Action_class_init(pw3270ActionClass *klass);
+ static void pw3270Action_init(pw3270Action *action);
+ static void pw3270_action_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
+ static void pw3270_action_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
- G_DEFINE_TYPE_WITH_CODE(pw3270Action, pw3270_action, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_ACTION, pw3270_action_iface_init))
+ static const GVariantType * pw3270_action_get_state_type(GAction *action);
+ static GVariant * pw3270_action_get_state_property(GAction *action);
+ static GVariantType * pw3270_action_get_parameter_type(GAction *action);
+
+
+ enum {
+ PROP_NONE,
+ PROP_NAME,
+ PROP_PARAMETER_TYPE,
+ PROP_ENABLED,
+ PROP_STATE_TYPE,
+ PROP_STATE
+ };
+
+ G_DEFINE_TYPE_WITH_CODE(pw3270Action, pw3270Action, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_ACTION, pw3270_action_iface_init))
void pw3270_action_iface_init(GActionInterface *iface) {
+ iface->get_name = pw3270_action_get_name;
+// iface->get_parameter_type = pw3270_action_get_parameter_type;
+ iface->get_state_type = pw3270_action_get_state_type;
+// iface->get_state_hint = pw3270_action_get_state_hint;
+ iface->get_enabled = pw3270_action_get_enabled;
+ iface->get_state = pw3270_action_get_state_property;
+// iface->change_state = pw3270_action_change_state;
+ iface->activate = pw3270_action_activate;
+ }
+ static gboolean return_false(GAction G_GNUC_UNUSED(*action), GtkWidget G_GNUC_UNUSED(*window)) {
+ return FALSE;
}
- void pw3270_action_class_init(pw3270ActionClass *klass) {
+ void pw3270Action_class_init(pw3270ActionClass *klass) {
+
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
+
+ object_class->set_property = pw3270_action_set_property;
+ object_class->get_property = pw3270_action_get_property;
+
+ klass->get_enabled = return_false;
+
+ // Install properties
+ g_object_class_install_property(object_class, PROP_NAME,
+ g_param_spec_string ("name",
+ N_("Action Name"),
+ N_("The name used to invoke the action"),
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class, PROP_PARAMETER_TYPE,
+ g_param_spec_boxed ("parameter-type",
+ N_("Parameter Type"),
+ N_("The type of GVariant passed to activate()"),
+ G_TYPE_VARIANT_TYPE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class, PROP_ENABLED,
+ g_param_spec_boolean ("enabled",
+ N_("Enabled"),
+ N_("If the action can be activated"),
+ TRUE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class, PROP_STATE_TYPE,
+ g_param_spec_boxed ("state-type",
+ N_("State Type"),
+ N_("The type of the state kept by the action"),
+ G_TYPE_VARIANT_TYPE,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class, PROP_STATE,
+ g_param_spec_variant ("state",
+ N_("State"),
+ N_("The state the action is in"),
+ G_VARIANT_TYPE_ANY,
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
+
}
- void pw3270_action_init(pw3270Action *action) {
+ void pw3270Action_init(pw3270Action *action) {
+
+ action->name = "unnamed";
+ action->window = NULL;
}
+ void pw3270_action_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) {
+
+ GAction *action = G_ACTION(object);
+
+ switch (prop_id) {
+ case PROP_NAME:
+ g_value_set_string(value, pw3270_action_get_name(action));
+ break;
+
+ case PROP_PARAMETER_TYPE:
+ g_value_set_boxed(value, pw3270_action_get_parameter_type(action));
+ break;
+
+ case PROP_ENABLED:
+ g_value_set_boolean(value, pw3270_action_get_enabled(action));
+ break;
+
+ case PROP_STATE_TYPE:
+ g_value_set_boxed(value, pw3270_action_get_state_type(action));
+ break;
+
+ case PROP_STATE:
+ g_value_take_variant(value, pw3270_action_get_state_property(action));
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ }
+
+ void pw3270_action_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) {
+ }
+
+ const gchar * pw3270_action_get_name(GAction *action) {
+ return PW3270_ACTION(action)->name;
+ }
+
+ const GVariantType * pw3270_action_get_state_type(GAction *action) {
+ return NULL;
+ }
+
+ GVariant * pw3270_action_get_state_property(GAction *action) {
+ return g_variant_new_int16(0);
+ }
+
+ GVariantType * pw3270_action_get_parameter_type(GAction *action) {
+ return NULL;
+ }
+
+ gboolean pw3270_action_get_enabled(GAction *action) {
+ GtkWidget *window = PW3270_ACTION(action)->window;
+
+ if(window)
+ return PW3270_ACTION_GET_CLASS(action)->get_enabled(action,window);
+
+ return FALSE;
+ }
+
+ void pw3270_action_activate(GAction *action, GVariant *parameter) {
+ GtkWidget *window = PW3270_ACTION(action)->window;
+
+ if(window)
+ PW3270_ACTION_GET_CLASS(action)->activate(action,window);
+
+ }
diff --git a/src/actions/actions.cbp b/src/actions/actions.cbp
index 02471c6..fa843cf 100644
--- a/src/actions/actions.cbp
+++ b/src/actions/actions.cbp
@@ -32,16 +32,20 @@
-
+
-
+
+
+
+
+
diff --git a/src/actions/lib3270.c b/src/actions/lib3270.c
new file mode 100644
index 0000000..7d92316
--- /dev/null
+++ b/src/actions/lib3270.c
@@ -0,0 +1,108 @@
+/*
+ * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
+ * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
+ * aplicativos mainframe. Registro no INPI sob o nome G3270.
+ *
+ * Copyright (C) <2008>
+ *
+ * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
+ * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
+ * Free Software Foundation.
+ *
+ * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
+ * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
+ * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
+ * obter mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
+ * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
+ * St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Este programa está nomeado como - e possui - linhas de código.
+ *
+ * Contatos:
+ *
+ * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
+ * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
+ *
+ */
+
+ /**
+ * @brief Implement GAction "wrapper" for lib3270's actions.
+ *
+ */
+
+ #include "private.h"
+ #include
+
+ #define PW3270_TYPE_LIB3270_ACTION (Lib3270Action_get_type())
+ #define PW3270_LIB3270_ACTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), PW3270_TYPE_LIB3270_ACTION, Lib3270Action))
+ #define PW3270_IS_LIB3270_ACTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), PW3270_TYPE_LIB3270_ACTION))
+
+ typedef struct _Lib3270ActionClass {
+ pw3270ActionClass parent_class;
+
+ } Lib3270ActionClass;
+
+ typedef struct _Lib3270Action {
+ pw3270Action parent;
+
+ const LIB3270_ACTION * definition;
+
+
+ } Lib3270Action;
+
+ static void Lib3270Action_class_init(Lib3270ActionClass *klass);
+ static void Lib3270Action_init(Lib3270Action *action);
+
+
+ G_DEFINE_TYPE(Lib3270Action, Lib3270Action, PW3270_TYPE_ACTION);
+
+ static gboolean action_enabled(GAction *action, GtkWidget *window) {
+
+ H3270 * hSession = pw3270_window_get_session_handle(window);
+
+ if(hSession)
+ return PW3270_LIB3270_ACTION(action)->definition->activatable(hSession) > 0 ? TRUE : FALSE;
+
+ return FALSE;
+ }
+
+ static void action_activate(GAction *action, GtkWidget *window) {
+
+ H3270 * hSession = pw3270_window_get_session_handle(window);
+
+ if(hSession)
+ PW3270_LIB3270_ACTION(action)->definition->activate(hSession);
+
+ }
+
+ void Lib3270Action_class_init(Lib3270ActionClass *klass) {
+
+ pw3270ActionClass * action = PW3270_ACTION_CLASS(klass);
+
+ action->get_enabled = action_enabled;
+ action->activate = action_activate;
+
+
+ }
+
+ void Lib3270Action_init(Lib3270Action *action) {
+ }
+
+ GAction * pw3270_action_get_from_lib3270(const LIB3270_ACTION * definition) {
+
+ Lib3270Action * action = (Lib3270Action *) g_object_new(PW3270_TYPE_LIB3270_ACTION, NULL);
+ action->definition = definition;
+
+ {
+ pw3270Action * abstract = PW3270_ACTION(action);
+
+ abstract->name = definition->name;
+
+ }
+
+ return G_ACTION(action);
+ }
+
+
diff --git a/src/actions/private.h b/src/actions/private.h
index aec6e32..a8af5fb 100644
--- a/src/actions/private.h
+++ b/src/actions/private.h
@@ -39,19 +39,24 @@
#include
#include
+ #include
#include
#include
struct _pw3270Action {
- GObject parent;
+ GObject parent;
+
+ GtkWidget * window;
+ const gchar * name;
};
struct _pw3270ActionClass {
+ GObjectClass parent_class;
- GObject parent_class;
-
+ gboolean (*get_enabled)(GAction *action, GtkWidget *window);
+ void (*activate)(GAction *action, GtkWidget *window);
};
diff --git a/src/actions/testprogram/testprogram.c b/src/actions/testprogram/testprogram.c
index 0a3d142..b420a7f 100644
--- a/src/actions/testprogram/testprogram.c
+++ b/src/actions/testprogram/testprogram.c
@@ -30,14 +30,29 @@
#include
#include
+ #include
+ #include
#include
/*---[ Implement ]----------------------------------------------------------------------------------*/
+ GtkWidget * pw3270_window_get_terminal_widget(GtkWidget G_GNUC_UNUSED(*window)) {
+ return NULL;
+ }
+
+ H3270 * pw3270_window_get_session_handle(GtkWidget G_GNUC_UNUSED(*window)) {
+ return NULL;
+ }
+
int main (int argc, char **argv) {
+ GAction * action = pw3270_action_get_from_lib3270(lib3270_action_get_by_name("testpattern"));
+
+ g_message("Action name is \"%s\"",g_action_get_name(action));
+ g_message("Action is %s",g_action_get_enabled(action) ? "enabled" : "disabled");
- return 0;
+ g_object_unref(action);
+ return 0;
}
diff --git a/src/include/pw3270/actions.h b/src/include/pw3270/actions.h
index 5e2a50f..cd425ea 100644
--- a/src/include/pw3270/actions.h
+++ b/src/include/pw3270/actions.h
@@ -42,15 +42,22 @@
G_BEGIN_DECLS
- #define PW3270_TYPE_ACTION (pw3270_action_get_type ())
-
-// #define PW3270_ACTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), PW3270_TYPE_ACTION, pw3270Action))
-// #define PW3270_IS_ACTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), PW3270_TYPE_ACTION))
+ #define PW3270_TYPE_ACTION (pw3270Action_get_type())
+ #define PW3270_ACTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), PW3270_TYPE_ACTION, pw3270Action))
+ #define PW3270_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PW3270_TYPE_ACTION, pw3270ActionClass))
+ #define PW3270_IS_ACTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), PW3270_TYPE_ACTION))
+ #define PW3270_IS_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PW3270_TYPE_ACTION))
+ #define PW3270_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PW3270_TYPE_ACTION, pw3270ActionClass))
typedef struct _pw3270Action pw3270Action;
typedef struct _pw3270ActionClass pw3270ActionClass;
- GType pw3270_action_get_type(void) G_GNUC_CONST;
+ GType pw3270Action_get_type(void) G_GNUC_CONST;
+
+ GAction * pw3270_action_get_from_lib3270(const LIB3270_ACTION * definition);
+ const gchar * pw3270_action_get_name(GAction *action);
+ gboolean pw3270_action_get_enabled(GAction *action);
+ void pw3270_action_activate(GAction *action, GVariant *parameter);
G_END_DECLS
diff --git a/src/include/pw3270/window.h b/src/include/pw3270/window.h
index 7034186..07a59b4 100644
--- a/src/include/pw3270/window.h
+++ b/src/include/pw3270/window.h
@@ -37,6 +37,7 @@
#define PW3270_WINDOW_H_INCLUDED
#include
+ #include
G_BEGIN_DECLS
@@ -62,6 +63,11 @@
/// @brief Create a new terminal tab.
GtkWidget * pw3270_terminal_new(GtkWidget *window);
+ /// @brief Get the active terminal widget.
+ GtkWidget * pw3270_window_get_terminal_widget(GtkWidget *window);
+
+ /// @brief Get the active session handle.
+ H3270 * pw3270_window_get_session_handle(GtkWidget *window);
G_END_DECLS
--
libgit2 0.21.2