From 6e14e1d19ac14e53a9c2cef7d51f21609ef302f5 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Thu, 27 Sep 2012 13:39:47 +0000 Subject: [PATCH] Implementando ativacao/desativacao das barras de botoes --- src/include/pw3270.h | 5 ++--- src/include/pw3270/v3270.h | 1 + src/pw3270/uiparser/action.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/pw3270/uiparser/parser.c | 4 +++- src/pw3270/uiparser/parser.h | 2 ++ src/pw3270/v3270/widget.c | 6 ++++++ 6 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/include/pw3270.h b/src/include/pw3270.h index 186b8ce..3ba35a1 100644 --- a/src/include/pw3270.h +++ b/src/include/pw3270.h @@ -79,10 +79,9 @@ LIB3270_EXPORT void pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, PW3270_SRC src); - #ifdef HAVE_GTKMAC - #include - LIB3270_EXPORT GtkMacBundle * pw3270_get_bundle(void); + #include + LIB3270_EXPORT GtkMacBundle * pw3270_get_bundle(void); #endif G_END_DECLS diff --git a/src/include/pw3270/v3270.h b/src/include/pw3270/v3270.h index 0cc9efd..1f5d05a 100644 --- a/src/include/pw3270/v3270.h +++ b/src/include/pw3270/v3270.h @@ -138,6 +138,7 @@ LIB3270_EXPORT const gchar * v3270_get_font_family(GtkWidget *widget); LIB3270_EXPORT H3270 * v3270_get_session(GtkWidget *widget); + LIB3270_EXPORT gboolean v3270_is_connected(GtkWidget *widget); LIB3270_EXPORT int v3270_connect(GtkWidget *widget, const gchar *host); LIB3270_EXPORT void v3270_disconnect(GtkWidget *widget); diff --git a/src/pw3270/uiparser/action.c b/src/pw3270/uiparser/action.c index e7b5d6d..7e82b91 100644 --- a/src/pw3270/uiparser/action.c +++ b/src/pw3270/uiparser/action.c @@ -30,6 +30,7 @@ */ #include + #include #include "private.h" /*--[ Implement ]------------------------------------------------------------------------------------*/ @@ -120,3 +121,53 @@ } } } + + struct list_data + { + GtkWidget * terminal; + GtkWidget **keypad; + guint pos; + guint total; + }; + + static void insert_keypad(gpointer key, GtkWidget *widget, struct list_data *dt) + { + if(!widget || dt->pos >= dt->total) + return; + gtk_widget_set_sensitive(widget,v3270_is_connected(dt->terminal)); + + trace("%s: keypad[%d]=%p",__FUNCTION__,dt->pos,widget); + dt->keypad[dt->pos++] = widget; + } + + static void disable_keypad(GtkWidget *terminal, GtkWidget **keypad) + { + while(*keypad) + gtk_widget_set_sensitive(*(keypad++),FALSE); + } + + static void enable_keypad(GtkWidget *terminal, const gchar *dunno, GtkWidget **keypad) + { + while(*keypad) + gtk_widget_set_sensitive(*(keypad++),TRUE); + } + + void ui_setup_keypads(GHashTable *keypads, GtkWidget *window, GtkWidget *widget) + { + struct list_data dt; + + memset(&dt,0,sizeof(dt)); + dt.terminal = widget; + dt.total = g_hash_table_size(keypads); + + if(!dt.total) + return; + + dt.keypad = g_new0(GtkWidget *,dt.total+1); + g_hash_table_foreach(keypads,(GHFunc) insert_keypad, &dt); + + g_signal_connect(widget,"disconnected",G_CALLBACK(disable_keypad),dt.keypad); + g_signal_connect(widget,"connected",G_CALLBACK(enable_keypad),dt.keypad); + + g_object_set_data_full(G_OBJECT(widget),"keypads",dt.keypad,g_free); + } diff --git a/src/pw3270/uiparser/parser.c b/src/pw3270/uiparser/parser.c index 487474d..900d190 100644 --- a/src/pw3270/uiparser/parser.c +++ b/src/pw3270/uiparser/parser.c @@ -231,6 +231,9 @@ void parser_build(struct parser *p, GtkWidget *widget) // Pack top toolbars g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p); + // Setup keypads + ui_setup_keypads(p->element_list[UI_ELEMENT_KEYPAD], p->toplevel, p->center_widget); + // Pack top keypads memset(&keypad,0,sizeof(keypad)); keypad.box = vbox; @@ -238,7 +241,6 @@ void parser_build(struct parser *p, GtkWidget *widget) keypad.pack = gtk_box_pack_start; g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); - // Pack left keypads keypad.box = hbox; keypad.filter = GTK_POS_RIGHT; diff --git a/src/pw3270/uiparser/parser.h b/src/pw3270/uiparser/parser.h index 327aaf9..d1f2e5a 100644 --- a/src/pw3270/uiparser/parser.h +++ b/src/pw3270/uiparser/parser.h @@ -71,6 +71,8 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash, const gchar **names, const gchar **values, GError **error); const gchar * ui_get_dir_name(UI_ATTR_DIRECTION dir); + void ui_setup_keypads(GHashTable *keypads, GtkWidget *window, GtkWidget *widget); + void ui_connect_text_script(GtkWidget *widget, GtkAction *action, const gchar *script_text, GError **error); void ui_set_scroll_actions(GtkWidget *widget, GtkAction *action[UI_ATTR_DIRECTION_COUNT]); diff --git a/src/pw3270/v3270/widget.c b/src/pw3270/v3270/widget.c index 34ac397..d7cf67d 100644 --- a/src/pw3270/v3270/widget.c +++ b/src/pw3270/v3270/widget.c @@ -1417,3 +1417,9 @@ void v3270_set_session_name(GtkWidget *widget, const gchar *name) GTK_V3270(widget)->session_name = g_strdup(name); } + +gboolean v3270_is_connected(GtkWidget *widget) +{ + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); + return lib3270_connected(GTK_V3270(widget)->host) ? TRUE : FALSE; +} -- libgit2 0.21.2