Commit 65993c406917236583a6ac3de17affdd12e2c9f6

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

Working with clipboard system.

Makefile.in
... ... @@ -33,6 +33,8 @@ SOURCES= \
33 33 $(wildcard src/terminal/@OSNAME@/*.rc) \
34 34 $(wildcard src/terminal/@OSNAME@/*.c) \
35 35 $(wildcard src/filetransfer/*.c) \
  36 + $(wildcard src/clipboard/*.c) \
  37 + $(wildcard src/clipboard/@OSNAME@/*.c) \
36 38 $(wildcard src/trace/*.c) \
37 39 $(wildcard src/dialogs/*.c) \
38 40 $(wildcard src/dialogs/@OSNAME@/*.c) \
... ...
src/clipboard/linux/paste.c 0 → 100644
... ... @@ -0,0 +1,43 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como selection.c e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <clipboard.h>
  31 +
  32 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  33 +
  34 +static void text_received(G_GNUC_UNUSED GtkClipboard *clipboard, const gchar *text, GtkWidget *widget)
  35 +{
  36 + v3270_paste_string(widget,text,"UTF-8");
  37 +}
  38 +
  39 +LIB3270_EXPORT void v3270_paste(GtkWidget *widget)
  40 +{
  41 + gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget);
  42 +}
  43 +
... ...
src/clipboard/selection.c 0 → 100644
... ... @@ -0,0 +1,211 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como selection.c e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <clipboard.h>
  31 +
  32 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  33 +
  34 + static const GtkTargetEntry targets[] =
  35 + {
  36 + { "COMPOUND_TEXT", 0, CLIPBOARD_TYPE_TEXT },
  37 + { "UTF8_STRING", 0, CLIPBOARD_TYPE_TEXT },
  38 + };
  39 +
  40 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  41 +
  42 +static void clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED GObject *obj)
  43 +{
  44 +}
  45 +
  46 +static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj)
  47 +{
  48 + v3270 * widget = GTK_V3270(obj);
  49 +
  50 + switch(target)
  51 + {
  52 + case CLIPBOARD_TYPE_TEXT: /* Get clipboard contents as text */
  53 + if(!widget->selection.text)
  54 + {
  55 + lib3270_ring_bell(widget->host);
  56 + }
  57 + else
  58 + {
  59 + gchar * text = g_convert(widget->selection.text, -1, "UTF-8", lib3270_get_display_charset(widget->host), NULL, NULL, NULL);
  60 + gtk_selection_data_set_text(selection,text,-1);
  61 + g_free(text);
  62 + }
  63 + break;
  64 +
  65 + default:
  66 + g_warning("Unexpected clipboard type %d\n",target);
  67 + }
  68 +}
  69 +
  70 +/**
  71 + * Clear clipboard contents.
  72 + *
  73 + * @param terminal Pointer to the terminal Widget.
  74 + *
  75 + */
  76 +void v3270_clear_clipboard(v3270 *terminal)
  77 +{
  78 + terminal->selection.text = lib3270_free(terminal->selection.text);
  79 +}
  80 +
  81 +/**
  82 + * Get lib3270 selection as a g_malloc buffer.
  83 + *
  84 + * @param widget Widget containing the desired section.
  85 + *
  86 + * @return NULL if error, otherwise the selected buffer contents (release with g_free).
  87 + *
  88 + */
  89 +LIB3270_EXPORT gchar * v3270_get_selected(GtkWidget *widget, gboolean cut)
  90 +{
  91 + const char *text;
  92 +
  93 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  94 +
  95 + text = v3270_update_selected_text(widget,cut);
  96 +
  97 + if(text)
  98 + return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);
  99 +
  100 + return NULL;
  101 +}
  102 +
  103 +LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget)
  104 +{
  105 + const char *text;
  106 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  107 +
  108 + text = GTK_V3270(widget)->selection.text;
  109 +
  110 + if(!text)
  111 + text = v3270_update_selected_text(widget,FALSE);
  112 +
  113 + if(text)
  114 + return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);
  115 +
  116 + return NULL;
  117 +}
  118 +
  119 +LIB3270_EXPORT void v3270_set_copy(GtkWidget *widget, const gchar *text)
  120 +{
  121 + v3270 * terminal;
  122 + gchar * isotext;
  123 +
  124 + g_return_if_fail(GTK_IS_V3270(widget));
  125 +
  126 + terminal = GTK_V3270(widget);
  127 + v3270_clear_clipboard(terminal);
  128 +
  129 + if(!text)
  130 + {
  131 + /* No string, signal clipboard clear and return */
  132 + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, FALSE);
  133 + return;
  134 + }
  135 +
  136 + /* Received text, replace the selection buffer */
  137 + terminal->selection.format = V3270_SELECT_TEXT;
  138 + isotext = g_convert(text, -1, lib3270_get_display_charset(terminal->host), "UTF-8", NULL, NULL, NULL);
  139 +
  140 + if(!isotext)
  141 + {
  142 + /* No string, signal clipboard clear and return */
  143 + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, FALSE);
  144 + return;
  145 + }
  146 +
  147 + terminal->selection.text = lib3270_strdup(isotext);
  148 +
  149 + g_free(isotext);
  150 +
  151 + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, TRUE);
  152 +}
  153 +
  154 +void v3270_update_system_clipboard(GtkWidget *widget)
  155 +{
  156 + if(GTK_V3270(widget)->selection.text)
  157 + {
  158 + GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD);
  159 +
  160 + if(gtk_clipboard_set_with_owner(
  161 + clipboard,
  162 + targets,
  163 + G_N_ELEMENTS(targets),
  164 + (GtkClipboardGetFunc) clipboard_get,
  165 + (GtkClipboardClearFunc) clipboard_clear,
  166 + G_OBJECT(widget)
  167 + ))
  168 + {
  169 + gtk_clipboard_set_can_store(clipboard,targets,1);
  170 + }
  171 +
  172 + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, TRUE);
  173 + }
  174 +}
  175 +
  176 +LIB3270_EXPORT void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut)
  177 +{
  178 + g_return_if_fail(GTK_IS_V3270(widget));
  179 + GTK_V3270(widget)->selection.format = mode;
  180 + v3270_update_selected_text(widget,cut);
  181 + v3270_update_system_clipboard(widget);
  182 +}
  183 +
  184 +LIB3270_EXPORT void v3270_unselect(GtkWidget *widget)
  185 +{
  186 + v3270_disable_updates(widget);
  187 + lib3270_unselect(v3270_get_session(widget));
  188 + v3270_enable_updates(widget);
  189 +}
  190 +
  191 +gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end)
  192 +{
  193 + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE);
  194 + return lib3270_get_selection_bounds(GTK_V3270(widget)->host,start,end) == 0 ? FALSE : TRUE;
  195 +}
  196 +
  197 +LIB3270_EXPORT void v3270_select_region(GtkWidget *widget, gint start, gint end)
  198 +{
  199 + g_return_if_fail(GTK_IS_V3270(widget));
  200 + lib3270_select_region(GTK_V3270(widget)->host,start,end);
  201 +}
  202 +
  203 +LIB3270_EXPORT void v3270_select_all(GtkWidget *widget)
  204 +{
  205 + g_return_if_fail(GTK_IS_V3270(widget));
  206 + v3270_disable_updates(widget);
  207 + lib3270_select_all(v3270_get_session(widget));
  208 + v3270_enable_updates(widget);
  209 +}
  210 +
  211 +
