Commit bc4c1af21c59d941d9d3e3fa056aaa54342cb600
1 parent
2bc1baf7
Exists in
master
and in
1 other branch
Implementando sinal quando algum elemento da OIA receb um click, incluindo trata…
…mento de ponteiros ao movimentar o mouse sobre a OIA
Showing
5 changed files
with
133 additions
and
34 deletions
Show diff stats
genmarshal
mouse.c
@@ -128,28 +128,49 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) | @@ -128,28 +128,49 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) | ||
128 | gdk_beep(); | 128 | gdk_beep(); |
129 | } | 129 | } |
130 | 130 | ||
131 | -gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) | 131 | +static V3270_OIA_FIELD get_field_from_event(v3270 *widget, GdkEventButton *event) |
132 | { | 132 | { |
133 | - int baddr = v3270_get_offset_at_point(GTK_V3270(widget),event->x,event->y); | 133 | + if(event->y >= widget->oia_rect->y) |
134 | + { | ||
135 | + V3270_OIA_FIELD f; | ||
134 | 136 | ||
135 | - if(baddr < 0) | ||
136 | - return FALSE; | 137 | + for(f=0;f<V3270_OIA_FIELD_COUNT;f++) |
138 | + { | ||
139 | + if(event->x >= widget->oia_rect[f].x && event->x <= (widget->oia_rect[f].x+widget->oia_rect[f].width)) | ||
140 | + return f; | ||
141 | + } | ||
142 | + } | ||
137 | 143 | ||
138 | -// trace("%s button=%d type=%d",__FUNCTION__,event->button,event->type); | 144 | + return V3270_OIA_FIELD_INVALID; |
145 | +} | ||
139 | 146 | ||
140 | - switch(event->button) | 147 | +gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) |
148 | +{ | ||
149 | + int baddr = v3270_get_offset_at_point(GTK_V3270(widget),event->x,event->y); | ||
150 | + | ||
151 | + if(baddr >= 0) | ||
141 | { | 152 | { |
142 | - case 1: // Left button | ||
143 | - button_1_press(widget,event->type,baddr); | ||
144 | - break; | 153 | + GTK_V3270(widget)->selected_field = V3270_OIA_FIELD_INVALID; |
145 | 154 | ||
146 | - case 3: // Right button | ||
147 | - if(event->type == GDK_BUTTON_PRESS) | ||
148 | - v3270_emit_popup(GTK_V3270(widget),baddr,event); | ||
149 | - break; | 155 | + switch(event->button) |
156 | + { | ||
157 | + case 1: // Left button | ||
158 | + button_1_press(widget,event->type,baddr); | ||
159 | + break; | ||
150 | 160 | ||
151 | - default: | ||
152 | - trace("%s button=%d type=%d",__FUNCTION__,event->button,event->type); | 161 | + case 3: // Right button |
162 | + if(event->type == GDK_BUTTON_PRESS) | ||
163 | + v3270_emit_popup(GTK_V3270(widget),baddr,event); | ||
164 | + break; | ||
165 | + | ||
166 | + default: | ||
167 | + trace("%s button=%d type=%d",__FUNCTION__,event->button,event->type); | ||
168 | + } | ||
169 | + } | ||
170 | + else if(event->button == 1 && event->type == GDK_BUTTON_PRESS) | ||
171 | + { | ||
172 | + GTK_V3270(widget)->selected_field = get_field_from_event(GTK_V3270(widget),event); | ||
173 | + trace("%s field=%d",__FUNCTION__,GTK_V3270(widget)->selected_field); | ||
153 | } | 174 | } |
154 | 175 | ||
155 | return FALSE; | 176 | return FALSE; |
@@ -163,24 +184,44 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) | @@ -163,24 +184,44 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) | ||
163 | GTK_V3270(widget)->selecting = 0; | 184 | GTK_V3270(widget)->selecting = 0; |
164 | GTK_V3270(widget)->moving = 0; | 185 | GTK_V3270(widget)->moving = 0; |
165 | GTK_V3270(widget)->resizing = 0; | 186 | GTK_V3270(widget)->resizing = 0; |
187 | + | ||
188 | + if(GTK_V3270(widget)->selected_field != V3270_OIA_FIELD_INVALID && GTK_V3270(widget)->selected_field == get_field_from_event(GTK_V3270(widget),event)) | ||
189 | + { | ||
190 | + gboolean handled = FALSE; | ||
191 | + | ||
192 | + trace("%s field %d was clicked event=%p",__FUNCTION__,GTK_V3270(widget)->selected_field,event); | ||
193 | + | ||
194 | + g_signal_emit(widget, v3270_widget_signal[SIGNAL_FIELD], 0, | ||
195 | + lib3270_connected(GTK_V3270(widget)->host) ? TRUE : FALSE, | ||
196 | + GTK_V3270(widget)->selected_field, | ||
197 | + event, | ||
198 | + &handled); | ||
199 | + | ||
200 | + trace("Handled: %s",handled ? "Yes": "No"); | ||
201 | + | ||
202 | + if(!handled) | ||
203 | + gdk_beep(); | ||
204 | + | ||
205 | + } | ||
206 | + | ||
207 | + GTK_V3270(widget)->selected_field = V3270_OIA_FIELD_INVALID; | ||
208 | + | ||
166 | break; | 209 | break; |
167 | 210 | ||
168 | default: | 211 | default: |
169 | trace("%s button=%d type=%d",__FUNCTION__,event->button,event->type); | 212 | trace("%s button=%d type=%d",__FUNCTION__,event->button,event->type); |
170 | } | 213 | } |
171 | 214 | ||
172 | - | ||
173 | return FALSE; | 215 | return FALSE; |
174 | } | 216 | } |
175 | 217 | ||
176 | - | ||
177 | static void update_mouse_pointer(GtkWidget *widget, int baddr) | 218 | static void update_mouse_pointer(GtkWidget *widget, int baddr) |
178 | { | 219 | { |
179 | - v3270 *terminal = GTK_V3270(widget); | 220 | + v3270 * terminal = GTK_V3270(widget); |
221 | + int id = terminal->pointer; | ||
180 | 222 | ||
181 | if(baddr >= 0 && terminal->pointer_id == LIB3270_CURSOR_EDITABLE) | 223 | if(baddr >= 0 && terminal->pointer_id == LIB3270_CURSOR_EDITABLE) |
182 | { | 224 | { |
183 | - int id = terminal->pointer; | ||
184 | 225 | ||
185 | switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x8f) | 226 | switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x8f) |
186 | { | 227 | { |
@@ -225,9 +266,10 @@ static void update_mouse_pointer(GtkWidget *widget, int baddr) | @@ -225,9 +266,10 @@ static void update_mouse_pointer(GtkWidget *widget, int baddr) | ||
225 | 266 | ||
226 | } | 267 | } |
227 | 268 | ||
228 | - gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[id]); | ||
229 | } | 269 | } |
230 | 270 | ||
271 | + gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[id]); | ||
272 | + | ||
231 | } | 273 | } |
232 | 274 | ||
233 | void v3270_update_mouse_pointer(GtkWidget *widget) | 275 | void v3270_update_mouse_pointer(GtkWidget *widget) |
@@ -244,11 +286,20 @@ void v3270_update_mouse_pointer(GtkWidget *widget) | @@ -244,11 +286,20 @@ void v3270_update_mouse_pointer(GtkWidget *widget) | ||
244 | 286 | ||
245 | gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) | 287 | gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) |
246 | { | 288 | { |
247 | - v3270 * terminal = GTK_V3270(widget); | ||
248 | - int baddr = v3270_get_offset_at_point(terminal,event->x,event->y); | 289 | + v3270 * terminal = GTK_V3270(widget); |
290 | + int baddr; | ||
291 | + | ||
292 | + if(!lib3270_connected(terminal->host)) | ||
293 | + { | ||
294 | + gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[V3270_CURSOR_PROTECTED]); | ||
295 | + return FALSE; | ||
296 | + } | ||
297 | + | ||
298 | + baddr = v3270_get_offset_at_point(terminal,event->x,event->y); | ||
249 | 299 | ||
250 | if(baddr >= 0) | 300 | if(baddr >= 0) |
251 | { | 301 | { |
302 | + | ||
252 | if(terminal->selecting) // Select region | 303 | if(terminal->selecting) // Select region |
253 | { | 304 | { |
254 | lib3270_select_to(terminal->host,baddr); | 305 | lib3270_select_to(terminal->host,baddr); |
@@ -263,6 +314,37 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) | @@ -263,6 +314,37 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) | ||
263 | update_mouse_pointer(widget,baddr); | 314 | update_mouse_pointer(widget,baddr); |
264 | } | 315 | } |
265 | } | 316 | } |
317 | + else if(event->y >= terminal->oia_rect->y) | ||
318 | + { | ||
319 | + int id = V3270_CURSOR_PROTECTED; | ||
320 | + | ||
321 | + if(event->x >= terminal->oia_rect[V3270_OIA_SSL].x && event->x <= (terminal->oia_rect[V3270_OIA_SSL].x + terminal->oia_rect[V3270_OIA_SSL].width)) | ||
322 | + { | ||
323 | + switch(lib3270_get_secure(terminal->host)) | ||
324 | + { | ||
325 | + case LIB3270_SSL_UNSECURE: /**< No secure connection */ | ||
326 | + id = V3270_CURSOR_QUESTION; | ||
327 | + break; | ||
328 | + | ||
329 | + case LIB3270_SSL_NEGOTIATING: /**< Negotiating SSL */ | ||
330 | + id = V3270_CURSOR_WAITING; | ||
331 | + break; | ||
332 | + | ||
333 | + case LIB3270_SSL_NEGOTIATED: /**< Connection secure, no CA or self-signed */ | ||
334 | + id = V3270_CURSOR_QUESTION; | ||
335 | + break; | ||
336 | + | ||
337 | + case LIB3270_SSL_SECURE: /**< Connection secure with CA check */ | ||
338 | + id = V3270_CURSOR_QUESTION; | ||
339 | + break; | ||
340 | + | ||
341 | + default: | ||
342 | + id = V3270_CURSOR_LOCKED; | ||
343 | + } | ||
344 | + } | ||
345 | + | ||
346 | + gdk_window_set_cursor(gtk_widget_get_window(widget),v3270_cursor[id]); | ||
347 | + } | ||
266 | 348 | ||
267 | return FALSE; | 349 | return FALSE; |
268 | } | 350 | } |
@@ -335,6 +335,13 @@ void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, struct v3270_metrics *metri | @@ -335,6 +335,13 @@ void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, struct v3270_metrics *metri | ||
335 | bits = (unsigned char *) unlocked_bits; | 335 | bits = (unsigned char *) unlocked_bits; |
336 | break; | 336 | break; |
337 | 337 | ||
338 | + case LIB3270_SSL_NEGOTIATING: /**< Negotiating SSL */ | ||
339 | + gdk_cairo_set_source_color(cr,color+V3270_COLOR_OIA_STATUS_WARNING); | ||
340 | + width = unlocked_width; | ||
341 | + height = unlocked_height; | ||
342 | + bits = (unsigned char *) unlocked_bits; | ||
343 | + break; | ||
344 | + | ||
338 | case LIB3270_SSL_NEGOTIATED: /**< Connection secure, no CA or self-signed */ | 345 | case LIB3270_SSL_NEGOTIATED: /**< Connection secure, no CA or self-signed */ |
339 | gdk_cairo_set_source_color(cr,color+V3270_COLOR_OIA_STATUS_WARNING); | 346 | gdk_cairo_set_source_color(cr,color+V3270_COLOR_OIA_STATUS_WARNING); |
340 | width = negotiated_width; | 347 | width = negotiated_width; |
@@ -342,7 +349,6 @@ void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, struct v3270_metrics *metri | @@ -342,7 +349,6 @@ void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, struct v3270_metrics *metri | ||
342 | bits = (unsigned char *) negotiated_bits; | 349 | bits = (unsigned char *) negotiated_bits; |
343 | break; | 350 | break; |
344 | 351 | ||
345 | - | ||
346 | case LIB3270_SSL_SECURE: /**< Connection secure with CA check */ | 352 | case LIB3270_SSL_SECURE: /**< Connection secure with CA check */ |
347 | gdk_cairo_set_source_color(cr,color+V3270_COLOR_OIA_STATUS_OK); | 353 | gdk_cairo_set_source_color(cr,color+V3270_COLOR_OIA_STATUS_OK); |
348 | width = locked_width; | 354 | width = locked_width; |
@@ -350,19 +356,11 @@ void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, struct v3270_metrics *metri | @@ -350,19 +356,11 @@ void v3270_draw_ssl_status(cairo_t *cr, H3270 *host, struct v3270_metrics *metri | ||
350 | bits = (unsigned char *) locked_bits; | 356 | bits = (unsigned char *) locked_bits; |
351 | break; | 357 | break; |
352 | 358 | ||
353 | - case LIB3270_SSL_NEGOTIATING: /**< Negotiating SSL */ | ||
354 | - gdk_cairo_set_source_color(cr,color+V3270_COLOR_OIA_STATUS_WARNING); | ||
355 | - width = unlocked_width; | ||
356 | - height = unlocked_height; | ||
357 | - bits = (unsigned char *) unlocked_bits; | ||
358 | - break; | ||
359 | - | ||
360 | default: | 359 | default: |
361 | return; | 360 | return; |
362 | 361 | ||
363 | } | 362 | } |
364 | 363 | ||
365 | - | ||
366 | icon = cairo_image_surface_create_for_data( bits, | 364 | icon = cairo_image_surface_create_for_data( bits, |
367 | CAIRO_FORMAT_A1, | 365 | CAIRO_FORMAT_A1, |
368 | width,height, | 366 | width,height, |
private.h
@@ -81,10 +81,12 @@ G_BEGIN_DECLS | @@ -81,10 +81,12 @@ G_BEGIN_DECLS | ||
81 | SIGNAL_CLIPBOARD, | 81 | SIGNAL_CLIPBOARD, |
82 | SIGNAL_CHANGED, | 82 | SIGNAL_CHANGED, |
83 | SIGNAL_MESSAGE, | 83 | SIGNAL_MESSAGE, |
84 | + SIGNAL_FIELD, | ||
84 | 85 | ||
85 | LAST_SIGNAL | 86 | LAST_SIGNAL |
86 | }; | 87 | }; |
87 | 88 | ||
89 | + | ||
88 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ | 90 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
89 | 91 | ||
90 | #define V3270_CURSOR_UNPROTECTED LIB3270_CURSOR_EDITABLE | 92 | #define V3270_CURSOR_UNPROTECTED LIB3270_CURSOR_EDITABLE |
@@ -101,8 +103,9 @@ G_BEGIN_DECLS | @@ -101,8 +103,9 @@ G_BEGIN_DECLS | ||
101 | #define V3270_CURSOR_SELECTION_BOTTOM LIB3270_CURSOR_USER+7 | 103 | #define V3270_CURSOR_SELECTION_BOTTOM LIB3270_CURSOR_USER+7 |
102 | #define V3270_CURSOR_SELECTION_LEFT LIB3270_CURSOR_USER+8 | 104 | #define V3270_CURSOR_SELECTION_LEFT LIB3270_CURSOR_USER+8 |
103 | #define V3270_CURSOR_SELECTION_RIGHT LIB3270_CURSOR_USER+9 | 105 | #define V3270_CURSOR_SELECTION_RIGHT LIB3270_CURSOR_USER+9 |
106 | + #define V3270_CURSOR_QUESTION LIB3270_CURSOR_USER+10 | ||
104 | 107 | ||
105 | - #define V3270_CURSOR_COUNT LIB3270_CURSOR_USER+10 | 108 | + #define V3270_CURSOR_COUNT LIB3270_CURSOR_USER+11 |
106 | 109 | ||
107 | 110 | ||
108 | struct v3270_metrics | 111 | struct v3270_metrics |
@@ -144,8 +147,10 @@ G_BEGIN_DECLS | @@ -144,8 +147,10 @@ G_BEGIN_DECLS | ||
144 | gchar * clipboard; /**< Clipboard contents (text only) */ | 147 | gchar * clipboard; /**< Clipboard contents (text only) */ |
145 | 148 | ||
146 | LIB3270_CURSOR pointer_id; | 149 | LIB3270_CURSOR pointer_id; |
147 | - unsigned char pointer; /** Mouse pointer ID */ | ||
148 | - int selection_addr; /** Selection addr */ | 150 | + unsigned char pointer; /**< Mouse pointer ID */ |
151 | + int selection_addr; /**< Selection addr */ | ||
152 | + | ||
153 | + V3270_OIA_FIELD selected_field; /**< Clicked OIA field */ | ||
149 | 154 | ||
150 | // Font info | 155 | // Font info |
151 | gchar * font_family; | 156 | gchar * font_family; |
widget.c
@@ -333,6 +333,8 @@ static void v3270_class_init(v3270Class *klass) | @@ -333,6 +333,8 @@ static void v3270_class_init(v3270Class *klass) | ||
333 | // Cursors | 333 | // Cursors |
334 | { | 334 | { |
335 | #ifdef WIN32 | 335 | #ifdef WIN32 |
336 | + // http://git.gnome.org/browse/gtk+/tree/gdk/win32/gdkcursor-win32.c | ||
337 | + // http://www.functionx.com/win32/Lesson02b.htm | ||
336 | static const gchar * cr[V3270_CURSOR_COUNT] = | 338 | static const gchar * cr[V3270_CURSOR_COUNT] = |
337 | { | 339 | { |
338 | "ibeam", // V3270_CURSOR_UNPROTECTED | 340 | "ibeam", // V3270_CURSOR_UNPROTECTED |
@@ -348,6 +350,7 @@ static void v3270_class_init(v3270Class *klass) | @@ -348,6 +350,7 @@ static void v3270_class_init(v3270Class *klass) | ||
348 | "sizens", // V3270_CURSOR_SELECTION_BOTTOM | 350 | "sizens", // V3270_CURSOR_SELECTION_BOTTOM |
349 | "sizewe", // V3270_CURSOR_SELECTION_LEFT | 351 | "sizewe", // V3270_CURSOR_SELECTION_LEFT |
350 | "sizewe", // V3270_CURSOR_SELECTION_RIGHT | 352 | "sizewe", // V3270_CURSOR_SELECTION_RIGHT |
353 | + "help", // V3270_CURSOR_QUESTION | ||
351 | }; | 354 | }; |
352 | #else | 355 | #else |
353 | static const int cr[V3270_CURSOR_COUNT] = | 356 | static const int cr[V3270_CURSOR_COUNT] = |
@@ -365,6 +368,7 @@ static void v3270_class_init(v3270Class *klass) | @@ -365,6 +368,7 @@ static void v3270_class_init(v3270Class *klass) | ||
365 | GDK_BOTTOM_SIDE, // V3270_CURSOR_SELECTION_BOTTOM | 368 | GDK_BOTTOM_SIDE, // V3270_CURSOR_SELECTION_BOTTOM |
366 | GDK_LEFT_SIDE, // V3270_CURSOR_SELECTION_LEFT | 369 | GDK_LEFT_SIDE, // V3270_CURSOR_SELECTION_LEFT |
367 | GDK_RIGHT_SIDE, // V3270_CURSOR_SELECTION_RIGHT | 370 | GDK_RIGHT_SIDE, // V3270_CURSOR_SELECTION_RIGHT |
371 | + GDK_QUESTION_ARROW, // V3270_CURSOR_QUESTION | ||
368 | }; | 372 | }; |
369 | #endif // WIN32 | 373 | #endif // WIN32 |
370 | 374 | ||
@@ -516,6 +520,15 @@ static void v3270_class_init(v3270Class *klass) | @@ -516,6 +520,15 @@ static void v3270_class_init(v3270Class *klass) | ||
516 | pw3270_VOID__VOID_UINT_POINTER_POINTER_POINTER, | 520 | pw3270_VOID__VOID_UINT_POINTER_POINTER_POINTER, |
517 | G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); | 521 | G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
518 | 522 | ||
523 | + v3270_widget_signal[SIGNAL_FIELD] = | ||
524 | + g_signal_new( "field_clicked", | ||
525 | + G_OBJECT_CLASS_TYPE (gobject_class), | ||
526 | + G_SIGNAL_RUN_LAST, | ||
527 | + 0, | ||
528 | + NULL, NULL, | ||
529 | + pw3270_BOOL__VOID_BOOL_UINT_POINTER, | ||
530 | + G_TYPE_BOOLEAN, 3, G_TYPE_BOOLEAN, G_TYPE_UINT, G_TYPE_POINTER); | ||
531 | + | ||
519 | } | 532 | } |
520 | 533 | ||
521 | void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height) | 534 | void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height) |