Commit 56954fbde3f8aa1d42072b04b266285702e7ead8

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

Implementing configuration for the "paste screen" option.

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,