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,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
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 |