... ...
src/clipboard/text.c 0 → 100644
... ... @@ -0,0 +1,286 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <clipboard.h>
  31 +
  32 +
  33 +LIB3270_EXPORT void v3270_copy_append(GtkWidget *widget)
  34 +{
  35 + v3270 * terminal;
  36 + char * str;
  37 +
  38 + g_return_if_fail(GTK_IS_V3270(widget));
  39 +
  40 + terminal = GTK_V3270(widget);
  41 +
  42 + if(!terminal->selection.text)
  43 + {
  44 + // Clipboard is empty, do a single copy
  45 + v3270_copy(widget, V3270_SELECT_TEXT, FALSE);
  46 + return;
  47 + }
  48 +
  49 + str = lib3270_get_selected(terminal->host);
  50 +
  51 + if(str)
  52 + {
  53 + size_t len = strlen(terminal->selection.text)+strlen(str)+2;
  54 +
  55 + terminal->selection.text = lib3270_realloc(terminal->selection.text,len);
  56 +
  57 + strncat(terminal->selection.text,"\n",len);
  58 + strncat(terminal->selection.text,str,len);
  59 +
  60 + lib3270_free(str);
  61 + }
  62 +
  63 + v3270_update_system_clipboard(widget);
  64 +
  65 +}
  66 +
  67 +const char * v3270_update_selected_text(GtkWidget *widget, gboolean cut)
  68 +{
  69 + char * text;
  70 + v3270 * terminal = GTK_V3270(widget);
  71 +
  72 + v3270_clear_clipboard(terminal);
  73 +
  74 + if(cut)
  75 + text = lib3270_cut_selected(terminal->host);
  76 + else
  77 + text = lib3270_get_selected(terminal->host);
  78 +
  79 + if(!text)
  80 + {
  81 + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, FALSE);
  82 + lib3270_ring_bell(terminal->host);
  83 + return NULL;
  84 + }
  85 +
  86 + if(terminal->selection.format == V3270_SELECT_TABLE)
  87 + {
  88 + // Convert text to table
  89 + gchar **ln = g_strsplit(text,"\n",-1);
  90 + int width = lib3270_get_width(terminal->host);
  91 + gboolean cols[width];
  92 + int l;
  93 + GString * buffer;
  94 +
  95 + memset(cols,0,sizeof(gboolean)*width);
  96 +
  97 + // Find column delimiters
  98 + for(l=0;ln[l];l++)
  99 + {
  100 + int c;
  101 + gchar * ptr = ln[l];
  102 +
  103 + for(c=0;c<width && *ptr;c++)
  104 + {
  105 + if(!g_ascii_isspace(*ptr))
  106 + cols[c] = TRUE;
  107 +
  108 + ptr++;
  109 + }
  110 +
  111 + }
  112 +
  113 + // Read screen contents
  114 + buffer = g_string_sized_new(strlen(text));
  115 + for(l=0;ln[l];l++)
  116 + {
  117 + int col = 0;
  118 + gchar * src = ln[l];
  119 +
  120 + while(col < width && *src)
  121 + {
  122 + if(col)
  123 + g_string_append_c(buffer,'\t');
  124 +
  125 + // Find column start
  126 + while(!cols[col] && col < width && *src)
  127 + {
  128 + col++;
  129 + src++;
  130 + }
  131 +
  132 + if(col < width && *src)
  133 + {
  134 + gchar tmp[width+1];
  135 + gchar * dst = tmp;
  136 +
  137 + // Copy column content
  138 + while(cols[col] && col < width && *src)
  139 + {
  140 + *dst = *src;
  141 + col++;
  142 + dst++;
  143 + src++;
  144 + }
  145 + *dst = 0;
  146 + g_string_append(buffer,g_strstrip(tmp));
  147 + }
  148 +
  149 + }
  150 + g_string_append_c(buffer,'\n');
  151 +
  152 + }
  153 +
  154 + g_strfreev(ln);
  155 + g_free(text);
  156 +
  157 + text = g_string_free(buffer,FALSE);
  158 + }
  159 +
  160 + return terminal->selection.text = text;
  161 +
  162 +}
  163 +
  164 +LIB3270_EXPORT void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding)
  165 +{
  166 + gchar * buffer = NULL;
  167 + H3270 * session = v3270_get_session(widget);
  168 + const gchar * charset = lib3270_get_display_charset(session);
  169 + gboolean next;
  170 +
  171 + if(!text)
  172 + return;
  173 + else if(g_ascii_strcasecmp(encoding,charset))
  174 + buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL);
  175 + else
  176 + buffer = g_strdup(text);
  177 +
  178 + if(!buffer)
  179 + {
  180 + /* Conversion failed, update special chars and try again */
  181 + size_t f;
  182 +
  183 + static const struct _xlat
  184 + {
  185 + const gchar *from;
  186 + const gchar *to;
  187 + } xlat[] =
  188 + {
  189 + { "–", "-" },
  190 + { "→", "->" },
  191 + { "←", "<-" },
  192 + { "©", "(c)" },
  193 + { "↔", "<->" },
  194 + { "™", "(TM)" },
  195 + { "®", "(R)" },
  196 + { "“", "\"" },
  197 + { "”", "\"" },
  198 + { "…", "..." },
  199 + { "•", "*" },
  200 + { "․", "." },
  201 + { "·", "*" },
  202 +
  203 + };
  204 +
  205 + gchar *string = g_strdup(text);
  206 +
  207 + // FIXME (perry#1#): Is there any better way for a "sed" here?
  208 + for(f=0;f<G_N_ELEMENTS(xlat);f++)
  209 + {
  210 + gchar *ptr = g_strstr_len(string,-1,xlat[f].from);
  211 +
  212 + if(ptr)
  213 + {
  214 + gchar *old = string;
  215 + gchar **tmp = g_strsplit(old,xlat[f].from,-1);
  216 + string = g_strjoinv(xlat[f].to,tmp);
  217 + g_strfreev(tmp);
  218 + g_free(old);
  219 + }
  220 + }
  221 +
  222 + buffer = g_convert(string, -1, charset, encoding, NULL, NULL, NULL);
  223 +
  224 + if(!buffer)
  225 + {
  226 + // Still failing, convert line by line
  227 + gchar **ln = g_strsplit(string,"\n",-1);
  228 +
  229 + for(f=0;ln[f];f++)
  230 + {
  231 + GError *error = NULL;
  232 + gchar *str = g_convert(ln[f], -1, charset, encoding, NULL, NULL, &error);
  233 +
  234 + if(!str)
  235 + {
  236 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel(widget)),
  237 + GTK_DIALOG_DESTROY_WITH_PARENT,
  238 + GTK_MESSAGE_ERROR,
  239 + GTK_BUTTONS_OK,
  240 + _( "Can't convert line %lu from %s to %s" ),(unsigned long) (f+1), encoding, charset);
  241 +
  242 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) );
  243 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s",error->message, ln[f]);
  244 +
  245 + gtk_dialog_run(GTK_DIALOG (dialog));
  246 + gtk_widget_destroy(dialog);
  247 +
  248 + break;
  249 + }
  250 + else
  251 + {
  252 + g_free(str);
  253 + }
  254 +
  255 + }
  256 + g_strfreev(ln);
  257 +
  258 + }
  259 +
  260 + g_free(string);
  261 + }
  262 +
  263 + if(buffer)
  264 + {
  265 + /* Remove TABS */
  266 + gchar *ptr;
  267 +
  268 + for(ptr = buffer;*ptr;ptr++)
  269 + {
  270 + if(*ptr == '\t')
  271 + *ptr = ' ';
  272 + }
  273 + }
  274 + else
  275 + {
  276 + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_PASTENEXT], 0, FALSE);
  277 + return;
  278 + }
  279 +
  280 + next = lib3270_paste(session,(unsigned char *) buffer) ? TRUE : FALSE;
  281 +
  282 + g_free(buffer);
  283 +
  284 + g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_PASTENEXT], 0, next);
  285 +
  286 +}
