Commit a73ec3ca04c81076c1c63e58e641e449a9efebca

Authored by perry.werneck@gmail.com
1 parent 925b3ce9

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
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);