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 |