Commit 7d6d8411cc41b078989f8a6e58d877c947d7c856

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

Implementando suporte a popup-menu por sinal

src/gtk/mainwindow.c
@@ -97,6 +97,12 @@ @@ -97,6 +97,12 @@
97 set_integer_to_config("terminal","model",id); 97 set_integer_to_config("terminal","model",id);
98 } 98 }
99 99
  100 + static gboolean popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, gpointer popup)
  101 + {
  102 + trace("Popup on widget %p online=%s selected=%s",widget,online ? "Yes" : "No", selected ? "Yes" : "No");
  103 + return TRUE;
  104 + }
  105 +
100 static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group) 106 static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group)
101 { 107 {
102 trace("Widget %p selection state changed to %s",widget,on ? "Yes" : "No"); 108 trace("Widget %p selection state changed to %s",widget,on ? "Yes" : "No");
@@ -219,6 +225,7 @@ @@ -219,6 +225,7 @@
219 g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0); 225 g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0);
220 g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0); 226 g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0);
221 g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group); 227 g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group);
  228 + g_signal_connect(terminal,"popup",G_CALLBACK(popup),NULL);
222 229
223 g_free(path); 230 g_free(path);
224 gtk_widget_grab_focus(terminal); 231 gtk_widget_grab_focus(terminal);
src/gtk/v3270/genmarshal
@@ -6,3 +6,4 @@ VOID:VOID,POINTER,POINTER @@ -6,3 +6,4 @@ VOID:VOID,POINTER,POINTER
6 VOID:VOID,UINT,POINTER 6 VOID:VOID,UINT,POINTER
7 BOOL:VOID,UINT,ENUM 7 BOOL:VOID,UINT,ENUM
8 VOID:VOID,BOOL 8 VOID:VOID,BOOL
  9 +VOID:VOID,BOOL,BOOL,POINTER
src/gtk/v3270/mouse.c
@@ -63,10 +63,12 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr) @@ -63,10 +63,12 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr)
63 lib3270_clear_selection(GTK_V3270(widget)->host); 63 lib3270_clear_selection(GTK_V3270(widget)->host);
64 break; 64 break;
65 65
66 - case GDK_2BUTTON_PRESS: // Double click - Select work 66 + case GDK_2BUTTON_PRESS: // Double click - Select word
  67 + lib3270_select_word(GTK_V3270(widget)->host,baddr);
67 break; 68 break;
68 69
69 case GDK_3BUTTON_PRESS: // Triple clock - Select field 70 case GDK_3BUTTON_PRESS: // Triple clock - Select field
  71 + lib3270_select_field(GTK_V3270(widget)->host,baddr);
70 break; 72 break;
71 73
72 #ifdef DEBUG 74 #ifdef DEBUG
@@ -76,6 +78,26 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr) @@ -76,6 +78,26 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr)
76 } 78 }
77 } 79 }
78 80
  81 +void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event)
  82 +{
  83 + unsigned char chr = 0;
  84 + unsigned short attr;
  85 + gboolean handled = FALSE;
  86 +
  87 + lib3270_get_contents(widget->host,baddr,baddr,&chr,&attr);
  88 +
  89 + g_signal_emit(GTK_WIDGET(widget), v3270_widget_signal[SIGNAL_POPUP], 0,
  90 + (attr & LIB3270_ATTR_SELECTED) ? TRUE : FALSE,
  91 + lib3270_connected(widget->host) ? TRUE : FALSE,
  92 + event,
  93 + &handled);
  94 +
  95 + if(handled)
  96 + return;
  97 +
  98 + gdk_beep();
  99 +}
  100 +
