Commit 30b68cb166ceb88d602eb2f943f811da32cf825c

Authored by perry.werneck@gmail.com
1 parent 4c176b46

Implementando indicador de insert, otimizando toggles

src/gtk/v3270/oia.c
... ... @@ -421,7 +421,22 @@ static void draw_status_message(cairo_t *cr, LIB3270_MESSAGE id, struct v3270_me
421 421 cairo_show_text(cr,gettext(msg));
422 422 }
423 423  
424   -// trace("%s ends",__FUNCTION__);
  424 +}
  425 +
  426 +static void draw_insert(cairo_t *cr, H3270 *host, GdkColor *color, GdkRectangle *rect)
  427 +{
  428 + if(lib3270_get_toggle(host,LIB3270_TOGGLE_INSERT))
  429 + {
  430 + double y = rect->y+(rect->height-2);
  431 +
  432 + gdk_cairo_set_source_color(cr,color+V3270_COLOR_OIA_FOREGROUND);
  433 +
  434 + cairo_move_to(cr,rect->x,y);
  435 + cairo_rel_line_to(cr,rect->width/2,-(rect->height/1.7));
  436 + cairo_line_to(cr,rect->x+rect->width,y);
  437 + cairo_stroke(cr);
  438 + }
  439 +
425 440 }
426 441  
427 442 void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v3270_metrics *metrics, GdkColor *color, GdkRectangle *rect)
... ... @@ -446,8 +461,6 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v3270_me
446 461 { V3270_OIA_SSL, setup_double_char_position },
447 462 };
448 463  
449   -// static const V3270_OIA_FIELD left[] = { V3270_OIA_UNDERA, V3270_OIA_CONNECTION };
450   -
451 464 int f;
452 465 int rCol = metrics->left+(cols*metrics->width);
453 466 int lCol = metrics->left+1;
... ... @@ -514,8 +527,6 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v3270_me
514 527  
515 528 memset(rect+V3270_OIA_MESSAGE,0,sizeof(GdkRectangle));
516 529  
517   -// trace("%s lcol=%d rcol=%d",__FUNCTION__,lCol,rCol);
518   -
519 530 if(lCol < rCol)
520 531 {
521 532 GdkRectangle *r = rect+V3270_OIA_MESSAGE;
... ... @@ -529,6 +540,10 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v3270_me
529 540 cairo_save(cr);
530 541 v3270_draw_ssl_status(cr,host,metrics,color,rect+V3270_OIA_SSL);
531 542 cairo_restore(cr);
  543 +
  544 + cairo_save(cr);
  545 + draw_insert(cr,host,color,rect+V3270_OIA_INSERT);
  546 + cairo_restore(cr);
532 547 }
533 548  
534 549 /**
... ... @@ -810,6 +825,23 @@ void v3270_draw_alt_status(v3270 *terminal)
810 825 update_text_field(terminal,terminal->keyflags & KEY_FLAG_ALT,V3270_OIA_ALT,"A");
811 826 }
812 827  
  828 +void v3270_draw_ins_status(v3270 *terminal)
  829 +{
  830 + GdkRectangle *r;
  831 + cairo_t *cr;
  832 +
  833 + if(!terminal->surface)
  834 + return;
  835 +
  836 + cr = set_update_region(terminal,&r,V3270_OIA_INSERT);
  837 +
  838 + draw_insert(cr,terminal->host,terminal->color,r);
  839 +
  840 + cairo_destroy(cr);
  841 + gtk_widget_queue_draw_area(GTK_WIDGET(terminal),r->x,r->y,r->width,r->height);
  842 +
  843 +}
  844 +
813 845 static gboolean update_timer(struct timer_info *info)
814 846 {
815 847 cairo_t * cr;
... ...
src/gtk/v3270/private.h
... ... @@ -96,6 +96,7 @@ void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v327
96 96  
97 97 void v3270_draw_shift_status(v3270 *terminal);
98 98 void v3270_draw_alt_status(v3270 *terminal);
  99 +void v3270_draw_ins_status(v3270 *terminal);
99 100  
100 101 void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned short attr);
101 102  
... ...
src/gtk/v3270/widget.c
... ... @@ -111,6 +111,7 @@ static void v3270_toggle_changed(v3270 *widget,LIB3270_TOGGLE toggle_id, gboolea
111 111 break;
112 112  
113 113 case LIB3270_TOGGLE_INSERT:
  114 + v3270_draw_ins_status(widget);
114 115 v3270_cursor_draw(widget);
115 116 break;
116 117  
... ...
src/include/lib3270.h
... ... @@ -294,17 +294,6 @@
294 294 LIB3270_EXPORT void lib3270_register_schange(H3270 *h,LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data);
295 295  
296 296 /**
297   - * Register a toggle change callback.
298   - *
299   - * @param h Session handle.
300   - * @param ix Toggle id
301   - * @param func Function to call when toggle changes.
302   - *
303   - * @return 0 if ok, EINVAL if the toggle id is invalid.
304   - */
305   - LIB3270_EXPORT int lib3270_register_tchange(H3270 *h, LIB3270_TOGGLE ix, void (*func)(H3270 *h, int, LIB3270_TOGGLE_TYPE reason));
306   -
307   - /**
308 297 * Network connect operation, keep main loop running
309 298 *
310 299 * Sets 'reconnect_host', 'current_host' and 'full_current_host' as
... ... @@ -431,10 +420,8 @@
431 420 * @param ix Toggle id.
432 421 * @param value New toggle state (non zero for true).
433 422 *
434   - * @return 0 if the toggle wasn't changed, non zero if it was changed.
435   - *
436 423 */
437   - LIB3270_EXPORT int lib3270_set_toggle(H3270 *h, LIB3270_TOGGLE ix, int value);
  424 + LIB3270_EXPORT void lib3270_set_toggle(H3270 *h, LIB3270_TOGGLE ix, int value);