... ...
src/clipboard/windows/paste.c 0 → 100644
... ... @@ -0,0 +1,58 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como selection.c e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <windows.h>
  31 + #include <clipboard.h>
  32 +
  33 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  34 +
  35 +LIB3270_EXPORT void v3270_paste(GtkWidget *widget)
  36 +{
  37 + HGLOBAL hglb;
  38 +
  39 + if (!IsClipboardFormatAvailable(CF_TEXT))
  40 + return;
  41 +
  42 + if (!OpenClipboard(NULL))
  43 + return;
  44 +
  45 + hglb = GetClipboardData(CF_TEXT);
  46 + if (hglb != NULL)
  47 + {
  48 + LPTSTR lptstr = GlobalLock(hglb);
  49 + if (lptstr != NULL)
  50 + {
  51 + v3270_paste_string(widget,lptstr,"CP1252");
  52 + GlobalUnlock(hglb);
  53 + }
  54 + }
  55 +
  56 + CloseClipboard();
  57 +
  58 +}
... ...
src/include/clipboard.h 0 → 100644
... ... @@ -0,0 +1,54 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como clipboard.h e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 +#ifndef V3270_CLIPBOARD_H_INCLUDED
  31 +
  32 + #define V3270_CLIPBOARD_H_INCLUDED
  33 +
  34 + #include <gtk/gtk.h>
  35 + #include <lib3270.h>
  36 + #include <v3270.h>
  37 + #include <terminal.h>
  38 + #include <internals.h>
  39 + #include <lib3270/selection.h>
  40 + #include <lib3270/log.h>
  41 + #include <lib3270/actions.h>
  42 +
  43 + enum
  44 + {
  45 + CLIPBOARD_TYPE_TEXT,
  46 + };
  47 +
  48 + G_GNUC_INTERNAL void v3270_update_system_clipboard(GtkWidget *widget);
  49 + G_GNUC_INTERNAL const char * v3270_update_selected_text(GtkWidget *widget, gboolean cut);
  50 +
  51 +
  52 +
  53 +#endif // V3270_CLIPBOARD_H_INCLUDED
  54 +
