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); |