79 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) 101 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event)
80 { 102 {
81 int baddr = decode_position(GTK_V3270(widget),event->x,event->y); 103 int baddr = decode_position(GTK_V3270(widget),event->x,event->y);
@@ -87,11 +109,13 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) @@ -87,11 +109,13 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event)
87 109
88 switch(event->button) 110 switch(event->button)
89 { 111 {
90 - case 1: 112 + case 1: // Left button
91 button_1_press(widget,event->type,baddr); 113 button_1_press(widget,event->type,baddr);
92 -// lib3270_set_cursor_address(GTK_V3270(widget)->host,baddr);  
93 -// GTK_V3270(widget)->selecting = 1;  
94 -// lib3270_clear_selection(GTK_V3270(widget)->host); 114 + break;
  115 +
  116 + case 3: // Right button
  117 + if(event->type == GDK_BUTTON_PRESS)
  118 + v3270_emit_popup(GTK_V3270(widget),baddr,event);
95 break; 119 break;
96 120
97 default: 121 default:
src/gtk/v3270/private.h
@@ -73,6 +73,7 @@ G_BEGIN_DECLS @@ -73,6 +73,7 @@ G_BEGIN_DECLS
73 SIGNAL_UPDATE_CONFIG, 73 SIGNAL_UPDATE_CONFIG,
74 SIGNAL_MODEL_CHANGED, 74 SIGNAL_MODEL_CHANGED,
75 SIGNAL_SELECTING, 75 SIGNAL_SELECTING,
  76 + SIGNAL_POPUP,
76 77
77 LAST_SIGNAL 78 LAST_SIGNAL
78 }; 79 };
@@ -127,5 +128,6 @@ void v3270_key_commit(GtkIMContext *imcontext, gchar *str, v3270 *widget); @@ -127,5 +128,6 @@ void v3270_key_commit(GtkIMContext *imcontext, gchar *str, v3270 *widget);
127 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event); 128 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event);
128 gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event); 129 gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event);
129 gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event); 130 gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event);
  131 +void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event);
130 132
131 G_END_DECLS 133 G_END_DECLS
src/gtk/v3270/widget.c
@@ -124,6 +124,23 @@ static void loghandler(H3270 *session, const char *module, int rc, const char *f @@ -124,6 +124,23 @@ static void loghandler(H3270 *session, const char *module, int rc, const char *f
124 g_logv(module,rc ? G_LOG_LEVEL_WARNING : G_LOG_LEVEL_MESSAGE, fmt, args); 124 g_logv(module,rc ? G_LOG_LEVEL_WARNING : G_LOG_LEVEL_MESSAGE, fmt, args);
125 } 125 }
126 126
  127 +static gboolean v3270_popup_menu(GtkWidget * widget)
  128 +{
  129 + GdkEventButton event;
  130 +
  131 + memset(&event,0,sizeof(event));
  132 +
  133 + event.time = gtk_get_current_event_time();
  134 + event.button = 3;
  135 + event.type = GDK_BUTTON_PRESS;
  136 +
  137 + v3270_emit_popup( GTK_V3270(widget),
  138 + lib3270_get_cursor_address(GTK_V3270(widget)->host),
  139 + &event );
  140 +
  141 + return TRUE;
  142 +}
  143 +
