Commit 06a2fa8d2219adc64a51d1e6fd075b2e26569f19

Authored by Perry Werneck
1 parent e4005363
Exists in master and in 1 other branch develop

Implementing copy with center button.

src/include/terminal.h
@@ -157,6 +157,7 @@ G_BEGIN_DECLS @@ -157,6 +157,7 @@ G_BEGIN_DECLS
157 int drawing : 1; /// @brief Draw widget? 157 int drawing : 1; /// @brief Draw widget?
158 int freeze : 1; /// @brief Truee when the "save settings" signal is disabled. 158 int freeze : 1; /// @brief Truee when the "save settings" signal is disabled.
159 int append : 1; /// @brief Next smart-copy operation will be append. 159 int append : 1; /// @brief Next smart-copy operation will be append.
  160 + int copying : 1; /// @brief Copy with center mouse button
160 161
161 /// @brief Action properties. 162 /// @brief Action properties.
162 GtkResponseType responses[V3270_TOGGLEABLE_DIALOG_CUSTOM]; 163 GtkResponseType responses[V3270_TOGGLEABLE_DIALOG_CUSTOM];
src/terminal/drawing/draw.c
@@ -118,22 +118,40 @@ gboolean v3270_expose(GtkWidget *widget, GdkEventExpose *event) @@ -118,22 +118,40 @@ gboolean v3270_expose(GtkWidget *widget, GdkEventExpose *event)
118 #endif // GTk3 118 #endif // GTk3
119 119
120 120
121 -static void get_element_colors(unsigned short attr, GdkRGBA **fg, GdkRGBA **bg, GdkRGBA *color)  
122 -{  
123 - if(attr & LIB3270_ATTR_SELECTED)  
124 - {  
125 - *fg = color+V3270_COLOR_SELECTED_FG;  
126 - *bg = color+V3270_COLOR_SELECTED_BG;  
127 - }  
128 - else  
129 - { 121 +static void get_element_colors(unsigned short attr, GdkRGBA **fg, GdkRGBA **bg, GdkRGBA *color) {
  122 +
  123 + int index[2];
  124 +
  125 + if(attr & LIB3270_ATTR_SELECTED) {
  126 +
  127 + index[0] = V3270_COLOR_SELECTED_FG;
  128 + index[1] = V3270_COLOR_SELECTED_BG;
  129 +
  130 +// *fg = color+V3270_COLOR_SELECTED_FG;
  131 +// *bg = color+V3270_COLOR_SELECTED_BG;
  132 +
  133 + } else {
  134 +
  135 + if(attr & LIB3270_ATTR_FIELD)
  136 + index[0] = (attr & 0x0003)+V3270_COLOR_FIELD;
  137 + else
  138 + index[0] = (attr & 0x000F);
  139 +
  140 + index[1] = ((attr & 0x00F0) >> 4);
  141 +
  142 + /*
130 *bg = color+((attr & 0x00F0) >> 4); 143 *bg = color+((attr & 0x00F0) >> 4);
131 144
132 if(attr & LIB3270_ATTR_FIELD) 145 if(attr & LIB3270_ATTR_FIELD)
133 *fg = color+(attr & 0x0003)+V3270_COLOR_FIELD; 146 *fg = color+(attr & 0x0003)+V3270_COLOR_FIELD;
134 else 147 else
135 *fg = color+(attr & 0x000F); 148 *fg = color+(attr & 0x000F);
  149 + */
136 } 150 }
  151 +
  152 + *fg = color+index[0];
  153 + *bg = color+index[1];
  154 +
137 } 155 }
138 156
139 void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *fontInfo, GdkRectangle *rect, GdkRGBA *color) 157 void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *fontInfo, GdkRectangle *rect, GdkRGBA *color)
src/terminal/mouse.c
@@ -84,24 +84,23 @@ static void single_click(v3270 *widget, int baddr) { @@ -84,24 +84,23 @@ static void single_click(v3270 *widget, int baddr) {
84 84
85 } 85 }
86 86
87 -static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr)  
88 -{ 87 +static void button_1_press(v3270 *terminal, GdkEventType type, int baddr) {
89 #pragma GCC diagnostic push 88 #pragma GCC diagnostic push
90 #pragma GCC diagnostic ignored "-Wswitch" 89 #pragma GCC diagnostic ignored "-Wswitch"
91 90
92 switch(type) { 91 switch(type) {
93 case GDK_BUTTON_PRESS: // Single click - set mode 92 case GDK_BUTTON_PRESS: // Single click - set mode
94 - single_click(GTK_V3270(widget),baddr); 93 + single_click(terminal,baddr);
95 break; 94 break;
96 95
97 case GDK_2BUTTON_PRESS: // Double click - Select word 96 case GDK_2BUTTON_PRESS: // Double click - Select word
98 - if(lib3270_select_word_at(GTK_V3270(widget)->host,baddr))  
99 - lib3270_ring_bell(GTK_V3270(widget)->host); 97 + if(lib3270_select_word_at(terminal->host,baddr))
  98 + lib3270_ring_bell(terminal->host);
100 break; 99 break;
101 100
102 case GDK_3BUTTON_PRESS: // Triple clock - Select field 101 case GDK_3BUTTON_PRESS: // Triple clock - Select field
103 - if(lib3270_select_field_at(GTK_V3270(widget)->host,baddr))  
104 - lib3270_ring_bell(GTK_V3270(widget)->host); 102 + if(lib3270_select_field_at(terminal->host,baddr))
  103 + lib3270_ring_bell(terminal->host);
105 break; 104 break;
106 105
107 } 106 }
@@ -110,6 +109,33 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr) @@ -110,6 +109,33 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr)
110 109
111 } 110 }
112 111
  112 +static void button_2_press(v3270 *terminal, GdkEventType type, int baddr) {
  113 + #pragma GCC diagnostic push
  114 + #pragma GCC diagnostic ignored "-Wswitch"
  115 +
  116 + switch(type) {
  117 + case GDK_BUTTON_PRESS: // Single click - set mode
  118 + if(lib3270_get_selection_flags(terminal->host,baddr)) {
  119 +
  120 + debug("%s: Center button press over selected area.", __FUNCTION__);
  121 + terminal->copying = 1;
  122 +
  123 + }
  124 + break;
  125 +
  126 + case GDK_2BUTTON_PRESS: // Double click - Select word
  127 + terminal->copying = 0;
  128 + lib3270_unselect(terminal->host);
  129 + break;
  130 +
  131 + default:
  132 + terminal->copying = 0;
  133 +
  134 + }
  135 +
  136 + #pragma GCC diagnostic pop
  137 +}
  138 +
