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 163  
164 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 170 // Clipboard
167 171 typedef enum _v3270_select_format
168 172 {
... ...
src/pw3270/main.c
... ... @@ -55,6 +55,7 @@
55 55 static GtkWidget * toplevel = NULL;
56 56 static GtkWidget * trace_window = NULL;
57 57 static unsigned int syscolors = 16;
  58 + static unsigned int timer = 0;
58 59 static const gchar * systype = NULL;
59 60 static const gchar * toggleset = NULL;
60 61 static const gchar * togglereset = NULL;
... ... @@ -408,6 +409,7 @@ int main(int argc, char *argv[])
408 409 { "togglereset", 'R', 0, G_OPTION_ARG_STRING, &togglereset, N_( "Set toggles OFF" ), NULL },
409 410 { "charset", 'C', 0, G_OPTION_ARG_STRING, &charset, N_( "Set host charset" ), NULL },
410 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 414 #if defined( HAVE_SYSLOG )
413 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 564 if(model)
563 565 lib3270_set_model(pw3270_get_session(toplevel),model);
564 566  
  567 + v3270_set_auto_disconnect(pw3270_get_terminal_widget(toplevel),timer);
  568 +
565 569 pw3270_start_plugins(toplevel);
566 570 gtk_window_present(GTK_WINDOW(toplevel));
567 571  
... ...
src/pw3270/v3270/keyboard.c
... ... @@ -198,6 +198,7 @@
198 198 {
199 199 v3270 * terminal = GTK_V3270(widget);
200 200  
  201 + terminal->activity.timestamp = time(0);
201 202 update_keyboard_state(terminal,event,TRUE);
202 203  
203 204 if(gtk_im_context_filter_keypress(terminal->input_method,event))
... ... @@ -229,12 +230,14 @@
229 230 void v3270_tab(GtkWidget *widget)
230 231 {
231 232 g_return_if_fail(GTK_IS_V3270(widget));
  233 + GTK_V3270(widget)->activity.timestamp = time(0);
232 234 lib3270_nextfield(GTK_V3270(widget)->host);
233 235 }
234 236  
235 237 void v3270_backtab(GtkWidget *widget)
236 238 {
237 239 g_return_if_fail(GTK_IS_V3270(widget));
  240 + GTK_V3270(widget)->activity.timestamp = time(0);
238 241 lib3270_previousfield(GTK_V3270(widget)->host);
239 242 }
240 243  
... ... @@ -246,6 +249,7 @@
246 249 g_return_if_fail(GTK_IS_V3270(widget));
247 250  
248 251 host = GTK_V3270(widget)->host;
  252 + GTK_V3270(widget)->activity.timestamp = time(0);
249 253  
250 254 utf = g_convert((char *) str, -1, lib3270_get_display_charset(host), "UTF-8", NULL, NULL, NULL);
251 255  
... ... @@ -264,7 +268,6 @@
264 268 if(utf)
265 269 {
266 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 271 g_free(utf);
269 272 }
270 273 else
... ...
src/pw3270/v3270/private.h
... ... @@ -199,6 +199,14 @@ G_BEGIN_DECLS
199 199 H3270 * host; /**< Related 3270 session */
200 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 210 // Scripting
203 211 struct
204 212 {
... ... @@ -224,6 +232,7 @@ G_BEGIN_DECLS
224 232 PROP_SELECTION,
225 233 PROP_MODEL,
226 234 PROP_LUNAME,
  235 + PROP_AUTO_DISCONNECT,
227 236  
228 237 /* Toggles - always the last one, the real values are PROP_TOGGLE+LIB3270_TOGGLE */
229 238 PROP_TOGGLE
... ...
src/pw3270/v3270/properties.c
... ... @@ -53,6 +53,10 @@
53 53 lib3270_set_model(window->host,g_value_get_string(value));
54 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 60 default:
57 61 if(prop_id < (PROP_TOGGLE + LIB3270_TOGGLE_COUNT))
58 62 {
... ... @@ -74,6 +78,10 @@
74 78 g_value_set_string(value,lib3270_get_model(window->host));
75 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 85 case PROP_LUNAME:
78 86 g_value_set_string(value,lib3270_get_luname(window->host));
79 87 break;
... ... @@ -129,6 +137,14 @@
129 137 FALSE,G_PARAM_READABLE|G_PARAM_WRITABLE);
130 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 148 // Toggle properties
133 149 int f;
134 150  
... ... @@ -138,3 +154,15 @@
138 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 675 break;
676 676  
677 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 680 break;
681 681  
682 682 case LIB3270_TOGGLE_BOLD:
... ... @@ -762,6 +762,8 @@ static void update_connect(H3270 *session, unsigned char connected)
762 762 g_object_notify(G_OBJECT(widget),"online");
763 763 #endif // GTK_CHECK_VERSION
764 764  
  765 + widget->activity.timestamp = time(0);
  766 +
765 767 gtk_widget_queue_draw(GTK_WIDGET(widget));
766 768 }
767 769  
... ... @@ -881,6 +883,21 @@ static int emit_print_signal(H3270 *session)
881 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 901 static void v3270_init(v3270 *widget)
885 902 {
886 903 widget->host = lib3270_session_new("");
... ... @@ -917,6 +934,10 @@ static void v3270_init(v3270 *widget)
917 934 widget->host->update_ssl = v3270_update_ssl;
918 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 941 // Setup input method
921 942 widget->input_method = gtk_im_multicontext_new();
922 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 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 954 gtk_widget_set_has_tooltip(GTK_WIDGET(widget),TRUE);
934 955  
  956 + // Setup auto disconnect timer
  957 + widget->cursor.timer = NULL;
  958 +
935 959 trace("%s",__FUNCTION__);
936 960 }
937 961  
... ... @@ -1013,6 +1037,13 @@ static void v3270_destroy(GtkObject *widget)
1013 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 1047 if(terminal->input_method)
1017 1048 {
1018 1049 g_object_unref(terminal->input_method);
... ... @@ -1049,7 +1080,7 @@ static gboolean timer_tick(v3270 *widget)
1049 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 1085 widget->cursor.timer = NULL;
1055 1086 }
... ... @@ -1144,12 +1175,22 @@ static void v3270_realize(GtkWidget * widget)
1144 1175 v3270 *terminal = GTK_V3270(widget);
1145 1176  
1146 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 1180 g_source_attach(terminal->cursor.timer, NULL);
1150 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 1196 static void v3270_size_allocate(GtkWidget * widget, GtkAllocation * allocation)
... ... @@ -1464,6 +1505,7 @@ static void v3270_activate(GtkWidget *widget)
1464 1505 v3270 * terminal = GTK_V3270(widget);
1465 1506  
1466 1507 trace("%s: %p",__FUNCTION__,terminal);
  1508 + terminal->activity.timestamp = time(0);
1467 1509  
1468 1510 if(lib3270_connected(terminal->host))
1469 1511 lib3270_enter(terminal->host);
... ...