Commit a73ec3ca04c81076c1c63e58e641e449a9efebca
1 parent
925b3ce9
Exists in
master
and in
5 other branches
Iniciando implementação de alteração pedida no forum do projeto.
Em: 2014-07-03 11:22:17.300246-03 De: rogermachine@gmail.com É possível adicionar um sub-menu em Configurações/Opções/SessionCloseTime na versão do PW3270 (para linux e windows)? Na versão 2.6 do PW3270 para windows existe esta opção. Gostaria de colocar esta opção nas novas versões. Esta opção expira a seção ociosa, por exemplo se em 10 minutos o usuário não utilizar o terminal ele fecha a sessão, liberando a porta para outro usuário. Se alguém puder ajudar agradeço! Rodrigo
Showing
6 changed files
with
95 additions
and
5 deletions
Show diff stats
src/include/pw3270/v3270.h
@@ -163,6 +163,10 @@ | @@ -163,6 +163,10 @@ | ||
163 | 163 | ||
164 | LIB3270_EXPORT int v3270_set_host_charset(GtkWidget *widget, const gchar *name); | 164 | LIB3270_EXPORT int v3270_set_host_charset(GtkWidget *widget, const gchar *name); |
165 | 165 | ||
166 | + LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes); | ||
167 | + LIB3270_EXPORT guint v3270_get_auto_disconnect(GtkWidget *widget); | ||
168 | + | ||
169 | + | ||
166 | // Clipboard | 170 | // Clipboard |
167 | typedef enum _v3270_select_format | 171 | typedef enum _v3270_select_format |
168 | { | 172 | { |
src/pw3270/main.c
@@ -55,6 +55,7 @@ | @@ -55,6 +55,7 @@ | ||
55 | static GtkWidget * toplevel = NULL; | 55 | static GtkWidget * toplevel = NULL; |
56 | static GtkWidget * trace_window = NULL; | 56 | static GtkWidget * trace_window = NULL; |
57 | static unsigned int syscolors = 16; | 57 | static unsigned int syscolors = 16; |
58 | + static unsigned int timer = 0; | ||
58 | static const gchar * systype = NULL; | 59 | static const gchar * systype = NULL; |
59 | static const gchar * toggleset = NULL; | 60 | static const gchar * toggleset = NULL; |
60 | static const gchar * togglereset = NULL; | 61 | static const gchar * togglereset = NULL; |
@@ -408,6 +409,7 @@ int main(int argc, char *argv[]) | @@ -408,6 +409,7 @@ int main(int argc, char *argv[]) | ||
408 | { "togglereset", 'R', 0, G_OPTION_ARG_STRING, &togglereset, N_( "Set toggles OFF" ), NULL }, | 409 | { "togglereset", 'R', 0, G_OPTION_ARG_STRING, &togglereset, N_( "Set toggles OFF" ), NULL }, |
409 | { "charset", 'C', 0, G_OPTION_ARG_STRING, &charset, N_( "Set host charset" ), NULL }, | 410 | { "charset", 'C', 0, G_OPTION_ARG_STRING, &charset, N_( "Set host charset" ), NULL }, |
410 | { "model", 'M', 0, G_OPTION_ARG_STRING, &model, N_( "The model of 3270 display to be emulated" ), NULL }, | 411 | { "model", 'M', 0, G_OPTION_ARG_STRING, &model, N_( "The model of 3270 display to be emulated" ), NULL }, |
412 | + { "autodisconnect", 'D', 0, G_OPTION_ARG_INT, &timer, N_( "Minutes for auto-disconnect" ), 0 }, | ||
411 | 413 | ||
412 | #if defined( HAVE_SYSLOG ) | 414 | #if defined( HAVE_SYSLOG ) |
413 | { "syslog", 'l', 0, G_OPTION_ARG_NONE, &log_to_syslog, N_( "Send messages to syslog" ), NULL }, | 415 | { "syslog", 'l', 0, G_OPTION_ARG_NONE, &log_to_syslog, N_( "Send messages to syslog" ), NULL }, |
@@ -562,6 +564,8 @@ int main(int argc, char *argv[]) | @@ -562,6 +564,8 @@ int main(int argc, char *argv[]) | ||
562 | if(model) | 564 | if(model) |
563 | lib3270_set_model(pw3270_get_session(toplevel),model); | 565 | lib3270_set_model(pw3270_get_session(toplevel),model); |
564 | 566 | ||
567 | + v3270_set_auto_disconnect(pw3270_get_terminal_widget(toplevel),timer); | ||
568 | + | ||
565 | pw3270_start_plugins(toplevel); | 569 | pw3270_start_plugins(toplevel); |
566 | gtk_window_present(GTK_WINDOW(toplevel)); | 570 | gtk_window_present(GTK_WINDOW(toplevel)); |
567 | 571 |
src/pw3270/v3270/keyboard.c
@@ -198,6 +198,7 @@ | @@ -198,6 +198,7 @@ | ||
198 | { | 198 | { |
199 | v3270 * terminal = GTK_V3270(widget); | 199 | v3270 * terminal = GTK_V3270(widget); |
200 | 200 | ||
201 | + terminal->activity.timestamp = time(0); | ||
201 | update_keyboard_state(terminal,event,TRUE); | 202 | update_keyboard_state(terminal,event,TRUE); |
202 | 203 | ||
203 | if(gtk_im_context_filter_keypress(terminal->input_method,event)) | 204 | if(gtk_im_context_filter_keypress(terminal->input_method,event)) |
@@ -229,12 +230,14 @@ | @@ -229,12 +230,14 @@ | ||
229 | void v3270_tab(GtkWidget *widget) | 230 | void v3270_tab(GtkWidget *widget) |
230 | { | 231 | { |
231 | g_return_if_fail(GTK_IS_V3270(widget)); | 232 | g_return_if_fail(GTK_IS_V3270(widget)); |
233 | + GTK_V3270(widget)->activity.timestamp = time(0); | ||
232 | lib3270_nextfield(GTK_V3270(widget)->host); | 234 | lib3270_nextfield(GTK_V3270(widget)->host); |
233 | } | 235 | } |
234 | 236 | ||
235 | void v3270_backtab(GtkWidget *widget) | 237 | void v3270_backtab(GtkWidget *widget) |
236 | { | 238 | { |
237 | g_return_if_fail(GTK_IS_V3270(widget)); | 239 | g_return_if_fail(GTK_IS_V3270(widget)); |
240 | + GTK_V3270(widget)->activity.timestamp = time(0); | ||
238 | lib3270_previousfield(GTK_V3270(widget)->host); | 241 | lib3270_previousfield(GTK_V3270(widget)->host); |
239 | } | 242 | } |
240 | 243 | ||
@@ -246,6 +249,7 @@ | @@ -246,6 +249,7 @@ | ||
246 | g_return_if_fail(GTK_IS_V3270(widget)); | 249 | g_return_if_fail(GTK_IS_V3270(widget)); |
247 | 250 | ||
248 | host = GTK_V3270(widget)->host; | 251 | host = GTK_V3270(widget)->host; |
252 | + GTK_V3270(widget)->activity.timestamp = time(0); | ||
249 | 253 | ||
250 | utf = g_convert((char *) str, -1, lib3270_get_display_charset(host), "UTF-8", NULL, NULL, NULL); | 254 | utf = g_convert((char *) str, -1, lib3270_get_display_charset(host), "UTF-8", NULL, NULL, NULL); |
251 | 255 | ||
@@ -264,7 +268,6 @@ | @@ -264,7 +268,6 @@ | ||
264 | if(utf) | 268 | if(utf) |
265 | { | 269 | { |
266 | lib3270_input_string(GTK_V3270(widget)->host, (const unsigned char *) utf); | 270 | lib3270_input_string(GTK_V3270(widget)->host, (const unsigned char *) utf); |
267 | -// lib3270_set_string(GTK_V3270(widget)->host, (const unsigned char *) utf); | ||
268 | g_free(utf); | 271 | g_free(utf); |
269 | } | 272 | } |
270 | else | 273 | else |
src/pw3270/v3270/private.h
@@ -199,6 +199,14 @@ G_BEGIN_DECLS | @@ -199,6 +199,14 @@ G_BEGIN_DECLS | ||
199 | H3270 * host; /**< Related 3270 session */ | 199 | H3270 * host; /**< Related 3270 session */ |
200 | gchar * session_name; /**< Session name (for window title) */ | 200 | gchar * session_name; /**< Session name (for window title) */ |
201 | 201 | ||
202 | + // Auto disconnect | ||
203 | + struct | ||
204 | + { | ||
205 | + time_t timestamp; /**< Last action in this widget */ | ||
206 | + guint disconnect; /**< Time (in minutes) for auto disconnect */ | ||
207 | + GSource * timer; /**< Auto disconnect timer */ | ||
208 | + } activity; | ||
209 | + | ||
202 | // Scripting | 210 | // Scripting |
203 | struct | 211 | struct |
204 | { | 212 | { |
@@ -224,6 +232,7 @@ G_BEGIN_DECLS | @@ -224,6 +232,7 @@ G_BEGIN_DECLS | ||
224 | PROP_SELECTION, | 232 | PROP_SELECTION, |
225 | PROP_MODEL, | 233 | PROP_MODEL, |
226 | PROP_LUNAME, | 234 | PROP_LUNAME, |
235 | + PROP_AUTO_DISCONNECT, | ||
227 | 236 | ||
228 | /* Toggles - always the last one, the real values are PROP_TOGGLE+LIB3270_TOGGLE */ | 237 | /* Toggles - always the last one, the real values are PROP_TOGGLE+LIB3270_TOGGLE */ |
229 | PROP_TOGGLE | 238 | PROP_TOGGLE |
src/pw3270/v3270/properties.c
@@ -53,6 +53,10 @@ | @@ -53,6 +53,10 @@ | ||
53 | lib3270_set_model(window->host,g_value_get_string(value)); | 53 | lib3270_set_model(window->host,g_value_get_string(value)); |
54 | break; | 54 | break; |
55 | 55 | ||
56 | + case PROP_AUTO_DISCONNECT: | ||
57 | + v3270_set_auto_disconnect(GTK_WIDGET(object),g_value_get_int(value)); | ||
58 | + break; | ||
59 | + | ||
56 | default: | 60 | default: |
57 | if(prop_id < (PROP_TOGGLE + LIB3270_TOGGLE_COUNT)) | 61 | if(prop_id < (PROP_TOGGLE + LIB3270_TOGGLE_COUNT)) |
58 | { | 62 | { |
@@ -74,6 +78,10 @@ | @@ -74,6 +78,10 @@ | ||
74 | g_value_set_string(value,lib3270_get_model(window->host)); | 78 | g_value_set_string(value,lib3270_get_model(window->host)); |
75 | break; | 79 | break; |
76 | 80 | ||
81 | + case PROP_AUTO_DISCONNECT: | ||
82 | + g_value_set_int(value,v3270_get_auto_disconnect(GTK_WIDGET(object))); | ||
83 | + break; | ||
84 | + | ||
77 | case PROP_LUNAME: | 85 | case PROP_LUNAME: |
78 | g_value_set_string(value,lib3270_get_luname(window->host)); | 86 | g_value_set_string(value,lib3270_get_luname(window->host)); |
79 | break; | 87 | break; |
@@ -129,6 +137,14 @@ | @@ -129,6 +137,14 @@ | ||
129 | FALSE,G_PARAM_READABLE|G_PARAM_WRITABLE); | 137 | FALSE,G_PARAM_READABLE|G_PARAM_WRITABLE); |
130 | g_object_class_install_property(gobject_class,PROP_LUNAME,v3270_properties[PROP_LUNAME]); | 138 | g_object_class_install_property(gobject_class,PROP_LUNAME,v3270_properties[PROP_LUNAME]); |
131 | 139 | ||
140 | + | ||
141 | + v3270_properties[PROP_AUTO_DISCONNECT] = g_param_spec_string( | ||
142 | + "auto_disconnect", | ||
143 | + "auto_disconnect", | ||
144 | + "Minutes to disconnect when idle", | ||
145 | + FALSE,G_PARAM_READABLE|G_PARAM_WRITABLE); | ||
146 | + g_object_class_install_property(gobject_class,PROP_LUNAME,v3270_properties[PROP_LUNAME]); | ||
147 | + | ||
132 | // Toggle properties | 148 | // Toggle properties |
133 | int f; | 149 | int f; |
134 | 150 | ||
@@ -138,3 +154,15 @@ | @@ -138,3 +154,15 @@ | ||
138 | g_object_class_install_property(gobject_class,PROP_TOGGLE+f,v3270_properties[PROP_TOGGLE+f]); | 154 | g_object_class_install_property(gobject_class,PROP_TOGGLE+f,v3270_properties[PROP_TOGGLE+f]); |
139 | } | 155 | } |
140 | } | 156 | } |
157 | + | ||
158 | + LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes) | ||
159 | + { | ||
160 | + g_return_if_fail(GTK_IS_V3270(widget)); | ||
161 | + GTK_V3270(widget)->activity.disconnect = minutes; | ||
162 | + } | ||
163 | + | ||
164 | + LIB3270_EXPORT guint v3270_get_auto_disconnect(GtkWidget *widget) | ||
165 | + { | ||
166 | + g_return_val_if_fail(GTK_IS_V3270(widget),0); | ||
167 | + return GTK_V3270(widget)->activity.disconnect; | ||
168 | + } |
src/pw3270/v3270/widget.c
@@ -675,8 +675,8 @@ static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value | @@ -675,8 +675,8 @@ static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value | ||
675 | break; | 675 | break; |
676 | 676 | ||
677 | case LIB3270_TOGGLE_INSERT: | 677 | case LIB3270_TOGGLE_INSERT: |
678 | - v3270_draw_ins_status(GTK_WIDGET(session->widget)); | ||
679 | - v3270_cursor_draw(GTK_WIDGET(session->widget)); | 678 | + v3270_draw_ins_status(GTK_V3270(session->widget)); |
679 | + v3270_cursor_draw(GTK_V3270(session->widget)); | ||
680 | break; | 680 | break; |
681 | 681 | ||
682 | case LIB3270_TOGGLE_BOLD: | 682 | case LIB3270_TOGGLE_BOLD: |
@@ -762,6 +762,8 @@ static void update_connect(H3270 *session, unsigned char connected) | @@ -762,6 +762,8 @@ static void update_connect(H3270 *session, unsigned char connected) | ||
762 | g_object_notify(G_OBJECT(widget),"online"); | 762 | g_object_notify(G_OBJECT(widget),"online"); |
763 | #endif // GTK_CHECK_VERSION | 763 | #endif // GTK_CHECK_VERSION |
764 | 764 | ||
765 | + widget->activity.timestamp = time(0); | ||
766 | + | ||
765 | gtk_widget_queue_draw(GTK_WIDGET(widget)); | 767 | gtk_widget_queue_draw(GTK_WIDGET(widget)); |
766 | } | 768 | } |
767 | 769 | ||
@@ -881,6 +883,21 @@ static int emit_print_signal(H3270 *session) | @@ -881,6 +883,21 @@ static int emit_print_signal(H3270 *session) | ||
881 | return 0; | 883 | return 0; |
882 | } | 884 | } |
883 | 885 | ||
886 | +static gboolean activity_tick(v3270 *widget) | ||
887 | +{ | ||
888 | + trace("idle=%d (%d) timeout=%d",time(0) - widget->activity.timestamp,((time(0) - widget->activity.timestamp)/60),widget->activity.disconnect); | ||
889 | + | ||
890 | + if(widget->activity.disconnect && lib3270_is_connected(widget->host) && ((time(0) - widget->activity.timestamp)/60) >= widget->activity.disconnect) | ||
891 | + lib3270_disconnect(widget->host); | ||
892 | + | ||
893 | + return TRUE; | ||
894 | +} | ||
895 | + | ||
896 | +static void release_activity_timer(v3270 *widget) | ||
897 | +{ | ||
898 | + widget->activity.timer = NULL; | ||
899 | +} | ||
900 | + | ||
884 | static void v3270_init(v3270 *widget) | 901 | static void v3270_init(v3270 *widget) |
885 | { | 902 | { |
886 | widget->host = lib3270_session_new(""); | 903 | widget->host = lib3270_session_new(""); |
@@ -917,6 +934,10 @@ static void v3270_init(v3270 *widget) | @@ -917,6 +934,10 @@ static void v3270_init(v3270 *widget) | ||
917 | widget->host->update_ssl = v3270_update_ssl; | 934 | widget->host->update_ssl = v3270_update_ssl; |
918 | widget->host->print = emit_print_signal; | 935 | widget->host->print = emit_print_signal; |
919 | 936 | ||
937 | + // Reset timer | ||
938 | + widget->activity.timestamp = time(0); | ||
939 | + widget->activity.disconnect = 0; | ||
940 | + | ||
920 | // Setup input method | 941 | // Setup input method |
921 | widget->input_method = gtk_im_multicontext_new(); | 942 | widget->input_method = gtk_im_multicontext_new(); |
922 | g_signal_connect(G_OBJECT(widget->input_method),"commit",G_CALLBACK(v3270_key_commit),widget); | 943 | g_signal_connect(G_OBJECT(widget->input_method),"commit",G_CALLBACK(v3270_key_commit),widget); |
@@ -932,6 +953,9 @@ static void v3270_init(v3270 *widget) | @@ -932,6 +953,9 @@ static void v3270_init(v3270 *widget) | ||
932 | gtk_widget_add_events(GTK_WIDGET(widget),GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_MOTION_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_ENTER_NOTIFY_MASK|GDK_SCROLL_MASK); | 953 | gtk_widget_add_events(GTK_WIDGET(widget),GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_MOTION_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_ENTER_NOTIFY_MASK|GDK_SCROLL_MASK); |
933 | gtk_widget_set_has_tooltip(GTK_WIDGET(widget),TRUE); | 954 | gtk_widget_set_has_tooltip(GTK_WIDGET(widget),TRUE); |
934 | 955 | ||
956 | + // Setup auto disconnect timer | ||
957 | + widget->cursor.timer = NULL; | ||
958 | + | ||
935 | trace("%s",__FUNCTION__); | 959 | trace("%s",__FUNCTION__); |
936 | } | 960 | } |
937 | 961 | ||
@@ -1013,6 +1037,13 @@ static void v3270_destroy(GtkObject *widget) | @@ -1013,6 +1037,13 @@ static void v3270_destroy(GtkObject *widget) | ||
1013 | g_source_unref(terminal->cursor.timer); | 1037 | g_source_unref(terminal->cursor.timer); |
1014 | } | 1038 | } |
1015 | 1039 | ||
1040 | + if(terminal->activity.timer) | ||
1041 | + { | ||
1042 | + g_source_destroy(terminal->activity.timer); | ||
1043 | + while(terminal->activity.timer) | ||
1044 | + g_source_unref(terminal->activity.timer); | ||
1045 | + } | ||
1046 | + | ||
1016 | if(terminal->input_method) | 1047 | if(terminal->input_method) |
1017 | { | 1048 | { |
1018 | g_object_unref(terminal->input_method); | 1049 | g_object_unref(terminal->input_method); |
@@ -1049,7 +1080,7 @@ static gboolean timer_tick(v3270 *widget) | @@ -1049,7 +1080,7 @@ static gboolean timer_tick(v3270 *widget) | ||
1049 | return TRUE; | 1080 | return TRUE; |
1050 | } | 1081 | } |
1051 | 1082 | ||
1052 | -static void release_timer(v3270 *widget) | 1083 | +static void release_cursor_timer(v3270 *widget) |
1053 | { | 1084 | { |
1054 | widget->cursor.timer = NULL; | 1085 | widget->cursor.timer = NULL; |
1055 | } | 1086 | } |
@@ -1144,12 +1175,22 @@ static void v3270_realize(GtkWidget * widget) | @@ -1144,12 +1175,22 @@ static void v3270_realize(GtkWidget * widget) | ||
1144 | v3270 *terminal = GTK_V3270(widget); | 1175 | v3270 *terminal = GTK_V3270(widget); |
1145 | 1176 | ||
1146 | terminal->cursor.timer = g_timeout_source_new(500); | 1177 | terminal->cursor.timer = g_timeout_source_new(500); |
1147 | - g_source_set_callback(terminal->cursor.timer,(GSourceFunc) timer_tick, widget, (GDestroyNotify) release_timer); | 1178 | + g_source_set_callback(terminal->cursor.timer,(GSourceFunc) timer_tick, widget, (GDestroyNotify) release_cursor_timer); |
1148 | 1179 | ||
1149 | g_source_attach(terminal->cursor.timer, NULL); | 1180 | g_source_attach(terminal->cursor.timer, NULL); |
1150 | g_source_unref(terminal->cursor.timer); | 1181 | g_source_unref(terminal->cursor.timer); |
1151 | } | 1182 | } |
1152 | 1183 | ||
1184 | + if(!GTK_V3270(widget)->activity.timer) | ||
1185 | + { | ||
1186 | + v3270 *terminal = GTK_V3270(widget); | ||
1187 | + | ||
1188 | + terminal->activity.timer = g_timeout_source_new(10000); | ||
1189 | + g_source_set_callback(terminal->activity.timer,(GSourceFunc) activity_tick, widget, (GDestroyNotify) release_activity_timer); | ||
1190 | + g_source_attach(terminal->activity.timer, NULL); | ||
1191 | + g_source_unref(terminal->activity.timer); | ||
1192 | + } | ||
1193 | + | ||
1153 | } | 1194 | } |
1154 | 1195 | ||
1155 | static void v3270_size_allocate(GtkWidget * widget, GtkAllocation * allocation) | 1196 | static void v3270_size_allocate(GtkWidget * widget, GtkAllocation * allocation) |
@@ -1464,6 +1505,7 @@ static void v3270_activate(GtkWidget *widget) | @@ -1464,6 +1505,7 @@ static void v3270_activate(GtkWidget *widget) | ||
1464 | v3270 * terminal = GTK_V3270(widget); | 1505 | v3270 * terminal = GTK_V3270(widget); |
1465 | 1506 | ||
1466 | trace("%s: %p",__FUNCTION__,terminal); | 1507 | trace("%s: %p",__FUNCTION__,terminal); |
1508 | + terminal->activity.timestamp = time(0); | ||
1467 | 1509 | ||
1468 | if(lib3270_connected(terminal->host)) | 1510 | if(lib3270_connected(terminal->host)) |
1469 | lib3270_enter(terminal->host); | 1511 | lib3270_enter(terminal->host); |