Commit 7d6d8411cc41b078989f8a6e58d877c947d7c856
1 parent
d1a0641a
Exists in
master
and in
5 other branches
Implementando suporte a popup-menu por sinal
Showing
6 changed files
with
90 additions
and
9 deletions
Show diff stats
src/gtk/mainwindow.c
... | ... | @@ -97,6 +97,12 @@ |
97 | 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 | 106 | static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group) |
101 | 107 | { |
102 | 108 | trace("Widget %p selection state changed to %s",widget,on ? "Yes" : "No"); |
... | ... | @@ -219,6 +225,7 @@ |
219 | 225 | g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0); |
220 | 226 | g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0); |
221 | 227 | g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group); |
228 | + g_signal_connect(terminal,"popup",G_CALLBACK(popup),NULL); | |
222 | 229 | |
223 | 230 | g_free(path); |
224 | 231 | gtk_widget_grab_focus(terminal); | ... | ... |
src/gtk/v3270/genmarshal
src/gtk/v3270/mouse.c
... | ... | @@ -63,10 +63,12 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr) |
63 | 63 | lib3270_clear_selection(GTK_V3270(widget)->host); |
64 | 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 | 68 | break; |
68 | 69 | |
69 | 70 | case GDK_3BUTTON_PRESS: // Triple clock - Select field |
71 | + lib3270_select_field(GTK_V3270(widget)->host,baddr); | |
70 | 72 | break; |
71 | 73 | |
72 | 74 | #ifdef DEBUG |
... | ... | @@ -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 | 101 | gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) |
80 | 102 | { |
81 | 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 | 109 | |
88 | 110 | switch(event->button) |
89 | 111 | { |
90 | - case 1: | |
112 | + case 1: // Left button | |
91 | 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 | 119 | break; |
96 | 120 | |
97 | 121 | default: | ... | ... |
src/gtk/v3270/private.h
... | ... | @@ -73,6 +73,7 @@ G_BEGIN_DECLS |
73 | 73 | SIGNAL_UPDATE_CONFIG, |
74 | 74 | SIGNAL_MODEL_CHANGED, |
75 | 75 | SIGNAL_SELECTING, |
76 | + SIGNAL_POPUP, | |
76 | 77 | |
77 | 78 | LAST_SIGNAL |
78 | 79 | }; |
... | ... | @@ -127,5 +128,6 @@ void v3270_key_commit(GtkIMContext *imcontext, gchar *str, v3270 *widget); |
127 | 128 | gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event); |
128 | 129 | gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event); |
129 | 130 | gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event); |
131 | +void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event); | |
130 | 132 | |
131 | 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 | 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 | 144 | static void v3270_class_init(v3270Class *klass) |
128 | 145 | { |
129 | 146 | GObjectClass * gobject_class = G_OBJECT_CLASS(klass); |
... | ... | @@ -140,6 +157,7 @@ static void v3270_class_init(v3270Class *klass) |
140 | 157 | widget_class->button_press_event = v3270_button_press_event; |
141 | 158 | widget_class->button_release_event = v3270_button_release_event; |
142 | 159 | widget_class->motion_notify_event = v3270_motion_notify_event; |
160 | + widget_class->popup_menu = v3270_popup_menu; | |
143 | 161 | |
144 | 162 | klass->activate = v3270_activate; |
145 | 163 | klass->toggle_changed = v3270_toggle_changed; |
... | ... | @@ -262,6 +280,15 @@ static void v3270_class_init(v3270Class *klass) |
262 | 280 | NULL, NULL, |
263 | 281 | pw3270_VOID__VOID_BOOL, |
264 | 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 | 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 | 182 | { |
183 | 183 | CHECK_SESSION_HANDLE(session); |
184 | 184 | |
185 | + if(!lib3270_connected(session)) | |
186 | + return; | |
187 | + | |
185 | 188 | lib3270_set_cursor_address(session,session->selected.end = baddr); |
186 | 189 | |
187 | 190 | if(session->selected.begin < 0) |
... | ... | @@ -200,22 +203,34 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr) |
200 | 203 | |
201 | 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 | 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 | 215 | len = session->rows * session->cols; |
207 | 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 | 219 | update_selected_region(session); |
211 | 220 | } |
212 | 221 | |
213 | 222 | LIB3270_EXPORT int lib3270_select_field(H3270 *session, int baddr) |
214 | 223 | { |
215 | - int start; | |
224 | + int start,len; | |
216 | 225 | |
217 | 226 | CHECK_SESSION_HANDLE(session); |
218 | 227 | |
228 | + if(!lib3270_connected(session)) | |
229 | + { | |
230 | + ring_bell(); | |
231 | + return; | |
232 | + } | |
233 | + | |
219 | 234 | start = lib3270_field_addr(session,baddr); |
220 | 235 | |
221 | 236 | if(start < 0) |
... | ... | @@ -224,8 +239,13 @@ LIB3270_EXPORT int lib3270_select_field(H3270 *session, int baddr) |
224 | 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 | 246 | session->selected.end = start + lib3270_field_length(session,start); |
247 | + if(session->selected.end > len) | |
248 | + session->selected.end = len; | |
229 | 249 | |
230 | 250 | update_selected_region(session); |
231 | 251 | ... | ... |