Commit 36c13ad1bb57294710776a73cfeca3bdcee2aa64

Authored by Perry Werneck
1 parent 5f3b9cfb

Activating auto-connect when the corresponding toggle is set and the

session is offline.
src/core/toggles/init.c
@@ -59,13 +59,13 @@ @@ -59,13 +59,13 @@
59 59
60 /*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ 60 /*---[ Implement ]------------------------------------------------------------------------------------------------------------*/
61 61
62 -static void toggle_altscreen(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) 62 +static void toggle_altscreen(H3270 *session, const struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt))
63 { 63 {
64 if(!session->screen_alt) 64 if(!session->screen_alt)
65 set_viewsize(session,t->value ? 24 : session->max.rows,80); 65 set_viewsize(session,t->value ? 24 : session->max.rows,80);
66 } 66 }
67 67
68 -static void toggle_redraw(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) 68 +static void toggle_redraw(H3270 *session, const struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt))
69 { 69 {
70 session->cbk.display(session); 70 session->cbk.display(session);
71 } 71 }
@@ -73,11 +73,11 @@ static void toggle_redraw(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), @@ -73,11 +73,11 @@ static void toggle_redraw(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t),
73 /** 73 /**
74 * @brief No-op toggle. 74 * @brief No-op toggle.
75 */ 75 */
76 -static void toggle_nop(H3270 GNUC_UNUSED(*session), struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) 76 +static void toggle_nop(H3270 GNUC_UNUSED(*session), const struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt))
77 { 77 {
78 } 78 }
79 79
80 -static void toggle_keepalive(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) 80 +static void toggle_keepalive(H3270 *session, const struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt))
81 { 81 {
82 if(session->connection.sock > 0) 82 if(session->connection.sock > 0)
83 { 83 {
@@ -96,21 +96,65 @@ static void toggle_keepalive(H3270 *session, struct lib3270_toggle GNUC_UNUSED(* @@ -96,21 +96,65 @@ static void toggle_keepalive(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*
96 } 96 }
97 } 97 }
98 98
  99 +static void toggle_connect(H3270 *hSession, const struct lib3270_toggle *toggle, LIB3270_TOGGLE_TYPE tt)
  100 +{
  101 + if(tt != LIB3270_TOGGLE_TYPE_INITIAL && lib3270_is_disconnected(hSession) && !hSession->popups && toggle->value)
  102 + {
  103 + if(lib3270_reconnect(hSession,0))
  104 + lib3270_write_log(hSession,"3270","Auto-connect fails: %s",strerror(errno));
  105 + }
  106 +
  107 +}
  108 +
99 /** 109 /**
100 * @brief Called from system initialization code to handle initial toggle settings. 110 * @brief Called from system initialization code to handle initial toggle settings.
101 */ 111 */
102 void initialize_toggles(H3270 *session) 112 void initialize_toggles(H3270 *session)
103 { 113 {
104 - int f; 114 + static const struct _upcalls
  115 + {
  116 + LIB3270_TOGGLE_ID id;
  117 + void (*upcall)(H3270 *session, const struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt);
  118 + }
  119 + upcalls[] =
  120 + {
  121 + {
  122 + LIB3270_TOGGLE_RECTANGLE_SELECT,
  123 + toggle_rectselect
  124 +
  125 + },
  126 + {
  127 + LIB3270_TOGGLE_MONOCASE,
  128 + toggle_redraw
  129 + },
  130 + {
  131 + LIB3270_TOGGLE_UNDERLINE,
  132 + toggle_redraw
  133 +
  134 + },
  135 + {
  136 + LIB3270_TOGGLE_ALTSCREEN,
  137 + toggle_altscreen
  138 +
  139 + },
  140 + {
  141 + LIB3270_TOGGLE_KEEP_ALIVE,
  142 + toggle_keepalive
  143 + },
  144 + {
  145 + LIB3270_TOGGLE_CONNECT_ON_STARTUP,
  146 + toggle_connect
  147 + }
  148 +
  149 + };
  150 +
  151 + unsigned int f;
105 152
106 for(f=0;f<LIB3270_TOGGLE_COUNT;f++) 153 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
107 session->toggle[f].upcall = toggle_nop; 154 session->toggle[f].upcall = toggle_nop;
108 155
109 - session->toggle[LIB3270_TOGGLE_RECTANGLE_SELECT].upcall = toggle_rectselect;  
110 - session->toggle[LIB3270_TOGGLE_MONOCASE].upcall = toggle_redraw;  
111 - session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw;  
112 - session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen;  
113 - session->toggle[LIB3270_TOGGLE_KEEP_ALIVE].upcall = toggle_keepalive; 156 + for(f=0;f<(sizeof(upcalls)/sizeof(upcalls[0]));f++)
  157 + session->toggle[upcalls[f].id].upcall = upcalls[f].upcall;
114 158
115 for(f=0;f<LIB3270_TOGGLE_COUNT;f++) 159 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
116 { 160 {
src/include/internals.h
@@ -383,8 +383,8 @@ struct _h3270 @@ -383,8 +383,8 @@ struct _h3270
383 383
384 struct lib3270_toggle 384 struct lib3270_toggle
385 { 385 {
386 - char value; /**< toggle value */  
387 - void (*upcall)(H3270 *, struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); /**< change value */ 386 + char value; /**< toggle value */
  387 + void (*upcall)(H3270 *, const struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); /**< change value */
388 } toggle[LIB3270_TOGGLE_COUNT]; 388 } toggle[LIB3270_TOGGLE_COUNT];
389 389
390 // Network & Termtype 390 // Network & Termtype
@@ -756,7 +756,7 @@ LIB3270_INTERNAL int use_syslog; @@ -756,7 +756,7 @@ LIB3270_INTERNAL int use_syslog;
756 LIB3270_INTERNAL int key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); 756 LIB3270_INTERNAL int key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped);
757 LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); 757 LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr);
758 758
759 -LIB3270_INTERNAL void toggle_rectselect(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt); 759 +LIB3270_INTERNAL void toggle_rectselect(H3270 *session, const struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt);
760 LIB3270_INTERNAL void remove_input_calls(H3270 *session); 760 LIB3270_INTERNAL void remove_input_calls(H3270 *session);
761 761
762 LIB3270_INTERNAL int lib3270_sock_send(H3270 *hSession, unsigned const char *buf, int len); 762 LIB3270_INTERNAL int lib3270_sock_send(H3270 *hSession, unsigned const char *buf, int len);
src/selection/selection.c
@@ -154,7 +154,7 @@ static void update_selected_region(H3270 *session) @@ -154,7 +154,7 @@ static void update_selected_region(H3270 *session)
154 154
155 } 155 }
156 156
157 -void toggle_rectselect(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) 157 +void toggle_rectselect(H3270 *session, const struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt))
158 { 158 {
159 if(!session->selected) 159 if(!session->selected)
160 return; 160 return;