... ...
src/include/terminal.h
... ... @@ -101,7 +101,6 @@ G_BEGIN_DECLS
101 101 int selecting : 1; /**< Selecting region */
102 102 int moving : 1; /**< Moving selected region */
103 103 int resizing : 1; /**< Resizing selected region */
104   - int table : 1; /**< Copy mode is table */
105 104 int scaled_fonts : 1; /**< Use scaled fonts */
106 105 int drawing : 1; /**< Draw widget? */
107 106  
... ... @@ -118,8 +117,9 @@ G_BEGIN_DECLS
118 117  
119 118 struct
120 119 {
121   - char * text; /**< Clipboard contents (lib3270 charset) */
122   - int baddr; /**< Selection addr */
  120 + V3270_SELECT_FORMAT format; /**< Copy format */
  121 + char * text; /**< Clipboard contents (lib3270 charset) */
  122 + int baddr; /**< Selection addr */
123 123 } selection;
124 124  
125 125 LIB3270_POINTER pointer_id;
... ...
src/terminal/get.c 0 → 100644
... ... @@ -0,0 +1,81 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <internals.h>
  31 + #include <terminal.h>
  32 + #include <lib3270/selection.h>
  33 +
  34 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  35 +
  36 +/**
  37 + * Get text at informed area.
  38 + *
  39 + * @param widget Widget.
  40 + * @param offset Offset of the desired text.
  41 + * @param len Number of characters to get.
  42 + *
  43 + */
  44 +LIB3270_EXPORT gchar * v3270_get_text(GtkWidget *widget, int offset, int len)
  45 +{
  46 + v3270 * terminal;
  47 + gchar * text;
  48 + char * str;
  49 +
  50 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  51 +
  52 + terminal = GTK_V3270(widget);
  53 +
  54 + str = lib3270_get_string_at_address(terminal->host, offset, len, '\n');
  55 +
  56 + if(!str)
  57 + return NULL;
  58 +
  59 + text = g_convert(str, -1, "UTF-8", lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
  60 +
  61 + lib3270_free(str);
  62 + return text;
  63 +}
  64 +
  65 +gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all)
  66 +{
  67 + char * str;
  68 + gchar * utftext;
  69 +
  70 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  71 +
  72 + str = lib3270_get_region(GTK_V3270(widget)->host,start_pos,end_pos,all);
  73 + if(!str)
  74 + return NULL;
  75 +
  76 + utftext = g_convert(str, -1, "UTF-8", lib3270_get_display_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);
  77 +
  78 + lib3270_free(str);
  79 +
  80 + return utftext;
  81 +}
