Clipboard: psppire-output-view - Adapt advertised target formats
authorFriedrich Beckmann <friedrich.beckmann@gmx.de>
Sun, 2 Jun 2024 17:45:01 +0000 (19:45 +0200)
committerFriedrich Beckmann <friedrich.beckmann@gmx.de>
Sun, 2 Jun 2024 17:45:01 +0000 (19:45 +0200)
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.

src/ui/gui/psppire-output-view.c

index 06418fae15318aba88178bcb32f34d0248586111..da48e19906d142eda56cda03479da6e1d2eaaf15 100644 (file)
@@ -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: