Commit 56954fbde3f8aa1d42072b04b266285702e7ead8
1 parent
9718680e
Exists in
master
and in
1 other branch
Implementing configuration for the "paste screen" option.
Showing
7 changed files
with
54 additions
and
11 deletions
Show diff stats
src/dialogs/settings/clipboard.c
... | ... | @@ -146,7 +146,17 @@ |
146 | 146 | .top = 2, |
147 | 147 | .width = 1, |
148 | 148 | .height = 1, |
149 | - .grid = 2 | |
149 | + .grid = HTML_SETTINGS | |
150 | + }, | |
151 | + | |
152 | + { | |
153 | + .label = N_("Paste formatted screen"), | |
154 | + .tooltip = N_("If enabled search clipboard for a similar screen, if found paste unprotected fields and restore cursor position"), | |
155 | + .left = 0, | |
156 | + .top = 2, | |
157 | + .width = 1, | |
158 | + .height = 1, | |
159 | + .grid = PASTE_SETTINGS | |
150 | 160 | } |
151 | 161 | |
152 | 162 | }; |
... | ... | @@ -336,7 +346,7 @@ static void V3270ClipboardSettings_init(V3270ClipboardSettings *widget) { |
336 | 346 | // Copy format combo |
337 | 347 | static const gchar * copy_formats[] = { |
338 | 348 | N_("Plain text only"), |
339 | - N_("Complete with terminal attributes") | |
349 | + N_("Screen with terminal attributes") | |
340 | 350 | }; |
341 | 351 | |
342 | 352 | gtk_combo_box_set_id_column(widget->input.combos[0],1); |
... | ... | @@ -434,6 +444,7 @@ static void load(GtkWidget *w, GtkWidget *t) { |
434 | 444 | gtk_combo_box_set_active_id(widget->input.combos[2],(terminal->selection.options & (V3270_SELECTION_ENABLE_HTML|V3270_SELECTION_DIALOG_STATE)) == 0 ? "0" : "1"); |
435 | 445 | |
436 | 446 | gtk_toggle_button_set_active(widget->input.checkboxes[0],(terminal->selection.options & V3270_SELECTION_NON_BREAKABLE_SPACE) != 0); |
447 | + gtk_toggle_button_set_active(widget->input.checkboxes[1],(terminal->selection.options & V3270_SELECTION_SCREEN_PASTE) != 0); | |
437 | 448 | |
438 | 449 | // |
439 | 450 | // Set font combo-box |
... | ... | @@ -507,6 +518,12 @@ static void apply(GtkWidget *w, GtkWidget *t) { |
507 | 518 | terminal->selection.options &= ~V3270_SELECTION_NON_BREAKABLE_SPACE; |
508 | 519 | } |
509 | 520 | |
521 | + if(gtk_toggle_button_get_active(widget->input.checkboxes[0])) { | |
522 | + terminal->selection.options |= V3270_SELECTION_SCREEN_PASTE; | |
523 | + } else { | |
524 | + terminal->selection.options &= ~V3270_SELECTION_SCREEN_PASTE; | |
525 | + } | |
526 | + | |
510 | 527 | // Get font settings |
511 | 528 | switch(get_active_id(widget,0)) { |
512 | 529 | case '0': | ... | ... |
src/include/terminal.h
... | ... | @@ -125,6 +125,7 @@ G_BEGIN_DECLS |
125 | 125 | V3270_SELECTION_COLORS = 0x0002, ///< @brief Inform terminal colors. |
126 | 126 | V3270_SELECTION_NON_BREAKABLE_SPACE = 0x0004, ///< @brief Use non breakable spaces. |
127 | 127 | V3270_SELECTION_DIALOG_STATE = 0x0010, ///< @brief Used for settings dialog. |
128 | + V3270_SELECTION_SCREEN_PASTE = 0x0020, ///< @brief Enable screen paste. | |
128 | 129 | |
129 | 130 | } V3270SelectionOption; |
130 | 131 | ... | ... |
src/selection/copy.c
... | ... | @@ -54,7 +54,8 @@ |
54 | 54 | |
55 | 55 | // ... and set the new mode. |
56 | 56 | if(mode == V3270_COPY_DEFAULT) { |
57 | - mode = (lib3270_get_toggle(v3270_get_session(widget),LIB3270_TOGGLE_SMART_PASTE) ? V3270_COPY_FORMATTED : V3270_COPY_TEXT); | |
57 | +// mode = (lib3270_get_toggle(v3270_get_session(widget),LIB3270_TOGGLE_SMART_PASTE) ? V3270_COPY_FORMATTED : V3270_COPY_TEXT); | |
58 | + mode = V3270_COPY_FORMATTED; | |
58 | 59 | } |
59 | 60 | |
60 | 61 | terminal->selection.format = mode; | ... | ... |
src/selection/linux/paste.c
... | ... | @@ -176,13 +176,15 @@ static void formatted_received(GtkClipboard *clipboard, GtkSelectionData *select |
176 | 176 | |
177 | 177 | } |
178 | 178 | |
179 | -static void targets_received(GtkClipboard *clipboard, GdkAtom *atoms, gint n_atoms, GtkWidget *widget) | |
180 | -{ | |
179 | +static void targets_received(GtkClipboard *clipboard, GdkAtom *atoms, gint n_atoms, GtkWidget *widget) { | |
181 | 180 | |
182 | 181 | // If smart paste is enabled try to get formatted clipboard. |
183 | - debug("%s: Smart paste is %s", __FUNCTION__, (lib3270_get_toggle(GTK_V3270(widget)->host,LIB3270_TOGGLE_SMART_PASTE) ? "enabled" : "disabled")); | |
184 | - if(lib3270_get_toggle(GTK_V3270(widget)->host,LIB3270_TOGGLE_SMART_PASTE) && has_target(GTK_V3270_GET_CLASS(widget)->clipboard_formatted,atoms,n_atoms)) | |
185 | - { | |
182 | + gboolean screen_paste = ((GTK_V3270(widget)->selection.options & V3270_SELECTION_SCREEN_PASTE) != 0); | |
183 | + | |
184 | + debug("%s: Screen paste is %s", __FUNCTION__, screen_paste ? "enabled" : "disabled"); | |
185 | + | |
186 | + if(screen_paste && has_target(GTK_V3270_GET_CLASS(widget)->clipboard_formatted,atoms,n_atoms)) { | |
187 | + | |
186 | 188 | debug("Clipboard as TN3270 \"%s\" data",gdk_atom_name(GTK_V3270_GET_CLASS(widget)->clipboard_formatted)); |
187 | 189 | |
188 | 190 | gtk_clipboard_request_contents( |
... | ... | @@ -225,7 +227,6 @@ LIB3270_EXPORT void v3270_clipboard_get_from_url(GtkWidget *widget, const gchar |
225 | 227 | (GtkClipboardTextReceivedFunc) text_received, |
226 | 228 | (gpointer) widget |
227 | 229 | ); |
228 | - | |
229 | 230 | } |
230 | 231 | else if(g_str_has_prefix(url,"file://")) |
231 | 232 | { |
... | ... | @@ -234,6 +235,15 @@ LIB3270_EXPORT void v3270_clipboard_get_from_url(GtkWidget *widget, const gchar |
234 | 235 | v3270_load_dialog_run(dialog); |
235 | 236 | gtk_widget_destroy(dialog); |
236 | 237 | } |
238 | + else if(g_str_has_prefix(url,"screen://")) | |
239 | + { | |
240 | + gtk_clipboard_request_contents( | |
241 | + clipboard, | |
242 | + GTK_V3270_GET_CLASS(widget)->clipboard_formatted, | |
243 | + (GtkClipboardReceivedFunc) formatted_received, | |
244 | + (gpointer) widget | |
245 | + ); | |
246 | + } | |
237 | 247 | |
238 | 248 | } |
239 | 249 | ... | ... |
src/terminal/actions/action.c
... | ... | @@ -248,7 +248,7 @@ |
248 | 248 | |
249 | 249 | } |
250 | 250 | |
251 | - void set_property(GObject G_GNUC_UNUSED(*object), guint G_GNUC_UNUSED(prop_id), const GValue G_GNUC_UNUSED(*value), GParamSpec *pspec) { | |
251 | + void set_property(GObject G_GNUC_UNUSED(*object), guint G_GNUC_UNUSED(prop_id), const GValue G_GNUC_UNUSED(*value), GParamSpec G_GNUC_UNUSED(*pspec)) { | |
252 | 252 | // g_message("Action %s property %s is read-only",g_action_get_name(G_ACTION(object)),pspec->name); |
253 | 253 | } |
254 | 254 | ... | ... |
src/terminal/actions/clipboard.c
... | ... | @@ -50,7 +50,6 @@ |
50 | 50 | |
51 | 51 | int fire_paste_accelerator(GtkWidget *widget, const V3270_ACTION * action) { |
52 | 52 | |
53 | - | |
54 | 53 | switch((int) action->flags) |
55 | 54 | { |
56 | 55 | case 0: // Default paste. |
... | ... | @@ -65,6 +64,10 @@ |
65 | 64 | v3270_clipboard_get_from_url(widget,"file://"); |
66 | 65 | break; |
67 | 66 | |
67 | + case 3: // screen paste. | |
68 | + v3270_clipboard_get_from_url(widget,"screen://"); | |
69 | + break; | |
70 | + | |
68 | 71 | default: |
69 | 72 | g_warning("Unexpected paste flags %u",(unsigned int) action->flags); |
70 | 73 | } | ... | ... |
src/terminal/actions/table.c
... | ... | @@ -193,6 +193,17 @@ |
193 | 193 | .activate = fire_paste_accelerator |
194 | 194 | }, |
195 | 195 | |
196 | + { | |
197 | + .flags = 3, | |
198 | + .group = LIB3270_ACTION_GROUP_ONLINE, | |
199 | + .name = "paste-screen", | |
200 | + .label = N_("Paste formatted screen"), | |
201 | + .summary = N_("Search clipboard for a similar screen, if found paste unprotected fields and restore cursor position"), | |
202 | + .key = 'v', | |
203 | + .mods = GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK, | |
204 | + .activate = fire_paste_accelerator | |
205 | + }, | |
206 | + | |
196 | 207 | { |
197 | 208 | .flags = 0, |
198 | 209 | .group = LIB3270_ACTION_GROUP_ONLINE, | ... | ... |