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