From: Friedrich Beckmann Date: Sun, 2 Jun 2024 17:45:01 +0000 (+0200) Subject: Clipboard: psppire-output-view - Adapt advertised target formats X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab195d580022d2d89afed1de238f6e215e003422;p=pspp Clipboard: psppire-output-view - Adapt advertised target formats When charts are copied to the clipboard, then also text formats were advertised. This patch restricts the advertised clipboard formats such that applications choose the correct format. See: https://savannah.gnu.org/bugs/?65288 The preferred format for charts/images is svg or some image format For tables no image format is advertised such that John can paste html as editable table in libreoffice. --- diff --git a/src/ui/gui/psppire-output-view.c b/src/ui/gui/psppire-output-view.c index 06418fae15..da48e19906 100644 --- a/src/ui/gui/psppire-output-view.c +++ b/src/ui/gui/psppire-output-view.c @@ -714,50 +714,63 @@ clipboard_clear_cb (GtkClipboard *clipboard, { } -#define CBTARGETS \ -CT ( ctn1, "STRING", 0, SELECT_FMT_TEXT ) \ -CT ( ctn2, "TEXT", 0, SELECT_FMT_TEXT ) \ -CT ( ctn3, "COMPOUND_TEXT", 0, SELECT_FMT_TEXT ) \ -CT ( ctn4, "text/plain", 0, SELECT_FMT_TEXT ) \ -CT ( ctn5, "UTF8_STRING", 0, SELECT_FMT_UTF8 ) \ -CT ( ctn6, "text/plain;charset=utf-8", 0, SELECT_FMT_UTF8 ) \ -CT ( ctn7, "text/html", 0, SELECT_FMT_HTML ) \ -CT ( ctn8, "image/svg+xml", 0, SELECT_FMT_SVG ) - -#define CT(ID, TARGET, FLAGS, INFO) static gchar ID[] = TARGET; -CBTARGETS -#undef CT -static gchar ctnlast[] = "application/vnd.oasis.opendocument.text"; - -static const GtkTargetEntry targets[] = { -#define CT(ID, TARGET, FLAGS, INFO) { ID, FLAGS, INFO }, - CBTARGETS -#undef CT - { ctnlast, 0, SELECT_FMT_ODT } +static gchar cbstringtargetname[] = "STRING"; +static gchar cbtexttargetname[] = "TEXT"; +static gchar cbctexttargetname[] = "COMPOUND_TEXT"; +static gchar cbtextmimetargetname[] = "text/plain"; +static gchar cbutf8targetname[] = "UTF8_STRING"; +static gchar cbutf8mimetargetname[] = "text/plain;charset=utf-8"; +static const GtkTargetEntry cbtexttargets[] = { + {cbstringtargetname, 0, SELECT_FMT_TEXT}, + {cbtexttargetname, 0, SELECT_FMT_TEXT}, + {cbctexttargetname, 0, SELECT_FMT_TEXT}, + {cbtextmimetargetname, 0, SELECT_FMT_TEXT}, + {cbutf8targetname, 0, SELECT_FMT_UTF8}, + {cbutf8mimetargetname, 0, SELECT_FMT_UTF8} +}; + +static gchar cbhtmltargetname[] = "text/html"; +static const GtkTargetEntry cbhtmltargets[] = { + {cbhtmltargetname, 0, SELECT_FMT_HTML} +}; + +static gchar cbsvgmimetargetname[] = "image/svg+xml"; +static const GtkTargetEntry cbsvgtargets[] = { + {cbsvgmimetargetname, 0, SELECT_FMT_SVG} +}; + +static gchar cbodttargetname[] = "application/vnd.oasis.opendocument.text"; +static const GtkTargetEntry cbodttargets[] = { + {cbodttargetname, 0, SELECT_FMT_ODT} }; static GtkTargetList * build_target_list (const struct output_item *item) { - GtkTargetList *tl = gtk_target_list_new (targets, G_N_ELEMENTS (targets)); + GtkTargetList *tl = gtk_target_list_new (NULL, 0); g_return_val_if_fail (tl, NULL); switch (item->type) { case OUTPUT_ITEM_CHART: case OUTPUT_ITEM_IMAGE: + gtk_target_list_add_table(tl, cbsvgtargets, G_N_ELEMENTS(cbsvgtargets)); gtk_target_list_add_image_targets (tl, SELECT_FMT_IMG, TRUE); - gtk_target_list_add_image_targets (tl, SELECT_FMT_SVG, TRUE); break; case OUTPUT_ITEM_TABLE: - gtk_target_list_add_text_targets (tl, SELECT_FMT_ODT); - gtk_target_list_add_text_targets (tl, SELECT_FMT_HTML); + /* Some applications at least on MacOS paste differently based on the + the position of the targets in the target list. + gtk_target_list_add_table prepends to the list. At least on MacOS + this results in html having higher priority over text when + html is added later ending up before text in the list. */ + gtk_target_list_add_table(tl, cbodttargets, G_N_ELEMENTS(cbodttargets)); + gtk_target_list_add_table(tl, cbtexttargets, G_N_ELEMENTS(cbtexttargets)); + gtk_target_list_add_table(tl, cbhtmltargets, G_N_ELEMENTS(cbhtmltargets)); break; case OUTPUT_ITEM_MESSAGE: case OUTPUT_ITEM_TEXT: - gtk_target_list_add_text_targets (tl, SELECT_FMT_UTF8); - gtk_target_list_add_text_targets (tl, SELECT_FMT_TEXT); - gtk_target_list_add_text_targets (tl, SELECT_FMT_HTML); - gtk_target_list_add_text_targets (tl, SELECT_FMT_ODT); + gtk_target_list_add_table(tl, cbhtmltargets, G_N_ELEMENTS(cbhtmltargets)); + gtk_target_list_add_table(tl, cbtexttargets, G_N_ELEMENTS(cbtexttargets)); + gtk_target_list_add_table(tl, cbodttargets, G_N_ELEMENTS(cbodttargets)); break; case OUTPUT_ITEM_GROUP: case OUTPUT_ITEM_PAGE_BREAK: