diff --git a/src/include/clipboard.h b/src/include/clipboard.h index 863fe7d..cf2c4ca 100644 --- a/src/include/clipboard.h +++ b/src/include/clipboard.h @@ -104,6 +104,9 @@ G_GNUC_INTERNAL gchar * v3270_get_copy_as_table(v3270 * terminal, const gchar *delimiter, const gchar *encoding); G_GNUC_INTERNAL gchar * v3270_get_copy_as_data_block(v3270 * terminal); + G_GNUC_INTERNAL void v3270_clipboard_clear(GtkClipboard *clipboard, GObject *obj); + G_GNUC_INTERNAL void v3270_clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj); + /// @brief Set contents. G_GNUC_INTERNAL gboolean v3270_set_from_data_block(v3270 * terminal, const struct SelectionHeader *selection); diff --git a/src/selection/copy.c b/src/selection/copy.c index b668e35..de17395 100644 --- a/src/selection/copy.c +++ b/src/selection/copy.c @@ -30,7 +30,17 @@ #include #include - static void do_copy(v3270 *terminal, gboolean cut) { + static void do_copy(v3270 *terminal, V3270_COPY_MODE mode, gboolean cut) { + + if(mode == V3270_COPY_SMART) { + mode = (terminal->append ? V3270_COPY_APPEND : V3270_COPY_FORMATTED); + } + + if(mode != V3270_COPY_APPEND) { + // It's not append, clear current contents ... + v3270_clear_selection(terminal); + terminal->selection.format = mode; + } lib3270_selection * selection = lib3270_selection_new(terminal->host,cut,0); @@ -44,32 +54,60 @@ LIB3270_EXPORT void v3270_clipboard_set(GtkWidget *widget, V3270_COPY_MODE mode, gboolean cut) { g_return_if_fail(GTK_IS_V3270(widget)); + do_copy(GTK_V3270(widget),mode,cut); + v3270_update_system_clipboard(widget); + + } + + LIB3270_EXPORT void v3270_copy_selection(GtkWidget *widget, V3270_COPY_MODE mode, gboolean cut) { + v3270_clipboard_set(widget,mode,cut); + } + + LIB3270_EXPORT void v3270_append_selection(GtkWidget *widget, gboolean cut) { + v3270_clipboard_set(widget,V3270_COPY_APPEND,cut); + } + LIB3270_EXPORT void v3270_copy_as_html(GtkWidget *widget) { + + g_return_if_fail(GTK_IS_V3270(widget)); v3270 * terminal = GTK_V3270(widget); - if(mode == V3270_COPY_SMART) { - mode = (terminal->append ? V3270_COPY_APPEND : V3270_COPY_FORMATTED); - } + debug("%s",__FUNCTION__); - if(mode != V3270_COPY_APPEND) { + do_copy(terminal,V3270_COPY_FORMATTED,0); - // It's not append, clear current contents ... - v3270_clear_selection(terminal); + // + // Export only in HTML format + // + GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,terminal->selection.target); - terminal->selection.format = mode; + GtkTargetList * list = gtk_target_list_new(NULL,0); - } + static const GtkTargetEntry entry = { + .target = "text/html", + .flags = 0, + .info = CLIPBOARD_TYPE_HTML + }; - do_copy(terminal,cut); + gtk_target_list_add_table(list, &entry, 1); - v3270_update_system_clipboard(widget); - } + int n_targets; + GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets); - LIB3270_EXPORT void v3270_copy_selection(GtkWidget *widget, V3270_COPY_MODE format, gboolean cut) { - v3270_clipboard_set(widget,format,cut); - } + if(gtk_clipboard_set_with_owner( + clipboard, + targets, + n_targets, + (GtkClipboardGetFunc) v3270_clipboard_get, + (GtkClipboardClearFunc) v3270_clipboard_clear, + G_OBJECT(widget) + )) + { + gtk_clipboard_set_can_store(clipboard,targets,1); + } - LIB3270_EXPORT void v3270_append_selection(GtkWidget *widget, gboolean cut) { - v3270_clipboard_set(widget,V3270_COPY_APPEND,cut); - } + gtk_target_table_free(targets, n_targets); + gtk_target_list_unref(list); + v3270_emit_copy_state(widget); + } diff --git a/src/selection/linux/copy.c b/src/selection/linux/copy.c index d391270..04f65c8 100644 --- a/src/selection/linux/copy.c +++ b/src/selection/linux/copy.c @@ -33,7 +33,7 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ -static void clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED GObject *obj) +void v3270_clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED GObject *obj) { v3270 * terminal = GTK_V3270(obj); @@ -45,7 +45,7 @@ static void clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED } -static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj) +void v3270_clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj) { v3270 * terminal = GTK_V3270(obj); @@ -178,8 +178,8 @@ void v3270_update_system_clipboard(GtkWidget *widget) clipboard, targets, n_targets, - (GtkClipboardGetFunc) clipboard_get, - (GtkClipboardClearFunc) clipboard_clear, + (GtkClipboardGetFunc) v3270_clipboard_get, + (GtkClipboardClearFunc) v3270_clipboard_clear, G_OBJECT(widget) )) { @@ -193,52 +193,4 @@ void v3270_update_system_clipboard(GtkWidget *widget) } -void v3270_set_copy_target(GtkWidget *widget, const gchar *target, guint flags, guint info) { - - v3270 * terminal = GTK_V3270(widget); - - if(!terminal->selection.blocks) - { - // No clipboard data, return. - v3270_emit_copy_state(widget); - return; - } - - // Has clipboard data, inform system. - GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,terminal->selection.target); - - GtkTargetList * list = gtk_target_list_new(NULL,0); - - GtkTargetEntry entry = { - .target = (char *) target, - .flags = flags, - .info = info - }; - - gtk_target_list_add_table(list, &entry, 1); - - int n_targets; - GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets); - - if(gtk_clipboard_set_with_owner( - clipboard, - targets, - n_targets, - (GtkClipboardGetFunc) clipboard_get, - (GtkClipboardClearFunc) clipboard_clear, - G_OBJECT(widget) - )) - { - gtk_clipboard_set_can_store(clipboard,targets,1); - } - - gtk_target_table_free(targets, n_targets); - gtk_target_list_unref(list); - v3270_emit_copy_state(widget); -} - -LIB3270_EXPORT void v3270_copy_as_html(GtkWidget *widget) { - debug("%s(%p)",__FUNCTION__,widget); - v3270_set_copy_target(widget,"text/html", 0, CLIPBOARD_TYPE_HTML); -} diff --git a/src/selection/windows/copy.c b/src/selection/windows/copy.c index d391270..996171c 100644 --- a/src/selection/windows/copy.c +++ b/src/selection/windows/copy.c @@ -33,7 +33,7 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ -static void clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED GObject *obj) +void v3270_clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED GObject *obj) { v3270 * terminal = GTK_V3270(obj); @@ -45,7 +45,7 @@ static void clipboard_clear(G_GNUC_UNUSED GtkClipboard *clipboard, G_GNUC_UNUSED } -static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj) +void v3270_clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj) { v3270 * terminal = GTK_V3270(obj); @@ -178,8 +178,8 @@ void v3270_update_system_clipboard(GtkWidget *widget) clipboard, targets, n_targets, - (GtkClipboardGetFunc) clipboard_get, - (GtkClipboardClearFunc) clipboard_clear, + (GtkClipboardGetFunc) v3270_clipboard_get, + (GtkClipboardClearFunc) v3270_clipboard_clear, G_OBJECT(widget) )) { @@ -192,53 +192,3 @@ void v3270_update_system_clipboard(GtkWidget *widget) v3270_emit_copy_state(widget); } - -void v3270_set_copy_target(GtkWidget *widget, const gchar *target, guint flags, guint info) { - - v3270 * terminal = GTK_V3270(widget); - - if(!terminal->selection.blocks) - { - // No clipboard data, return. - v3270_emit_copy_state(widget); - return; - } - - // Has clipboard data, inform system. - GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,terminal->selection.target); - - GtkTargetList * list = gtk_target_list_new(NULL,0); - - GtkTargetEntry entry = { - .target = (char *) target, - .flags = flags, - .info = info - }; - - gtk_target_list_add_table(list, &entry, 1); - - int n_targets; - GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets); - - if(gtk_clipboard_set_with_owner( - clipboard, - targets, - n_targets, - (GtkClipboardGetFunc) clipboard_get, - (GtkClipboardClearFunc) clipboard_clear, - G_OBJECT(widget) - )) - { - gtk_clipboard_set_can_store(clipboard,targets,1); - } - - gtk_target_table_free(targets, n_targets); - gtk_target_list_unref(list); - v3270_emit_copy_state(widget); -} - -LIB3270_EXPORT void v3270_copy_as_html(GtkWidget *widget) { - debug("%s(%p)",__FUNCTION__,widget); - v3270_set_copy_target(widget,"text/html", 0, CLIPBOARD_TYPE_HTML); -} - -- libgit2 0.21.2