Merge lp:~3v1n0/bamf/create-local-desktop into lp:bamf

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Christopher Townsend
Approved revision: 645
Merged at revision: 572
Proposed branch: lp:~3v1n0/bamf/create-local-desktop
Merge into: lp:bamf
Diff against target: 1319 lines (+731/-51)
23 files modified
debian/libbamf3-1.symbols (+1/-0)
lib/libbamf-private/org.ayatana.bamf.view.xml (+3/-0)
lib/libbamf-private/org.ayatana.bamf.xml (+8/-1)
lib/libbamf/bamf-application.c (+21/-0)
lib/libbamf/bamf-application.h (+3/-2)
lib/libbamf/bamf-control.c (+31/-5)
lib/libbamf/bamf-control.h (+4/-0)
lib/libbamf/bamf-tab-source.c (+1/-1)
src/bamf-application.c (+272/-2)
src/bamf-application.h (+2/-0)
src/bamf-control.c (+45/-8)
src/bamf-control.h (+3/-0)
src/bamf-legacy-window-test.c (+2/-2)
src/bamf-legacy-window.c (+20/-17)
src/bamf-legacy-window.h (+5/-3)
src/bamf-matcher.c (+27/-2)
src/bamf-matcher.h (+2/-0)
src/bamf-tab.c (+2/-4)
src/bamf-unity-webapps-application.c (+10/-1)
src/bamf-unity-webapps-observer.c (+0/-1)
tests/bamfdaemon/test-application.c (+220/-2)
tests/bamfdaemon/test-bamf.c (+12/-0)
tests/bamfdaemon/test-matcher.c (+37/-0)
To merge this branch: bzr merge lp:~3v1n0/bamf/create-local-desktop
Reviewer Review Type Date Requested Status
Christopher Townsend (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Marco Trevisan (Treviño) Pending
Review via email: mp+178794@code.launchpad.net

Commit message

BamfControl: add an API to allow generation of local .desktop file for a BamfApplication.

Add a bamf_control dbus method that requests to generate a new local .desktop
file for the provided application path. In case the application has alredy
a desktop file, the request is ignored. Otherwise we use some euristic to
generate an hopefully valid file saved in $XDG_DATA_HOME dir.

Also added a new DesktopUpdated signal to the BamfApplication DBus interface
that is emitted when the .desktop file for an application is set (for now).

Description of the change

Add a bamf_control dbus method that requests to generate a new local .desktop
file for the provided application path. In case the application has alredy
a desktop file, the request is ignored. Otherwise we use some euristic to
generate an hopefully valid file saved in $XDG_DATA_HOME dir.

Also added a new DesktopUpdated signal to the BamfApplication DBus interface
that is emitted when the .desktop file for an application is set (for now).

All the dbus changes have been reflected to the libbamf API.
New unit tests added.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
lp:~3v1n0/bamf/create-local-desktop updated
645. By Marco Trevisan (Treviño)

debian: update libbamf3-1 symbols file

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Christopher Townsend (townsend) wrote :

Merges and builds cleanly and all tests new and old pass. Code looks good.

I did not try the actual creating the desktop file since that is done by https://code.launchpad.net/~3v1n0/unity/desktop-file-updated-support/+merge/178703. I will review that MP and see if the .desktop file gets created and that the actual bug is fixed.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/libbamf3-1.symbols'
--- debian/libbamf3-1.symbols 2012-12-19 16:21:01 +0000
+++ debian/libbamf3-1.symbols 2013-08-06 16:20:35 +0000
@@ -10,6 +10,7 @@
10 bamf_application_get_xids@Base 0.2.2010 bamf_application_get_xids@Base 0.2.20
11 bamf_application_new@Base 0.2.2011 bamf_application_new@Base 0.2.20
12 bamf_application_new_favorite@Base 0.2.6012 bamf_application_new_favorite@Base 0.2.60
13 bamf_control_create_local_desktop_file@Base 0.5.0
13 bamf_control_get_default@Base 0.2.2014 bamf_control_get_default@Base 0.2.20
14 bamf_control_get_type@Base 0.2.2015 bamf_control_get_type@Base 0.2.20
15 bamf_control_insert_desktop_file@Base 0.2.2016 bamf_control_insert_desktop_file@Base 0.2.20
1617
=== modified file 'lib/libbamf-private/org.ayatana.bamf.view.xml'
--- lib/libbamf-private/org.ayatana.bamf.view.xml 2013-06-19 19:31:58 +0000
+++ lib/libbamf-private/org.ayatana.bamf.view.xml 2013-08-06 16:20:35 +0000
@@ -105,6 +105,9 @@
105 <signal name="SupportedMimeTypesChanged">105 <signal name="SupportedMimeTypesChanged">
106 <arg name="dnd_mimes" type="as"/>106 <arg name="dnd_mimes" type="as"/>
107 </signal>107 </signal>
108 <signal name="DesktopFileUpdated">
109 <arg name="desktop_file" type="s"/>
110 </signal>
108 </interface>111 </interface>
109112
110 <interface name="org.ayatana.bamf.window">113 <interface name="org.ayatana.bamf.window">
111114
=== modified file 'lib/libbamf-private/org.ayatana.bamf.xml'
--- lib/libbamf-private/org.ayatana.bamf.xml 2013-06-08 13:54:06 +0000
+++ lib/libbamf-private/org.ayatana.bamf.xml 2013-08-06 16:20:35 +0000
@@ -4,7 +4,7 @@
4 <interface name="org.ayatana.bamf.control">4 <interface name="org.ayatana.bamf.control">
5 <method name="Quit">5 <method name="Quit">
6 </method>6 </method>
7 <method name="OmNomNomDesktopFile">7 <method name="InsertDesktopFile">
8 <arg name="tab_path" type="s" direction="in"/>8 <arg name="tab_path" type="s" direction="in"/>
9 </method>9 </method>
10 <method name="RegisterTabProvider">10 <method name="RegisterTabProvider">
@@ -14,6 +14,13 @@
14 <arg name="application" type="s" direction="in"/>14 <arg name="application" type="s" direction="in"/>
15 <arg name="pid" type="i" direction="in"/>15 <arg name="pid" type="i" direction="in"/>
16 </method>16 </method>
17 <method name="CreateLocalDesktopFile">
18 <arg name="application" type="s" direction="in"/>
19 </method>
20 <method name="OmNomNomDesktopFile">
21 <annotation name="org.freedesktop.DBus.Deprecated" value="true"/>
22 <arg name="tab_path" type="s" direction="in"/>
23 </method>
17 </interface>24 </interface>
1825
19 <interface name="org.ayatana.bamf.matcher">26 <interface name="org.ayatana.bamf.matcher">
2027
=== modified file 'lib/libbamf/bamf-application.c'
--- lib/libbamf/bamf-application.c 2013-07-20 14:57:45 +0000
+++ lib/libbamf/bamf-application.c 2013-08-06 16:20:35 +0000
@@ -52,6 +52,7 @@
5252
53enum53enum
54{54{
55 DESKTOP_FILE_UPDATED,
55 WINDOW_ADDED,56 WINDOW_ADDED,
56 WINDOW_REMOVED,57 WINDOW_REMOVED,
5758
@@ -408,6 +409,15 @@
408}409}
409410
410static void411static void
412bamf_application_on_desktop_file_updated (BamfDBusItemApplication *proxy, const char *desktop_file, BamfApplication *self)
413{
414 g_free (self->priv->desktop_file);
415 self->priv->desktop_file = g_strdup (desktop_file);
416
417 g_signal_emit (self, application_signals[DESKTOP_FILE_UPDATED], 0, desktop_file);
418}
419
420static void
411bamf_application_on_window_added (BamfDBusItemApplication *proxy, const char *path, BamfApplication *self)421bamf_application_on_window_added (BamfDBusItemApplication *proxy, const char *path, BamfApplication *self)
412{422{
413 BamfView *view;423 BamfView *view;
@@ -549,6 +559,9 @@
549559
550 g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (priv->proxy), BAMF_DBUS_DEFAULT_TIMEOUT);560 g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (priv->proxy), BAMF_DBUS_DEFAULT_TIMEOUT);
551561
562 g_signal_connect (priv->proxy, "desktop-file-updated",
563 G_CALLBACK (bamf_application_on_desktop_file_updated), view);
564
552 g_signal_connect (priv->proxy, "window-added",565 g_signal_connect (priv->proxy, "window-added",
553 G_CALLBACK (bamf_application_on_window_added), view);566 G_CALLBACK (bamf_application_on_window_added), view);
554567
@@ -678,6 +691,14 @@
678691
679 g_type_class_add_private (obj_class, sizeof (BamfApplicationPrivate));692 g_type_class_add_private (obj_class, sizeof (BamfApplicationPrivate));
680693
694 application_signals [DESKTOP_FILE_UPDATED] =
695 g_signal_new (BAMF_APPLICATION_SIGNAL_DESKTOP_FILE_UPDATED,
696 G_OBJECT_CLASS_TYPE (klass),
697 0,
698 0, NULL, NULL, NULL,
699 G_TYPE_NONE, 1,
700 G_TYPE_STRING);
701
681 application_signals [WINDOW_ADDED] =702 application_signals [WINDOW_ADDED] =
682 g_signal_new (BAMF_APPLICATION_SIGNAL_WINDOW_ADDED,703 g_signal_new (BAMF_APPLICATION_SIGNAL_WINDOW_ADDED,
683 G_OBJECT_CLASS_TYPE (klass),704 G_OBJECT_CLASS_TYPE (klass),
684705
=== modified file 'lib/libbamf/bamf-application.h'
--- lib/libbamf/bamf-application.h 2013-06-18 14:46:15 +0000
+++ lib/libbamf/bamf-application.h 2013-08-06 16:20:35 +0000
@@ -50,8 +50,9 @@
50#define BAMF_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\50#define BAMF_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\
51 BAMF_TYPE_APPLICATION, BamfApplicationClass))51 BAMF_TYPE_APPLICATION, BamfApplicationClass))
5252
53#define BAMF_APPLICATION_SIGNAL_WINDOW_ADDED "window-added"53#define BAMF_APPLICATION_SIGNAL_DESKTOP_FILE_UPDATED "desktop-file-updated"
54#define BAMF_APPLICATION_SIGNAL_WINDOW_REMOVED "window-removed"54#define BAMF_APPLICATION_SIGNAL_WINDOW_ADDED "window-added"
55#define BAMF_APPLICATION_SIGNAL_WINDOW_REMOVED "window-removed"
5556
56typedef struct _BamfApplication BamfApplication;57typedef struct _BamfApplication BamfApplication;
57typedef struct _BamfApplicationClass BamfApplicationClass;58typedef struct _BamfApplicationClass BamfApplicationClass;
5859
=== modified file 'lib/libbamf/bamf-control.c'
--- lib/libbamf/bamf-control.c 2013-06-08 13:54:06 +0000
+++ lib/libbamf/bamf-control.c 2013-08-06 16:20:35 +0000
@@ -37,6 +37,7 @@
3737
38#include <libbamf-private/bamf-private.h>38#include <libbamf-private/bamf-private.h>
39#include "bamf-control.h"39#include "bamf-control.h"
40#include "bamf-view-private.h"
4041
41G_DEFINE_TYPE (BamfControl, bamf_control, G_TYPE_OBJECT);42G_DEFINE_TYPE (BamfControl, bamf_control, G_TYPE_OBJECT);
4243
@@ -117,7 +118,7 @@
117/**118/**
118 * bamf_control_get_default:119 * bamf_control_get_default:
119 *120 *
120 * Returns: (transfer none): The default #BamfControl reference.121 * Returns: (transfer full): The default #BamfControl reference.
121 */122 */
122BamfControl *123BamfControl *
123bamf_control_get_default (void)124bamf_control_get_default (void)
@@ -125,7 +126,9 @@
125 if (BAMF_IS_CONTROL (default_control))126 if (BAMF_IS_CONTROL (default_control))
126 return g_object_ref (default_control);127 return g_object_ref (default_control);
127128
128 return (default_control = g_object_new (BAMF_TYPE_CONTROL, NULL));129 default_control = g_object_new (BAMF_TYPE_CONTROL, NULL);
130
131 return default_control;
129}132}
130133
131void134void
@@ -137,9 +140,8 @@
137 g_return_if_fail (BAMF_IS_CONTROL (control));140 g_return_if_fail (BAMF_IS_CONTROL (control));
138 priv = control->priv;141 priv = control->priv;
139142
140 if (!_bamf_dbus_control_call_om_nom_nom_desktop_file_sync (priv->proxy,143 if (!_bamf_dbus_control_call_insert_desktop_file_sync (priv->proxy, desktop_file,
141 desktop_file,144 NULL, &error))
142 NULL, &error))
143 {145 {
144 g_warning ("Failed to insert desktop file: %s", error->message);146 g_warning ("Failed to insert desktop file: %s", error->message);
145 g_error_free (error);147 g_error_free (error);
@@ -147,6 +149,30 @@
147}149}
148150
149void151void
152bamf_control_create_local_desktop_file (BamfControl *control, BamfApplication *app)
153{
154 BamfControlPrivate *priv;
155 const gchar *app_path;
156 GError *error = NULL;
157
158 g_return_if_fail (BAMF_IS_CONTROL (control));
159 g_return_if_fail (BAMF_IS_APPLICATION (app));
160
161 priv = control->priv;
162 app_path = _bamf_view_get_path (BAMF_VIEW (app));
163
164 if (!app_path)
165 return;
166
167 if (!_bamf_dbus_control_call_create_local_desktop_file_sync (priv->proxy, app_path,
168 NULL, &error))
169 {
170 g_warning ("Failed to create local desktop file: %s", error->message);
171 g_error_free (error);
172 }
173}
174
175void
150bamf_control_register_application_for_pid (BamfControl *control,176bamf_control_register_application_for_pid (BamfControl *control,
151 const gchar *desktop_file,177 const gchar *desktop_file,
152 gint32 pid)178 gint32 pid)
153179
=== modified file 'lib/libbamf/bamf-control.h'
--- lib/libbamf/bamf-control.h 2013-06-08 13:54:06 +0000
+++ lib/libbamf/bamf-control.h 2013-08-06 16:20:35 +0000
@@ -29,6 +29,7 @@
29#define _BAMF_CONTROL_H_29#define _BAMF_CONTROL_H_
3030
31#include <glib-object.h>31#include <glib-object.h>
32#include "bamf-application.h"
3233
33G_BEGIN_DECLS34G_BEGIN_DECLS
3435
@@ -80,6 +81,9 @@
80void bamf_control_insert_desktop_file (BamfControl *control,81void bamf_control_insert_desktop_file (BamfControl *control,
81 const gchar *desktop_file);82 const gchar *desktop_file);
8283
84void bamf_control_create_local_desktop_file (BamfControl *control,
85 BamfApplication *application);
86
83void bamf_control_register_application_for_pid (BamfControl *control,87void bamf_control_register_application_for_pid (BamfControl *control,
84 const gchar *desktop_file,88 const gchar *desktop_file,
85 gint32 pid);89 gint32 pid);
8690
=== modified file 'lib/libbamf/bamf-tab-source.c'
--- lib/libbamf/bamf-tab-source.c 2013-06-13 22:20:25 +0000
+++ lib/libbamf/bamf-tab-source.c 2013-08-06 16:20:35 +0000
@@ -138,8 +138,8 @@
138 gchar *tab_id,138 gchar *tab_id,
139 BamfTabSource *self)139 BamfTabSource *self)
140{140{
141 g_dbus_method_invocation_return_value (invocation, NULL);
141 bamf_tab_source_show_tab (self, tab_id, NULL);142 bamf_tab_source_show_tab (self, tab_id, NULL);
142 g_dbus_method_invocation_return_value (invocation, NULL);
143143
144 return TRUE;144 return TRUE;
145}145}
146146
=== modified file 'src/bamf-application.c'
--- src/bamf-application.c 2013-07-23 22:40:05 +0000
+++ src/bamf-application.c 2013-08-06 16:20:35 +0000
@@ -40,6 +40,7 @@
40 BamfDBusItemApplication *dbus_iface;40 BamfDBusItemApplication *dbus_iface;
41 BamfApplicationType app_type;41 BamfApplicationType app_type;
42 BamfView * main_child;42 BamfView * main_child;
43 GCancellable * cancellable;
43 char * desktop_file;44 char * desktop_file;
44 GList * desktop_file_list;45 GList * desktop_file_list;
45 char * wmclass;46 char * wmclass;
@@ -104,7 +105,7 @@
104105
105 GKeyFile* key_file = g_key_file_new ();106 GKeyFile* key_file = g_key_file_new ();
106107
107 if (!g_key_file_load_from_file (key_file, desktop_file, (GKeyFileFlags) 0, NULL))108 if (!g_key_file_load_from_file (key_file, desktop_file, G_KEY_FILE_NONE, NULL))
108 {109 {
109 g_key_file_free (key_file);110 g_key_file_free (key_file);
110 return NULL;111 return NULL;
@@ -340,7 +341,7 @@
340341
341 if (!icon)342 if (!icon)
342 {343 {
343 icon = g_strdup (bamf_legacy_window_save_mini_icon (legacy_window));344 icon = bamf_legacy_window_save_mini_icon (legacy_window);
344345
345 if (!icon)346 if (!icon)
346 {347 {
@@ -388,6 +389,9 @@
388 on_main_child_name_changed, application);389 on_main_child_name_changed, application);
389 }390 }
390391
392 g_signal_emit_by_name (application, "desktop-file-updated",
393 application->priv->desktop_file);
394
391 bamf_application_setup_icon_and_name (application, TRUE);395 bamf_application_setup_icon_and_name (application, TRUE);
392}396}
393397
@@ -414,6 +418,255 @@
414 return TRUE;418 return TRUE;
415}419}
416420
421static GFile *
422try_create_subdir (GFile *parent, const gchar *child_name, GCancellable *cancellable)
423{
424 GFile *child;
425 GError *error = NULL;
426
427 child = g_file_get_child (parent, child_name);
428 g_return_val_if_fail (G_IS_FILE (child), NULL);
429
430 g_file_make_directory_with_parents (child, cancellable, &error);
431
432 if (error)
433 {
434 if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS))
435 {
436 g_error ("Impossible to create `%s` directory: %s", child_name, error->message);
437 g_clear_object (&child);
438 }
439
440 g_error_free (error);
441 }
442
443 return child;
444}
445
446static GFile *
447try_create_child (GFile *parent, const gchar *basename, const gchar *extension, GCancellable *cancellable)
448{
449 gchar *down, *child_name;
450
451 down = g_ascii_strdown (basename, -1);
452 g_strdelimit (down, "/\\&%\"'!?`*.;:^|()= <>[]{}", '_');
453
454 child_name = g_strconcat (down, extension, NULL);
455
456 GFile *child = g_file_get_child (parent, child_name);
457 g_return_val_if_fail (G_IS_FILE (child), NULL);
458
459 if (g_file_query_exists (child, cancellable))
460 g_clear_object (&child);
461
462 g_free (child_name);
463 g_free (down);
464
465 return child;
466}
467
468gboolean
469try_create_local_desktop_data (GFile *apps_dir, GFile *icons_dir, const char *basename,
470 GFile **out_desktop_file, GFile **out_icon_file,
471 GCancellable *cancellable)
472{
473 g_return_val_if_fail (out_desktop_file, NULL);
474
475 if (!apps_dir)
476 {
477 *out_desktop_file = NULL;
478 g_warn_if_reached ();
479 }
480
481 *out_desktop_file = try_create_child (apps_dir, basename, ".desktop", cancellable);
482
483 if (G_IS_FILE (*out_desktop_file))
484 {
485 if (G_IS_FILE (icons_dir) && out_icon_file)
486 *out_icon_file = try_create_child (icons_dir, basename, ".png", cancellable);
487
488 return TRUE;
489 }
490
491 return FALSE;
492}
493
494gboolean
495bamf_application_create_local_desktop_file (BamfApplication *self)
496{
497 BamfApplicationPrivate *priv;
498 BamfLegacyWindow *window;
499 GKeyFile *key_file;
500 const gchar *name, *icon, *iclass, *nclass, *class, *exec;
501 GFile *data_dir, *apps_dir, *icons_dir, *desktop_file, *icon_file, *mini_icon;
502 GError *error = NULL;
503
504 g_return_val_if_fail (BAMF_IS_APPLICATION (self), FALSE);
505 priv = self->priv;
506
507 if (priv->desktop_file || !BAMF_IS_WINDOW (priv->main_child))
508 {
509 return FALSE;
510 }
511
512 window = bamf_window_get_window (BAMF_WINDOW (priv->main_child));
513 exec = bamf_legacy_window_get_exec_string (window);
514
515 if (!exec)
516 {
517 return FALSE;
518 }
519
520 data_dir = g_file_new_for_path (g_get_user_data_dir ());
521 name = bamf_view_get_name (BAMF_VIEW (self));
522 icon = bamf_view_get_icon (BAMF_VIEW (self));
523 iclass = bamf_legacy_window_get_class_instance_name (window);
524 nclass = bamf_legacy_window_get_class_name (window);
525 mini_icon = bamf_legacy_window_get_saved_mini_icon (window);
526
527 apps_dir = try_create_subdir (data_dir, "applications", priv->cancellable);
528 icons_dir = NULL;
529
530 if (!G_IS_FILE (apps_dir))
531 {
532 g_object_unref (data_dir);
533 return FALSE;
534 }
535
536 if (icon && G_IS_FILE (mini_icon))
537 icons_dir = try_create_subdir (data_dir, "icons", priv->cancellable);
538
539 g_clear_object (&data_dir);
540
541 desktop_file = NULL;
542 icon_file = NULL;
543 class = (iclass) ? iclass : nclass;
544
545 if (class)
546 {
547 try_create_local_desktop_data (apps_dir, icons_dir, class,
548 &desktop_file, &icon_file, priv->cancellable);
549 }
550
551 if (!G_IS_FILE (desktop_file))
552 {
553 BamfMatcher *matcher = bamf_matcher_get_default ();
554 gchar *trimmed_exec = bamf_matcher_get_trimmed_exec (matcher, exec);
555 try_create_local_desktop_data (apps_dir, icons_dir, trimmed_exec,
556 &desktop_file, &icon_file, priv->cancellable);
557 g_free (trimmed_exec);
558 }
559
560 if (!G_IS_FILE (desktop_file))
561 {
562 try_create_local_desktop_data (apps_dir, icons_dir, exec,
563 &desktop_file, &icon_file, priv->cancellable);
564 }
565
566 g_object_unref (apps_dir);
567
568 if (!G_IS_FILE (desktop_file))
569 {
570 g_critical ("Impossible to find a valid path where to save a .desktop file");
571 g_clear_object (&icons_dir);
572 g_clear_object (&icon_file);
573 return FALSE;
574 }
575
576 if (G_IS_FILE (icons_dir) && !G_IS_FILE (icon_file))
577 {
578 gchar *basename = g_file_get_basename (mini_icon);
579 icon_file = try_create_child (icons_dir, basename+1, ".png", priv->cancellable);
580 g_free (basename);
581 }
582
583 g_clear_object (&icons_dir);
584
585 if (G_IS_FILE (icon_file))
586 {
587 if (!g_file_copy (mini_icon, icon_file, G_FILE_COPY_NONE,
588 priv->cancellable, NULL, NULL, &error))
589 {
590 g_warning ("Impossible to copy icon to final destination: %s", error->message);
591 g_clear_error (&error);
592 g_clear_object (&icon_file);
593 }
594 }
595
596 key_file = g_key_file_new ();
597 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
598 G_KEY_FILE_DESKTOP_KEY_TYPE,
599 G_KEY_FILE_DESKTOP_TYPE_APPLICATION);
600
601 if (name)
602 {
603 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
604 G_KEY_FILE_DESKTOP_KEY_NAME, name);
605 }
606
607 if (icon_file)
608 {
609 gchar *basename = g_file_get_basename (icon_file);
610 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
611 G_KEY_FILE_DESKTOP_KEY_ICON, basename);
612 bamf_view_set_icon (BAMF_VIEW (self), basename);
613 g_free (basename);
614 g_clear_object (&icon_file);
615 }
616 else if (icon)
617 {
618 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
619 G_KEY_FILE_DESKTOP_KEY_ICON, icon);
620 }
621
622 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
623 G_KEY_FILE_DESKTOP_KEY_EXEC, exec);
624
625 g_key_file_set_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP,
626 G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY, TRUE);
627
628 if (class)
629 {
630 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
631 G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS, class);
632 }
633
634 gsize data_length = 0;
635 gchar *data = g_key_file_to_data (key_file, &data_length, &error);
636 g_key_file_free (key_file);
637
638 if (error)
639 {
640 g_critical ("Impossible to generate local desktop file: %s", error->message);
641 g_clear_error (&error);
642 g_clear_pointer (&data, g_free);
643 }
644
645 if (data)
646 {
647 g_file_replace_contents (desktop_file, data, data_length, NULL, FALSE,
648 G_FILE_CREATE_NONE, NULL, priv->cancellable, &error);
649 g_free (data);
650
651 if (error)
652 {
653 g_critical ("Impossible to create local desktop file: %s", error->message);
654 g_clear_error (&error);
655 g_object_unref (desktop_file);
656
657 return FALSE;
658 }
659 }
660
661 gchar *desktop_path = g_file_get_path (desktop_file);
662 g_object_unref (desktop_file);
663
664 bamf_application_set_desktop_file (self, desktop_path);
665 g_free (desktop_path);
666
667 return TRUE;
668}
669
417void670void
418bamf_application_set_wmclass (BamfApplication *application,671bamf_application_set_wmclass (BamfApplication *application,
419 const char *wmclass)672 const char *wmclass)
@@ -888,6 +1141,13 @@
888 g_signal_emit_by_name (self->priv->dbus_iface, "window-removed", win_path);1141 g_signal_emit_by_name (self->priv->dbus_iface, "window-removed", win_path);
889}1142}
8901143
1144static void
1145on_desktop_file_updated (BamfApplication *self, const gchar *file, gpointer _not_used)
1146{
1147 g_return_if_fail (BAMF_IS_APPLICATION (self));
1148 g_signal_emit_by_name (self->priv->dbus_iface, "desktop-file-updated", file);
1149}
1150
891static gboolean1151static gboolean
892on_dbus_handle_show_stubs (BamfDBusItemApplication *interface,1152on_dbus_handle_show_stubs (BamfDBusItemApplication *interface,
893 GDBusMethodInvocation *invocation,1153 GDBusMethodInvocation *invocation,
@@ -1056,6 +1316,13 @@
1056 priv->main_child = NULL;1316 priv->main_child = NULL;
1057 }1317 }
10581318
1319 if (priv->cancellable)
1320 {
1321 g_cancellable_cancel (priv->cancellable);
1322 g_object_unref (priv->cancellable);
1323 priv->cancellable = NULL;
1324 }
1325
1059 g_strfreev (priv->mimes);1326 g_strfreev (priv->mimes);
1060 priv->mimes = NULL;1327 priv->mimes = NULL;
10611328
@@ -1085,6 +1352,8 @@
1085 priv->app_type = BAMF_APPLICATION_SYSTEM;1352 priv->app_type = BAMF_APPLICATION_SYSTEM;
1086 priv->show_stubs = TRUE;1353 priv->show_stubs = TRUE;
10871354
1355 priv->cancellable = g_cancellable_new ();
1356
1088 /* Initializing the dbus interface */1357 /* Initializing the dbus interface */
1089 priv->dbus_iface = _bamf_dbus_item_application_skeleton_new ();1358 priv->dbus_iface = _bamf_dbus_item_application_skeleton_new ();
10901359
@@ -1092,6 +1361,7 @@
1092 * interface */1361 * interface */
1093 g_signal_connect (self, "window-added", G_CALLBACK (on_window_added), NULL);1362 g_signal_connect (self, "window-added", G_CALLBACK (on_window_added), NULL);
1094 g_signal_connect (self, "window-removed", G_CALLBACK (on_window_removed), NULL);1363 g_signal_connect (self, "window-removed", G_CALLBACK (on_window_removed), NULL);
1364 g_signal_connect (self, "desktop-file-updated", G_CALLBACK (on_desktop_file_updated), NULL);
10951365
1096 /* Registering signal callbacks to reply to dbus method calls */1366 /* Registering signal callbacks to reply to dbus method calls */
1097 g_signal_connect (priv->dbus_iface, "handle-show-stubs",1367 g_signal_connect (priv->dbus_iface, "handle-show-stubs",
10981368
=== modified file 'src/bamf-application.h'
--- src/bamf-application.h 2013-07-16 16:17:38 +0000
+++ src/bamf-application.h 2013-08-06 16:20:35 +0000
@@ -84,6 +84,8 @@
84gboolean bamf_application_contains_similar_to_window (BamfApplication *app,84gboolean bamf_application_contains_similar_to_window (BamfApplication *app,
85 BamfWindow *window);85 BamfWindow *window);
8686
87gboolean bamf_application_create_local_desktop_file (BamfApplication *app);
88
87const char * bamf_application_get_wmclass (BamfApplication *application);89const char * bamf_application_get_wmclass (BamfApplication *application);
88void bamf_application_set_wmclass (BamfApplication *application,90void bamf_application_set_wmclass (BamfApplication *application,
89 const char *wmclass);91 const char *wmclass);
9092
=== modified file 'src/bamf-control.c'
--- src/bamf-control.c 2013-06-08 13:54:06 +0000
+++ src/bamf-control.c 2013-08-06 16:20:35 +0000
@@ -19,9 +19,12 @@
19 */19 */
2020
2121
22#include "bamf-matcher.h"22#include <libbamf-private/bamf-private.h>
23
23#include "bamf-control.h"24#include "bamf-control.h"
25#include "bamf-application.h"
24#include "bamf-daemon.h"26#include "bamf-daemon.h"
27#include "bamf-matcher.h"
2528
26G_DEFINE_TYPE (BamfControl, bamf_control, BAMF_DBUS_TYPE_CONTROL_SKELETON);29G_DEFINE_TYPE (BamfControl, bamf_control, BAMF_DBUS_TYPE_CONTROL_SKELETON);
27#define BAMF_CONTROL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \30#define BAMF_CONTROL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \
@@ -96,20 +99,20 @@
96 GDBusMethodInvocation *invocation,99 GDBusMethodInvocation *invocation,
97 BamfControl *self)100 BamfControl *self)
98{101{
102 g_dbus_method_invocation_return_value (invocation, NULL);
99 bamf_control_quit (self);103 bamf_control_quit (self);
100 g_dbus_method_invocation_return_value (invocation, NULL);
101104
102 return TRUE;105 return TRUE;
103}106}
104107
105static gboolean108static gboolean
106on_dbus_handle_om_nom_nom_desktop_file (BamfDBusControl *interface,109on_dbus_handle_insert_desktop_file (BamfDBusControl *interface,
107 GDBusMethodInvocation *invocation,110 GDBusMethodInvocation *invocation,
108 const gchar *desktop_file,111 const gchar *desktop_file,
109 BamfControl *self)112 BamfControl *self)
110{113{
114 g_dbus_method_invocation_return_value (invocation, NULL);
111 bamf_control_insert_desktop_file (self, desktop_file);115 bamf_control_insert_desktop_file (self, desktop_file);
112 g_dbus_method_invocation_return_value (invocation, NULL);
113116
114 return TRUE;117 return TRUE;
115}118}
@@ -121,8 +124,20 @@
121 guint pid,124 guint pid,
122 BamfControl *self)125 BamfControl *self)
123{126{
127 g_dbus_method_invocation_return_value (invocation, NULL);
124 bamf_control_register_application_for_pid (self, application, pid);128 bamf_control_register_application_for_pid (self, application, pid);
129
130 return TRUE;
131}
132
133static gboolean
134on_dbus_handle_create_local_desktop_file (BamfDBusControl *interface,
135 GDBusMethodInvocation *invocation,
136 const gchar *desktop_file,
137 BamfControl *self)
138{
125 g_dbus_method_invocation_return_value (invocation, NULL);139 g_dbus_method_invocation_return_value (invocation, NULL);
140 bamf_control_create_local_desktop_file (self, desktop_file);
126141
127 return TRUE;142 return TRUE;
128}143}
@@ -138,10 +153,16 @@
138 G_CALLBACK (on_dbus_handle_quit), self);153 G_CALLBACK (on_dbus_handle_quit), self);
139154
140 g_signal_connect (self, "handle-om-nom-nom-desktop-file",155 g_signal_connect (self, "handle-om-nom-nom-desktop-file",
141 G_CALLBACK (on_dbus_handle_om_nom_nom_desktop_file), self);156 G_CALLBACK (on_dbus_handle_insert_desktop_file), self);
157
158 g_signal_connect (self, "handle-insert-desktop-file",
159 G_CALLBACK (on_dbus_handle_insert_desktop_file), self);
142160
143 g_signal_connect (self, "handle-register-application-for-pid",161 g_signal_connect (self, "handle-register-application-for-pid",
144 G_CALLBACK (on_dbus_handle_register_application_for_pid), self);162 G_CALLBACK (on_dbus_handle_register_application_for_pid), self);
163
164 g_signal_connect (self, "handle-create-local-desktop-file",
165 G_CALLBACK (on_dbus_handle_create_local_desktop_file), self);
145}166}
146167
147static void168static void
@@ -191,6 +212,22 @@
191 bamf_matcher_load_desktop_file (matcher, path);212 bamf_matcher_load_desktop_file (matcher, path);
192}213}
193214
215void
216bamf_control_create_local_desktop_file (BamfControl *control, const char *app_path)
217{
218 BamfMatcher *matcher;
219 BamfView *view;
220
221 g_return_if_fail (BAMF_IS_CONTROL (control));
222 g_return_if_fail (app_path);
223
224 matcher = bamf_matcher_get_default ();
225 view = bamf_matcher_get_view_by_path (matcher, app_path);
226
227 if (BAMF_IS_APPLICATION (view))
228 bamf_application_create_local_desktop_file (BAMF_APPLICATION (view));
229}
230
194static gboolean231static gboolean
195bamf_control_on_quit (BamfControl *control)232bamf_control_on_quit (BamfControl *control)
196{233{
197234
=== modified file 'src/bamf-control.h'
--- src/bamf-control.h 2013-06-08 13:54:06 +0000
+++ src/bamf-control.h 2013-08-06 16:20:35 +0000
@@ -63,6 +63,9 @@
63void bamf_control_insert_desktop_file (BamfControl *control,63void bamf_control_insert_desktop_file (BamfControl *control,
64 const char *path);64 const char *path);
6565
66void bamf_control_create_local_desktop_file (BamfControl *control,
67 const char *desktop_file);
68
66void bamf_control_quit (BamfControl *control);69void bamf_control_quit (BamfControl *control);
6770
68BamfControl * bamf_control_get_default (void);71BamfControl * bamf_control_get_default (void);
6972
=== modified file 'src/bamf-legacy-window-test.c'
--- src/bamf-legacy-window-test.c 2013-07-23 22:40:05 +0000
+++ src/bamf-legacy-window-test.c 2013-08-06 16:20:35 +0000
@@ -420,10 +420,10 @@
420 return g_hash_table_insert (self->hints, g_strdup (name), g_strdup (value));420 return g_hash_table_insert (self->hints, g_strdup (name), g_strdup (value));
421}421}
422422
423static const char *423static char *
424bamf_legacy_window_test_save_mini_icon (BamfLegacyWindow *window)424bamf_legacy_window_test_save_mini_icon (BamfLegacyWindow *window)
425{425{
426 return BAMF_LEGACY_WINDOW_TEST (window)->icon;426 return g_strdup (BAMF_LEGACY_WINDOW_TEST (window)->icon);
427}427}
428428
429static void429static void
430430
=== modified file 'src/bamf-legacy-window.c'
--- src/bamf-legacy-window.c 2013-07-23 22:40:05 +0000
+++ src/bamf-legacy-window.c 2013-08-06 16:20:35 +0000
@@ -51,7 +51,7 @@
51struct _BamfLegacyWindowPrivate51struct _BamfLegacyWindowPrivate
52{52{
53 WnckWindow * legacy_window;53 WnckWindow * legacy_window;
54 gchar * mini_icon_path;54 GFile * mini_icon;
55 gchar * exec_string;55 gchar * exec_string;
56 gboolean is_closed;56 gboolean is_closed;
57};57};
@@ -260,7 +260,7 @@
260 return self->priv->exec_string;260 return self->priv->exec_string;
261}261}
262262
263const char *263char *
264bamf_legacy_window_save_mini_icon (BamfLegacyWindow *self)264bamf_legacy_window_save_mini_icon (BamfLegacyWindow *self)
265{265{
266 WnckWindow *window;266 WnckWindow *window;
@@ -274,16 +274,16 @@
274 if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->save_mini_icon)274 if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->save_mini_icon)
275 return BAMF_LEGACY_WINDOW_GET_CLASS (self)->save_mini_icon (self);275 return BAMF_LEGACY_WINDOW_GET_CLASS (self)->save_mini_icon (self);
276276
277 if (self->priv->mini_icon_path)277 if (self->priv->mini_icon)
278 {278 {
279 if (g_file_test (self->priv->mini_icon_path, G_FILE_TEST_EXISTS))279 if (g_file_query_exists (self->priv->mini_icon, NULL))
280 {280 {
281 return self->priv->mini_icon_path;281 return g_file_get_path (self->priv->mini_icon);
282 }282 }
283 else283 else
284 {284 {
285 g_free (self->priv->mini_icon_path);285 g_object_unref (self->priv->mini_icon);
286 self->priv->mini_icon_path = NULL;286 self->priv->mini_icon = NULL;
287 }287 }
288 }288 }
289289
@@ -305,13 +305,21 @@
305305
306 if (gdk_pixbuf_save_to_stream (pbuf, output, "png", NULL, NULL, NULL))306 if (gdk_pixbuf_save_to_stream (pbuf, output, "png", NULL, NULL, NULL))
307 {307 {
308 self->priv->mini_icon_path = g_file_get_path (tmp);308 self->priv->mini_icon = g_object_ref (tmp);
309 }309 }
310310
311 g_object_unref (iostream);311 g_object_unref (iostream);
312 g_object_unref (tmp);312 g_object_unref (tmp);
313313
314 return self->priv->mini_icon_path;314 return g_file_get_path (self->priv->mini_icon);
315}
316
317GFile *
318bamf_legacy_window_get_saved_mini_icon (BamfLegacyWindow *self)
319{
320 g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), NULL);
321
322 return self->priv->mini_icon;
315}323}
316324
317guint325guint
@@ -563,19 +571,14 @@
563bamf_legacy_window_dispose (GObject *object)571bamf_legacy_window_dispose (GObject *object)
564{572{
565 BamfLegacyWindow *self;573 BamfLegacyWindow *self;
566 GFile *file;
567 guint i;574 guint i;
568575
569 self = BAMF_LEGACY_WINDOW (object);576 self = BAMF_LEGACY_WINDOW (object);
570577
571 if (self->priv->mini_icon_path)578 if (self->priv->mini_icon)
572 {579 {
573 file = g_file_new_for_path (self->priv->mini_icon_path);580 g_file_delete (self->priv->mini_icon, NULL, NULL);
574 g_file_delete (file, NULL, NULL);581 g_object_unref (self->priv->mini_icon);
575 g_object_unref (file);
576
577 g_free (self->priv->mini_icon_path);
578 self->priv->mini_icon_path = NULL;
579 }582 }
580583
581 if (self->priv->exec_string)584 if (self->priv->exec_string)
582585
=== modified file 'src/bamf-legacy-window.h'
--- src/bamf-legacy-window.h 2013-07-23 22:40:05 +0000
+++ src/bamf-legacy-window.h 2013-08-06 16:20:35 +0000
@@ -76,8 +76,8 @@
76 const char * (*get_role) (BamfLegacyWindow *legacy_window);76 const char * (*get_role) (BamfLegacyWindow *legacy_window);
77 const char * (*get_class_name) (BamfLegacyWindow *legacy_window);77 const char * (*get_class_name) (BamfLegacyWindow *legacy_window);
78 const char * (*get_class_instance_name) (BamfLegacyWindow *legacy_window);78 const char * (*get_class_instance_name) (BamfLegacyWindow *legacy_window);
79 const char * (*save_mini_icon) (BamfLegacyWindow *legacy_window);
80 const char * (*get_exec_string) (BamfLegacyWindow *legacy_window);79 const char * (*get_exec_string) (BamfLegacyWindow *legacy_window);
80 char * (*save_mini_icon) (BamfLegacyWindow *legacy_window);
81 char * (*get_process_name) (BamfLegacyWindow *legacy_window);81 char * (*get_process_name) (BamfLegacyWindow *legacy_window);
82 char * (*get_app_id) (BamfLegacyWindow *legacy_window);82 char * (*get_app_id) (BamfLegacyWindow *legacy_window);
83 char * (*get_unique_bus_name) (BamfLegacyWindow *legacy_window);83 char * (*get_unique_bus_name) (BamfLegacyWindow *legacy_window);
@@ -147,10 +147,12 @@
147147
148const char * bamf_legacy_window_get_role (BamfLegacyWindow *self);148const char * bamf_legacy_window_get_role (BamfLegacyWindow *self);
149149
150const char * bamf_legacy_window_save_mini_icon (BamfLegacyWindow *self);
151
152const char * bamf_legacy_window_get_exec_string (BamfLegacyWindow *self);150const char * bamf_legacy_window_get_exec_string (BamfLegacyWindow *self);
153151
152char * bamf_legacy_window_save_mini_icon (BamfLegacyWindow *self);
153
154GFile * bamf_legacy_window_get_saved_mini_icon (BamfLegacyWindow *self);
155
154char * bamf_legacy_window_get_process_name (BamfLegacyWindow *self);156char * bamf_legacy_window_get_process_name (BamfLegacyWindow *self);
155157
156BamfLegacyWindow * bamf_legacy_window_get_transient (BamfLegacyWindow *self);158BamfLegacyWindow * bamf_legacy_window_get_transient (BamfLegacyWindow *self);
157159
=== modified file 'src/bamf-matcher.c'
--- src/bamf-matcher.c 2013-07-24 00:11:01 +0000
+++ src/bamf-matcher.c 2013-08-06 16:20:35 +0000
@@ -191,6 +191,31 @@
191 return NULL;191 return NULL;
192}192}
193193
194
195BamfView *
196bamf_matcher_get_view_by_path (BamfMatcher *self, const char *view_path)
197{
198 GList *l;
199 BamfView *view;
200
201 g_return_val_if_fail (BAMF_IS_MATCHER (self), NULL);
202
203 for (l = self->priv->views; l; l = l->next)
204 {
205 view = l->data;
206
207 if (!BAMF_IS_VIEW (view))
208 continue;
209
210 if (g_strcmp0 (bamf_view_get_path (view), view_path) == 0)
211 {
212 return view;
213 }
214 }
215
216 return NULL;
217}
218
194static gboolean219static gboolean
195emit_paths_changed (gpointer user_data)220emit_paths_changed (gpointer user_data)
196{221{
@@ -2835,8 +2860,8 @@
2835 const char **favorites,2860 const char **favorites,
2836 BamfMatcher *self)2861 BamfMatcher *self)
2837{2862{
2863 g_dbus_method_invocation_return_value (invocation, NULL);
2838 bamf_matcher_register_favorites (self, favorites);2864 bamf_matcher_register_favorites (self, favorites);
2839 g_dbus_method_invocation_return_value (invocation, NULL);
28402865
2841 return TRUE;2866 return TRUE;
2842}2867}
@@ -2917,7 +2942,7 @@
2917 webapp_tab = BAMF_UNITY_WEBAPPS_TAB (child);2942 webapp_tab = BAMF_UNITY_WEBAPPS_TAB (child);
2918 legacy_window = bamf_unity_webapps_tab_get_legacy_window_for (webapp_tab);2943 legacy_window = bamf_unity_webapps_tab_get_legacy_window_for (webapp_tab);
29192944
2920 if (is_web_app_window (legacy_window))2945 if (legacy_window && is_web_app_window (legacy_window))
2921 {2946 {
2922 /* If we have a chromeless window, we remove the window from the2947 /* If we have a chromeless window, we remove the window from the
2923 * application children list, so that it won't be duplicated in launcher */2948 * application children list, so that it won't be duplicated in launcher */
29242949
=== modified file 'src/bamf-matcher.h'
--- src/bamf-matcher.h 2013-06-26 20:34:40 +0000
+++ src/bamf-matcher.h 2013-08-06 16:20:35 +0000
@@ -114,6 +114,8 @@
114char * bamf_matcher_get_trimmed_exec (BamfMatcher *matcher,114char * bamf_matcher_get_trimmed_exec (BamfMatcher *matcher,
115 const char *exec_string);115 const char *exec_string);
116116
117BamfView * bamf_matcher_get_view_by_path (BamfMatcher *matcher,
118 const char *view_path);
117119
118BamfMatcher * bamf_matcher_get_default (void);120BamfMatcher * bamf_matcher_get_default (void);
119121
120122
=== modified file 'src/bamf-tab.c'
--- src/bamf-tab.c 2013-06-13 17:08:07 +0000
+++ src/bamf-tab.c 2013-08-06 16:20:35 +0000
@@ -122,10 +122,9 @@
122 GDBusMethodInvocation *invocation,122 GDBusMethodInvocation *invocation,
123 BamfTab *self)123 BamfTab *self)
124{124{
125 g_dbus_method_invocation_return_value (invocation, NULL);
125 bamf_tab_raise (self);126 bamf_tab_raise (self);
126127
127 g_dbus_method_invocation_return_value (invocation, NULL);
128
129 return TRUE;128 return TRUE;
130}129}
131130
@@ -134,10 +133,9 @@
134 GDBusMethodInvocation *invocation,133 GDBusMethodInvocation *invocation,
135 BamfTab *self)134 BamfTab *self)
136{135{
136 g_dbus_method_invocation_return_value (invocation, NULL);
137 bamf_tab_close (self);137 bamf_tab_close (self);
138138
139 g_dbus_method_invocation_return_value (invocation, NULL);
140
141 return TRUE;139 return TRUE;
142}140}
143141
144142
=== modified file 'src/bamf-unity-webapps-application.c'
--- src/bamf-unity-webapps-application.c 2013-06-26 11:54:58 +0000
+++ src/bamf-unity-webapps-application.c 2013-08-06 16:20:35 +0000
@@ -229,7 +229,16 @@
229static gchar *229static gchar *
230bamf_unity_webapps_application_get_stable_bus_name (BamfView *view)230bamf_unity_webapps_application_get_stable_bus_name (BamfView *view)
231{231{
232 return g_strdup_printf ("application%i", abs (g_str_hash (bamf_application_get_desktop_file (BAMF_APPLICATION (view)))));232 const gchar *desktop_file;
233
234 desktop_file = bamf_application_get_desktop_file (BAMF_APPLICATION (view));
235
236 if (desktop_file)
237 {
238 return g_strdup_printf ("application%i", abs (g_str_hash (desktop_file)));
239 }
240
241 return g_strdup_printf ("application%p", view);
233}242}
234243
235244
236245
=== modified file 'src/bamf-unity-webapps-observer.c'
--- src/bamf-unity-webapps-observer.c 2013-07-16 16:19:42 +0000
+++ src/bamf-unity-webapps-observer.c 2013-08-06 16:20:35 +0000
@@ -155,7 +155,6 @@
155 unity_webapps_service_on_context_vanished (observer->priv->service, bamf_unity_webapps_observer_context_vanished, observer);155 unity_webapps_service_on_context_vanished (observer->priv->service, bamf_unity_webapps_observer_context_vanished, observer);
156156
157 bamf_unity_webapps_observer_register_existing_contexts (observer, observer->priv->service);157 bamf_unity_webapps_observer_register_existing_contexts (observer, observer->priv->service);
158
159}158}
160159
161static void160static void
162161
=== modified file 'tests/bamfdaemon/test-application.c'
--- tests/bamfdaemon/test-application.c 2013-07-23 21:45:59 +0000
+++ tests/bamfdaemon/test-application.c 2013-08-06 16:20:35 +0000
@@ -328,7 +328,7 @@
328 g_assert (g_file_test (test_icon, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));328 g_assert (g_file_test (test_icon, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));
329329
330 key_file = g_key_file_new ();330 key_file = g_key_file_new ();
331 g_key_file_load_from_file (key_file, test_app, (GKeyFileFlags)0, NULL);331 g_key_file_load_from_file (key_file, test_app, G_KEY_FILE_NONE, NULL);
332 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, test_icon);332 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, test_icon);
333333
334 gchar *key_data = g_key_file_to_data (key_file, NULL, NULL);334 gchar *key_data = g_key_file_to_data (key_file, NULL, NULL);
@@ -358,7 +358,7 @@
358 g_assert (!g_file_test (invalid_test_icon, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));358 g_assert (!g_file_test (invalid_test_icon, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));
359359
360 key_file = g_key_file_new ();360 key_file = g_key_file_new ();
361 g_key_file_load_from_file (key_file, test_app, (GKeyFileFlags)0, NULL);361 g_key_file_load_from_file (key_file, test_app, G_KEY_FILE_NONE, NULL);
362 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, invalid_test_icon);362 g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, invalid_test_icon);
363363
364 gchar *key_data = g_key_file_to_data (key_file, NULL, NULL);364 gchar *key_data = g_key_file_to_data (key_file, NULL, NULL);
@@ -1099,6 +1099,218 @@
1099}1099}
11001100
1101static void1101static void
1102test_desktop_app_create_local_desktop_file (void)
1103{
1104 BamfApplication *application;
1105 BamfLegacyWindowTest *lwin;
1106 BamfWindow *win;
1107
1108 application = bamf_application_new ();
1109 bamf_application_set_desktop_file (application, DESKTOP_FILE);
1110 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-class", "execution-binary");
1111 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1112 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1113
1114 g_assert (!bamf_application_create_local_desktop_file (application));
1115
1116 g_object_unref (lwin);
1117 g_object_unref (win);
1118 g_object_unref (application);
1119}
1120
1121static void
1122test_desktopless_app_create_local_desktop_file_invalid_exec (void)
1123{
1124 BamfApplication *application;
1125 BamfLegacyWindowTest *lwin;
1126 BamfWindow *win;
1127
1128 application = bamf_application_new ();
1129 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-class", NULL);
1130 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1131 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1132
1133 g_assert (!bamf_application_create_local_desktop_file (application));
1134
1135 g_object_unref (lwin);
1136 g_object_unref (win);
1137 g_object_unref (application);
1138}
1139
1140static void
1141verify_application_desktop_file_content (BamfApplication *application)
1142{
1143 GKeyFile *key_file;
1144 const gchar *desktop_file, *exec, *class;
1145 gchar *str_value;
1146 GError *error = NULL;
1147 BamfView *main_child;
1148 BamfLegacyWindow *main_window;
1149
1150 desktop_file = bamf_application_get_desktop_file (application);
1151
1152 key_file = g_key_file_new ();
1153 g_key_file_load_from_file (key_file, desktop_file, G_KEY_FILE_NONE, NULL);
1154
1155 str_value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
1156 G_KEY_FILE_DESKTOP_KEY_TYPE, &error);
1157 g_assert (!error);
1158 g_assert_cmpstr (str_value, ==, G_KEY_FILE_DESKTOP_TYPE_APPLICATION);
1159 g_clear_pointer (&str_value, g_free);
1160
1161 if (bamf_view_get_name (BAMF_VIEW (application)))
1162 {
1163 str_value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
1164 G_KEY_FILE_DESKTOP_KEY_NAME, &error);
1165 g_assert (!error);
1166 g_assert_cmpstr (str_value, ==, bamf_view_get_name (BAMF_VIEW (application)));
1167 g_clear_pointer (&str_value, g_free);
1168 }
1169
1170 if (bamf_view_get_icon (BAMF_VIEW (application)))
1171 {
1172 str_value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
1173 G_KEY_FILE_DESKTOP_KEY_ICON, &error);
1174 g_assert (!error);
1175 g_assert_cmpstr (str_value, ==, bamf_view_get_icon (BAMF_VIEW (application)));
1176 g_clear_pointer (&str_value, g_free);
1177 }
1178
1179 main_child = bamf_application_get_main_child (application);
1180 main_window = bamf_window_get_window (BAMF_WINDOW (main_child));
1181 exec = bamf_legacy_window_get_exec_string (main_window);
1182
1183 str_value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
1184 G_KEY_FILE_DESKTOP_KEY_EXEC, &error);
1185 g_assert (!error);
1186 g_assert_cmpstr (str_value, ==, exec);
1187 g_clear_pointer (&str_value, g_free);
1188
1189 g_assert (g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP,
1190 G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY, &error));
1191 g_assert (!error);
1192
1193 class = bamf_legacy_window_get_class_instance_name (main_window);
1194 class = class ? class : bamf_legacy_window_get_class_name (main_window);
1195
1196 if (class)
1197 {
1198 str_value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP,
1199 G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS, &error);
1200 g_assert (!error);
1201 g_assert_cmpstr (str_value, ==, class);
1202 g_clear_pointer (&str_value, g_free);
1203 }
1204
1205 g_key_file_free (key_file);
1206}
1207
1208static void
1209test_desktopless_app_create_local_desktop_file_using_instance_class_basename (void)
1210{
1211 BamfApplication *application;
1212 BamfLegacyWindowTest *lwin;
1213 BamfWindow *win;
1214 const gchar *desktop_path;
1215
1216 application = bamf_application_new ();
1217 lwin = bamf_legacy_window_test_new (20, "window", NULL, "awesome --exec");
1218 bamf_legacy_window_test_set_wmclass (lwin, "application-class", "instance-class");
1219 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1220 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1221
1222 g_assert (bamf_application_create_local_desktop_file (application));
1223
1224 desktop_path = bamf_application_get_desktop_file (application);
1225 g_assert (desktop_path);
1226 g_assert (g_str_has_suffix (desktop_path, "instance-class.desktop"));
1227 g_assert (g_file_test (desktop_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));
1228 verify_application_desktop_file_content (application);
1229
1230 g_object_unref (lwin);
1231 g_object_unref (win);
1232 g_object_unref (application);
1233}
1234
1235static void
1236test_desktopless_app_create_local_desktop_file_using_name_class_basename (void)
1237{
1238 BamfApplication *application;
1239 BamfLegacyWindowTest *lwin;
1240 BamfWindow *win;
1241 const gchar *desktop_path;
1242
1243 application = bamf_application_new ();
1244 lwin = bamf_legacy_window_test_new (20, "window", "Application!/?Class", "awesome --exec");
1245 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1246 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1247
1248 g_assert (bamf_application_create_local_desktop_file (application));
1249
1250 desktop_path = bamf_application_get_desktop_file (application);
1251 g_assert (desktop_path);
1252 g_assert (g_str_has_suffix (desktop_path, "application___class.desktop"));
1253 g_assert (g_file_test (desktop_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));
1254 verify_application_desktop_file_content (application);
1255
1256 g_object_unref (lwin);
1257 g_object_unref (win);
1258 g_object_unref (application);
1259}
1260
1261static void
1262test_desktopless_app_create_local_desktop_file_using_exec_basename (void)
1263{
1264 BamfApplication *application;
1265 BamfLegacyWindowTest *lwin;
1266 BamfWindow *win;
1267 const gchar *desktop_path;
1268
1269 application = bamf_application_new ();
1270 lwin = bamf_legacy_window_test_new (20, "window", NULL, "awesome --exec");
1271 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1272 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1273
1274 g_assert (bamf_application_create_local_desktop_file (application));
1275
1276 desktop_path = bamf_application_get_desktop_file (application);
1277 g_assert (desktop_path);
1278 g_assert (g_str_has_suffix (desktop_path, "awesome.desktop"));
1279 g_assert (g_file_test (desktop_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));
1280 verify_application_desktop_file_content (application);
1281
1282 g_object_unref (lwin);
1283 g_object_unref (win);
1284 g_object_unref (application);
1285}
1286
1287static void
1288test_desktopless_app_create_local_desktop_file_using_trimmed_exec_basename (void)
1289{
1290 BamfApplication *application;
1291 BamfLegacyWindowTest *lwin;
1292 BamfWindow *win;
1293 const gchar *desktop_path;
1294
1295 application = bamf_application_new ();
1296 lwin = bamf_legacy_window_test_new (20, "window", NULL, "python awesome-script.py");
1297 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1298 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1299
1300 g_assert (bamf_application_create_local_desktop_file (application));
1301
1302 desktop_path = bamf_application_get_desktop_file (application);
1303 g_assert (desktop_path);
1304 g_assert (g_str_has_suffix (desktop_path, "awesome-script.desktop"));
1305 g_assert (g_file_test (desktop_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));
1306 verify_application_desktop_file_content (application);
1307
1308 g_object_unref (lwin);
1309 g_object_unref (win);
1310 g_object_unref (application);
1311}
1312
1313static void
1102test_contain_similar_to_window (void)1314test_contain_similar_to_window (void)
1103{1315{
1104 BamfApplication *application;1316 BamfApplication *application;
@@ -1202,6 +1414,7 @@
1202 g_test_add_func (DOMAIN"/DesktopFile/MainChild", test_desktop_app_main_child);1414 g_test_add_func (DOMAIN"/DesktopFile/MainChild", test_desktop_app_main_child);
1203 g_test_add_func (DOMAIN"/DesktopFile/MainChild/NotMatchEmblems", test_desktop_app_main_child_doesnt_match_emblems);1415 g_test_add_func (DOMAIN"/DesktopFile/MainChild/NotMatchEmblems", test_desktop_app_main_child_doesnt_match_emblems);
1204 g_test_add_func (DOMAIN"/DesktopFile/MainChild/NotUpdatesEmblems", test_desktop_app_main_child_doesnt_update_emblems);1416 g_test_add_func (DOMAIN"/DesktopFile/MainChild/NotUpdatesEmblems", test_desktop_app_main_child_doesnt_update_emblems);
1417 g_test_add_func (DOMAIN"/DesktopFile/CreateLocalDesktopFile", test_desktop_app_create_local_desktop_file);
1205 g_test_add_func (DOMAIN"/DesktopLess/Icon/ClassName", test_icon_class_name);1418 g_test_add_func (DOMAIN"/DesktopLess/Icon/ClassName", test_icon_class_name);
1206 g_test_add_func (DOMAIN"/DesktopLess/Icon/Exec", test_icon_exec_string);1419 g_test_add_func (DOMAIN"/DesktopLess/Icon/Exec", test_icon_exec_string);
1207 g_test_add_func (DOMAIN"/DesktopLess/Icon/Embedded", test_icon_embedded);1420 g_test_add_func (DOMAIN"/DesktopLess/Icon/Embedded", test_icon_embedded);
@@ -1215,6 +1428,11 @@
1215 g_test_add_func (DOMAIN"/DesktopLess/MainChild/NormalPriority", test_app_main_child_normal_priority);1428 g_test_add_func (DOMAIN"/DesktopLess/MainChild/NormalPriority", test_app_main_child_normal_priority);
1216 g_test_add_func (DOMAIN"/DesktopLess/MainChild/Removal", test_app_main_child_on_window_removal);1429 g_test_add_func (DOMAIN"/DesktopLess/MainChild/Removal", test_app_main_child_on_window_removal);
1217 g_test_add_func (DOMAIN"/DesktopLess/MainChild/ReplaceOnRemoval", test_app_main_child_on_window_replace_on_removal);1430 g_test_add_func (DOMAIN"/DesktopLess/MainChild/ReplaceOnRemoval", test_app_main_child_on_window_replace_on_removal);
1431 g_test_add_func (DOMAIN"/DesktopLess/CreateLocalDesktopFile/InvalidExec", test_desktopless_app_create_local_desktop_file_invalid_exec);
1432 g_test_add_func (DOMAIN"/DesktopLess/CreateLocalDesktopFile/UsingClassInstance", test_desktopless_app_create_local_desktop_file_using_instance_class_basename);
1433 g_test_add_func (DOMAIN"/DesktopLess/CreateLocalDesktopFile/UsingClassName", test_desktopless_app_create_local_desktop_file_using_name_class_basename);
1434 g_test_add_func (DOMAIN"/DesktopLess/CreateLocalDesktopFile/UsingExec", test_desktopless_app_create_local_desktop_file_using_exec_basename);
1435 g_test_add_func (DOMAIN"/DesktopLess/CreateLocalDesktopFile/UsingTrimmedExec", test_desktopless_app_create_local_desktop_file_using_trimmed_exec_basename);
1218 g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid);1436 g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid);
1219 g_test_add_func (DOMAIN"/GetWindow", test_get_window);1437 g_test_add_func (DOMAIN"/GetWindow", test_get_window);
1220 g_test_add_func (DOMAIN"/Xids", test_get_xids);1438 g_test_add_func (DOMAIN"/Xids", test_get_xids);
12211439
=== modified file 'tests/bamfdaemon/test-bamf.c'
--- tests/bamfdaemon/test-bamf.c 2013-07-16 14:46:37 +0000
+++ tests/bamfdaemon/test-bamf.c 2013-08-06 16:20:35 +0000
@@ -82,6 +82,15 @@
82{82{
83 GMainLoop *loop;83 GMainLoop *loop;
8484
85 GFile *tmp_dir;
86 gchar *tmp_path;
87
88 tmp_path = g_dir_make_tmp (".bamfhomedataXXXXXX", NULL);
89 tmp_dir = g_file_new_for_path (tmp_path);
90 g_file_make_directory (tmp_dir, NULL, NULL);
91 g_setenv ("XDG_DATA_HOME", tmp_path, TRUE);
92 g_free (tmp_path);
93
85 gtk_init (&argc, &argv);94 gtk_init (&argc, &argv);
86 g_test_init (&argc, &argv, NULL);95 g_test_init (&argc, &argv, NULL);
87 glibtop_init ();96 glibtop_init ();
@@ -99,5 +108,8 @@
99108
100 g_main_loop_run (loop);109 g_main_loop_run (loop);
101110
111 g_file_delete (tmp_dir, NULL, NULL);
112 g_object_unref (tmp_dir);
113
102 return result;114 return result;
103}115}
104116
=== modified file 'tests/bamfdaemon/test-matcher.c'
--- tests/bamfdaemon/test-matcher.c 2013-07-24 00:11:46 +0000
+++ tests/bamfdaemon/test-matcher.c 2013-08-06 16:20:35 +0000
@@ -1176,6 +1176,42 @@
1176 }1176 }
1177}1177}
11781178
1179static void
1180test_get_view_by_path (void)
1181{
1182 BamfMatcher *matcher;
1183 BamfLegacyScreen *screen;
1184 BamfLegacyWindowTest *lwin;
1185 BamfApplication *app;
1186 BamfWindow *win;
1187 GList *app_children;
1188 guint32 xid;
1189
1190 screen = bamf_legacy_screen_get_default();
1191 matcher = bamf_matcher_get_default ();
1192
1193 cleanup_matcher_tables (matcher);
1194 export_matcher_on_bus (matcher);
1195
1196 xid = g_random_int ();
1197 lwin = bamf_legacy_window_test_new (xid, "Window", NULL, NULL);
1198 _bamf_legacy_screen_open_test_window (screen, lwin);
1199
1200 app = bamf_matcher_get_application_by_xid (matcher, xid);
1201 const char *app_path = bamf_view_get_path (BAMF_VIEW (app));
1202 g_assert (app == BAMF_APPLICATION (bamf_matcher_get_view_by_path (matcher, app_path)));
1203
1204 app_children = bamf_view_get_children (BAMF_VIEW (app));
1205 g_assert (app_children);
1206
1207 win = BAMF_WINDOW (app_children->data);
1208 const char *win_path = bamf_view_get_path (BAMF_VIEW (win));
1209 g_assert (win == BAMF_WINDOW (bamf_matcher_get_view_by_path (matcher, win_path)));
1210
1211 g_object_unref (matcher);
1212 g_object_unref (screen);
1213}
1214
1179/* Initialize test suite */1215/* Initialize test suite */
11801216
1181void1217void
@@ -1187,6 +1223,7 @@
1187 g_test_add_func (DOMAIN"/AutostartDesktopFile/User", test_autostart_desktop_file_user);1223 g_test_add_func (DOMAIN"/AutostartDesktopFile/User", test_autostart_desktop_file_user);
1188 g_test_add_func (DOMAIN"/AutostartDesktopFile/System", test_autostart_desktop_file_system);1224 g_test_add_func (DOMAIN"/AutostartDesktopFile/System", test_autostart_desktop_file_system);
1189 g_test_add_func (DOMAIN"/ExecStringTrimming", test_trim_exec_string);1225 g_test_add_func (DOMAIN"/ExecStringTrimming", test_trim_exec_string);
1226 g_test_add_func (DOMAIN"/GetViewByPath", test_get_view_by_path);
1190 g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file);1227 g_test_add_func (DOMAIN"/LoadDesktopFile", test_load_desktop_file);
1191 g_test_add_func (DOMAIN"/LoadDesktopFile/Autostart", test_load_desktop_file_autostart);1228 g_test_add_func (DOMAIN"/LoadDesktopFile/Autostart", test_load_desktop_file_autostart);
1192 g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/SameID", test_load_desktop_file_no_display_has_lower_prio_same_id);1229 g_test_add_func (DOMAIN"/LoadDesktopFile/NoDisplay/SameID", test_load_desktop_file_no_display_has_lower_prio_same_id);

Subscribers

People subscribed via source and target branches