438 425  
439 426 /**
440 427 * Translate a string toggle name to the corresponding value.
... ...
src/lib3270/appres.h
... ... @@ -30,13 +30,12 @@ struct toggle {
30 30 // Widget w[2]; /* the menu item widgets */
31 31 // const char *label[2]; /* labels */
32 32 void (*upcall)(H3270 *, struct toggle *, LIB3270_TOGGLE_TYPE); /* change value */
33   - void (*callback)(H3270 *, int, LIB3270_TOGGLE_TYPE);
  33 +// void (*callback)(H3270 *, int, LIB3270_TOGGLE_TYPE);
34 34  
35 35 };
36 36  
37 37 #define toggled(ix) (appres.toggle[ix].value)
38   -#define toggle_toggle(t) \
39   - { (t)->value = !(t)->value; }
  38 +// #define toggle_toggle(t) { (t)->value = !(t)->value; }
40 39  
41 40 /* Application resources */
42 41  
... ...
src/lib3270/kybd.c
... ... @@ -18,7 +18,7 @@
18 18 * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
19 19 * Place, Suite 330, Boston, MA, 02111-1307, USA
20 20 *
21   - * Este programa está nomeado como kybd.c e possui 4414 linhas de código.
  21 + * Este programa está nomeado como kybd.c e possui - linhas de código.
