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 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
... ... @@ -6,3 +6,4 @@ VOID:VOID,POINTER,POINTER
6 6 VOID:VOID,UINT,POINTER
7 7 BOOL:VOID,UINT,ENUM
8 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 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  
... ...