Commit 6e14e1d19ac14e53a9c2cef7d51f21609ef302f5
1 parent
27bf76ec
Exists in
master
and in
5 other branches
Implementando ativacao/desativacao das barras de botoes
Showing
6 changed files
with
65 additions
and
4 deletions
Show diff stats
src/include/pw3270.h
| ... | ... | @@ -79,10 +79,9 @@ |
| 79 | 79 | |
| 80 | 80 | LIB3270_EXPORT void pw3270_print(GtkWidget *widget, GObject *action, GtkPrintOperationAction oper, PW3270_SRC src); |
| 81 | 81 | |
| 82 | - | |
| 83 | 82 | #ifdef HAVE_GTKMAC |
| 84 | - #include <gtk-mac-bundle.h> | |
| 85 | - LIB3270_EXPORT GtkMacBundle * pw3270_get_bundle(void); | |
| 83 | + #include <gtk-mac-bundle.h> | |
| 84 | + LIB3270_EXPORT GtkMacBundle * pw3270_get_bundle(void); | |
| 86 | 85 | #endif |
| 87 | 86 | |
| 88 | 87 | G_END_DECLS | ... | ... |
src/include/pw3270/v3270.h
| ... | ... | @@ -138,6 +138,7 @@ |
| 138 | 138 | LIB3270_EXPORT const gchar * v3270_get_font_family(GtkWidget *widget); |
| 139 | 139 | |
| 140 | 140 | LIB3270_EXPORT H3270 * v3270_get_session(GtkWidget *widget); |
| 141 | + LIB3270_EXPORT gboolean v3270_is_connected(GtkWidget *widget); | |
| 141 | 142 | |
| 142 | 143 | LIB3270_EXPORT int v3270_connect(GtkWidget *widget, const gchar *host); |
| 143 | 144 | LIB3270_EXPORT void v3270_disconnect(GtkWidget *widget); | ... | ... |
src/pw3270/uiparser/action.c
| ... | ... | @@ -30,6 +30,7 @@ |
| 30 | 30 | */ |
| 31 | 31 | |
| 32 | 32 | #include <stdlib.h> |
| 33 | + #include <pw3270/v3270.h> | |
| 33 | 34 | #include "private.h" |
| 34 | 35 | |
| 35 | 36 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| ... | ... | @@ -120,3 +121,53 @@ |
| 120 | 121 | } |
| 121 | 122 | } |
| 122 | 123 | } |
| 124 | + | |
| 125 | + struct list_data | |
| 126 | + { | |
| 127 | + GtkWidget * terminal; | |
| 128 | + GtkWidget **keypad; | |
| 129 | + guint pos; | |
| 130 | + guint total; | |
| 131 | + }; | |
| 132 | + | |
| 133 | + static void insert_keypad(gpointer key, GtkWidget *widget, struct list_data *dt) | |
| 134 | + { | |
| 135 | + if(!widget || dt->pos >= dt->total) | |
| 136 | + return; | |
| 137 | + gtk_widget_set_sensitive(widget,v3270_is_connected(dt->terminal)); | |
| 138 | + | |
| 139 | + trace("%s: keypad[%d]=%p",__FUNCTION__,dt->pos,widget); | |
| 140 | + dt->keypad[dt->pos++] = widget; | |
| 141 | + } | |
| 142 | + | |
| 143 | + static void disable_keypad(GtkWidget *terminal, GtkWidget **keypad) | |
| 144 | + { | |
| 145 | + while(*keypad) | |
| 146 | + gtk_widget_set_sensitive(*(keypad++),FALSE); | |
| 147 | + } | |
| 148 | + | |
| 149 | + static void enable_keypad(GtkWidget *terminal, const gchar *dunno, GtkWidget **keypad) | |
| 150 | + { | |
| 151 | + while(*keypad) | |
| 152 | + gtk_widget_set_sensitive(*(keypad++),TRUE); | |
| 153 | + } | |
| 154 | + | |
| 155 | + void ui_setup_keypads(GHashTable *keypads, GtkWidget *window, GtkWidget *widget) | |
| 156 | + { | |
| 157 | + struct list_data dt; | |
| 158 | + | |
| 159 | + memset(&dt,0,sizeof(dt)); | |
| 160 | + dt.terminal = widget; | |
| 161 | + dt.total = g_hash_table_size(keypads); | |
| 162 | + | |
| 163 | + if(!dt.total) | |
| 164 | + return; | |
| 165 | + | |
| 166 | + dt.keypad = g_new0(GtkWidget *,dt.total+1); | |
| 167 | + g_hash_table_foreach(keypads,(GHFunc) insert_keypad, &dt); | |
| 168 | + | |
| 169 | + g_signal_connect(widget,"disconnected",G_CALLBACK(disable_keypad),dt.keypad); | |
| 170 | + g_signal_connect(widget,"connected",G_CALLBACK(enable_keypad),dt.keypad); | |
| 171 | + | |
| 172 | + g_object_set_data_full(G_OBJECT(widget),"keypads",dt.keypad,g_free); | |
| 173 | + } | ... | ... |
src/pw3270/uiparser/parser.c
| ... | ... | @@ -231,6 +231,9 @@ void parser_build(struct parser *p, GtkWidget *widget) |
| 231 | 231 | // Pack top toolbars |
| 232 | 232 | g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p); |
| 233 | 233 | |
| 234 | + // Setup keypads | |
| 235 | + ui_setup_keypads(p->element_list[UI_ELEMENT_KEYPAD], p->toplevel, p->center_widget); | |
| 236 | + | |
| 234 | 237 | // Pack top keypads |
| 235 | 238 | memset(&keypad,0,sizeof(keypad)); |
| 236 | 239 | keypad.box = vbox; |
| ... | ... | @@ -238,7 +241,6 @@ void parser_build(struct parser *p, GtkWidget *widget) |
| 238 | 241 | keypad.pack = gtk_box_pack_start; |
| 239 | 242 | g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); |
| 240 | 243 | |
| 241 | - | |
| 242 | 244 | // Pack left keypads |
| 243 | 245 | keypad.box = hbox; |
| 244 | 246 | keypad.filter = GTK_POS_RIGHT; | ... | ... |
src/pw3270/uiparser/parser.h
| ... | ... | @@ -71,6 +71,8 @@ |
| 71 | 71 | GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash, const gchar **names, const gchar **values, GError **error); |
| 72 | 72 | const gchar * ui_get_dir_name(UI_ATTR_DIRECTION dir); |
| 73 | 73 | |
| 74 | + void ui_setup_keypads(GHashTable *keypads, GtkWidget *window, GtkWidget *widget); | |
| 75 | + | |
| 74 | 76 | void ui_connect_text_script(GtkWidget *widget, GtkAction *action, const gchar *script_text, GError **error); |
| 75 | 77 | void ui_set_scroll_actions(GtkWidget *widget, GtkAction *action[UI_ATTR_DIRECTION_COUNT]); |
| 76 | 78 | ... | ... |
src/pw3270/v3270/widget.c
| ... | ... | @@ -1417,3 +1417,9 @@ void v3270_set_session_name(GtkWidget *widget, const gchar *name) |
| 1417 | 1417 | |
| 1418 | 1418 | GTK_V3270(widget)->session_name = g_strdup(name); |
| 1419 | 1419 | } |
| 1420 | + | |
| 1421 | +gboolean v3270_is_connected(GtkWidget *widget) | |
| 1422 | +{ | |
| 1423 | + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); | |
| 1424 | + return lib3270_connected(GTK_V3270(widget)->host) ? TRUE : FALSE; | |
| 1425 | +} | ... | ... |