Commit 06a2fa8d2219adc64a51d1e6fd075b2e26569f19
1 parent
e4005363
Exists in
master
and in
1 other branch
Implementing copy with center button.
Showing
3 changed files
with
94 additions
and
27 deletions
Show diff stats
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 |