Commit 4ffa4f375f4eb93fb78de7c4b22f0b5f1af2294c
1 parent
a4d83a3b
Exists in
master
and in
5 other branches
Implementando mudança do ponteiro do mouse de acordo com o campo
Showing
12 changed files
with
197 additions
and
126 deletions
Show diff stats
src/gtk/v3270/accessible.c
| ... | ... | @@ -450,7 +450,7 @@ static gint v3270_accessible_get_n_selections (AtkText *text) |
| 450 | 450 | if(!widget) |
| 451 | 451 | return 0; |
| 452 | 452 | |
| 453 | - trace("%s: n_selections=%d",__FUNCTION__,v3270_get_selection_bounds(widget, NULL, NULL) ? 1 : 0); | |
| 453 | +// trace("%s: n_selections=%d",__FUNCTION__,v3270_get_selection_bounds(widget, NULL, NULL) ? 1 : 0); | |
| 454 | 454 | |
| 455 | 455 | return v3270_get_selection_bounds(widget, NULL, NULL) ? 1 : 0; |
| 456 | 456 | } |
| ... | ... | @@ -459,17 +459,17 @@ static gchar * v3270_accessible_get_selection(AtkText *atk_text, gint selection_ |
| 459 | 459 | { |
| 460 | 460 | GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE (atk_text)); |
| 461 | 461 | |
| 462 | - trace("%s: selection_num=%d",__FUNCTION__,selection_num); | |
| 462 | +// trace("%s: selection_num=%d",__FUNCTION__,selection_num); | |
| 463 | 463 | if (widget == NULL ||selection_num != 0) |
| 464 | 464 | return NULL; |
| 465 | 465 | |
| 466 | 466 | if(v3270_get_selection_bounds(widget, start_pos, end_pos)) |
| 467 | 467 | { |
| 468 | - trace("%s: TRUE",__FUNCTION__); | |
| 468 | +// trace("%s: TRUE",__FUNCTION__); | |
| 469 | 469 | return v3270_get_region(widget, *start_pos, *end_pos, FALSE); |
| 470 | 470 | } |
| 471 | 471 | |
| 472 | - trace("%s: FALSE",__FUNCTION__); | |
| 472 | +// trace("%s: FALSE",__FUNCTION__); | |
| 473 | 473 | return NULL; |
| 474 | 474 | } |
| 475 | 475 | |
| ... | ... | @@ -506,6 +506,28 @@ static gboolean v3270_accessible_set_selection(AtkText *text, gint selection_num |
| 506 | 506 | return FALSE; |
| 507 | 507 | } |
| 508 | 508 | |
| 509 | +/* | |
| 510 | +static AtkAttributeSet * v3270_accessible_get_run_attributes(AtkText *text, gint offset, gint * start_offset, gint * end_offset) | |
| 511 | +{ | |
| 512 | + GtkWidget * widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); | |
| 513 | + AtkAttributeSet * attributes = NULL; | |
| 514 | + | |
| 515 | + if(!widget) | |
| 516 | + return NULL; | |
| 517 | + | |
| 518 | + trace("%s is incomplete ***********************",__FUNCTION__); | |
| 519 | + | |
| 520 | + // http://developer.gnome.org/atk/stable/AtkText.html#AtkTextAttribute | |
| 521 | + | |
| 522 | + attributes = add_attribute (attributes, ATK_TEXT_ATTR_DIRECTION, | |
| 523 | + atk_text_attribute_get_value (ATK_TEXT_ATTR_DIRECTION, | |
| 524 | + gtk_widget_get_direction(widget))); | |
| 525 | + | |
| 526 | + | |
| 527 | + return attributes; | |
| 528 | +} | |
| 529 | +*/ | |
| 530 | + | |
| 509 | 531 | static void atk_text_interface_init(AtkTextIface *iface) |
| 510 | 532 | { |
| 511 | 533 | iface->get_text = v3270_accessible_get_text; | ... | ... |
src/gtk/v3270/mouse.c
| ... | ... | @@ -42,13 +42,16 @@ gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y) |
| 42 | 42 | GdkPoint point; |
| 43 | 43 | int r,c; |
| 44 | 44 | |
| 45 | - point.x = ((x-widget->metrics.left)/widget->metrics.width); | |
| 46 | - point.y = ((y-widget->metrics.top)/widget->metrics.spacing); | |
| 45 | + if(x > 0 && y > 0) | |
| 46 | + { | |
| 47 | + point.x = ((x-widget->metrics.left)/widget->metrics.width); | |
| 48 | + point.y = ((y-widget->metrics.top)/widget->metrics.spacing); | |
| 47 | 49 | |
| 48 | - lib3270_get_screen_size(widget->host,&r,&c); | |
| 50 | + lib3270_get_screen_size(widget->host,&r,&c); | |
| 49 | 51 | |
| 50 | - if(point.x >= 0 && point.y >= 0 && point.x < c && point.y < r) | |
| 51 | - return (point.y * c) + point.x; | |
| 52 | + if(point.x >= 0 && point.y >= 0 && point.x < c && point.y < r) | |
| 53 | + return (point.y * c) + point.x; | |
| 54 | + } | |
| 52 | 55 | |
| 53 | 56 | return -1; |
| 54 | 57 | } |
| ... | ... | @@ -164,76 +167,93 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) |
| 164 | 167 | } |
| 165 | 168 | |
| 166 | 169 | |
| 167 | -gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) | |
| 170 | +static void update_mouse_pointer(GtkWidget *widget, int baddr) | |
| 168 | 171 | { |
| 169 | - v3270 * terminal = GTK_V3270(widget); | |
| 170 | - int baddr = v3270_get_offset_at_point(terminal,event->x,event->y); | |
| 171 | - | |
| 172 | - if(baddr < 0) | |
| 173 | - return FALSE; | |
| 172 | + v3270 *terminal = GTK_V3270(widget); | |
| 174 | 173 | |
| 175 | - if(terminal->selecting) | |
| 176 | - { | |
| 177 | - // Select area | |
| 178 | - lib3270_select_to(terminal->host,baddr); | |
| 179 | - } | |
| 180 | - else if(terminal->moving) | |
| 174 | + if(baddr >= 0 && terminal->pointer_id == LIB3270_CURSOR_EDITABLE) | |
| 181 | 175 | { |
| 182 | - // Move selected area | |
| 183 | - terminal->selection_addr = lib3270_drag_selection(terminal->host,terminal->pointer,terminal->selection_addr,baddr); | |
| 184 | - } | |
| 185 | - else if(terminal->pointer_id == LIB3270_CURSOR_NORMAL) | |
| 186 | - { | |
| 187 | - unsigned char new_pointer = lib3270_get_selection_flags(terminal->host,baddr); | |
| 188 | - if(new_pointer != terminal->pointer) | |
| 176 | + int id = terminal->pointer; | |
| 177 | + | |
| 178 | + switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x1f) | |
| 189 | 179 | { |
| 190 | - GdkWindow *window = gtk_widget_get_window(widget); | |
| 191 | - trace("Pointer changes to %04x",new_pointer); | |
| 180 | + case 0x10: | |
| 181 | + id = V3270_CURSOR_MOVE_SELECTION; | |
| 182 | + break; | |
| 183 | + | |
| 184 | + case 0x12: | |
| 185 | + id = V3270_CURSOR_SELECTION_TOP; | |
| 186 | + break; | |
| 187 | + | |
| 188 | + case 0x16: | |
| 189 | + id = V3270_CURSOR_SELECTION_TOP_RIGHT; | |
| 190 | + break; | |
| 191 | + | |
| 192 | + case 0x14: | |
| 193 | + id = V3270_CURSOR_SELECTION_RIGHT; | |
| 194 | + break; | |
| 192 | 195 | |
| 193 | - switch(new_pointer & 0x1F) | |
| 194 | - { | |
| 195 | - case 0x10: | |
| 196 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_MOVE_SELECTION]); | |
| 197 | - break; | |
| 196 | + case 0x11: | |
| 197 | + id = V3270_CURSOR_SELECTION_LEFT; | |
| 198 | + break; | |
| 198 | 199 | |
| 199 | - case 0x12: | |
| 200 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_TOP]); | |
| 201 | - break; | |
| 200 | + case 0x19: | |
| 201 | + id = V3270_CURSOR_SELECTION_BOTTOM_LEFT; | |
| 202 | + break; | |
| 202 | 203 | |
| 203 | - case 0x16: | |
| 204 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_TOP_RIGHT]); | |
| 205 | - break; | |
| 204 | + case 0x18: | |
| 205 | + id = V3270_CURSOR_SELECTION_BOTTOM; | |
| 206 | + break; | |
| 206 | 207 | |
| 207 | - case 0x14: | |
| 208 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_RIGHT]); | |
| 209 | - break; | |
| 208 | + case 0x1c: | |
| 209 | + id = V3270_CURSOR_SELECTION_BOTTOM_RIGHT; | |
| 210 | + break; | |
| 210 | 211 | |
| 211 | - case 0x11: | |
| 212 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_LEFT]); | |
| 213 | - break; | |
| 212 | + case 0x13: | |
| 213 | + id = V3270_CURSOR_SELECTION_TOP_LEFT; | |
| 214 | + break; | |
| 214 | 215 | |
| 215 | - case 0x19: | |
| 216 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_BOTTOM_LEFT]); | |
| 217 | - break; | |
| 216 | + default: | |
| 217 | + id = lib3270_is_protected(terminal->host,baddr) ? V3270_CURSOR_PROTECTED : V3270_CURSOR_UNPROTECTED; | |
| 218 | 218 | |
| 219 | - case 0x18: | |
| 220 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_BOTTOM]); | |
| 221 | - break; | |
| 219 | + } | |
| 220 | + | |
| 221 | + gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[id]); | |
| 222 | + } | |
| 222 | 223 | |
| 223 | - case 0x1c: | |
| 224 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_BOTTOM_RIGHT]); | |
| 225 | - break; | |
| 224 | +} | |
| 226 | 225 | |
| 227 | - case 0x13: | |
| 228 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_SELECTION_TOP_LEFT]); | |
| 229 | - break; | |
| 226 | +void v3270_update_mouse_pointer(GtkWidget *widget) | |
| 227 | +{ | |
| 228 | + gint x, y; | |
| 230 | 229 | |
| 231 | - default: | |
| 232 | - gdk_window_set_cursor(window,v3270_cursor[V3270_CURSOR_NORMAL]); | |
| 230 | +#if GTK_CHECK_VERSION(3,4,0) | |
| 231 | + #warning Implement gdk_window_get_device_position | |
| 232 | +#endif // GTK(3,4,0) | |
| 233 | 233 | |
| 234 | - } | |
| 234 | + gtk_widget_get_pointer(widget,&x,&y); | |
| 235 | + update_mouse_pointer(widget,v3270_get_offset_at_point(GTK_V3270(widget),x,y)); | |
| 236 | +} | |
| 235 | 237 | |
| 236 | - terminal->pointer = new_pointer; | |
| 238 | +gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) | |
| 239 | +{ | |
| 240 | + v3270 * terminal = GTK_V3270(widget); | |
| 241 | + int baddr = v3270_get_offset_at_point(terminal,event->x,event->y); | |
| 242 | + | |
| 243 | + if(baddr >= 0) | |
| 244 | + { | |
| 245 | + if(terminal->selecting) // Select region | |
| 246 | + { | |
| 247 | + lib3270_select_to(terminal->host,baddr); | |
| 248 | + } | |
| 249 | + if(terminal->moving) // Move selected area | |
| 250 | + { | |
| 251 | + terminal->selection_addr = lib3270_drag_selection(terminal->host,terminal->pointer,terminal->selection_addr,baddr); | |
| 252 | + } | |
| 253 | + else | |
| 254 | + { | |
| 255 | + terminal->pointer = lib3270_get_selection_flags(terminal->host,baddr); | |
| 256 | + update_mouse_pointer(widget,baddr); | |
| 237 | 257 | } |
| 238 | 258 | } |
| 239 | 259 | ... | ... |
src/gtk/v3270/private.h
| ... | ... | @@ -85,21 +85,22 @@ G_BEGIN_DECLS |
| 85 | 85 | |
| 86 | 86 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
| 87 | 87 | |
| 88 | - #define V3270_CURSOR_NORMAL LIB3270_CURSOR_NORMAL | |
| 88 | + #define V3270_CURSOR_UNPROTECTED LIB3270_CURSOR_EDITABLE | |
| 89 | 89 | #define V3270_CURSOR_WAITING LIB3270_CURSOR_WAITING |
| 90 | 90 | #define V3270_CURSOR_LOCKED LIB3270_CURSOR_LOCKED |
| 91 | 91 | |
| 92 | - #define V3270_CURSOR_MOVE_SELECTION LIB3270_CURSOR_USER | |
| 93 | - #define V3270_CURSOR_SELECTION_TOP_LEFT LIB3270_CURSOR_USER+1 | |
| 94 | - #define V3270_CURSOR_SELECTION_TOP_RIGHT LIB3270_CURSOR_USER+2 | |
| 95 | - #define V3270_CURSOR_SELECTION_TOP LIB3270_CURSOR_USER+3 | |
| 96 | - #define V3270_CURSOR_SELECTION_BOTTOM_LEFT LIB3270_CURSOR_USER+4 | |
| 97 | - #define V3270_CURSOR_SELECTION_BOTTOM_RIGHT LIB3270_CURSOR_USER+5 | |
| 98 | - #define V3270_CURSOR_SELECTION_BOTTOM LIB3270_CURSOR_USER+6 | |
| 99 | - #define V3270_CURSOR_SELECTION_LEFT LIB3270_CURSOR_USER+7 | |
| 100 | - #define V3270_CURSOR_SELECTION_RIGHT LIB3270_CURSOR_USER+8 | |
| 92 | + #define V3270_CURSOR_PROTECTED LIB3270_CURSOR_USER | |
| 93 | + #define V3270_CURSOR_MOVE_SELECTION LIB3270_CURSOR_USER+1 | |
| 94 | + #define V3270_CURSOR_SELECTION_TOP_LEFT LIB3270_CURSOR_USER+2 | |
| 95 | + #define V3270_CURSOR_SELECTION_TOP_RIGHT LIB3270_CURSOR_USER+3 | |
| 96 | + #define V3270_CURSOR_SELECTION_TOP LIB3270_CURSOR_USER+4 | |
| 97 | + #define V3270_CURSOR_SELECTION_BOTTOM_LEFT LIB3270_CURSOR_USER+5 | |
| 98 | + #define V3270_CURSOR_SELECTION_BOTTOM_RIGHT LIB3270_CURSOR_USER+6 | |
| 99 | + #define V3270_CURSOR_SELECTION_BOTTOM LIB3270_CURSOR_USER+7 | |
| 100 | + #define V3270_CURSOR_SELECTION_LEFT LIB3270_CURSOR_USER+8 | |
| 101 | + #define V3270_CURSOR_SELECTION_RIGHT LIB3270_CURSOR_USER+9 | |
| 101 | 102 | |
| 102 | - #define V3270_CURSOR_COUNT LIB3270_CURSOR_USER+9 | |
| 103 | + #define V3270_CURSOR_COUNT LIB3270_CURSOR_USER+10 | |
| 103 | 104 | |
| 104 | 105 | |
| 105 | 106 | struct v3270_metrics |
| ... | ... | @@ -189,6 +190,7 @@ const GtkWidgetClass * v3270_get_parent_class(void); |
| 189 | 190 | |
| 190 | 191 | gboolean v3270_draw(GtkWidget * widget, cairo_t * cr); |
| 191 | 192 | void v3270_draw_oia(cairo_t *cr, H3270 *host, int row, int cols, struct v3270_metrics *metrics, GdkColor *color, GdkRectangle *rect); |
| 193 | +void v3270_update_mouse_pointer(GtkWidget *widget); | |
| 192 | 194 | |
| 193 | 195 | #if ! GTK_CHECK_VERSION(3,0,0) |
| 194 | 196 | gboolean v3270_expose(GtkWidget * widget, GdkEventExpose *event); | ... | ... |
src/gtk/v3270/widget.c
| ... | ... | @@ -271,34 +271,36 @@ static void v3270_class_init(v3270Class *klass) |
| 271 | 271 | #ifdef WIN32 |
| 272 | 272 | static const gchar * cr[V3270_CURSOR_COUNT] = |
| 273 | 273 | { |
| 274 | - "ibeam", | |
| 275 | - "wait", | |
| 276 | - "arrow", | |
| 277 | - "hand", | |
| 278 | - "sizenwse", // Top-left | |
| 279 | - "sizenesw", // Top-right | |
| 280 | - "sizens", // Top | |
| 281 | - "sizenesw", // Bottom-left | |
| 282 | - "sizenwse", // Bottom-right | |
| 283 | - "sizens", // Bottom | |
| 284 | - "sizewe", // Left | |
| 285 | - "sizewe", // Right | |
| 274 | + "ibeam", // V3270_CURSOR_UNPROTECTED | |
| 275 | + "wait", // V3270_CURSOR_WAITING | |
| 276 | + "arrow", // V3270_CURSOR_LOCKED | |
| 277 | + "arrow", // V3270_CURSOR_PROTECTED | |
| 278 | + "hand", // V3270_CURSOR_MOVE_SELECTION | |
| 279 | + "sizenwse", // V3270_CURSOR_SELECTION_TOP_LEFT | |
| 280 | + "sizenesw", // V3270_CURSOR_SELECTION_TOP_RIGHT | |
| 281 | + "sizens", // V3270_CURSOR_SELECTION_TOP | |
| 282 | + "sizenesw", // V3270_CURSOR_SELECTION_BOTTOM_LEFT | |
| 283 | + "sizenwse", // V3270_CURSOR_SELECTION_BOTTOM_RIGHT | |
| 284 | + "sizens", // V3270_CURSOR_SELECTION_BOTTOM | |
| 285 | + "sizewe", // V3270_CURSOR_SELECTION_LEFT | |
| 286 | + "sizewe", // V3270_CURSOR_SELECTION_RIGHT | |
| 286 | 287 | }; |
| 287 | 288 | #else |
| 288 | 289 | static const int cr[V3270_CURSOR_COUNT] = |
| 289 | 290 | { |
| 290 | - GDK_XTERM, | |
| 291 | - GDK_WATCH, | |
| 292 | - GDK_X_CURSOR, | |
| 293 | - GDK_HAND1, | |
| 294 | - GDK_TOP_LEFT_CORNER, // Top-left | |
| 295 | - GDK_TOP_RIGHT_CORNER, // Top-right | |
| 296 | - GDK_TOP_SIDE, // Top | |
| 297 | - GDK_BOTTOM_LEFT_CORNER, // Bottom-left | |
| 298 | - GDK_BOTTOM_RIGHT_CORNER, // Bottom-right | |
| 299 | - GDK_BOTTOM_SIDE, // Bottom | |
| 300 | - GDK_LEFT_SIDE, // Left | |
| 301 | - GDK_RIGHT_SIDE, // Right | |
| 291 | + GDK_XTERM, // V3270_CURSOR_UNPROTECTED | |
| 292 | + GDK_WATCH, // V3270_CURSOR_WAITING | |
| 293 | + GDK_X_CURSOR, // V3270_CURSOR_LOCKED | |
| 294 | + GDK_ARROW, // V3270_CURSOR_PROTECTED | |
| 295 | + GDK_HAND1, // V3270_CURSOR_MOVE_SELECTION | |
| 296 | + GDK_TOP_LEFT_CORNER, // V3270_CURSOR_SELECTION_TOP_LEFT | |
| 297 | + GDK_TOP_RIGHT_CORNER, // V3270_CURSOR_SELECTION_TOP_RIGHT | |
| 298 | + GDK_TOP_SIDE, // V3270_CURSOR_SELECTION_TOP | |
| 299 | + GDK_BOTTOM_LEFT_CORNER, // V3270_CURSOR_SELECTION_BOTTOM_LEFT | |
| 300 | + GDK_BOTTOM_RIGHT_CORNER, // V3270_CURSOR_SELECTION_BOTTOM_RIGHT | |
| 301 | + GDK_BOTTOM_SIDE, // V3270_CURSOR_SELECTION_BOTTOM | |
| 302 | + GDK_LEFT_SIDE, // V3270_CURSOR_SELECTION_LEFT | |
| 303 | + GDK_RIGHT_SIDE, // V3270_CURSOR_SELECTION_RIGHT | |
| 302 | 304 | }; |
| 303 | 305 | #endif // WIN32 |
| 304 | 306 | |
| ... | ... | @@ -313,12 +315,6 @@ static void v3270_class_init(v3270Class *klass) |
| 313 | 315 | #endif |
| 314 | 316 | } |
| 315 | 317 | } |
| 316 | -/* | |
| 317 | - v3270_cursor[V3270_CURSOR_NORMAL] = gdk_cursor_new(GDK_XTERM); | |
| 318 | - v3270_cursor[V3270_CURSOR_WAITING] = gdk_cursor_new(GDK_WATCH); | |
| 319 | - v3270_cursor[V3270_CURSOR_LOCKED] = gdk_cursor_new(GDK_X_CURSOR); | |
| 320 | - v3270_cursor[] | |
| 321 | -*/ | |
| 322 | 318 | |
| 323 | 319 | // Signals |
| 324 | 320 | widget_class->activate_signal = |
| ... | ... | @@ -573,8 +569,19 @@ static void select_cursor(H3270 *session, LIB3270_CURSOR id) |
| 573 | 569 | if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget)) |
| 574 | 570 | { |
| 575 | 571 | GTK_V3270(widget)->pointer_id = id; |
| 576 | - gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[id]); | |
| 572 | + v3270_update_mouse_pointer(widget); | |
| 573 | + } | |
| 574 | +} | |
| 575 | + | |
| 576 | +static void ctlr_done(H3270 *session) | |
| 577 | +{ | |
| 578 | + GtkWidget *widget = GTK_WIDGET(session->widget); | |
| 579 | + | |
| 580 | + if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget)) | |
| 581 | + { | |
| 582 | + v3270_update_mouse_pointer(widget); | |
| 577 | 583 | } |
| 584 | + | |
| 578 | 585 | } |
| 579 | 586 | |
| 580 | 587 | static void update_connect(H3270 *session, unsigned char connected) |
| ... | ... | @@ -700,6 +707,8 @@ static void v3270_init(v3270 *widget) |
| 700 | 707 | widget->host->update_connect = update_connect; |
| 701 | 708 | widget->host->update_model = update_model; |
| 702 | 709 | widget->host->changed = changed; |
| 710 | + widget->host->ctlr_done = ctlr_done; | |
| 711 | + | |
| 703 | 712 | |
| 704 | 713 | // Setup input method |
| 705 | 714 | widget->input_method = gtk_im_multicontext_new(); | ... | ... |
src/include/lib3270.h
| ... | ... | @@ -186,7 +186,7 @@ |
| 186 | 186 | */ |
| 187 | 187 | typedef enum _LIB3270_CURSOR |
| 188 | 188 | { |
| 189 | - LIB3270_CURSOR_NORMAL, /**< Ready for user actions */ | |
| 189 | + LIB3270_CURSOR_EDITABLE, /**< Ready for user actions */ | |
| 190 | 190 | LIB3270_CURSOR_WAITING, /**< Waiting for host */ |
| 191 | 191 | LIB3270_CURSOR_LOCKED, /**< Locked, can't receive user actions */ |
| 192 | 192 | |
| ... | ... | @@ -698,6 +698,9 @@ |
| 698 | 698 | LIB3270_EXPORT int lib3270_set_model(H3270 *session, int model); |
| 699 | 699 | LIB3270_EXPORT int lib3270_get_model(H3270 *session); |
| 700 | 700 | |
| 701 | + LIB3270_EXPORT int lib3270_is_protected(H3270 *h, unsigned int baddr); | |
| 702 | + | |
| 703 | + | |
| 701 | 704 | #ifdef __cplusplus |
| 702 | 705 | } |
| 703 | 706 | #endif | ... | ... |
src/lib3270/api.h
| ... | ... | @@ -271,7 +271,7 @@ |
| 271 | 271 | |
| 272 | 272 | /* Screen processing */ |
| 273 | 273 | |
| 274 | - #define CURSOR_MODE_NORMAL LIB3270_CURSOR_NORMAL | |
| 274 | + #define CURSOR_MODE_NORMAL LIB3270_CURSOR_EDITABLE | |
| 275 | 275 | #define CURSOR_MODE_WAITING LIB3270_CURSOR_WAITING |
| 276 | 276 | #define CURSOR_MODE_LOCKED LIB3270_CURSOR_LOCKED |
| 277 | 277 | ... | ... |
src/lib3270/ctlr.c
| ... | ... | @@ -380,7 +380,6 @@ int lib3270_field_length(H3270 *h, int baddr) |
| 380 | 380 | */ |
| 381 | 381 | unsigned char get_field_attribute(H3270 *h, int baddr) |
| 382 | 382 | { |
| 383 | - CHECK_SESSION_HANDLE(h); | |
| 384 | 383 | return h->ea_buf[find_field_attribute(h,baddr)].fa; |
| 385 | 384 | } |
| 386 | 385 | |
| ... | ... | @@ -435,20 +434,19 @@ fa2ea(int baddr) |
| 435 | 434 | * unprotected attribute byte, or 0 if no nonzero-width unprotected field |
| 436 | 435 | * can be found. |
| 437 | 436 | */ |
| 438 | -int | |
| 439 | -next_unprotected(int baddr0) | |
| 437 | +int next_unprotected(H3270 *session, int baddr0) | |
| 440 | 438 | { |
| 441 | 439 | register int baddr, nbaddr; |
| 442 | 440 | |
| 443 | 441 | nbaddr = baddr0; |
| 444 | - do { | |
| 442 | + do | |
| 443 | + { | |
| 445 | 444 | baddr = nbaddr; |
| 446 | 445 | INC_BA(nbaddr); |
| 447 | - if (h3270.ea_buf[baddr].fa && | |
| 448 | - !FA_IS_PROTECTED(h3270.ea_buf[baddr].fa) && | |
| 449 | - !h3270.ea_buf[nbaddr].fa) | |
| 446 | + if(session->ea_buf[baddr].fa &&!FA_IS_PROTECTED(session->ea_buf[baddr].fa) &&!session->ea_buf[nbaddr].fa) | |
| 450 | 447 | return nbaddr; |
| 451 | 448 | } while (nbaddr != baddr0); |
| 449 | + | |
| 452 | 450 | return 0; |
| 453 | 451 | } |
| 454 | 452 | |
| ... | ... | @@ -1287,7 +1285,7 @@ ctlr_write(unsigned char buf[], int buflen, Boolean erase) |
| 1287 | 1285 | * Otherwise, advance to the first position of the |
| 1288 | 1286 | * next unprotected field. |
| 1289 | 1287 | */ |
| 1290 | - baddr = next_unprotected(h3270.buffer_addr); | |
| 1288 | + baddr = next_unprotected(&h3270,h3270.buffer_addr); | |
| 1291 | 1289 | if (baddr < h3270.buffer_addr) |
| 1292 | 1290 | baddr = 0; |
| 1293 | 1291 | /* | ... | ... |
src/lib3270/ctlrc.h
| ... | ... | @@ -53,7 +53,7 @@ LIB3270_INTERNAL struct ea *fa2ea(int baddr); |
| 53 | 53 | LIB3270_INTERNAL Boolean get_bounded_field_attribute(register int baddr, register int bound, unsigned char *fa_out); |
| 54 | 54 | LIB3270_INTERNAL void mdt_clear(int baddr); |
| 55 | 55 | LIB3270_INTERNAL void mdt_set(int baddr); |
| 56 | -LIB3270_INTERNAL int next_unprotected(int baddr0); | |
| 56 | +LIB3270_INTERNAL int next_unprotected(H3270 *session, int baddr0); | |
| 57 | 57 | LIB3270_INTERNAL enum pds process_ds(unsigned char *buf, int buflen); |
| 58 | 58 | LIB3270_INTERNAL void ps_process(void); |
| 59 | 59 | ... | ... |
src/lib3270/kybd.c
| ... | ... | @@ -962,7 +962,7 @@ static Boolean key_Character(int code, Boolean with_ge, Boolean pasting, Boolean |
| 962 | 962 | if (skipped != NULL) |
| 963 | 963 | *skipped = True; |
| 964 | 964 | if (FA_IS_SKIP(h3270.ea_buf[baddr].fa)) |
| 965 | - baddr = next_unprotected(baddr); | |
| 965 | + baddr = next_unprotected(&h3270,baddr); | |
| 966 | 966 | else |
| 967 | 967 | INC_BA(baddr); |
| 968 | 968 | } |
| ... | ... | @@ -1269,7 +1269,7 @@ retry: |
| 1269 | 1269 | if (skipped != NULL) |
| 1270 | 1270 | *skipped = True; |
| 1271 | 1271 | if (FA_IS_SKIP(ea_buf[baddr].fa)) |
| 1272 | - baddr = next_unprotected(baddr); | |
| 1272 | + baddr = next_unprotected(&h3270,baddr); | |
| 1273 | 1273 | else |
| 1274 | 1274 | INC_BA(baddr); |
| 1275 | 1275 | } |
| ... | ... | @@ -1387,7 +1387,7 @@ LIB3270_KEY_ACTION( tab ) |
| 1387 | 1387 | return 0; |
| 1388 | 1388 | } |
| 1389 | 1389 | #endif /*]*/ |
| 1390 | - cursor_move(&h3270,next_unprotected(h3270.cursor_addr)); | |
| 1390 | + cursor_move(hSession,next_unprotected(hSession,hSession->cursor_addr)); | |
| 1391 | 1391 | return 0; |
| 1392 | 1392 | } |
| 1393 | 1393 | |
| ... | ... | @@ -1550,7 +1550,7 @@ LIB3270_ACTION( firstfield ) |
| 1550 | 1550 | cursor_move(hSession,0); |
| 1551 | 1551 | return 0; |
| 1552 | 1552 | } |
| 1553 | - cursor_move(hSession,next_unprotected(hSession->rows*hSession->cols-1)); | |
| 1553 | + cursor_move(hSession,next_unprotected(hSession,hSession->rows*hSession->cols-1)); | |
| 1554 | 1554 | |
| 1555 | 1555 | return 0; |
| 1556 | 1556 | } |
| ... | ... | @@ -2240,7 +2240,7 @@ LIB3270_CURSOR_ACTION( newline ) |
| 2240 | 2240 | if (faddr != baddr && !FA_IS_PROTECTED(fa)) |
| 2241 | 2241 | cursor_move(hSession,baddr); |
| 2242 | 2242 | else |
| 2243 | - cursor_move(hSession,next_unprotected(baddr)); | |
| 2243 | + cursor_move(hSession,next_unprotected(hSession,baddr)); | |
| 2244 | 2244 | |
| 2245 | 2245 | return 0; |
| 2246 | 2246 | } |
| ... | ... | @@ -2263,7 +2263,7 @@ LIB3270_ACTION( dup ) |
| 2263 | 2263 | if (key_Character(EBC_dup, False, False, NULL)) |
| 2264 | 2264 | { |
| 2265 | 2265 | screen_disp(hSession); |
| 2266 | - cursor_move(hSession,next_unprotected(hSession->cursor_addr)); | |
| 2266 | + cursor_move(hSession,next_unprotected(hSession,hSession->cursor_addr)); | |
| 2267 | 2267 | } |
| 2268 | 2268 | } |
| 2269 | 2269 | |
| ... | ... | @@ -2931,7 +2931,7 @@ remargin(int lmargin) |
| 2931 | 2931 | faddr = find_field_attribute(&h3270,baddr); |
| 2932 | 2932 | fa = h3270.ea_buf[faddr].fa; |
| 2933 | 2933 | if (faddr == baddr || FA_IS_PROTECTED(fa)) { |
| 2934 | - baddr = next_unprotected(baddr); | |
| 2934 | + baddr = next_unprotected(&h3270,baddr); | |
| 2935 | 2935 | if (baddr <= b0) |
| 2936 | 2936 | return False; |
| 2937 | 2937 | } |
| ... | ... | @@ -3354,7 +3354,7 @@ kybd_prime(void) |
| 3354 | 3354 | * The cursor is not in an unprotected field. Find the |
| 3355 | 3355 | * next one. |
| 3356 | 3356 | */ |
| 3357 | - baddr = next_unprotected(h3270.cursor_addr); | |
| 3357 | + baddr = next_unprotected(&h3270,h3270.cursor_addr); | |
| 3358 | 3358 | |
| 3359 | 3359 | /* If there isn't any, give up. */ |
| 3360 | 3360 | if (!baddr) | ... | ... |
src/lib3270/paste.c
| ... | ... | @@ -122,7 +122,7 @@ |
| 122 | 122 | fa = session->ea_buf[faddr].fa; |
| 123 | 123 | if (faddr == baddr || FA_IS_PROTECTED(fa)) |
| 124 | 124 | { |
| 125 | - baddr = next_unprotected(baddr); | |
| 125 | + baddr = next_unprotected(session,baddr); | |
| 126 | 126 | if (baddr <= b0) |
| 127 | 127 | return 0; |
| 128 | 128 | } |
| ... | ... | @@ -212,7 +212,7 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str) |
| 212 | 212 | if (faddr != baddr && !FA_IS_PROTECTED(fa)) |
| 213 | 213 | cursor_move(h,baddr); |
| 214 | 214 | else |
| 215 | - cursor_move(h,next_unprotected(baddr)); | |
| 215 | + cursor_move(h,next_unprotected(h,baddr)); | |
| 216 | 216 | data.row = BA_TO_ROW(h->cursor_addr); |
| 217 | 217 | } |
| 218 | 218 | last = ' '; | ... | ... |
src/lib3270/screen.c
| ... | ... | @@ -768,3 +768,18 @@ LIB3270_EXPORT void lib3270_popup_dialog(H3270 *session, LIB3270_NOTIFY id , con |
| 768 | 768 | popup_handler(session,id,title ? title : _( "3270 Error" ), message,fmt,args); |
| 769 | 769 | va_end(args); |
| 770 | 770 | } |
| 771 | + | |
| 772 | +LIB3270_EXPORT int lib3270_is_protected(H3270 *h, unsigned int baddr) | |
| 773 | +{ | |
| 774 | + unsigned char fa; | |
| 775 | + | |
| 776 | + CHECK_SESSION_HANDLE(h); | |
| 777 | + | |
| 778 | + if(baddr > (h->rows * h->cols)) | |
| 779 | + return -1; | |
| 780 | + | |
| 781 | + fa = get_field_attribute(h,baddr); | |
| 782 | + | |
| 783 | + return FA_IS_PROTECTED(fa); | |
| 784 | +} | |
| 785 | + | ... | ... |
src/lib3270/selection.c