22 22 *
23 23 * Contatos:
24 24 *
... ... @@ -98,8 +98,7 @@ static unsigned char pa_xlate[] = {
98 98 static unsigned long unlock_id;
99 99 static time_t unlock_delay_time;
100 100 #define UNLOCK_MS 350 /* 0.35s after last unlock */
101   -static Boolean key_Character(int code, Boolean with_ge, Boolean pasting,
102   - Boolean *skipped);
  101 +static Boolean key_Character(int code, Boolean with_ge, Boolean pasting,Boolean *skipped);
103 102 static Boolean flush_ta(void);
104 103 static void key_AID(unsigned char aid_code);
105 104 static void kybdlock_set(unsigned int bits, const char *cause);
... ... @@ -527,10 +526,11 @@ key_AID(unsigned char aid_code)
527 526 /* Act as if the host had written our input. */
528 527 h3270.buffer_addr = h3270.cursor_addr;
529 528 }
530   - if (!IN_SSCP || aid_code != AID_CLEAR) {
  529 + if (!IN_SSCP || aid_code != AID_CLEAR)
  530 + {
531 531 status_twait(&h3270);
532 532 mcursor_waiting(&h3270);
533   - set_toggle(INSERT,0);
  533 + lib3270_set_toggle(&h3270,LIB3270_TOGGLE_INSERT,0);
534 534 kybdlock_set(KL_OIA_TWAIT | KL_OIA_LOCKED, "key_AID");
535 535 }
536 536 aid = aid_code;
... ... @@ -745,15 +745,12 @@ key_Character_wrapper(Widget w unused, XEvent *event unused, String *params,
745 745 * Handle an ordinary displayable character key. Lots of stuff to handle
746 746 * insert-mode, protected fields and etc.
747 747 */
748   -static Boolean
749   -key_Character(int code, Boolean with_ge, Boolean pasting, Boolean *skipped)
  748 +static Boolean key_Character(int code, Boolean with_ge, Boolean pasting, Boolean *skipped)
750 749 {
751 750 register int baddr, faddr, xaddr;
752 751 register unsigned char fa;
753 752 enum dbcs_why why;
754 753  
755   -// reset_idle_timer();
756   -
757 754 if (skipped != NULL)
758 755 *skipped = False;
759 756  
... ... @@ -798,7 +795,7 @@ key_Character(int code, Boolean with_ge, Boolean pasting, Boolean *skipped)
798 795 /* Add the character. */
799 796 if (h3270.ea_buf[baddr].cc == EBC_so) {
800 797  
801   - if (toggled(INSERT)) {
  798 + if (toggled(LIB3270_TOGGLE_INSERT)) {
802 799 if (!ins_prep(faddr, baddr, 1))
803 800 return False;
804 801 } else {
... ... @@ -835,7 +832,7 @@ key_Character(int code, Boolean with_ge, Boolean pasting, Boolean *skipped)
835 832 /* fall through... */
836 833 case DBCS_LEFT:
837 834 if (why == DBCS_ATTRIBUTE) {
838   - if (toggled(INSERT)) {
  835 + if (toggled(LIB3270_TOGGLE_INSERT)) {
839 836 if (!ins_prep(faddr, baddr, 1))
840 837 return False;
841 838 } else {
... ... @@ -852,7 +849,7 @@ key_Character(int code, Boolean with_ge, Boolean pasting, Boolean *skipped)
852 849 } else {
853 850 Boolean was_si;
854 851  
855   - if (toggled(INSERT)) {
  852 + if (toggled(LIB3270_TOGGLE_INSERT)) {
856 853 /*
857 854 * Inserting SBCS into a DBCS subfield.
858 855 * If this is the first position, we
... ... @@ -909,7 +906,7 @@ key_Character(int code, Boolean with_ge, Boolean pasting, Boolean *skipped)
909 906 break;
910 907 default:
911 908 case DBCS_NONE:
912   - if (toggled(INSERT) && !ins_prep(faddr, baddr, 1))
  909 + if (toggled(LIB3270_TOGGLE_INSERT) && !ins_prep(faddr, baddr, 1))
913 910 return False;
914 911 break;
915 912 }
... ... @@ -1292,73 +1289,28 @@ retry:
1292 1289 */
1293 1290 void key_ACharacter(unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped)
1294 1291 {
1295   -// register int i;
1296   -// struct akeysym ak;
1297   -
1298   -// reset_idle_timer();
1299   -
1300 1292 if (skipped != NULL)
1301 1293 *skipped = False;
1302 1294  
1303   -// ak.keysym = c;
1304   -// ak.keytype = keytype;
  1295 + trace_event(" %s -> Key(\"%s\")\n",ia_name[(int) cause], ctl_see((int) c));
1305 1296  
1306   -/*
1307   - switch (composing) {
1308   - case NONE:
1309   - break;
1310   - case COMPOSE:
1311   - for (i = 0; i < n_composites; i++)
1312   - if (ak_eq(composites[i].k1, ak) ||
1313   - ak_eq(composites[i].k2, ak))
1314   - break;
1315   - if (i < n_composites) {
1316   - cc_first.keysym = c;
1317   - cc_first.keytype = keytype;
1318   - composing = FIRST;
1319   - status_compose(True, c, keytype);
1320   - } else {
1321   - lib3270_ring_bell();
1322   - composing = NONE;
1323   - status_compose(False, 0, KT_STD);
1324   - }
1325   - return;
1326   - case FIRST:
1327   - composing = NONE;
1328   - status_compose(False, 0, KT_STD);
1329   - for (i = 0; i < n_composites; i++)
1330   - if ((ak_eq(composites[i].k1, cc_first) &&
1331   - ak_eq(composites[i].k2, ak)) ||
1332   - (ak_eq(composites[i].k1, ak) &&
1333   - ak_eq(composites[i].k2, cc_first)))
1334   - break;
1335   - if (i < n_composites) {
1336   - c = composites[i].translation.keysym;
1337   - keytype = composites[i].translation.keytype;
1338   - } else {
1339   - lib3270_ring_bell();
1340   - return;
1341   - }
1342   - break;
1343   - }
1344   -*/
1345   -
1346   - trace_event(" %s -> Key(\"%s\")\n",
1347   - ia_name[(int) cause], ctl_see((int) c));
1348   - if (IN_3270) {
1349   - if (c < ' ') {
  1297 + if (IN_3270)
  1298 + {
  1299 + if (c < ' ')
  1300 + {
1350 1301 trace_event(" dropped (control char)\n");
1351 1302 return;
1352 1303 }
1353   - (void) key_Character((int) asc2ebc[c], keytype == KT_GE, False,
1354   - skipped);
  1304 + (void) key_Character((int) asc2ebc[c], keytype == KT_GE, False, skipped);
1355 1305 }
1356 1306 #if defined(X3270_ANSI) /*[*/
1357   - else if (IN_ANSI) {
  1307 + else if (IN_ANSI)
  1308 + {
1358 1309 net_sendc((char) c);
1359 1310 }
1360 1311 #endif /*]*/
1361   - else {
  1312 + else
  1313 + {
1362 1314 trace_event(" dropped (not connected)\n");
1363 1315 }
1364 1316 }
... ... @@ -1533,7 +1485,7 @@ do_reset(Boolean explicit)
1533 1485 }
1534 1486  
1535 1487 /* Always clear insert mode. */
1536   - set_toggle(INSERT,0);
  1488 + lib3270_set_toggle(&h3270,LIB3270_TOGGLE_INSERT,0);
1537 1489  
1538 1490 /* Otherwise, if not connect, reset is a no-op. */
1539 1491 if (!CONNECTED)
... ...
src/lib3270/paste.c
... ... @@ -133,14 +133,14 @@
133 133 return -1;
134 134 }
135 135  
136   - static int paste_char(PASTE_DATA *data, unsigned char c)
  136 + static int paste_char(H3270 *session, PASTE_DATA *data, unsigned char c)
137 137 {
138 138  
139 139 if(toggled(SMART_PASTE))
140 140 {
141   - int faddr = find_field_attribute(&h3270,h3270.cursor_addr);
142   - if(FA_IS_PROTECTED(h3270.ea_buf[faddr].fa))
143   - h3270.cursor_addr++;
  141 + int faddr = find_field_attribute(session,session->cursor_addr);
  142 + if(FA_IS_PROTECTED(session->ea_buf[faddr].fa))
  143 + session->cursor_addr++;
144 144 else
145 145 key_ACharacter(c, KT_STD, IA_PASTE, NULL);
146 146 }
... ... @@ -197,7 +197,7 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str)
197 197 switch(*str)
198 198 {
199 199 case '\t':
200   - last = paste_char(&data, ' ');
  200 + last = paste_char(h,&data, ' ');
201 201 break;
202 202  
203 203 case '\n':
... ... @@ -218,7 +218,7 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str)
218 218 break;
219 219  
220 220 default:
221   - last = paste_char(&data, *str);
  221 + last = paste_char(h,&data, *str);
222 222  
223 223 }
224 224 str++;
... ...
src/lib3270/toggle.h
... ... @@ -59,14 +59,14 @@
59 59 #define AID_WAIT LIB3270_TOGGLE_AID_WAIT
60 60 #define FULL_SCREEN LIB3270_TOGGLE_FULL_SCREEN
61 61 #define RECONNECT LIB3270_TOGGLE_RECONNECT
62   - #define INSERT LIB3270_TOGGLE_INSERT
  62 +// #define INSERT LIB3270_TOGGLE_INSERT
63 63 #define KEYPAD LIB3270_TOGGLE_KEYPAD
64 64 #define SMART_PASTE LIB3270_TOGGLE_SMART_PASTE
65 65 #define N_TOGGLES LIB3270_TOGGLE_COUNT
66 66  
67 67 #define LIB3270_TOGGLE_ID LIB3270_TOGGLE
68 68  
69   - #define register_3270_toggle_monitor(ix,callback) lib3270_register_tchange(NULL,ix,callback)
  69 +// #define register_3270_toggle_monitor(ix,callback) lib3270_register_tchange(NULL,ix,callback)
70 70 #define get_3270_toggle_by_name(x) lib3270_get_toggle_id(x)
71 71  
72 72 // Compatibility macros
... ... @@ -75,7 +75,7 @@
75 75  
76 76 #define get_3270_toggle_name(ix) lib3270_get_toggle_name(ix)
77 77 #define get_toggle_name(ix) lib3270_get_toggle_name(ix)
78   - #define set_toggle(ix,value) lib3270_set_toggle(NULL,ix,value)
  78 +// #define set_toggle(ix,value) lib3270_set_toggle(NULL,ix,value)
79 79 #define get_toggle_by_name(name) lib3270_get_toggle_id(name)
80 80  
81 81 #endif /* TOGGLE3270_H_INCLUDED */
... ...
src/lib3270/toggles.c
... ... @@ -79,6 +79,7 @@ static const char *toggle_names[LIB3270_TOGGLE_COUNT] =
79 79 };
80 80  
81 81  
  82 +/*
82 83 static void no_callback(H3270 *h, int value, LIB3270_TOGGLE_TYPE reason)
83 84 {
84 85 }
... ... @@ -106,6 +107,7 @@ LIB3270_EXPORT int lib3270_register_tchange(H3270 *h, LIB3270_TOGGLE_ID ix, void
106 107  
107 108 return 0;
108 109 }
  110 +*/
109 111  
110 112 LIB3270_EXPORT unsigned char lib3270_get_toggle(H3270 *session, LIB3270_TOGGLE ix)
111 113 {
... ... @@ -117,54 +119,46 @@ LIB3270_EXPORT unsigned char lib3270_get_toggle(H3270 *session, LIB3270_TOGGLE i
117 119 }
118 120  
119 121 /*
120   - * Generic toggle stuff
  122 + * Call the internal update routine
121 123 */
122   -static void do_toggle_reason(H3270 *session, LIB3270_TOGGLE ix, LIB3270_TOGGLE_TYPE reason)
  124 +static void toggle_notify(H3270 *session, struct toggle *t, LIB3270_TOGGLE ix)
123 125 {
124   - struct toggle *t = &appres.toggle[ix];
125   -
126   - /*
127   - * Change the value, call the internal update routine, and reset the
128   - * menu label(s).
129   - */
130   - toggle_toggle(t);
131   - t->upcall(session, t, reason);
132   - t->callback(session,t->value, (int) reason);
  126 + t->upcall(session, t, TT_INTERACTIVE);
  127 +// t->callback(session,t->value, (int) TT_INTERACTIVE);
133 128  
134 129 if(session->update_toggle)
135   - session->update_toggle(session,ix,t->value,reason,toggle_names[ix]);
  130 + session->update_toggle(session,ix,t->value,TT_INTERACTIVE,toggle_names[ix]);
136 131  
137 132 }
138 133  
139   -LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value)
  134 +LIB3270_EXPORT void lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value)
140 135 {
141   - Boolean v = ((Boolean) (value != 0)); // Convert int in Boolean
142   -
143 136 struct toggle *t;
144 137  
145 138 CHECK_SESSION_HANDLE(session);
146 139  
147 140 if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT)
148   - return 0;
  141 + return;
149 142  
150 143 t = &appres.toggle[ix];
  144 + t->value = (value != 0);
151 145  
152   - if(t->value == v)
153   - return 0;
154   -
155   - do_toggle_reason(session, ix, TT_INTERACTIVE);
156   -
157   - return -1;
  146 + toggle_notify(session,t,ix);
158 147 }
159 148  
160 149 LIB3270_EXPORT int lib3270_toggle(H3270 *session, LIB3270_TOGGLE ix)
161 150 {
  151 + struct toggle *t;
  152 +
162 153 CHECK_SESSION_HANDLE(session);
163 154  
164 155 if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT)
165   - return EINVAL;
  156 + return;
  157 +
  158 + t = &appres.toggle[ix];
166 159  
167   - do_toggle_reason(session, ix, TT_INTERACTIVE);
  160 + t->value = !t->value;
  161 + toggle_notify(session,t,ix);
168 162  
169 163 return 0;
170 164 }
... ... @@ -183,7 +177,7 @@ void initialize_toggles(H3270 *session, struct toggle *toggle)
183 177  
184 178 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
185 179 {
186   - toggle[f].callback = no_callback;
  180 +// toggle[f].callback = no_callback;
187 181 toggle[f].upcall = toggle_nop;
188 182 }
189 183  
... ...