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,7 +146,17 @@ | ||
| 146 | .top = 2, | 146 | .top = 2, |
| 147 | .width = 1, | 147 | .width = 1, |
| 148 | .height = 1, | 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,7 +346,7 @@ static void V3270ClipboardSettings_init(V3270ClipboardSettings *widget) { | ||
| 336 | // Copy format combo | 346 | // Copy format combo |
| 337 | static const gchar * copy_formats[] = { | 347 | static const gchar * copy_formats[] = { |
| 338 | N_("Plain text only"), | 348 | N_("Plain text only"), |
| 339 | - N_("Complete with terminal attributes") | 349 | + N_("Screen with terminal attributes") |
| 340 | }; | 350 | }; |
| 341 | 351 | ||
| 342 | gtk_combo_box_set_id_column(widget->input.combos[0],1); | 352 | gtk_combo_box_set_id_column(widget->input.combos[0],1); |
| @@ -434,6 +444,7 @@ static void load(GtkWidget *w, GtkWidget *t) { | @@ -434,6 +444,7 @@ static void load(GtkWidget *w, GtkWidget *t) { | ||
| 434 | gtk_combo_box_set_active_id(widget->input.combos[2],(terminal->selection.options & (V3270_SELECTION_ENABLE_HTML|V3270_SELECTION_DIALOG_STATE)) == 0 ? "0" : "1"); | 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 | gtk_toggle_button_set_active(widget->input.checkboxes[0],(terminal->selection.options & V3270_SELECTION_NON_BREAKABLE_SPACE) != 0); | 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 | // Set font combo-box | 450 | // Set font combo-box |
| @@ -507,6 +518,12 @@ static void apply(GtkWidget *w, GtkWidget *t) { | @@ -507,6 +518,12 @@ static void apply(GtkWidget *w, GtkWidget *t) { | ||
| 507 | terminal->selection.options &= ~V3270_SELECTION_NON_BREAKABLE_SPACE; | 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 | // Get font settings | 527 | // Get font settings |
| 511 | switch(get_active_id(widget,0)) { | 528 | switch(get_active_id(widget,0)) { |
| 512 | case '0': | 529 | case '0': |
src/include/terminal.h
| @@ -125,6 +125,7 @@ G_BEGIN_DECLS | @@ -125,6 +125,7 @@ G_BEGIN_DECLS | ||
| 125 | V3270_SELECTION_COLORS = 0x0002, ///< @brief Inform terminal colors. | 125 | V3270_SELECTION_COLORS = 0x0002, ///< @brief Inform terminal colors. |
| 126 | V3270_SELECTION_NON_BREAKABLE_SPACE = 0x0004, ///< @brief Use non breakable spaces. | 126 | V3270_SELECTION_NON_BREAKABLE_SPACE = 0x0004, ///< @brief Use non breakable spaces. |
| 127 | V3270_SELECTION_DIALOG_STATE = 0x0010, ///< @brief Used for settings dialog. | 127 | V3270_SELECTION_DIALOG_STATE = 0x0010, ///< @brief Used for settings dialog. |
| 128 | + V3270_SELECTION_SCREEN_PASTE = 0x0020, ///< @brief Enable screen paste. | ||
| 128 | 129 | ||
| 129 | } V3270SelectionOption; | 130 | } V3270SelectionOption; |
| 130 | 131 |
src/selection/copy.c
| @@ -54,7 +54,8 @@ | @@ -54,7 +54,8 @@ | ||
| 54 | 54 | ||
| 55 | // ... and set the new mode. | 55 | // ... and set the new mode. |
| 56 | if(mode == V3270_COPY_DEFAULT) { | 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 | terminal->selection.format = mode; | 61 | terminal->selection.format = mode; |
src/selection/linux/paste.c
| @@ -176,13 +176,15 @@ static void formatted_received(GtkClipboard *clipboard, GtkSelectionData *select | @@ -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 | // If smart paste is enabled try to get formatted clipboard. | 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 | debug("Clipboard as TN3270 \"%s\" data",gdk_atom_name(GTK_V3270_GET_CLASS(widget)->clipboard_formatted)); | 188 | debug("Clipboard as TN3270 \"%s\" data",gdk_atom_name(GTK_V3270_GET_CLASS(widget)->clipboard_formatted)); |
| 187 | 189 | ||
| 188 | gtk_clipboard_request_contents( | 190 | gtk_clipboard_request_contents( |
| @@ -225,7 +227,6 @@ LIB3270_EXPORT void v3270_clipboard_get_from_url(GtkWidget *widget, const gchar | @@ -225,7 +227,6 @@ LIB3270_EXPORT void v3270_clipboard_get_from_url(GtkWidget *widget, const gchar | ||
| 225 | (GtkClipboardTextReceivedFunc) text_received, | 227 | (GtkClipboardTextReceivedFunc) text_received, |
| 226 | (gpointer) widget | 228 | (gpointer) widget |
| 227 | ); | 229 | ); |
| 228 | - | ||
| 229 | } | 230 | } |
| 230 | else if(g_str_has_prefix(url,"file://")) | 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,6 +235,15 @@ LIB3270_EXPORT void v3270_clipboard_get_from_url(GtkWidget *widget, const gchar | ||
| 234 | v3270_load_dialog_run(dialog); | 235 | v3270_load_dialog_run(dialog); |
| 235 | gtk_widget_destroy(dialog); | 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,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 | // g_message("Action %s property %s is read-only",g_action_get_name(G_ACTION(object)),pspec->name); | 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,7 +50,6 @@ | ||
| 50 | 50 | ||
| 51 | int fire_paste_accelerator(GtkWidget *widget, const V3270_ACTION * action) { | 51 | int fire_paste_accelerator(GtkWidget *widget, const V3270_ACTION * action) { |
| 52 | 52 | ||
| 53 | - | ||
| 54 | switch((int) action->flags) | 53 | switch((int) action->flags) |
| 55 | { | 54 | { |
| 56 | case 0: // Default paste. | 55 | case 0: // Default paste. |
| @@ -65,6 +64,10 @@ | @@ -65,6 +64,10 @@ | ||
| 65 | v3270_clipboard_get_from_url(widget,"file://"); | 64 | v3270_clipboard_get_from_url(widget,"file://"); |
| 66 | break; | 65 | break; |
| 67 | 66 | ||
| 67 | + case 3: // screen paste. | ||
| 68 | + v3270_clipboard_get_from_url(widget,"screen://"); | ||
| 69 | + break; | ||
| 70 | + | ||
| 68 | default: | 71 | default: |
| 69 | g_warning("Unexpected paste flags %u",(unsigned int) action->flags); | 72 | g_warning("Unexpected paste flags %u",(unsigned int) action->flags); |
| 70 | } | 73 | } |
src/terminal/actions/table.c
| @@ -193,6 +193,17 @@ | @@ -193,6 +193,17 @@ | ||
| 193 | .activate = fire_paste_accelerator | 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 | .flags = 0, | 208 | .flags = 0, |
| 198 | .group = LIB3270_ACTION_GROUP_ONLINE, | 209 | .group = LIB3270_ACTION_GROUP_ONLINE, |