Commit c718872aef01d73e504f2862aa05a7896b341f8c
1 parent
c85e42c2
Exists in
master
and in
1 other branch
Adding property to control de clipboard behavior.
Showing
10 changed files
with
122 additions
and
53 deletions
Show diff stats
src/include/terminal.h
@@ -49,6 +49,7 @@ G_BEGIN_DECLS | @@ -49,6 +49,7 @@ G_BEGIN_DECLS | ||
49 | V3270_SETTING_HOST_TYPE, | 49 | V3270_SETTING_HOST_TYPE, |
50 | V3270_SETTING_CRL_PROTOCOL, | 50 | V3270_SETTING_CRL_PROTOCOL, |
51 | V3270_SETTING_TERMINAL_COLORS, | 51 | V3270_SETTING_TERMINAL_COLORS, |
52 | + V3270_SETTING_SELECTION_OPTIONS, | ||
52 | 53 | ||
53 | V3270_SETTING_COUNT ///< @brief Number of setting properties. | 54 | V3270_SETTING_COUNT ///< @brief Number of setting properties. |
54 | } V3270_SETTING; | 55 | } V3270_SETTING; |
@@ -116,6 +117,16 @@ G_BEGIN_DECLS | @@ -116,6 +117,16 @@ G_BEGIN_DECLS | ||
116 | #define KEY_FLAG_ALT 0x0002 | 117 | #define KEY_FLAG_ALT 0x0002 |
117 | #endif // !WIN32 | 118 | #endif // !WIN32 |
118 | 119 | ||
120 | + typedef enum _V3270SelectionOption { | ||
121 | + | ||
122 | + V3270_SELECTION_PLAIN_TEXT = 0x0000, ///< @brief Uses only plain text. | ||
123 | + V3270_SELECTION_FONT_FAMILY = 0x0001, ///< @brief Inform font-family. | ||
124 | + V3270_SELECTION_COLORS = 0x0002, ///< @brief Inform terminal colors. | ||
125 | + | ||
126 | + } V3270SelectionOption; | ||
127 | + | ||
128 | + #define V3270_SELECTION_DEFAULT (V3270_SELECTION_FONT_FAMILY|V3270_SELECTION_COLORS) | ||
129 | + | ||
119 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ | 130 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
120 | 131 | ||
121 | struct v3270_ssl_status_msg | 132 | struct v3270_ssl_status_msg |
@@ -149,10 +160,11 @@ G_BEGIN_DECLS | @@ -149,10 +160,11 @@ G_BEGIN_DECLS | ||
149 | 160 | ||
150 | struct { | 161 | struct { |
151 | 162 | ||
152 | - int baddr; ///< @brief Selection address. | ||
153 | - GdkAtom target; ///< @brief A GdkAtom which identifies the clipboard to use. GDK_SELECTION_CLIPBOARD gives the default clipboard. | ||
154 | - V3270_COPY_MODE format; ///< @brief Copy mode. | ||
155 | - GList * blocks; ///< @brief Selection blocks. | 163 | + int baddr; ///< @brief Selection address. |
164 | + GdkAtom target; ///< @brief A GdkAtom which identifies the clipboard to use. GDK_SELECTION_CLIPBOARD gives the default clipboard. | ||
165 | + V3270_COPY_MODE format; ///< @brief Copy mode. | ||
166 | + GList * blocks; ///< @brief Selection blocks. | ||
167 | + V3270SelectionOption options; ///< @brief Selection options. | ||
156 | 168 | ||
157 | } selection; | 169 | } selection; |
158 | 170 |
src/selection/html.c
@@ -53,17 +53,24 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | @@ -53,17 +53,24 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | ||
53 | { | 53 | { |
54 | const GList * element = selection; | 54 | const GList * element = selection; |
55 | GString * string = g_string_new(""); | 55 | GString * string = g_string_new(""); |
56 | - gchar * bgColor = gdk_rgba_to_string(terminal->color+V3270_COLOR_BACKGROUND); | 56 | + gchar * bgColor; |
57 | gchar * fgColor; | 57 | gchar * fgColor; |
58 | 58 | ||
59 | - g_string_append_printf( | ||
60 | - string, | ||
61 | - "<div style=\"font-family:%s,monospace;padding:1em;display:inline-block;background-color:%s\">", | ||
62 | - terminal->font.family, | ||
63 | - bgColor | ||
64 | - ); | 59 | + g_string_append(string,"<div style=\"padding:1em;display:inline-block"); |
65 | 60 | ||
66 | - g_free(bgColor); | 61 | + if(terminal->selection.options & V3270_SELECTION_FONT_FAMILY) |
62 | + { | ||
63 | + g_string_append_printf(string,";font-family:%s,monospace",terminal->font.family); | ||
64 | + } | ||
65 | + | ||
66 | + if(terminal->selection.options & V3270_SELECTION_COLORS) | ||
67 | + { | ||
68 | + bgColor = gdk_rgba_to_string(terminal->color+V3270_COLOR_BACKGROUND); | ||
69 | + g_string_append_printf(string,";background-color:%s",bgColor); | ||
70 | + g_free(bgColor); | ||
71 | + } | ||
72 | + | ||
73 | + g_string_append(string,"\">"); | ||
67 | 74 | ||
68 | while(element) | 75 | while(element) |
69 | { | 76 | { |
@@ -71,17 +78,20 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | @@ -71,17 +78,20 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | ||
71 | unsigned int row, col, src = 0; | 78 | unsigned int row, col, src = 0; |
72 | unsigned short flags = block->contents[0].attribute.visual; | 79 | unsigned short flags = block->contents[0].attribute.visual; |
73 | 80 | ||
74 | - get_element_colors(terminal,flags,&fgColor,&bgColor); | 81 | + if(terminal->selection.options & V3270_SELECTION_COLORS) |
82 | + { | ||
83 | + get_element_colors(terminal,flags,&fgColor,&bgColor); | ||
75 | 84 | ||
76 | - g_string_append_printf( | ||
77 | - string, | ||
78 | - "<span style=\"background-color:%s;color:%s\">", | ||
79 | - bgColor, | ||
80 | - fgColor | ||
81 | - ); | 85 | + g_string_append_printf( |
86 | + string, | ||
87 | + "<span style=\"background-color:%s;color:%s\">", | ||
88 | + bgColor, | ||
89 | + fgColor | ||
90 | + ); | ||
82 | 91 | ||
83 | - g_free(bgColor); | ||
84 | - g_free(fgColor); | 92 | + g_free(bgColor); |
93 | + g_free(fgColor); | ||
94 | + } | ||
85 | 95 | ||
86 | #ifdef DEBUG | 96 | #ifdef DEBUG |
87 | g_string_append_c(string,'\n'); | 97 | g_string_append_c(string,'\n'); |
@@ -95,18 +105,20 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | @@ -95,18 +105,20 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | ||
95 | { | 105 | { |
96 | flags = block->contents[src].attribute.visual; | 106 | flags = block->contents[src].attribute.visual; |
97 | 107 | ||
98 | - get_element_colors(terminal,flags,&fgColor,&bgColor); | ||
99 | - | ||
100 | - g_string_append_printf( | ||
101 | - string, | ||
102 | - "</span><span style=\"background-color:%s;color:%s\">", | ||
103 | - bgColor, | ||
104 | - fgColor | ||
105 | - ); | 108 | + if(terminal->selection.options & V3270_SELECTION_COLORS) |
109 | + { | ||
110 | + get_element_colors(terminal,flags,&fgColor,&bgColor); | ||
106 | 111 | ||
107 | - g_free(bgColor); | ||
108 | - g_free(fgColor); | 112 | + g_string_append_printf( |
113 | + string, | ||
114 | + "</span><span style=\"background-color:%s;color:%s\">", | ||
115 | + bgColor, | ||
116 | + fgColor | ||
117 | + ); | ||
109 | 118 | ||
119 | + g_free(bgColor); | ||
120 | + g_free(fgColor); | ||
121 | + } | ||
110 | 122 | ||
111 | } | 123 | } |
112 | 124 | ||
@@ -128,7 +140,10 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | @@ -128,7 +140,10 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | ||
128 | #endif // DEBUG | 140 | #endif // DEBUG |
129 | } | 141 | } |
130 | 142 | ||
131 | - g_string_append(string,"</span>"); | 143 | + if(terminal->selection.options & V3270_SELECTION_COLORS) |
144 | + { | ||
145 | + g_string_append(string,"</span>"); | ||
146 | + } | ||
132 | 147 | ||
133 | element = g_list_next(element); | 148 | element = g_list_next(element); |
134 | } | 149 | } |
@@ -139,6 +154,8 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | @@ -139,6 +154,8 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all | ||
139 | 154 | ||
140 | g_string_append(string,"</div>"); | 155 | g_string_append(string,"</div>"); |
141 | 156 | ||
157 | + debug("\n%s\n------------> %u",string->str,(unsigned int) terminal->selection.options); | ||
158 | + | ||
142 | return g_string_free(string,FALSE); | 159 | return g_string_free(string,FALSE); |
143 | 160 | ||
144 | } | 161 | } |
src/selection/linux/copy.c
@@ -127,19 +127,24 @@ void v3270_update_system_clipboard(GtkWidget *widget) | @@ -127,19 +127,24 @@ void v3270_update_system_clipboard(GtkWidget *widget) | ||
127 | // | 127 | // |
128 | // Reference: https://cpp.hotexamples.com/examples/-/-/g_list_insert_sorted/cpp-g_list_insert_sorted-function-examples.html | 128 | // Reference: https://cpp.hotexamples.com/examples/-/-/g_list_insert_sorted/cpp-g_list_insert_sorted-function-examples.html |
129 | // | 129 | // |
130 | - static const GtkTargetEntry internal_targets[] = { | ||
131 | - { "text/csv", 0, CLIPBOARD_TYPE_CSV }, | ||
132 | - { "text/html", 0, CLIPBOARD_TYPE_HTML }, | ||
133 | - { "application/x-v3270-unprotected", 0, CLIPBOARD_TYPE_V3270_UNPROTECTED }, | ||
134 | - }; | ||
135 | - | ||
136 | - GtkTargetList * list = gtk_target_list_new(internal_targets, G_N_ELEMENTS(internal_targets)); | ||
137 | - GtkTargetEntry * targets; | ||
138 | - int n_targets; | 130 | + GtkTargetList * list = gtk_target_list_new(NULL,0); |
139 | 131 | ||
140 | gtk_target_list_add_text_targets(list, CLIPBOARD_TYPE_TEXT); | 132 | gtk_target_list_add_text_targets(list, CLIPBOARD_TYPE_TEXT); |
141 | 133 | ||
142 | - targets = gtk_target_table_new_from_list(list, &n_targets); | 134 | + if(terminal->selection.options != V3270_SELECTION_PLAIN_TEXT) |
135 | + { | ||
136 | + static const GtkTargetEntry targets[] = { | ||
137 | + { "text/csv", 0, CLIPBOARD_TYPE_CSV }, | ||
138 | + { "text/html", 0, CLIPBOARD_TYPE_HTML }, | ||
139 | + { "application/x-v3270-unprotected", 0, CLIPBOARD_TYPE_V3270_UNPROTECTED }, | ||
140 | + }; | ||
141 | + | ||
142 | + gtk_target_list_add_table(list, targets, G_N_ELEMENTS(targets)); | ||
143 | + | ||
144 | + } | ||
145 | + | ||
146 | + int n_targets; | ||
147 | + GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets); | ||
143 | 148 | ||
144 | #ifdef DEBUG | 149 | #ifdef DEBUG |
145 | { | 150 | { |
src/terminal/actions/scroll.c
@@ -39,9 +39,12 @@ | @@ -39,9 +39,12 @@ | ||
39 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 39 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
40 | 40 | ||
41 | // Callback for compatibility with the old application. | 41 | // Callback for compatibility with the old application. |
42 | -static void activate_action(GtkWidget *terminal, GtkAction *action) | 42 | +static void activate_action(GtkWidget G_GNUC_UNUSED(*terminal), GtkAction *action) |
43 | { | 43 | { |
44 | + #pragma GCC diagnostic push | ||
45 | + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" | ||
44 | gtk_action_activate(action); | 46 | gtk_action_activate(action); |
47 | + #pragma GCC diagnostic pop | ||
45 | } | 48 | } |
46 | 49 | ||
47 | LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) | 50 | LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) |
src/terminal/keyfile.c
src/terminal/properties/get.c
@@ -139,6 +139,10 @@ | @@ -139,6 +139,10 @@ | ||
139 | } | 139 | } |
140 | break; | 140 | break; |
141 | 141 | ||
142 | + case V3270_PROPERTY_SELECTION_OPTIONS: | ||
143 | + g_value_set_uint(value,(guint) window->selection.options); | ||
144 | + break; | ||
145 | + | ||
142 | default: | 146 | default: |
143 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); | 147 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
144 | 148 |
src/terminal/properties/init.c
@@ -224,6 +224,26 @@ | @@ -224,6 +224,26 @@ | ||
224 | klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] | 224 | klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] |
225 | ); | 225 | ); |
226 | 226 | ||
227 | + // Clipboard options | ||
228 | + klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] = | ||
229 | + g_param_spec_uint( | ||
230 | + "selection_flags", | ||
231 | + "selection_flags", | ||
232 | + _("Flags to cut&paste"), | ||
233 | + 0, | ||
234 | + G_MAXUINT, | ||
235 | + V3270_SELECTION_DEFAULT, | ||
236 | + G_PARAM_READABLE|G_PARAM_WRITABLE | ||
237 | + ); | ||
238 | + | ||
239 | + g_object_class_install_property( | ||
240 | + gobject_class, | ||
241 | + V3270_PROPERTY_SELECTION_OPTIONS, | ||
242 | + klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] | ||
243 | + ); | ||
244 | + | ||
245 | + | ||
246 | + | ||
227 | // | 247 | // |
228 | // Create dynamic properties | 248 | // Create dynamic properties |
229 | // | 249 | // |
src/terminal/properties/private.h
@@ -48,17 +48,18 @@ | @@ -48,17 +48,18 @@ | ||
48 | 48 | ||
49 | enum _v3270_internal_property | 49 | enum _v3270_internal_property |
50 | { | 50 | { |
51 | - V3270_PROPERTY_FONT_FAMILY = 2, ///< @brief Name of the font-family used by widget. | ||
52 | - V3270_PROPERTY_CLIPBOARD = 3, ///< @brief Name of the selected clipboard. | ||
53 | - V3270_PROPERTY_SESSION_NAME = 4, ///< @brief Widget's session name. | ||
54 | - V3270_PROPERTY_AUTO_DISCONNECT = 5, ///< @brief Auto disconnect. | ||
55 | - V3270_PROPERTY_REMAP_FILE = 6, ///< @brief Path of the remap file. | ||
56 | - V3270_PROPERTY_DYNAMIC_SPACING = 7, ///< @brief Toggle dynamic font spacing. | ||
57 | - V3270_PROPERTY_LU_NAMES = 8, ///< @brief The LU names list. | ||
58 | - V3270_PROPERTY_TRACE = 9, ///< @brief Is the trace widget active? | ||
59 | - V3270_PROPERTY_TERMINAL_COLORS = 10, ///< @brief Terminal colors. | 51 | + V3270_PROPERTY_FONT_FAMILY = 2, ///< @brief Name of the font-family used by widget. |
52 | + V3270_PROPERTY_CLIPBOARD = 3, ///< @brief Name of the selected clipboard. | ||
53 | + V3270_PROPERTY_SESSION_NAME = 4, ///< @brief Widget's session name. | ||
54 | + V3270_PROPERTY_AUTO_DISCONNECT = 5, ///< @brief Auto disconnect. | ||
55 | + V3270_PROPERTY_REMAP_FILE = 6, ///< @brief Path of the remap file. | ||
56 | + V3270_PROPERTY_DYNAMIC_SPACING = 7, ///< @brief Toggle dynamic font spacing. | ||
57 | + V3270_PROPERTY_LU_NAMES = 8, ///< @brief The LU names list. | ||
58 | + V3270_PROPERTY_TRACE = 9, ///< @brief Is the trace widget active? | ||
59 | + V3270_PROPERTY_TERMINAL_COLORS = 10, ///< @brief Terminal colors. | ||
60 | + V3270_PROPERTY_SELECTION_OPTIONS = 11, | ||
60 | 61 | ||
61 | - V3270_PROPERTY_DYNAMIC = 11 ///< @brief Id of the first LIB3270 internal property. | 62 | + V3270_PROPERTY_DYNAMIC = 12 ///< @brief Id of the first LIB3270 internal property. |
62 | }; | 63 | }; |
63 | 64 | ||
64 | G_GNUC_INTERNAL void v3270_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); | 65 | G_GNUC_INTERNAL void v3270_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
src/terminal/properties/set.c
@@ -138,6 +138,10 @@ | @@ -138,6 +138,10 @@ | ||
138 | v3270_set_colors(GTK_WIDGET(object),g_value_get_string(value)); | 138 | v3270_set_colors(GTK_WIDGET(object),g_value_get_string(value)); |
139 | break; | 139 | break; |
140 | 140 | ||
141 | + case V3270_PROPERTY_SELECTION_OPTIONS: | ||
142 | + GTK_V3270(object)->selection.options = (V3270SelectionOption) g_value_get_uint(value); | ||
143 | + break; | ||
144 | + | ||
141 | default: | 145 | default: |
142 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); | 146 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); |
143 | 147 |
src/terminal/widget.c
@@ -499,6 +499,7 @@ static void v3270_init(v3270 *widget) | @@ -499,6 +499,7 @@ static void v3270_init(v3270 *widget) | ||
499 | 499 | ||
500 | // Setup clipboard. | 500 | // Setup clipboard. |
501 | widget->selection.target = GDK_SELECTION_CLIPBOARD; | 501 | widget->selection.target = GDK_SELECTION_CLIPBOARD; |
502 | + widget->selection.options = V3270_SELECTION_DEFAULT; | ||
502 | 503 | ||
503 | // Reset timer | 504 | // Reset timer |
504 | widget->activity.timestamp = time(0); | 505 | widget->activity.timestamp = time(0); |