... ...
src/terminal/selection.c
... ... @@ -1,566 +0,0 @@
1   -/*
2   - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
3   - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
4   - * aplicativos mainframe. Registro no INPI sob o nome G3270.
5   - *
6   - * Copyright (C) <2008> <Banco do Brasil S.A.>
7   - *
8   - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
9   - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
10   - * Free Software Foundation.
11   - *
12   - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
13   - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
14   - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
15   - * obter mais detalhes.
16   - *
17   - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
18   - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19   - * St, Fifth Floor, Boston, MA 02110-1301 USA
20   - *
21   - * Este programa está nomeado como selection.c e possui - linhas de código.
22   - *
23   - * Contatos:
24   - *
25   - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26   - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27   - *
28   - */
29   -
30   - #include <gtk/gtk.h>
31   - #include <lib3270.h>
32   - #include <v3270.h>
33   - #include <terminal.h>
34   - #include <internals.h>
35   - #include <lib3270/selection.h>
36   - #include <lib3270/log.h>
37   - #include <lib3270/actions.h>
38   -
39   -/*--[ Globals ]--------------------------------------------------------------------------------------*/
40   -
41   - enum
42   - {
43   - CLIPBOARD_TYPE_TEXT,
44   - };
45   -
46   - static const GtkTargetEntry targets[] =
47   - {
48   - { "COMPOUND_TEXT", 0, CLIPBOARD_TYPE_TEXT },
49   - { "UTF8_STRING", 0, CLIPBOARD_TYPE_TEXT },
50   - };
51   -
52   -/*--[ Implement ]------------------------------------------------------------------------------------*/
53   -
54   -static void clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED GObject *obj)
55   -{
56   -}
57   -
58   -static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj)
59   -{
60   - v3270 * widget = GTK_V3270(obj);
61   -
62   - switch(target)
63   - {
64   - case CLIPBOARD_TYPE_TEXT: /* Get clipboard contents as text */
65   - if(!widget->selection.text)
66   - {
67   - lib3270_ring_bell(widget->host);
68   - }
69   - else
70   - {
71   - gchar * text = g_convert(widget->selection.text, -1, "UTF-8", lib3270_get_display_charset(widget->host), NULL, NULL, NULL);
72   - gtk_selection_data_set_text(selection,text,-1);
73   - g_free(text);
74   - }
75   - break;
76   -
77   - default:
78   - g_warning("Unexpected clipboard type %d\n",target);
79   - }
80   -}
81   -
82   -/**
83   - * Clear clipboard contents.
84   - *
85   - * @param terminal Pointer to the terminal Widget.
86   - *
87   - */
88   -void v3270_clear_clipboard(v3270 *terminal)
89   -{
90   - terminal->selection.text = lib3270_free(terminal->selection.text);
91   -}
92   -
93   -/**
94   - * Get text at informed area.
95   - *
96   - * @param widget Widget.
97   - * @param offset Offset of the desired text.
98   - * @param len Number of characters to get.
99   - *
100   - */
101   -LIB3270_EXPORT gchar * v3270_get_text(GtkWidget *widget, int offset, int len)
102   -{
103   - v3270 * terminal;
104   - gchar * text;
105   - char * str;
106   -
107   - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
108   -
109   - terminal = GTK_V3270(widget);
110   -
111   - str = lib3270_get_string_at_address(terminal->host, offset, len, '\n');
112   -
113   - if(!str)
114   - return NULL;
115   -
116   - text = g_convert(str, -1, "UTF-8", lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
117   -
118   - lib3270_free(str);
119   - return text;
120   -}
121   -
122   -static const char * update_selected_text(GtkWidget *widget, gboolean cut)
123   -{
124   - char * text;
125   - v3270 * terminal = GTK_V3270(widget);
126   -
127   - v3270_clear_clipboard(terminal);
128   -
129   - if(cut)
130   - text = lib3270_cut_selected(terminal->host);
131   - else
132   - text = lib3270_get_selected(terminal->host);
133   -
134   - if(!text)
135   - {
136   - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, FALSE);
137   - lib3270_ring_bell(terminal->host);
138   - return NULL;
139   - }
140   -
141   - if(terminal->table)
142   - {
143   - // Convert text to table
144   - gchar **ln = g_strsplit(text,"\n",-1);
145   - int width = lib3270_get_width(terminal->host);
146   - gboolean cols[width];
147   - int l;
148   - GString * buffer;
149   -
150   - memset(cols,0,sizeof(gboolean)*width);
151   -
152   - // Find column delimiters
153   - for(l=0;ln[l];l++)
154   - {
155   - int c;
156   - gchar * ptr = ln[l];
157   -
158   - for(c=0;c<width && *ptr;c++)
159   - {
160   - if(!g_ascii_isspace(*ptr))
161   - cols[c] = TRUE;
162   -
163   - ptr++;
164   - }
165   -
166   - }
167   -
168   - // Read screen contents
169   - buffer = g_string_sized_new(strlen(text));
170   - for(l=0;ln[l];l++)
171   - {
172   - int col = 0;
173   - gchar * src = ln[l];
174   -
175   - while(col < width && *src)
176   - {
177   - if(col)
178   - g_string_append_c(buffer,'\t');
179   -
180   - // Find column start
181   - while(!cols[col] && col < width && *src)
182   - {
183   - col++;
184   - src++;
185   - }
186   -
187   - if(col < width && *src)
188   - {
189   - gchar tmp[width+1];
190   - gchar * dst = tmp;
191   -
192   - // Copy column content
193   - while(cols[col] && col < width && *src)
194   - {
195   - *dst = *src;
196   - col++;
197   - dst++;
198   - src++;
199   - }
200   - *dst = 0;
201   - g_string_append(buffer,g_strstrip(tmp));
202   - }
203   -
204   - }
205   - g_string_append_c(buffer,'\n');
206   -
207   - }
208   -
209   - g_strfreev(ln);
210   - g_free(text);
211   -
212   - text = g_string_free(buffer,FALSE);
213   - }
214   -
215   - return terminal->selection.text = text;
216   -
217   -}
218   -
219   -/**
220   - * Get lib3270 selection as a g_malloc buffer.
221   - *
222   - * @param widget Widget containing the desired section.
223   - *
224   - * @return NULL if error, otherwise the selected buffer contents (release with g_free).
225   - *
226   - */
227   -LIB3270_EXPORT gchar * v3270_get_selected(GtkWidget *widget, gboolean cut)
228   -{
229   - const char *text;
230   -
231   - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
232   -
233   - text = update_selected_text(widget,cut);
234   -
235   - if(text)
236   - return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);
237   -
238   - return NULL;
239   -}
240   -
241   -LIB3270_EXPORT gchar * v3270_get_copy(GtkWidget *widget)
242   -{
243   - const char *text;
244   - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
245   -
246   - text = GTK_V3270(widget)->selection.text;
247   -
248   - if(!text)
249   - text = update_selected_text(widget,FALSE);
250   -
251   - if(text)
252   - return g_convert(text, -1, "UTF-8", lib3270_get_display_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);
253   -
254   - return NULL;
255   -}
256   -
257   -LIB3270_EXPORT void v3270_set_copy(GtkWidget *widget, const gchar *text)
258   -{
259   - v3270 * terminal;
260   - gchar * isotext;
261   -
262   - g_return_if_fail(GTK_IS_V3270(widget));
263   -
264   - terminal = GTK_V3270(widget);
265   - v3270_clear_clipboard(terminal);
266   -
267   - if(!text)
268   - {
269   - /* No string, signal clipboard clear and return */
270   - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, FALSE);
271   - return;
272   - }
273   -
274   - /* Received text, replace the selection buffer */
275   - terminal->table = 0;
276   - isotext = g_convert(text, -1, lib3270_get_display_charset(terminal->host), "UTF-8", NULL, NULL, NULL);
277   -
278   - if(!isotext)
279   - {
280   - /* No string, signal clipboard clear and return */
281   - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, FALSE);
282   - return;
283   - }
284   -
285   - terminal->selection.text = lib3270_strdup(isotext);
286   -
287   - g_free(isotext);
288   -
289   - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, TRUE);
290   -}
291   -
292   -static void update_system_clipboard(GtkWidget *widget)
293   -{
294   - if(GTK_V3270(widget)->selection.text)
295   - {
296   - GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD);
297   -
298   - if(gtk_clipboard_set_with_owner( clipboard,
299   - targets,
300   - G_N_ELEMENTS(targets),
301   - (GtkClipboardGetFunc) clipboard_get,
302   - (GtkClipboardClearFunc) clipboard_clear,
303   - G_OBJECT(widget)
304   - ))
305   - {
306   - gtk_clipboard_set_can_store(clipboard,targets,1);
307   - }
308   -
309   - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_CLIPBOARD], 0, TRUE);
310   - }
311   -}
312   -
313   -
314   -LIB3270_EXPORT void v3270_copy_append(GtkWidget *widget)
315   -{
316   - v3270 * terminal;
317   - char * str;
318   -
319   - g_return_if_fail(GTK_IS_V3270(widget));
320   -
321   - terminal = GTK_V3270(widget);
322   -
323   - if(!terminal->selection.text)
324   - {
325   - // Clipboard is empty, do a single copy
326   - v3270_copy(widget, V3270_SELECT_TEXT, FALSE);
327   - return;
328   - }
329   -
330   - str = lib3270_get_selected(terminal->host);
331   -
332   - if(str)
333   - {
334   - size_t len = strlen(terminal->selection.text)+strlen(str)+2;
335   -
336   - terminal->selection.text = lib3270_realloc(terminal->selection.text,len);
337   -
338   - strncat(terminal->selection.text,"\n",len);
339   - strncat(terminal->selection.text,str,len);
340   -
341   - lib3270_free(str);
342   - }
343   -
344   - update_system_clipboard(widget);
345   -
346   -}
347   -
348   -LIB3270_EXPORT void v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode, gboolean cut)
349   -{
350   - g_return_if_fail(GTK_IS_V3270(widget));
351   - GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0);
352   - update_selected_text(widget,cut);
353   - update_system_clipboard(widget);
354   -}
355   -
356   -#ifdef _WIN32
357   -
358   -LIB3270_EXPORT void v3270_paste(GtkWidget *widget)
359   -{
360   - HGLOBAL hglb;
361   -
362   - if (!IsClipboardFormatAvailable(CF_TEXT))
363   - return;
364   -
365   - if (!OpenClipboard(NULL))
366   - return;
367   -
368   - hglb = GetClipboardData(CF_TEXT);
369   - if (hglb != NULL)
370   - {
371   - LPTSTR lptstr = GlobalLock(hglb);
372   - if (lptstr != NULL)
373   - {
374   - v3270_paste_string(widget,lptstr,"CP1252");
375   - GlobalUnlock(hglb);
376   - }
377   - }
378   -
379   - CloseClipboard();
380   -
381   -}
382   -
383   -#else
384   -
385   -static void text_received(G_GNUC_UNUSED GtkClipboard *clipboard, const gchar *text, GtkWidget *widget)
386   -{
387   - v3270_paste_string(widget,text,"UTF-8");
388   -}
389   -
390   -LIB3270_EXPORT void v3270_paste(GtkWidget *widget)
391   -{
392   - gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget);
393   -}
394   -
395   -#endif // _WIN32
396   -
397   -LIB3270_EXPORT void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding)
398   -{
399   - gchar * buffer = NULL;
400   - H3270 * session = v3270_get_session(widget);
401   - const gchar * charset = lib3270_get_display_charset(session);
402   - gboolean next;
403   -
404   - if(!text)
405   - return;
406   - else if(g_ascii_strcasecmp(encoding,charset))
407   - buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL);
408   - else
409   - buffer = g_strdup(text);
410   -
411   - if(!buffer)
412   - {
413   - /* Conversion failed, update special chars and try again */
414   - size_t f;
415   -
416   - static const struct _xlat
417   - {
418   - const gchar *from;
419   - const gchar *to;
420   - } xlat[] =
421   - {
422   - { "–", "-" },
423   - { "→", "->" },
424   - { "←", "<-" },
425   - { "©", "(c)" },
426   - { "↔", "<->" },
427   - { "™", "(TM)" },
428   - { "®", "(R)" },
429   - { "“", "\"" },
430   - { "”", "\"" },
431   - { "…", "..." },
432   - { "•", "*" },
433   - { "․", "." },
434   - { "·", "*" },
435   -
436   - };
437   -
438   - gchar *string = g_strdup(text);
439   -
440   - // FIXME (perry#1#): Is there any better way for a "sed" here?
441   - for(f=0;f<G_N_ELEMENTS(xlat);f++)
442   - {
443   - gchar *ptr = g_strstr_len(string,-1,xlat[f].from);
444   -
445   - if(ptr)
446   - {
447   - gchar *old = string;
448   - gchar **tmp = g_strsplit(old,xlat[f].from,-1);
449   - string = g_strjoinv(xlat[f].to,tmp);
450   - g_strfreev(tmp);
451   - g_free(old);
452   - }
453   - }
454   -
455   - buffer = g_convert(string, -1, charset, encoding, NULL, NULL, NULL);
456   -
457   - if(!buffer)
458   - {
459   - // Still failing, convert line by line
460   - gchar **ln = g_strsplit(string,"\n",-1);
461   -
462   - for(f=0;ln[f];f++)
463   - {
464   - GError *error = NULL;
465   - gchar *str = g_convert(ln[f], -1, charset, encoding, NULL, NULL, &error);
466   -
467   - if(!str)
468   - {
469   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel(widget)),
470   - GTK_DIALOG_DESTROY_WITH_PARENT,
471   - GTK_MESSAGE_ERROR,
472   - GTK_BUTTONS_OK,
473   - _( "Can't convert line %lu from %s to %s" ),(unsigned long) (f+1), encoding, charset);
474   -
475   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) );
476   - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s",error->message, ln[f]);
477   -
478   - gtk_dialog_run(GTK_DIALOG (dialog));
479   - gtk_widget_destroy(dialog);
480   -
481   - break;
482   - }
483   - else
484   - {
485   - g_free(str);
486   - }
487   -
488   - }
489   - g_strfreev(ln);
490   -
491   - }
492   -
493   - g_free(string);
494   - }
495   -
496   - if(buffer)
497   - {
498   - /* Remove TABS */
499   - gchar *ptr;
500   -
501   - for(ptr = buffer;*ptr;ptr++)
502   - {
503   - if(*ptr == '\t')
504   - *ptr = ' ';
505   - }
506   - }
507   - else
508   - {
509   - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_PASTENEXT], 0, FALSE);
510   - return;
511   - }
512   -
513   - next = lib3270_paste(session,(unsigned char *) buffer) ? TRUE : FALSE;
514   -
515   - g_free(buffer);
516   -
517   - g_signal_emit(widget,v3270_widget_signal[V3270_SIGNAL_PASTENEXT], 0, next);
518   -
519   -}
520   -
521   -LIB3270_EXPORT void v3270_unselect(GtkWidget *widget)
522   -{
523   - v3270_disable_updates(widget);
524   - lib3270_unselect(v3270_get_session(widget));
525   - v3270_enable_updates(widget);
526   -}
527   -
528   -gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end)
529   -{
530   - g_return_val_if_fail(GTK_IS_V3270(widget),FALSE);
531   - return lib3270_get_selection_bounds(GTK_V3270(widget)->host,start,end) == 0 ? FALSE : TRUE;
532   -}
533   -
534   -gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all)
535   -{
536   - char * str;
537   - gchar * utftext;
538   -
539   - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
540   -
541   - str = lib3270_get_region(GTK_V3270(widget)->host,start_pos,end_pos,all);
542   - if(!str)
543   - return NULL;
544   -
545   - utftext = g_convert(str, -1, "UTF-8", lib3270_get_display_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);
546   -
547   - lib3270_free(str);
548   -
549   - return utftext;
550   -}
551   -
552   -LIB3270_EXPORT void v3270_select_region(GtkWidget *widget, gint start, gint end)
553   -{
554   - g_return_if_fail(GTK_IS_V3270(widget));
555   - lib3270_select_region(GTK_V3270(widget)->host,start,end);
556   -}
557   -
558   -LIB3270_EXPORT void v3270_select_all(GtkWidget *widget)
559   -{
560   - g_return_if_fail(GTK_IS_V3270(widget));
561   - v3270_disable_updates(widget);
562   - lib3270_select_all(v3270_get_session(widget));
563   - v3270_enable_updates(widget);
564   -}
565   -
566   -
v3270.cbp
... ... @@ -42,6 +42,18 @@
42 42 <Add option="-fPIC" />
43 43 </Linker>
44 44 <Unit filename="configure.ac" />
  45 + <Unit filename="src/clipboard/linux/paste.c">
  46 + <Option compilerVar="CC" />
  47 + </Unit>
  48 + <Unit filename="src/clipboard/selection.c">
  49 + <Option compilerVar="CC" />
  50 + </Unit>
  51 + <Unit filename="src/clipboard/text.c">
  52 + <Option compilerVar="CC" />
  53 + </Unit>
  54 + <Unit filename="src/clipboard/windows/paste.c">
  55 + <Option compilerVar="CC" />
  56 + </Unit>