113 void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) { 139 void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) {
114 unsigned char chr = 0; 140 unsigned char chr = 0;
115 unsigned short attr; 141 unsigned short attr;
@@ -147,19 +173,26 @@ static V3270_OIA_FIELD get_field_from_event(v3270 *widget, GdkEventButton *event @@ -147,19 +173,26 @@ static V3270_OIA_FIELD get_field_from_event(v3270 *widget, GdkEventButton *event
147 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) 173 gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event)
148 { 174 {
149 int baddr = v3270_get_offset_at_point(GTK_V3270(widget),event->x,event->y); 175 int baddr = v3270_get_offset_at_point(GTK_V3270(widget),event->x,event->y);
  176 + v3270 * terminal = GTK_V3270(widget);
150 177
151 if(baddr >= 0) { 178 if(baddr >= 0) {
152 179
153 // Click inside the terminal contents. 180 // Click inside the terminal contents.
  181 + debug("Button %d pressed on terminal addr %d",(int) event->button,baddr);
154 182
155 - GTK_V3270(widget)->oia.selected = V3270_OIA_FIELD_INVALID; 183 + terminal->oia.selected = V3270_OIA_FIELD_INVALID;
156 184
157 switch(event->button) { 185 switch(event->button) {
158 case 1: // Left button 186 case 1: // Left button
159 - button_1_press(widget,event->type,baddr); 187 + button_1_press(terminal,event->type,baddr);
  188 + break;
  189 +
  190 + case 2: // Center button
  191 + button_2_press(terminal,event->type,baddr);
160 break; 192 break;
161 193
162 case 3: // Right button 194 case 3: // Right button
  195 +
163 if(event->type == GDK_BUTTON_PRESS) 196 if(event->type == GDK_BUTTON_PRESS)
164 v3270_emit_popup(GTK_V3270(widget),baddr,event); 197 v3270_emit_popup(GTK_V3270(widget),baddr,event);
165 break; 198 break;
@@ -204,19 +237,23 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event) @@ -204,19 +237,23 @@ gboolean v3270_button_press_event(GtkWidget *widget, GdkEventButton *event)
204 return FALSE; 237 return FALSE;
205 } 238 }
206 239
207 -gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event)  
208 -{ 240 +gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) {
  241 +
  242 + v3270 * terminal = GTK_V3270(widget);
  243 +
  244 + debug("%s(%d)",__FUNCTION__,(int) event->button);
  245 +
209 switch(event->button) { 246 switch(event->button) {
210 case 1: // Left button 247 case 1: // Left button
211 - GTK_V3270(widget)->selecting = 0;  
212 - GTK_V3270(widget)->moving = 0;  
213 - GTK_V3270(widget)->resizing = 0; 248 + terminal->selecting = 0;
  249 + terminal->moving = 0;
  250 + terminal->resizing = 0;
214 251
215 - if(GTK_V3270(widget)->oia.selected != V3270_OIA_FIELD_INVALID && GTK_V3270(widget)->oia.selected == get_field_from_event(GTK_V3270(widget),event)) 252 + if(terminal->oia.selected != V3270_OIA_FIELD_INVALID && terminal->oia.selected == get_field_from_event(terminal,event))
216 { 253 {
217 gboolean handled = FALSE; 254 gboolean handled = FALSE;
218 - gboolean connected = lib3270_is_connected(GTK_V3270(widget)->host) ? TRUE : FALSE;  
219 - V3270_OIA_FIELD field = GTK_V3270(widget)->oia.selected; 255 + gboolean connected = lib3270_is_connected(terminal->host) ? TRUE : FALSE;
  256 + V3270_OIA_FIELD field = terminal->oia.selected;
220 257
221 g_signal_emit(widget, v3270_widget_signal[V3270_SIGNAL_FIELD], 0, 258 g_signal_emit(widget, v3270_widget_signal[V3270_SIGNAL_FIELD], 0,
222 connected, 259 connected,
@@ -243,12 +280,23 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) @@ -243,12 +280,23 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event)
243 280
244 } 281 }
245 282
246 - GTK_V3270(widget)->oia.selected = V3270_OIA_FIELD_INVALID; 283 + terminal->oia.selected = V3270_OIA_FIELD_INVALID;
  284 +
  285 + break;
  286 +
  287 + case 2: // Center button
  288 +
  289 + if(lib3270_has_selection(terminal->host)) {
  290 + debug("%s: Copy with center button",__FUNCTION__);
  291 + v3270_clipboard_set(widget,V3270_COPY_SMART,FALSE);
  292 + }
247 293
248 break; 294 break;
249 295
250 } 296 }
251 297
  298 + terminal->copying = 0;
  299 +
252 return FALSE; 300 return FALSE;
253 } 301 }
254 302