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 | 49 | V3270_SETTING_HOST_TYPE, |
| 50 | 50 | V3270_SETTING_CRL_PROTOCOL, |
| 51 | 51 | V3270_SETTING_TERMINAL_COLORS, |
| 52 | + V3270_SETTING_SELECTION_OPTIONS, | |
| 52 | 53 | |
| 53 | 54 | V3270_SETTING_COUNT ///< @brief Number of setting properties. |
| 54 | 55 | } V3270_SETTING; |
| ... | ... | @@ -116,6 +117,16 @@ G_BEGIN_DECLS |
| 116 | 117 | #define KEY_FLAG_ALT 0x0002 |
| 117 | 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 | 130 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
| 120 | 131 | |
| 121 | 132 | struct v3270_ssl_status_msg |
| ... | ... | @@ -149,10 +160,11 @@ G_BEGIN_DECLS |
| 149 | 160 | |
| 150 | 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 | 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 | 53 | { |
| 54 | 54 | const GList * element = selection; |
| 55 | 55 | GString * string = g_string_new(""); |
| 56 | - gchar * bgColor = gdk_rgba_to_string(terminal->color+V3270_COLOR_BACKGROUND); | |
| 56 | + gchar * bgColor; | |
| 57 | 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 | 75 | while(element) |
| 69 | 76 | { |
| ... | ... | @@ -71,17 +78,20 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all |
| 71 | 78 | unsigned int row, col, src = 0; |
| 72 | 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 | 96 | #ifdef DEBUG |
| 87 | 97 | g_string_append_c(string,'\n'); |
| ... | ... | @@ -95,18 +105,20 @@ static gchar * get_as_div(v3270 * terminal, const GList *selection, gboolean all |
| 95 | 105 | { |
| 96 | 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 | 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 | 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 | 154 | |
| 140 | 155 | g_string_append(string,"</div>"); |
| 141 | 156 | |
| 157 | + debug("\n%s\n------------> %u",string->str,(unsigned int) terminal->selection.options); | |
| 158 | + | |
| 142 | 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 | 127 | // |
| 128 | 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 | 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 | 149 | #ifdef DEBUG |
| 145 | 150 | { | ... | ... |
src/terminal/actions/scroll.c
| ... | ... | @@ -39,9 +39,12 @@ |
| 39 | 39 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 40 | 40 | |
| 41 | 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 | 46 | gtk_action_activate(action); |
| 47 | + #pragma GCC diagnostic pop | |
| 45 | 48 | } |
| 46 | 49 | |
| 47 | 50 | LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) | ... | ... |
src/terminal/keyfile.c
src/terminal/properties/get.c
src/terminal/properties/init.c
| ... | ... | @@ -224,6 +224,26 @@ |
| 224 | 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 | 248 | // Create dynamic properties |
| 229 | 249 | // | ... | ... |
src/terminal/properties/private.h
| ... | ... | @@ -48,17 +48,18 @@ |
| 48 | 48 | |
| 49 | 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 | 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 | 138 | v3270_set_colors(GTK_WIDGET(object),g_value_get_string(value)); |
| 139 | 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 | 145 | default: |
| 142 | 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 | 499 | |
| 500 | 500 | // Setup clipboard. |
| 501 | 501 | widget->selection.target = GDK_SELECTION_CLIPBOARD; |
| 502 | + widget->selection.options = V3270_SELECTION_DEFAULT; | |
| 502 | 503 | |
| 503 | 504 | // Reset timer |
| 504 | 505 | widget->activity.timestamp = time(0); | ... | ... |