45 57 <Unit filename="src/dialogs/colors.c">
46 58 <Option compilerVar="CC" />
47 59 </Unit>
... ... @@ -130,6 +142,7 @@
130 142 <Unit filename="src/filetransfer/worker.c">
131 143 <Option compilerVar="CC" />
132 144 </Unit>
  145 + <Unit filename="src/include/clipboard.h" />
133 146 <Unit filename="src/include/config.h" />
134 147 <Unit filename="src/include/config.h.in" />
135 148 <Unit filename="src/include/hostselect.h" />
... ... @@ -163,6 +176,9 @@
163 176 <Unit filename="src/terminal/font.c">
164 177 <Option compilerVar="CC" />
165 178 </Unit>
  179 + <Unit filename="src/terminal/get.c">
  180 + <Option compilerVar="CC" />
  181 + </Unit>
166 182 <Unit filename="src/terminal/iocallback.c">
167 183 <Option compilerVar="CC" />
168 184 </Unit>
... ... @@ -185,9 +201,6 @@
185 201 <Unit filename="src/terminal/security.c">
186 202 <Option compilerVar="CC" />
187 203 </Unit>
188   - <Unit filename="src/terminal/selection.c">
189   - <Option compilerVar="CC" />
190   - </Unit>
191 204 <Unit filename="src/terminal/widget.c">
192 205 <Option compilerVar="CC" />
193 206 </Unit>
... ...