diff --git a/src/include/pw3270/keypad.h b/src/include/pw3270/keypad.h index 07ebcc6..5251b39 100644 --- a/src/include/pw3270/keypad.h +++ b/src/include/pw3270/keypad.h @@ -52,7 +52,7 @@ GType KeypadModel_get_type(void) G_GNUC_CONST; - GObject * pw3270_keypad_model_new_from_xml(const gchar *filename); + GList * pw3270_keypad_model_load_from_xml(GList *keypads, const gchar *filename); G_END_DECLS diff --git a/src/objects/keypad/element.c b/src/objects/keypad/element.c new file mode 100644 index 0000000..1d58c54 --- /dev/null +++ b/src/objects/keypad/element.c @@ -0,0 +1,265 @@ +/* + * "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) + * + */ + + #include "private.h" + +/*---[ Globals & Object definition ]----------------------------------------------------------------*/ + + enum { + PROP_NONE, + PROP_LABEL, + PROP_ACTION, + PROP_ICON_NAME, + PROP_ROW, + PROP_COL, + PROP_WIDTH, + PROP_HEIGHT, + }; + + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); + + G_DEFINE_TYPE(KeypadElement, KeypadElement, G_TYPE_OBJECT) + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + static void finalize(GObject *object) { + + KeypadElement * element = PW_KEYPAD_ELEMENT(object); + + if(element->icon_name) { + g_free(element->icon_name); + element->icon_name = NULL; + } + + if(element->label) { + g_free(element->label); + element->label = NULL; + } + + if(element->action) { + g_free(element->action); + element->action = NULL; + } + + } + + static void KeypadElement_class_init(KeypadElementClass *klass) { + + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->finalize = finalize; + object_class->get_property = get_property; + object_class->set_property = set_property; + + // Install properties + g_object_class_install_property(object_class, PROP_ICON_NAME, + g_param_spec_string ( + I_("icon-name"), + I_("icon-name"), + N_("The name of the icon"), + NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_LABEL, + g_param_spec_string ( + I_("label"), + I_("label"), + N_("The Label of the keypad"), + NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_WIDTH, + g_param_spec_uint( + I_("row"), + I_("width"), + _("Element row"), + 1, + 10, + 3, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_WIDTH, + g_param_spec_uint( + I_("col"), + I_("width"), + _("Element col"), + 1, + 10, + 3, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_WIDTH, + g_param_spec_uint( + I_("width"), + I_("width"), + _("Element width in columns"), + 1, + 10, + 3, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_HEIGHT, + g_param_spec_uint( + I_("height"), + I_("height"), + _("Element height in rows"), + 0, + 100, + 0, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + } + + static void KeypadElement_init(KeypadElement *object) { + + + } + + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { + + KeypadElement * element = PW_KEYPAD_ELEMENT(object); + + switch (prop_id) { + case PROP_LABEL: + g_value_set_string(value, element->label); + break; + + case PROP_ICON_NAME: + g_value_set_string(value, element->icon_name); + break; + + case PROP_ACTION: + g_value_set_string(value, element->action); + break; + + case PROP_ROW: + g_value_set_uint(value, element->row); + break; + + case PROP_COL: + g_value_set_uint(value, element->col); + break; + + case PROP_HEIGHT: + g_value_set_uint(value, element->height); + break; + + case PROP_WIDTH: + g_value_set_uint(value, element->width); + break; + + default: + g_assert_not_reached (); + } + + } + + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { + + KeypadElement * element = PW_KEYPAD_ELEMENT(object); + + switch (prop_id) { + case PROP_LABEL: + + if(element->label) { + g_free(element->label); + element->label = g_value_dup_string(value); + } + break; + + case PROP_ACTION: + + if(element->action) { + g_free(element->action); + element->action = g_value_dup_string(value); + } + break; + + case PROP_ROW: + element->row = (unsigned short) g_value_get_uint(value); + break; + + case PROP_COL: + element->col = (unsigned short) g_value_get_uint(value); + break; + + case PROP_HEIGHT: + element->height = (unsigned short) g_value_get_uint(value); + break; + + case PROP_WIDTH: + element->width = (unsigned short) g_value_get_uint(value); + break; + + default: + g_assert_not_reached(); + } + } + + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, GList *keypads, GError **error) { + + debug("%s(%s)",__FUNCTION__,element_name); + + } + + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList *keypads, GError **error) { + + debug("%s(%s)",__FUNCTION__,element_name); + + } + + void keypad_model_element_parse_context(GObject *element, GMarkupParseContext *context) { + + static const GMarkupParser parser = { + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) + element_start, + + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) + element_end, + NULL, + NULL, + NULL + }; + + g_markup_parse_context_push(context, &parser, element); + + } diff --git a/src/objects/keypad/keypad.c b/src/objects/keypad/keypad.c new file mode 100644 index 0000000..fcaf588 --- /dev/null +++ b/src/objects/keypad/keypad.c @@ -0,0 +1,308 @@ +/* + * "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) + * + */ + + #include "private.h" + #include + +/*---[ Globals & Object definition ]----------------------------------------------------------------*/ + + enum { + PROP_NONE, + PROP_NAME, + PROP_LABEL, + PROP_POSITION, + PROP_WIDTH, + PROP_HEIGHT, + }; + + static const char * positions[] = { + "up", + "down", + "left", + "right" + }; + + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); + + G_DEFINE_TYPE(KeypadModel, KeypadModel, G_TYPE_OBJECT) + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + static void finalize(GObject *object) { + + KeypadModel * model = PW_KEYPAD_MODEL(object); + + if(model->name) { + g_free(model->name); + model->name = NULL; + } + + if(model->label) { + g_free(model->label); + model->label = NULL; + } + + } + + static void KeypadModel_class_init(KeypadModelClass *klass) { + + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + klass->domain = g_quark_from_static_string("keypad"); + + object_class->finalize = finalize; + object_class->get_property = get_property; + object_class->set_property = set_property; + + // Install properties + g_object_class_install_property(object_class, PROP_NAME, + g_param_spec_string ( + I_("name"), + N_("Keypad Name"), + N_("The name used to identify the keypad"), + NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_LABEL, + g_param_spec_string ( + _("label"), + N_("Keypad Label"), + N_("The Label of the keypad"), + NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_POSITION, + g_param_spec_string ( + I_("position"), + I_("position"), + N_("The position of the keypad"), + NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_WIDTH, + g_param_spec_uint( + I_("width"), + I_("width"), + _("Keypad width in columns"), + 1, + 10, + 3, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + + g_object_class_install_property(object_class, PROP_WIDTH, + g_param_spec_uint( + I_("height"), + I_("height"), + _("Keypad height in rows"), + 0, + 100, + 0, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE + ) + ); + } + + static void KeypadModel_init(KeypadModel *object) { + + + } + + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { + + KeypadModel * model = PW_KEYPAD_MODEL(object); + + switch (prop_id) { + case PROP_NAME: + g_value_set_string(value, model->name); + break; + + case PROP_LABEL: + g_value_set_string(value, model->label); + break; + + case PROP_POSITION: + g_value_set_static_string(value,keypad_model_get_position(object)); + break; + + case PROP_HEIGHT: + g_value_set_uint(value, model->height); + break; + + case PROP_WIDTH: + g_value_set_uint(value, model->width); + break; + + default: + g_assert_not_reached (); + } + + } + + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { + + KeypadModel * model = PW_KEYPAD_MODEL(object); + + switch (prop_id) { + case PROP_NAME: + + if(model->name) { + g_free(model->name); + model->name = g_value_dup_string(value); + } + break; + + case PROP_LABEL: + + if(model->label) { + g_free(model->label); + model->label = g_value_dup_string(value); + } + break; + + case PROP_POSITION: + keypad_model_set_position(object,g_value_get_string(value)); + break; + + case PROP_HEIGHT: + model->height = (unsigned short) g_value_get_uint(value); + break; + + case PROP_WIDTH: + model->width = (unsigned short) g_value_get_uint(value); + break; + + default: + g_assert_not_reached(); + } + } + + void keypad_model_set_position(GObject *model, const gchar *position) { + + if(position) { + size_t ix; + for(ix = 0; ix < G_N_ELEMENTS(positions); ix++) { + if(!g_ascii_strcasecmp(positions[ix],position)) { + PW_KEYPAD_MODEL(model)->position = (unsigned short) ix; + break; + } + } + } + + } + + const gchar * keypad_model_get_position(GObject *model) { + + size_t ix = (size_t) PW_KEYPAD_MODEL(model)->position; + + if(ix < G_N_ELEMENTS(positions)) + return positions[ix]; + + return "undefined"; + } + + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, KeypadModel *model, GError **error) { + + debug("%s(%s)",__FUNCTION__,element_name); + + if(!g_ascii_strcasecmp(element_name,"button")) { + + const gchar *row, *col, *width, *height; + GObject * element = g_object_new(PW_TYPE_KEYPAD_ELEMENT,NULL); + + if(!g_markup_collect_attributes( + element_name,names,values,error, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "row", &row, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "column", &col, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "width", &width, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "height", &height, + G_MARKUP_COLLECT_INVALID + )) { + + return; + + } + + if(row) { + PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(row); + } + + if(col) { + PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(col); + } + + if(width) { + PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(width); + } + + if(height) { + PW_KEYPAD_MODEL(element)->height = (unsigned short) atoi(height); + } + + keypad_model_element_parse_context(element,context); + + } + + + } + + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList *keypads, GError **error) { + + debug("%s(%s)",__FUNCTION__,element_name); + + if(!g_ascii_strcasecmp(element_name,"button")) { + g_markup_parse_context_pop(context); + } + + } + + void keypad_model_parse_context(GObject *model, GMarkupParseContext *context) { + + static const GMarkupParser parser = { + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) + element_start, + + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) + element_end, + NULL, + NULL, + NULL + }; + + g_markup_parse_context_push(context, &parser, model); + + } diff --git a/src/objects/keypad/keypad.cbp b/src/objects/keypad/keypad.cbp index 0619803..6153cdd 100644 --- a/src/objects/keypad/keypad.cbp +++ b/src/objects/keypad/keypad.cbp @@ -39,10 +39,13 @@ - + + + - + diff --git a/src/objects/keypad/load.c b/src/objects/keypad/load.c index 8423b80..b6f3774 100644 --- a/src/objects/keypad/load.c +++ b/src/objects/keypad/load.c @@ -28,12 +28,60 @@ */ #include "private.h" + #include /*---[ Implement ]----------------------------------------------------------------------------------*/ - GObject * pw3270_keypad_model_new_from_xml(const gchar *filename) { + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, GList *keypads, GError **error) { + + if(!g_ascii_strcasecmp(element_name,"keypad")) { + + const gchar *name, *position, *width, *height; + GObject * keypad = g_object_new(PW_TYPE_KEYPAD_MODEL,NULL); + + if(!g_markup_collect_attributes( + element_name,names,values,error, + G_MARKUP_COLLECT_STRING, "name", &name, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "position", &position, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "width", &width, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "height", &height, + G_MARKUP_COLLECT_INVALID + )) { + + return; + + } + + keypad_model_set_position(keypad,position); + + if(width) { + PW_KEYPAD_MODEL(keypad)->width = (unsigned short) atoi(width); + } + + if(height) { + PW_KEYPAD_MODEL(keypad)->height = (unsigned short) atoi(height); + } + + keypad_model_parse_context(keypad,context); + + } + + debug("%s(%s)",__FUNCTION__,element_name); + + } + + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList *keypads, GError **error) { + + debug("%s(%s)",__FUNCTION__,element_name); + + if(!g_ascii_strcasecmp(element_name,"keypad")) { + g_markup_parse_context_pop(context); + } + + } + + GList * pw3270_keypad_model_new_from_xml(GList *keypads, const gchar *filename) { - GObject * object = g_object_new(PW_TYPE_KEYPAD_MODEL,NULL); GError * error = NULL; g_autofree gchar *text = NULL; @@ -41,19 +89,31 @@ g_message("Loading keypad from %s",filename); + static const GMarkupParser parser = { + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) + element_start, + + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) + element_end, + NULL, + NULL, + NULL + }; + + GMarkupParseContext * context = g_markup_parse_context_new(&parser,G_MARKUP_TREAT_CDATA_AS_TEXT,keypads,NULL); + g_markup_parse_context_parse(context,text,strlen(text),&error); + g_markup_parse_context_free(context); } if(error) { - // TODO: Popup with error message. + // TODO: Popup error message. + g_message("%s",error->message); g_error_free(error); error = NULL; - g_object_unref(object); - object = NULL; - } - return object; + return keypads; } diff --git a/src/objects/keypad/model.c b/src/objects/keypad/model.c deleted file mode 100644 index 75b88c2..0000000 --- a/src/objects/keypad/model.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * "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) - * - */ - - #include "private.h" - -/*---[ Globals & Object definition ]----------------------------------------------------------------*/ - - enum { - PROP_NONE, - PROP_NAME, - PROP_LABEL, - PROP_POSITION, - PROP_WIDTH, - PROP_HEIGHT, - }; - - static const char * positions[] = { - "up", - "down", - "left", - "right" - }; - - static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); - - G_DEFINE_TYPE(KeypadModel, KeypadModel, G_TYPE_OBJECT) - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - static void finalize(GObject *object) { - - KeypadModel * model = PW_KEYPAD_MODEL(object); - - if(model->name) { - g_free(model->name); - model->name = NULL; - } - - if(model->label) { - g_free(model->label); - model->label = NULL; - } - - } - - static void KeypadModel_class_init(KeypadModelClass *klass) { - - GObjectClass *object_class = G_OBJECT_CLASS(klass); - - klass->domain = g_quark_from_static_string("keypad"); - - object_class->finalize = finalize; - object_class->get_property = get_property; - object_class->set_property = set_property; - - // Install properties - g_object_class_install_property(object_class, PROP_NAME, - g_param_spec_string ( - "name", - N_("Keypad Name"), - N_("The name used to identify the keypad"), - NULL, - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE - ) - ); - - g_object_class_install_property(object_class, PROP_LABEL, - g_param_spec_string ( - "label", - N_("Keypad Label"), - N_("The Label of the keypad"), - NULL, - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE - ) - ); - - g_object_class_install_property(object_class, PROP_POSITION, - g_param_spec_string ( - "position", - N_("Keypad position"), - N_("The position of the keypad"), - NULL, - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE - ) - ); - - g_object_class_install_property(object_class, PROP_WIDTH, - g_param_spec_uint( - "width", - "width", - _("Keypad width in columns"), - 1, - 10, - 3, - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE - ) - ); - - g_object_class_install_property(object_class, PROP_WIDTH, - g_param_spec_uint( - "height", - "height", - _("Keypad height in rows"), - 0, - 100, - 0, - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE - ) - ); - } - - static void KeypadModel_init(KeypadModel *object) { - - - } - - static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - - KeypadModel * model = PW_KEYPAD_MODEL(object); - - switch (prop_id) { - case PROP_NAME: - g_value_set_string(value, model->name); - break; - - case PROP_LABEL: - g_value_set_string(value, model->label); - break; - - case PROP_POSITION: - g_value_set_static_string(value,keypad_model_get_position(object)); - break; - - case PROP_HEIGHT: - g_value_set_uint(value, model->height); - break; - - case PROP_WIDTH: - g_value_set_uint(value, model->width); - break; - - default: - g_assert_not_reached (); - } - - } - - static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - - KeypadModel * model = PW_KEYPAD_MODEL(object); - - switch (prop_id) { - case PROP_NAME: - - if(model->name) { - g_free(model->name); - model->name = g_value_dup_string(value); - } - break; - - case PROP_LABEL: - - if(model->label) { - g_free(model->label); - model->label = g_value_dup_string(value); - } - break; - - case PROP_POSITION: - keypad_model_set_position(object,g_value_get_string(value)); - break; - - case PROP_HEIGHT: - model->height = (unsigned short) g_value_get_uint(value); - break; - - case PROP_WIDTH: - model->width = (unsigned short) g_value_get_uint(value); - break; - - default: - g_assert_not_reached(); - } - } - - void keypad_model_set_position(GObject *model, const gchar *position) { - - size_t ix; - for(ix = 0; ix < G_N_ELEMENTS(positions); ix++) { - if(!g_ascii_strcasecmp(positions[ix],position)) { - PW_KEYPAD_MODEL(model)->position = (unsigned short) ix; - break; - } - } - - } - - const gchar * keypad_model_get_position(GObject *model) { - - size_t ix = (size_t) PW_KEYPAD_MODEL(model)->position; - - if(ix < G_N_ELEMENTS(positions)) - return positions[ix]; - - return "undefined"; - } diff --git a/src/objects/keypad/private.h b/src/objects/keypad/private.h index 561ea71..1c0cb4a 100644 --- a/src/objects/keypad/private.h +++ b/src/objects/keypad/private.h @@ -46,6 +46,38 @@ #include + G_BEGIN_DECLS + + #define I_(string) g_intern_static_string (string) + + #define PW_TYPE_KEYPAD_ELEMENT (KeypadElement_get_type()) + #define PW_KEYPAD_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PW_TYPE_KEYPAD_ELEMENT, KeypadElement)) + #define PW_KEYPAD_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PW_TYPE_KEYPAD_ELEMENT, KeypadModelClass)) + #define PW_IS_KEYPAD_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PW_TYPE_KEYPAD_ELEMENT)) + #define PW_IS_KEYPAD_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PW_TYPE_KEYPAD_ELEMENT)) + #define PW_KEYPAD_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PW_TYPE_KEYPAD_ELEMENT, KeypadElementClass)) + + typedef struct _KeypadElement { + GObject parent; + + unsigned short row; + unsigned short col; + unsigned short width; + unsigned short height; + + gchar * icon_name; + gchar * label; + gchar * action; + + } KeypadElement; + + typedef struct _KeypadElementClass { + GObjectClass parent; + + } KeypadElementClass; + + GType KeypadElement_get_type(void) G_GNUC_CONST; + struct _KeypadModel { GObject parent; @@ -66,6 +98,12 @@ }; void keypad_model_set_position(GObject *model, const gchar *position); + void keypad_model_parse_context(GObject *model, GMarkupParseContext *context); + const gchar * keypad_model_get_position(GObject *mode); + void keypad_model_element_parse_context(GObject *element, GMarkupParseContext *context); + + G_END_DECLS + #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/keypad/testprogram/testprogram.c b/src/objects/keypad/testprogram/testprogram.c index ac740ab..f4e268f 100644 --- a/src/objects/keypad/testprogram/testprogram.c +++ b/src/objects/keypad/testprogram/testprogram.c @@ -66,7 +66,7 @@ } // Load keypad - GObject *keypad = pw3270_keypad_model_new_from_xml("keypad.xml"); + GList *keypads = pw3270_keypad_model_new_from_xml(NULL,"keypad.xml"); // Create trace window v3270_set_trace(terminal,TRUE); -- libgit2 0.21.2