File libfm-1.2.3-Fix-SF950.patch of Package libfm

From 699810d3bd0c5d9d508fcd9aa3a65442f2afee3f Mon Sep 17 00:00:00 2001
From: Andriy Grytsenko <andrej@rep.kiev.ua>
Date: Tue, 19 May 2015 20:18:05 +0300
Subject: [PATCH] [SF#950] Fix adding user-defined MIME associations into
 mimeapps.list config.

Change in commit 3c629358f01914f71e2acd73c61174d91d456023 was incorrect,
workaround on GDesktopAppInfo caching should be implemented other way.
---
diff --git a/src/gtk/fm-app-chooser-dlg.c b/src/gtk/fm-app-chooser-dlg.c
index 700c3a8..2649826 100644
--- a/src/gtk/fm-app-chooser-dlg.c
+++ b/src/gtk/fm-app-chooser-dlg.c
@@ -2,7 +2,7 @@
  *      fm-app-chooser-dlg.c
  *
  *      Copyright 2010 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
- *      Copyright 2012-2014 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
+ *      Copyright 2012-2015 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
  *
  *      This program is free software; you can redistribute it and/or modify
  *      it under the terms of the GNU General Public License as published by
@@ -39,6 +39,7 @@
 #include <glib/gi18n-lib.h>
 #include <string.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include "fm.h"
 #include "fm-app-chooser-dlg.h"
 #include "fm-app-menu-view.h"
@@ -97,8 +98,33 @@ static GAppInfo* app_info_create_from_commandline(const char *commandline,
         app_basename = bin_name;
     if(g_mkdir_with_parents(dirname, 0700) == 0)
     {
-        char* filename = g_strdup_printf ("%s/userapp-%s-XXXXXX.desktop", dirname, app_basename);
-        int fd = g_mkstemp (filename);
+        char *filename = NULL;
+        int fd;
+
+#if GLIB_CHECK_VERSION(2, 37, 6)
+        if (mime_type && application_name[0])
+        {
+            /* SF bug #871: new GLib has ids cached so we do a trick here:
+               we create a dummy app before really creating the file */
+            app = g_app_info_create_from_commandline(commandline,
+                                                     app_basename,
+                                                     0, NULL);
+            if (app)
+            {
+                g_app_info_remove_supports_type(app, mime_type, NULL);
+                filename = g_strdup(g_desktop_app_info_get_filename(G_DESKTOP_APP_INFO(app)));
+                g_object_unref(app);
+                app = NULL;
+            }
+        }
+        if (filename)
+            fd = g_open(filename, O_RDWR, 0);
+        else
+#endif
+        {
+            filename = g_strdup_printf ("%s/userapp-%s-XXXXXX.desktop", dirname, app_basename);
+            fd = g_mkstemp (filename);
+        }
         if(fd != -1)
         {
             GString* content = g_string_sized_new(256);
@@ -125,12 +151,18 @@ static GAppInfo* app_info_create_from_commandline(const char *commandline,
             close(fd); /* g_file_set_contents() may fail creating duplicate */
             if(g_file_set_contents(filename, content->str, content->len, NULL))
             {
-                /* SF bug #871: new GLib fails on id, have to use filename */
-                app = G_APP_INFO(g_desktop_app_info_new_from_filename(filename));
+                char *fbname = g_path_get_basename(filename);
+                app = G_APP_INFO(g_desktop_app_info_new(fbname));
+                g_free(fbname);
+                if (app == NULL)
+                {
+                    g_warning("failed to load %s as an application", filename);
+                    g_unlink(filename);
+                }
                 /* if there is mime_type set then created application will be
                    saved for the mime type (see fm_choose_app_for_mime_type()
                    below) but if not then we should remove this temp. file */
-                if(!mime_type || !application_name[0])
+                else if (!mime_type || !application_name[0])
                     /* save the name so this file will be removed later */
                     g_object_weak_ref(G_OBJECT(app), on_temp_appinfo_destroy,
                                       g_strdup(filename));
-- 
2.1.4

openSUSE Build Service is sponsored by