127 static void v3270_class_init(v3270Class *klass) 144 static void v3270_class_init(v3270Class *klass)
128 { 145 {
129 GObjectClass * gobject_class = G_OBJECT_CLASS(klass); 146 GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
@@ -140,6 +157,7 @@ static void v3270_class_init(v3270Class *klass) @@ -140,6 +157,7 @@ static void v3270_class_init(v3270Class *klass)
140 widget_class->button_press_event = v3270_button_press_event; 157 widget_class->button_press_event = v3270_button_press_event;
141 widget_class->button_release_event = v3270_button_release_event; 158 widget_class->button_release_event = v3270_button_release_event;
142 widget_class->motion_notify_event = v3270_motion_notify_event; 159 widget_class->motion_notify_event = v3270_motion_notify_event;
  160 + widget_class->popup_menu = v3270_popup_menu;
143 161
144 klass->activate = v3270_activate; 162 klass->activate = v3270_activate;
145 klass->toggle_changed = v3270_toggle_changed; 163 klass->toggle_changed = v3270_toggle_changed;
@@ -262,6 +280,15 @@ static void v3270_class_init(v3270Class *klass) @@ -262,6 +280,15 @@ static void v3270_class_init(v3270Class *klass)
262 NULL, NULL, 280 NULL, NULL,
263 pw3270_VOID__VOID_BOOL, 281 pw3270_VOID__VOID_BOOL,
264 G_TYPE_NONE, 1, G_TYPE_BOOLEAN); 282 G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
  283 +
  284 + v3270_widget_signal[SIGNAL_POPUP] =
  285 + g_signal_new( "popup",
  286 + G_OBJECT_CLASS_TYPE (gobject_class),
  287 + G_SIGNAL_RUN_FIRST,
  288 + 0,
  289 + NULL, NULL,
  290 + pw3270_VOID__VOID_BOOL_BOOL_POINTER,
  291 + G_TYPE_NONE, 3, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_POINTER);
265 } 292 }
266 293
267 void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height) 294 void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int height)
src/lib3270/selection.c
@@ -182,6 +182,9 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) @@ -182,6 +182,9 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr)
182 { 182 {
183 CHECK_SESSION_HANDLE(session); 183 CHECK_SESSION_HANDLE(session);
184 184
  185 + if(!lib3270_connected(session))
  186 + return;
  187 +
185 lib3270_set_cursor_address(session,session->selected.end = baddr); 188 lib3270_set_cursor_address(session,session->selected.end = baddr);
186 189
187 if(session->selected.begin < 0) 190 if(session->selected.begin < 0)
@@ -200,22 +203,34 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr) @@ -200,22 +203,34 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr)
200 203
201 CHECK_SESSION_HANDLE(session); 204 CHECK_SESSION_HANDLE(session);
202 205
  206 + if(!lib3270_connected(session) || isspace(ea_buf[baddr].chr))
  207 + {
  208 + ring_bell();
  209 + return;
  210 + }
  211 +
203 for(pos = baddr; pos > 0 && !isspace(ea_buf[pos].chr);pos--); 212 for(pos = baddr; pos > 0 && !isspace(ea_buf[pos].chr);pos--);
204 - session->selected.begin = pos; 213 + session->selected.begin = pos > 0 ? pos+1 : 0;
205 214
206 len = session->rows * session->cols; 215 len = session->rows * session->cols;
207 for(pos = baddr; pos < len && !isspace(ea_buf[pos].chr);pos++); 216 for(pos = baddr; pos < len && !isspace(ea_buf[pos].chr);pos++);
208 - session->selected.end = pos; 217 + session->selected.end = pos < len ? pos-1 : len;
209 218
210 update_selected_region(session); 219 update_selected_region(session);
211 } 220 }
212 221
213 LIB3270_EXPORT int lib3270_select_field(H3270 *session, int baddr) 222 LIB3270_EXPORT int lib3270_select_field(H3270 *session, int baddr)
214 { 223 {
215 - int start; 224 + int start,len;
216 225
217 CHECK_SESSION_HANDLE(session); 226 CHECK_SESSION_HANDLE(session);
218 227
  228 + if(!lib3270_connected(session))
  229 + {
  230 + ring_bell();
  231 + return;
  232 + }
  233 +
219 start = lib3270_field_addr(session,baddr); 234 start = lib3270_field_addr(session,baddr);
220 235
221 if(start < 0) 236 if(start < 0)
@@ -224,8 +239,13 @@ LIB3270_EXPORT int lib3270_select_field(H3270 *session, int baddr) @@ -224,8 +239,13 @@ LIB3270_EXPORT int lib3270_select_field(H3270 *session, int baddr)
224 return -1; 239 return -1;
225 } 240 }
226 241
227 - session->selected.begin = start; 242 + session->selected.begin = (start+1);
  243 +
  244 + len = (session->rows * session->cols)-1;
  245 +
228 session->selected.end = start + lib3270_field_length(session,start); 246 session->selected.end = start + lib3270_field_length(session,start);
  247 + if(session->selected.end > len)
  248 + session->selected.end = len;
229 249
230 update_selected_region(session); 250 update_selected_region(session);
231 251