Commit 757cb72fd488760b57a38d17d104defeb8e43aab

Authored by perry.werneck@gmail.com
1 parent 1c28a0e5

Incluindo acerto dos cantos da area de selecao pelo mouse

src/gtk/v3270/mouse.c
... ... @@ -180,7 +180,7 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event)
180 180 else if(terminal->moving)
181 181 {
182 182 // Move selected area
183   - terminal->selection_addr = lib3270_move_selected_area(terminal->host,terminal->selection_addr,baddr);
  183 + terminal->selection_addr = lib3270_drag_selection(terminal->host,terminal->pointer,terminal->selection_addr,baddr);
184 184 }
185 185 else if(terminal->pointer_id == LIB3270_CURSOR_NORMAL)
186 186 {
... ... @@ -190,41 +190,41 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event)
190 190 GdkWindow *window = gtk_widget_get_window(widget);
191 191 trace("Pointer changes to %04x",new_pointer);
192 192  
193   - switch(new_pointer & 0x1F)
  193 + switch(new_pointer & 0x0F)
194 194 {
195 195 case 0x00:
196 196 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_NORMAL]);
197 197 break;
198 198  
199   - case 0x05:
  199 + case 0x02:
200 200 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_TOP]);
201 201 break;
202 202  
203   - case 0x0d:
  203 + case 0x06:
204 204 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_TOP_RIGHT]);
205 205 break;
206 206  
207   - case 0x09:
  207 + case 0x04:
208 208 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_RIGHT]);
209 209 break;
210 210  
211   - case 0x03:
  211 + case 0x01:
212 212 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_LEFT]);
213 213 break;
214 214  
215   - case 0x13:
  215 + case 0x09:
216 216 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_BOTTOM_LEFT]);
217 217 break;
218 218  
219   - case 0x11:
  219 + case 0x08:
220 220 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_BOTTOM]);
221 221 break;
222 222  
223   - case 0x19:
  223 + case 0x0c:
224 224 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_BOTTOM_RIGHT]);
225 225 break;
226 226  
227   - case 0x07:
  227 + case 0x03:
228 228 gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_TOP_LEFT]);
229 229 break;
230 230  
... ...
src/include/lib3270/selection.h
... ... @@ -86,6 +86,21 @@
86 86 LIB3270_EXPORT int lib3270_move_selected_area(H3270 *h, int from, int to);
87 87  
88 88 /**
  89 + * Drag selected region.
  90 + *
  91 + * Move or resize selected box according to the selection flags.
  92 + *
  93 + * @param h Session handle.
  94 + * @param flag Selection flag.
  95 + * @param origin Reference position (got from mouse button down or other move action).
  96 + * @param baddr New position.
  97 + *
  98 + * @return The new reference position.
  99 + *
  100 + */
  101 + LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int origin, int baddr);
  102 +
  103 + /**
89 104 * Get addresses of selected area.
90 105 *
91 106 * @param h Session handle.
... ...
src/lib3270/selection.c
... ... @@ -34,6 +34,12 @@
34 34 #include <lib3270/session.h>
35 35 #include <lib3270/selection.h>
36 36  
  37 + #define SELECTION_LEFT 0x01
  38 + #define SELECTION_TOP 0x02
  39 + #define SELECTION_RIGHT 0x04
  40 + #define SELECTION_BOTTOM 0x08
  41 + #define SELECTION_ACTIVE 0x10
  42 +
37 43 static void update_selection(H3270 *session);
38 44  
39 45 /*--[ Implement ]------------------------------------------------------------------------------------*/
... ... @@ -240,19 +246,19 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba
240 246  
241 247 row = baddr / hSession->cols;
242 248 col = baddr % hSession->cols;
243   - rc |= 0x01;
  249 + rc |= SELECTION_ACTIVE;
244 250  
245 251 if( (col == 0) || !(hSession->text[baddr-1].attr & LIB3270_ATTR_SELECTED) )
246   - rc |= 0x02;
  252 + rc |= SELECTION_LEFT;
247 253  
248 254 if( (row == 0) || !(hSession->text[baddr-hSession->cols].attr & LIB3270_ATTR_SELECTED) )
249   - rc |= 0x04;
  255 + rc |= SELECTION_TOP;
250 256  
251 257 if( (col == hSession->cols) || !(hSession->text[baddr+1].attr & LIB3270_ATTR_SELECTED) )
252   - rc |= 0x08;
  258 + rc |= SELECTION_RIGHT;
253 259  
254 260 if( (row == hSession->rows) || !(hSession->text[baddr+hSession->cols].attr & LIB3270_ATTR_SELECTED) )
255   - rc |= 0x10;
  261 + rc |= SELECTION_BOTTOM;
256 262  
257 263 return rc;
258 264 }
... ... @@ -475,6 +481,53 @@ LIB3270_EXPORT int lib3270_move_selected_area(H3270 *hSession, int from, int to)
475 481 return from+step;
476 482 }
477 483  
  484 +LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int origin, int baddr)
  485 +{
  486 + int first, last, row, col;
  487 +
  488 + if(lib3270_get_selected_addr(h,&first,&last))
  489 + return origin;
  490 +
  491 + flag &= 0x1f;
  492 +
  493 + if(!flag)
  494 + return origin;
  495 + else if(flag == SELECTION_ACTIVE)
  496 + return lib3270_move_selected_area(h,origin,baddr);
  497 +
  498 + row = baddr/h->cols;
  499 + col = baddr%h->cols;
  500 +
  501 + if(flag & SELECTION_LEFT) // Update left margin
  502 + origin = first = ((first/h->cols)*h->cols) + col;
  503 +
  504 + if(flag & SELECTION_TOP) // Update top margin
  505 + origin = first = (row*h->cols) + (first%h->cols);
  506 +
  507 + if(flag & SELECTION_RIGHT) // Update right margin
  508 + origin = last = ((last/h->cols)*h->cols) + col;
  509 +
  510 + if(flag & SELECTION_BOTTOM) // Update bottom margin
  511 + origin = last = (row*h->cols) + (last%h->cols);
  512 +
  513 + if(h->select.begin < h->select.end)
  514 + {
  515 + h->select.begin = first;
  516 + h->select.end = last;
  517 + }
  518 + else
  519 + {
  520 + h->select.begin = last;
  521 + h->select.end = first;
  522 + }
  523 +
  524 + update_selection(h);
  525 + lib3270_set_cursor_address(h,h->select.end);
  526 +
  527 + return origin;
  528 +}
  529 +
  530 +
478 531 LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir)
479 532 {
480 533 if(!hSession->selected || hSession->select.begin == hSession->select.end)
... ...