Merge lp:~3v1n0/bamf/app-main-view into lp:bamf

Proposed by Marco Trevisan (Treviño)
Status: Merged
Approved by: Brandon Schaefer
Approved revision: 609
Merged at revision: 564
Proposed branch: lp:~3v1n0/bamf/app-main-view
Merge into: lp:bamf
Diff against target: 1004 lines (+594/-125)
6 files modified
src/bamf-application.c (+216/-111)
src/bamf-application.h (+18/-6)
src/bamf-unity-webapps-application.c (+1/-1)
src/bamf-unity-webapps-observer.c (+7/-1)
tests/bamfdaemon/test-application.c (+338/-6)
tests/bamfdaemon/test-bamf.c (+14/-0)
To merge this branch: bzr merge lp:~3v1n0/bamf/app-main-view
Reviewer Review Type Date Requested Status
Brandon Schaefer (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+175063@code.launchpad.net

Commit message

BamfApplication: keep track of the application main-window and update name and icon accordingly

Applications without a .desktop file should update their name and icon based on their children.
So now we try to compute the main window children, and we update name and icon based on it.

Description of the change

Add a special "main_window" children to the BamfApplication, in this way we keep track of the child that is currently leading the application window group.
Thanks to this, we can update the application name and icon whenever they change.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

LGTM

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/bamf-application.c'
--- src/bamf-application.c 2013-07-16 00:25:51 +0000
+++ src/bamf-application.c 2013-07-16 16:30:44 +0000
@@ -38,12 +38,12 @@
38struct _BamfApplicationPrivate38struct _BamfApplicationPrivate
39{39{
40 BamfDBusItemApplication *dbus_iface;40 BamfDBusItemApplication *dbus_iface;
41 BamfApplicationType app_type;
42 BamfView * main_child;
41 char * desktop_file;43 char * desktop_file;
42 GList * desktop_file_list;44 GList * desktop_file_list;
43 char * app_type;
44 char * wmclass;45 char * wmclass;
45 char ** mimes;46 char ** mimes;
46 gboolean is_tab_container;
47 gboolean show_stubs;47 gboolean show_stubs;
48};48};
4949
@@ -57,6 +57,8 @@
5757
58#define STUB_KEY "X-Ayatana-Appmenu-Show-Stubs"58#define STUB_KEY "X-Ayatana-Appmenu-Show-Stubs"
5959
60static void on_main_child_name_changed (BamfView *, const gchar *, const gchar *, BamfApplication *);
61
60void62void
61bamf_application_supported_mime_types_changed (BamfApplication *application,63bamf_application_supported_mime_types_changed (BamfApplication *application,
62 const gchar **new_mimes)64 const gchar **new_mimes)
@@ -136,23 +138,21 @@
136 return g_strdupv (mimes);138 return g_strdupv (mimes);
137}139}
138140
139char *141BamfApplicationType
140bamf_application_get_application_type (BamfApplication *application)142bamf_application_get_application_type (BamfApplication *application)
141{143{
142 g_return_val_if_fail (BAMF_IS_APPLICATION (application), NULL);144 g_return_val_if_fail (BAMF_IS_APPLICATION (application), BAMF_APPLICATION_UNKNOWN);
143145
144 return g_strdup (application->priv->app_type);146 return application->priv->app_type;
145}147}
146148
147void149void
148bamf_application_set_application_type (BamfApplication *application, const gchar *type)150bamf_application_set_application_type (BamfApplication *application, BamfApplicationType type)
149{151{
150 g_return_if_fail (BAMF_IS_APPLICATION (application));152 g_return_if_fail (BAMF_IS_APPLICATION (application));
151153 g_return_if_fail (type >= 0 && type < BAMF_APPLICATION_UNKNOWN);
152 if (application->priv->app_type)154
153 g_free (application->priv->app_type);155 application->priv->app_type = type;
154
155 application->priv->app_type = g_strdup (type);
156}156}
157157
158const char *158const char *
@@ -201,22 +201,24 @@
201}201}
202202
203static void203static void
204bamf_application_setup_icon_and_name (BamfApplication *self)204bamf_application_setup_icon_and_name (BamfApplication *self, gboolean force)
205{205{
206 BamfView *view;206 BamfWindow *window;
207 BamfWindow *window = NULL;207 BamfLegacyWindow *legacy_window;
208 GDesktopAppInfo *desktop;208 GDesktopAppInfo *desktop;
209 GKeyFile * keyfile;209 GKeyFile * keyfile;
210 GIcon *gicon;210 GIcon *gicon;
211 GList *children, *l;
212 const char *class;211 const char *class;
213 char *icon = NULL, *generic_icon = NULL, *name = NULL;212 char *icon = NULL, *generic_icon = NULL, *name = NULL;
214 GError *error;213 GError *error;
215214
216 g_return_if_fail (BAMF_IS_APPLICATION (self));215 g_return_if_fail (BAMF_IS_APPLICATION (self));
217216
218 if (bamf_view_get_icon (BAMF_VIEW (self)) && bamf_view_get_name (BAMF_VIEW (self)))217 if (!force)
219 return;218 {
219 if (bamf_view_get_icon (BAMF_VIEW (self)) && bamf_view_get_name (BAMF_VIEW (self)))
220 return;
221 }
220222
221 if (self->priv->desktop_file)223 if (self->priv->desktop_file)
222 {224 {
@@ -289,66 +291,57 @@
289 g_object_unref (desktop);291 g_object_unref (desktop);
290 g_key_file_free (keyfile);292 g_key_file_free (keyfile);
291 }293 }
292 else if ((children = bamf_view_get_children (BAMF_VIEW (self))) != NULL)294 else if (BAMF_IS_WINDOW (self->priv->main_child))
293 {295 {
294 for (l = children; l && !icon; l = l->next)296 name = g_strdup (bamf_view_get_name (self->priv->main_child));
295 {297 window = BAMF_WINDOW (self->priv->main_child);
296 view = l->data;298 legacy_window = bamf_window_get_window (window);
297 if (!BAMF_IS_WINDOW (view))299 class = bamf_legacy_window_get_class_name (legacy_window);
298 continue;300
299301 if (class)
300 window = BAMF_WINDOW (view);302 {
301303 icon = g_utf8_strdown (class, -1);
302 do304
303 {305 if (icon_name_is_valid (icon))
304 class = bamf_legacy_window_get_class_name (bamf_window_get_window (window));306 {
305307 if (icon_name_is_generic (icon))
306 if (class)308 {
307 {309 generic_icon = icon;
308 icon = g_utf8_strdown (class, -1);310 icon = NULL;
309311 }
310 if (icon_name_is_valid (icon))312 }
311 {313 else
312 if (icon_name_is_generic (icon))314 {
313 {315 g_free (icon);
314 generic_icon = g_strdup (icon);316 icon = NULL;
315 }317 }
316 else318 }
317 {319
318 break;320 if (!icon)
319 }321 {
320 }322 char *exec = bamf_legacy_window_get_exec_string (legacy_window);
321 }323 icon = bamf_matcher_get_trimmed_exec (bamf_matcher_get_default (), exec);
322324 g_free (exec);
323 g_free (icon);325
324 char *exec = bamf_legacy_window_get_exec_string (bamf_window_get_window (window));326 if (icon_name_is_valid (icon))
325 icon = bamf_matcher_get_trimmed_exec (bamf_matcher_get_default (), exec);327 {
326 g_free (exec);328 if (icon_name_is_generic (icon))
327329 {
328 if (icon_name_is_valid (icon))330 g_free (generic_icon);
329 {331 generic_icon = icon;
330 if (icon_name_is_generic (icon))332 icon = NULL;
331 {333 }
332 generic_icon = g_strdup (icon);334 }
333 }335 else
334 else336 {
335 {337 g_free (icon);
336 break;338 icon = NULL;
337 }339 }
338 }340 }
339341
340 g_free (icon);342 if (!icon)
341 icon = NULL;343 {
342 }344 icon = g_strdup (bamf_legacy_window_save_mini_icon (legacy_window));
343 while (FALSE);
344
345 name = g_strdup (bamf_legacy_window_get_name (bamf_window_get_window (window)));
346 }
347
348 if (!icon)
349 {
350 if (window)
351 icon = g_strdup (bamf_legacy_window_save_mini_icon (bamf_window_get_window (window)));
352345
353 if (!icon)346 if (!icon)
354 {347 {
@@ -381,15 +374,22 @@
381{374{
382 g_return_if_fail (BAMF_IS_APPLICATION (application));375 g_return_if_fail (BAMF_IS_APPLICATION (application));
383376
384 if (application->priv->desktop_file)377 if (g_strcmp0 (application->priv->desktop_file, desktop_file) == 0)
385 g_free (application->priv->desktop_file);378 return;
379
380 g_free (application->priv->desktop_file);
381 application->priv->desktop_file = NULL;
386382
387 if (desktop_file && desktop_file[0] != '\0')383 if (desktop_file && desktop_file[0] != '\0')
388 application->priv->desktop_file = g_strdup (desktop_file);384 application->priv->desktop_file = g_strdup (desktop_file);
389 else385
390 application->priv->desktop_file = NULL;386 if (application->priv->main_child)
391387 {
392 bamf_application_setup_icon_and_name (application);388 g_signal_handlers_disconnect_by_func (application->priv->main_child,
389 on_main_child_name_changed, application);
390 }
391
392 bamf_application_setup_icon_and_name (application, TRUE);
393}393}
394394
395gboolean395gboolean
@@ -632,25 +632,79 @@
632}632}
633633
634static void634static void
635on_main_child_name_changed (BamfView *child, const gchar *old_name,
636 const gchar *new_name, BamfApplication *self)
637{
638 bamf_view_set_name (BAMF_VIEW (self), new_name);
639}
640
641static void
642bamf_application_set_main_child (BamfApplication *self, BamfView *child)
643{
644 if (self->priv->main_child == child)
645 return;
646
647 if (self->priv->main_child)
648 {
649 g_object_remove_weak_pointer (G_OBJECT (self->priv->main_child),
650 (gpointer*) &self->priv->main_child);
651 g_signal_handlers_disconnect_by_func (self->priv->main_child,
652 on_main_child_name_changed, self);
653 }
654
655 self->priv->main_child = child;
656
657 if (self->priv->main_child)
658 {
659 g_object_add_weak_pointer (G_OBJECT (self->priv->main_child),
660 (gpointer*) &self->priv->main_child);
661
662 if (!self->priv->desktop_file)
663 {
664 g_signal_connect (child, "name-changed",
665 G_CALLBACK (on_main_child_name_changed), self);
666 }
667 }
668}
669
670BamfView *
671bamf_application_get_main_child (BamfApplication *self)
672{
673 g_return_val_if_fail (BAMF_IS_APPLICATION (self), NULL);
674
675 return self->priv->main_child;
676}
677
678static void
635view_exported (BamfView *view, BamfApplication *self)679view_exported (BamfView *view, BamfApplication *self)
636{680{
637 g_signal_emit_by_name (self, "window-added", bamf_view_get_path (view));681 g_signal_emit_by_name (self, "window-added", bamf_view_get_path (view));
682 g_signal_handlers_disconnect_by_func (view, view_exported, self);
638}683}
639684
640static void685static void
641bamf_application_child_added (BamfView *view, BamfView *child)686bamf_application_child_added (BamfView *view, BamfView *child)
642{687{
643 BamfApplication *application;688 BamfApplication *application;
689 BamfWindow *window = NULL;
690 gboolean reset_emblems = FALSE;
644691
645 application = BAMF_APPLICATION (view);692 application = BAMF_APPLICATION (view);
646693
647 if (BAMF_IS_WINDOW (child))694 if (BAMF_IS_WINDOW (child))
648 {695 {
696 window = BAMF_WINDOW (child);
697
649 if (bamf_view_is_on_bus (child))698 if (bamf_view_is_on_bus (child))
650 g_signal_emit_by_name (BAMF_APPLICATION (view), "window-added", bamf_view_get_path (child));699 {
700 g_signal_emit_by_name (BAMF_APPLICATION (view), "window-added",
701 bamf_view_get_path (child));
702 }
651 else703 else
652 g_signal_connect (G_OBJECT (child), "exported",704 {
653 (GCallback) view_exported, view);705 g_signal_connect (G_OBJECT (child), "exported",
706 (GCallback) view_exported, view);
707 }
654 }708 }
655709
656 g_signal_connect (G_OBJECT (child), "active-changed",710 g_signal_connect (G_OBJECT (child), "active-changed",
@@ -666,9 +720,30 @@
666 (GCallback) view_xid_changed, view);720 (GCallback) view_xid_changed, view);
667 }721 }
668722
723 if (application->priv->main_child)
724 {
725 if (window && BAMF_IS_WINDOW (application->priv->main_child))
726 {
727 BamfWindow *main_window = BAMF_WINDOW (application->priv->main_child);
728
729 if (bamf_window_get_window_type (main_window) != BAMF_WINDOW_NORMAL &&
730 bamf_window_get_window_type (window) == BAMF_WINDOW_NORMAL)
731 {
732 bamf_application_set_main_child (application, child);
733 }
734 }
735 }
736 else
737 {
738 bamf_application_set_main_child (application, child);
739 }
740
669 bamf_application_ensure_flags (BAMF_APPLICATION (view));741 bamf_application_ensure_flags (BAMF_APPLICATION (view));
670742
671 bamf_application_setup_icon_and_name (application);743 if (!application->priv->desktop_file && application->priv->main_child == child)
744 reset_emblems = TRUE;
745
746 bamf_application_setup_icon_and_name (application, reset_emblems);
672}747}
673748
674static char *749static char *
@@ -740,6 +815,8 @@
740bamf_application_child_removed (BamfView *view, BamfView *child)815bamf_application_child_removed (BamfView *view, BamfView *child)
741{816{
742 BamfApplication *self = BAMF_APPLICATION (view);817 BamfApplication *self = BAMF_APPLICATION (view);
818 GList *children, *l;
819
743 if (BAMF_IS_WINDOW (child))820 if (BAMF_IS_WINDOW (child))
744 {821 {
745 if (bamf_view_is_on_bus (child))822 if (bamf_view_is_on_bus (child))
@@ -751,7 +828,35 @@
751828
752 bamf_application_ensure_flags (self);829 bamf_application_ensure_flags (self);
753830
754 if (!bamf_view_get_children (view) && bamf_application_get_close_when_empty (self))831 children = bamf_view_get_children (view);
832
833 if (self->priv->main_child == child)
834 {
835 /* Giving priority to older windows, and BamfView has a reversed list */
836 children = g_list_last (children);
837 bamf_application_set_main_child (self, (children ? children->data : NULL));
838
839 if (self->priv->app_type == BAMF_APPLICATION_SYSTEM)
840 {
841 /* We check if we have a better target in next windows */
842 for (l = children; l; l = l->prev)
843 {
844 if (bamf_window_get_window_type (BAMF_WINDOW (l->data)) == BAMF_WINDOW_NORMAL)
845 {
846 bamf_application_set_main_child (self, l->data);
847 break;
848 }
849 }
850 }
851
852 if (self->priv->main_child)
853 {
854 gboolean reset_emblems = (!self->priv->desktop_file);
855 bamf_application_setup_icon_and_name (self, reset_emblems);
856 }
857 }
858
859 if (!children && bamf_application_get_close_when_empty (self))
755 {860 {
756 bamf_view_close (view);861 bamf_view_close (view);
757 }862 }
@@ -901,9 +1006,21 @@
901 GDBusMethodInvocation *invocation,1006 GDBusMethodInvocation *invocation,
902 BamfApplication *self)1007 BamfApplication *self)
903{1008{
904 const char *type = self->priv->app_type ? self->priv->app_type : "";1009 const char *type = "";
905 g_dbus_method_invocation_return_value (invocation,1010
906 g_variant_new ("(s)", type));1011 switch (self->priv->app_type)
1012 {
1013 case BAMF_APPLICATION_SYSTEM:
1014 type = "system";
1015 break;
1016 case BAMF_APPLICATION_WEB:
1017 type = "webapp";
1018 break;
1019 default:
1020 type = "unknown";
1021 }
1022
1023 g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", type));
9071024
908 return TRUE;1025 return TRUE;
909}1026}
@@ -929,18 +1046,20 @@
929 priv->desktop_file_list = NULL;1046 priv->desktop_file_list = NULL;
930 }1047 }
9311048
932 if (priv->app_type)
933 {
934 g_free (priv->app_type);
935 priv->app_type = NULL;
936 }
937
938 if (priv->wmclass)1049 if (priv->wmclass)
939 {1050 {
940 g_free (priv->wmclass);1051 g_free (priv->wmclass);
941 priv->wmclass = NULL;1052 priv->wmclass = NULL;
942 }1053 }
9431054
1055 if (priv->main_child)
1056 {
1057 g_object_remove_weak_pointer (G_OBJECT (priv->main_child),
1058 (gpointer*) &priv->main_child);
1059 g_signal_handlers_disconnect_by_data (priv->main_child, app);
1060 priv->main_child = NULL;
1061 }
1062
944 g_strfreev (priv->mimes);1063 g_strfreev (priv->mimes);
945 priv->mimes = NULL;1064 priv->mimes = NULL;
9461065
@@ -967,10 +1086,8 @@
967 BamfApplicationPrivate *priv;1086 BamfApplicationPrivate *priv;
968 priv = self->priv = BAMF_APPLICATION_GET_PRIVATE (self);1087 priv = self->priv = BAMF_APPLICATION_GET_PRIVATE (self);
9691088
970 priv->is_tab_container = FALSE;1089 priv->app_type = BAMF_APPLICATION_SYSTEM;
971 priv->app_type = g_strdup ("system");
972 priv->show_stubs = TRUE;1090 priv->show_stubs = TRUE;
973 priv->wmclass = NULL;
9741091
975 /* Initializing the dbus interface */1092 /* Initializing the dbus interface */
976 priv->dbus_iface = _bamf_dbus_item_application_skeleton_new ();1093 priv->dbus_iface = _bamf_dbus_item_application_skeleton_new ();
@@ -1087,17 +1204,6 @@
1087 return application;1204 return application;
1088}1205}
10891206
1090/**
1091 bamf_application_get_show_stubs:
1092 @application: Application to check for menu stubs
1093
1094 Checks to see if the application should show menu stubs or not.
1095 This is specified with the "X-Ayatana-Appmenu-Show-Stubs" desktop
1096 file key.
1097
1098 Return Value: Defaults to TRUE, else FALSE if specified in
1099 .desktop file.
1100*/
1101gboolean1207gboolean
1102bamf_application_get_show_stubs (BamfApplication *application)1208bamf_application_get_show_stubs (BamfApplication *application)
1103{1209{
@@ -1105,7 +1211,6 @@
1105 return application->priv->show_stubs;1211 return application->priv->show_stubs;
1106}1212}
11071213
1108
1109gboolean1214gboolean
1110bamf_application_get_close_when_empty (BamfApplication *application)1215bamf_application_get_close_when_empty (BamfApplication *application)
1111{1216{
11121217
=== modified file 'src/bamf-application.h'
--- src/bamf-application.h 2013-06-18 13:44:04 +0000
+++ src/bamf-application.h 2013-07-16 16:30:44 +0000
@@ -56,6 +56,13 @@
56 BamfApplicationPrivate *priv;56 BamfApplicationPrivate *priv;
57};57};
5858
59typedef enum
60{
61 BAMF_APPLICATION_SYSTEM, /* BamfWindow container */
62 BAMF_APPLICATION_WEB, /* BamfTab container */
63 BAMF_APPLICATION_UNKNOWN,
64} BamfApplicationType;
65
59GType bamf_application_get_type (void) G_GNUC_CONST;66GType bamf_application_get_type (void) G_GNUC_CONST;
6067
61void bamf_application_emit_supported_mime_types_changed (BamfApplication *application);68void bamf_application_emit_supported_mime_types_changed (BamfApplication *application);
@@ -64,7 +71,7 @@
64void bamf_application_set_desktop_file (BamfApplication *application,71void bamf_application_set_desktop_file (BamfApplication *application,
65 const char * desktop_file);72 const char * desktop_file);
6673
67char ** bamf_application_get_supported_mime_types (BamfApplication *application);74char ** bamf_application_get_supported_mime_types (BamfApplication *application);
6875
69GVariant * bamf_application_get_xids (BamfApplication *application);76GVariant * bamf_application_get_xids (BamfApplication *application);
7077
@@ -90,11 +97,16 @@
9097
91BamfApplication * bamf_application_new_with_wmclass (const char *wmclass);98BamfApplication * bamf_application_new_with_wmclass (const char *wmclass);
9299
93void bamf_application_set_application_type (BamfApplication *application, const gchar *type);100void bamf_application_set_application_type (BamfApplication *application,
94101 BamfApplicationType type);
95void bamf_application_get_application_menu (BamfApplication *application, gchar **name, gchar **object_path);102BamfApplicationType bamf_application_get_application_type (BamfApplication *application);
96103
97BamfView * bamf_application_get_focusable_child (BamfApplication *application);104void bamf_application_get_application_menu (BamfApplication *application,
105 gchar **name, gchar **object_path);
106
107BamfView * bamf_application_get_focusable_child (BamfApplication *application);
108
109BamfView * bamf_application_get_main_child (BamfApplication *application);
98110
99gboolean bamf_application_get_close_when_empty (BamfApplication *application);111gboolean bamf_application_get_close_when_empty (BamfApplication *application);
100gboolean bamf_application_set_desktop_file_from_id (BamfApplication *application, const char *id);112gboolean bamf_application_set_desktop_file_from_id (BamfApplication *application, const char *id);
101113
=== modified file 'src/bamf-unity-webapps-application.c'
--- src/bamf-unity-webapps-application.c 2013-06-13 18:40:56 +0000
+++ src/bamf-unity-webapps-application.c 2013-07-16 16:30:44 +0000
@@ -267,7 +267,7 @@
267{267{
268 self->priv = BAMF_UNITY_WEBAPPS_APPLICATION_GET_PRIVATE (self);268 self->priv = BAMF_UNITY_WEBAPPS_APPLICATION_GET_PRIVATE (self);
269269
270 bamf_application_set_application_type (BAMF_APPLICATION (self), "webapp");270 bamf_application_set_application_type (BAMF_APPLICATION (self), BAMF_APPLICATION_WEB);
271271
272}272}
273273
274274
=== modified file 'src/bamf-unity-webapps-observer.c'
--- src/bamf-unity-webapps-observer.c 2013-06-13 18:40:56 +0000
+++ src/bamf-unity-webapps-observer.c 2013-07-16 16:30:44 +0000
@@ -204,7 +204,10 @@
204204
205 g_hash_table_destroy (observer->priv->applications_by_context_name);205 g_hash_table_destroy (observer->priv->applications_by_context_name);
206206
207 g_bus_unwatch_name (observer->priv->service_watch_id);207 if (observer->priv->service_watch_id)
208 {
209 g_bus_unwatch_name (observer->priv->service_watch_id);
210 }
208211
209 if (observer->priv->service)212 if (observer->priv->service)
210 {213 {
@@ -225,6 +228,9 @@
225 G_OBJECT_CLASS (bamf_unity_webapps_observer_parent_class)->constructed (object);228 G_OBJECT_CLASS (bamf_unity_webapps_observer_parent_class)->constructed (object);
226 }229 }
227230
231 if (g_strcmp0 (g_getenv ("BAMF_TEST_MODE"), "TRUE") == 0)
232 return;
233
228 observer->priv->service_watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,234 observer->priv->service_watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
229 "com.canonical.Unity.Webapps.Service",235 "com.canonical.Unity.Webapps.Service",
230 G_BUS_NAME_WATCHER_FLAGS_NONE,236 G_BUS_NAME_WATCHER_FLAGS_NONE,
231237
=== modified file 'tests/bamfdaemon/test-application.c'
--- tests/bamfdaemon/test-application.c 2013-07-16 00:27:11 +0000
+++ tests/bamfdaemon/test-application.c 2013-07-16 16:30:44 +0000
@@ -27,7 +27,9 @@
27#include "bamf-legacy-window.h"27#include "bamf-legacy-window.h"
28#include "bamf-legacy-window-test.h"28#include "bamf-legacy-window-test.h"
2929
30#define DESKTOP_FILE "/usr/share/applications/gnome-terminal.desktop"30#define DESKTOP_FILE TESTDIR"/data/test-bamf-app.desktop"
31
32void ignore_fatal_errors (void);
3133
32static gboolean signal_seen = FALSE;34static gboolean signal_seen = FALSE;
33static gboolean signal_result = FALSE;35static gboolean signal_result = FALSE;
@@ -66,7 +68,7 @@
66static void68static void
67test_allocation (void)69test_allocation (void)
68{70{
69 BamfApplication *application;71 BamfApplication *application;
7072
71 /* Check it allocates */73 /* Check it allocates */
72 application = bamf_application_new ();74 application = bamf_application_new ();
@@ -81,12 +83,47 @@
81}83}
8284
83static void85static void
86test_type (void)
87{
88 BamfApplication *application = bamf_application_new ();
89 g_assert_cmpuint (bamf_application_get_application_type (application), ==, BAMF_APPLICATION_SYSTEM);
90
91 g_object_unref (application);
92}
93
94static void
95test_type_set (void)
96{
97 BamfApplication *application = bamf_application_new ();
98
99 bamf_application_set_application_type (application, BAMF_APPLICATION_WEB);
100 g_assert_cmpuint (bamf_application_get_application_type (application), ==, BAMF_APPLICATION_WEB);
101
102 bamf_application_set_application_type (application, BAMF_APPLICATION_SYSTEM);
103 g_assert_cmpuint (bamf_application_get_application_type (application), ==, BAMF_APPLICATION_SYSTEM);
104
105 g_object_unref (application);
106}
107
108static void
109test_type_set_invalid (void)
110{
111 ignore_fatal_errors();
112 BamfApplication *application = bamf_application_new ();
113
114 bamf_application_set_application_type (application, BAMF_APPLICATION_UNKNOWN);
115 g_assert_cmpuint (bamf_application_get_application_type (application), ==, BAMF_APPLICATION_SYSTEM);
116
117 bamf_application_set_application_type (application, -1);
118 g_assert_cmpuint (bamf_application_get_application_type (application), ==, BAMF_APPLICATION_SYSTEM);
119
120 g_object_unref (application);
121}
122
123static void
84test_desktop_file (void)124test_desktop_file (void)
85{125{
86 BamfApplication *application;126 BamfApplication *application = bamf_application_new ();
87
88 /* Check it allocates */
89 application = bamf_application_new ();
90 g_assert (bamf_application_get_desktop_file (application) == NULL);127 g_assert (bamf_application_get_desktop_file (application) == NULL);
91128
92 bamf_application_set_desktop_file (application, DESKTOP_FILE);129 bamf_application_set_desktop_file (application, DESKTOP_FILE);
@@ -733,6 +770,7 @@
733770
734 g_object_unref (window);771 g_object_unref (window);
735 g_object_unref (test);772 g_object_unref (test);
773 g_object_unref (application);
736}774}
737775
738static void776static void
@@ -777,6 +815,287 @@
777815
778 g_object_unref (window);816 g_object_unref (window);
779 g_object_unref (test);817 g_object_unref (test);
818 g_object_unref (application);
819}
820
821static void
822test_desktop_app_main_child (void)
823{
824 BamfApplication *application;
825 BamfLegacyWindowTest *lwin;
826 BamfWindow *win;
827
828 application = bamf_application_new_from_desktop_file (DESKTOP_FILE);
829 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-icon", "execution-binary");
830 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
831
832 g_assert (!bamf_application_get_main_child (application));
833 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
834 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win));
835
836 g_object_unref (lwin);
837 g_object_unref (win);
838 g_object_unref (application);
839}
840
841static void
842test_desktop_app_main_child_doesnt_match_emblems (void)
843{
844 BamfApplication *application;
845 BamfLegacyWindowTest *lwin;
846 BamfWindow *win;
847
848 application = bamf_application_new_from_desktop_file (DESKTOP_FILE);
849 lwin = bamf_legacy_window_test_new (20, "window", "python", "execution-binary");
850 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
851
852 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
853 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), !=, "window");
854 g_assert_cmpstr (bamf_view_get_icon (BAMF_VIEW (application)), !=, "python");
855
856 g_object_unref (lwin);
857 g_object_unref (win);
858 g_object_unref (application);
859}
860
861static void
862test_desktop_app_main_child_doesnt_update_emblems (void)
863{
864 BamfApplication *application;
865 BamfLegacyWindowTest *lwin;
866 BamfWindow *win;
867
868 application = bamf_application_new_from_desktop_file (DESKTOP_FILE);
869 lwin = bamf_legacy_window_test_new (20, "window", "python", "execution-binary");
870 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
871
872 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
873 bamf_legacy_window_test_set_name (lwin, "New Window Name");
874 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), !=, "New Window Name");
875
876 bamf_legacy_window_test_set_name (lwin, "even-new-name");
877 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), !=, "even-new-name");
878
879 g_object_unref (lwin);
880 g_object_unref (win);
881 g_object_unref (application);
882}
883
884static void
885test_app_main_child (void)
886{
887 BamfApplication *application;
888 BamfLegacyWindowTest *lwin;
889 BamfWindow *win;
890
891 application = bamf_application_new ();
892 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-icon", "execution-binary");
893 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
894
895 g_assert (!bamf_application_get_main_child (application));
896 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
897 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win));
898
899 g_object_unref (lwin);
900 g_object_unref (win);
901
902 g_assert (!bamf_application_get_main_child (application));
903 g_object_unref (application);
904}
905
906static void
907test_app_main_child_matches_emblems (void)
908{
909 BamfApplication *application;
910 BamfLegacyWindowTest *lwin;
911 BamfWindow *win;
912
913 application = bamf_application_new ();
914 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-icon", "execution-binary");
915 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
916
917 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
918 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), ==, "window");
919 g_assert_cmpstr (bamf_view_get_icon (BAMF_VIEW (application)), ==, "test-bamf-icon");
920
921 g_object_unref (lwin);
922 g_object_unref (win);
923 g_object_unref (application);
924}
925
926static void
927test_app_main_child_updates_emblems (void)
928{
929 BamfApplication *application;
930 BamfLegacyWindowTest *lwin;
931 BamfWindow *win;
932
933 application = bamf_application_new ();
934 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-icon", "execution-binary");
935 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
936
937 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
938 bamf_legacy_window_test_set_name (lwin, "New Window Name");
939 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), ==, "New Window Name");
940
941 bamf_legacy_window_test_set_name (lwin, "even-new-name");
942 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), ==, "even-new-name");
943
944 g_object_unref (lwin);
945 g_object_unref (win);
946 g_object_unref (application);
947}
948
949static void
950test_app_main_child_multiple_children (void)
951{
952 BamfApplication *application;
953 BamfLegacyWindowTest *lwin;
954 BamfWindow *win1;
955 GList *wins = NULL;
956 GList *lwins = NULL;
957 int i;
958
959 application = bamf_application_new ();
960 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-icon", "execution-binary");
961 win1 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
962 g_object_unref (lwin);
963
964 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win1));
965
966 for (i = 0; i < 10; ++i)
967 {
968 lwin = bamf_legacy_window_test_new (i, "other-window", "", "execution-binary");
969 lwins = g_list_prepend (lwins, lwin);
970 wins = g_list_prepend (wins, bamf_window_new (BAMF_LEGACY_WINDOW (lwin)));
971 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (wins->data));
972
973 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win1));
974 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), ==, "window");
975 g_assert_cmpstr (bamf_view_get_icon (BAMF_VIEW (application)), ==, "test-bamf-icon");
976 }
977
978 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win1));
979
980 g_object_unref (win1);
981 g_object_unref (application);
982 g_list_free_full (wins, g_object_unref);
983 g_list_free_full (lwins, g_object_unref);
984}
985
986static void
987test_app_main_child_normal_priority (void)
988{
989 BamfApplication *application;
990 BamfLegacyWindowTest *lwin;
991 BamfWindow *dialog, *win;
992
993 application = bamf_application_new ();
994 lwin = bamf_legacy_window_test_new (10, "dialog", "python", "execution-binary");
995 lwin->window_type = BAMF_WINDOW_DIALOG;
996 dialog = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
997 g_object_unref (lwin);
998
999 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (dialog));
1000 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (dialog));
1001
1002 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), ==, "dialog");
1003 g_assert_cmpstr (bamf_view_get_icon (BAMF_VIEW (application)), ==, "python");
1004
1005 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-icon", "execution-binary");
1006 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1007 g_object_unref (lwin);
1008
1009 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1010 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win));
1011
1012 g_assert_cmpstr (bamf_view_get_name (BAMF_VIEW (application)), ==, "window");
1013 g_assert_cmpstr (bamf_view_get_icon (BAMF_VIEW (application)), ==, "test-bamf-icon");
1014
1015 g_object_unref (dialog);
1016 g_object_unref (win);
1017 g_object_unref (application);
1018}
1019
1020static void
1021test_app_main_child_on_window_removal (void)
1022{
1023 BamfApplication *application;
1024 BamfLegacyWindowTest *lwin;
1025 BamfWindow *win1, *win2, *win3, *win4, *dialog;
1026
1027 application = bamf_application_new ();
1028 lwin = bamf_legacy_window_test_new (10, "window1", NULL, "execution-binary");
1029 win1 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1030 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win1));
1031 g_object_unref (lwin);
1032
1033 lwin = bamf_legacy_window_test_new (20, "window2", NULL, "execution-binary");
1034 win2 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1035 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win2));
1036 g_object_unref (lwin);
1037
1038 lwin = bamf_legacy_window_test_new (21, "dialog", NULL, "execution-binary");
1039 lwin->window_type = BAMF_WINDOW_DIALOG;
1040 dialog = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1041 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (dialog));
1042 g_object_unref (lwin);
1043
1044 lwin = bamf_legacy_window_test_new (30, "window3", NULL, "execution-binary");
1045 win3 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1046 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win3));
1047 g_object_unref (lwin);
1048
1049 lwin = bamf_legacy_window_test_new (40, "window4", NULL, "execution-binary");
1050 win4 = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1051 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win4));
1052 g_object_unref (lwin);
1053
1054 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win1));
1055
1056 bamf_view_remove_child (BAMF_VIEW (application), BAMF_VIEW (win4));
1057 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win1));
1058
1059 bamf_view_remove_child (BAMF_VIEW (application), BAMF_VIEW (win1));
1060 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win2));
1061
1062 bamf_view_remove_child (BAMF_VIEW (application), BAMF_VIEW (win2));
1063 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win3));
1064
1065 bamf_view_remove_child (BAMF_VIEW (application), BAMF_VIEW (win3));
1066 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (dialog));
1067
1068 bamf_view_remove_child (BAMF_VIEW (application), BAMF_VIEW (dialog));
1069 g_assert (!bamf_application_get_main_child (application));
1070
1071 g_object_unref (win1);
1072 g_object_unref (win2);
1073 g_object_unref (win3);
1074 g_object_unref (win4);
1075 g_object_unref (dialog);
1076 g_object_unref (application);
1077}
1078
1079static void
1080test_app_main_child_on_window_replace_on_removal (void)
1081{
1082 BamfApplication *application;
1083 BamfLegacyWindowTest *lwin;
1084 BamfWindow *win;
1085
1086 application = bamf_application_new ();
1087 lwin = bamf_legacy_window_test_new (20, "window", "test-bamf-icon", "execution-binary");
1088 win = bamf_window_new (BAMF_LEGACY_WINDOW (lwin));
1089
1090 bamf_view_add_child (BAMF_VIEW (application), BAMF_VIEW (win));
1091 g_assert (bamf_application_get_main_child (application) == BAMF_VIEW (win));
1092 bamf_view_remove_child (BAMF_VIEW (application), BAMF_VIEW (win));
1093 g_assert (!bamf_application_get_main_child (application));
1094 bamf_legacy_window_test_set_name (lwin, "don't crash here!");
1095
1096 g_object_unref (lwin);
1097 g_object_unref (win);
1098 g_object_unref (application);
780}1099}
7811100
782/* Initialize test suite */1101/* Initialize test suite */
@@ -789,6 +1108,9 @@
789 gdbus_connection = connection;1108 gdbus_connection = connection;
7901109
791 g_test_add_func (DOMAIN"/Allocation", test_allocation);1110 g_test_add_func (DOMAIN"/Allocation", test_allocation);
1111 g_test_add_func (DOMAIN"/Type", test_type);
1112 g_test_add_func (DOMAIN"/Type/Set", test_type_set);
1113 g_test_add_func (DOMAIN"/Type/Set/Invalid", test_type_set_invalid);
792 g_test_add_func (DOMAIN"/DesktopFile", test_desktop_file);1114 g_test_add_func (DOMAIN"/DesktopFile", test_desktop_file);
793 g_test_add_func (DOMAIN"/DesktopFile/Icon", test_desktop_icon);1115 g_test_add_func (DOMAIN"/DesktopFile/Icon", test_desktop_icon);
794 g_test_add_func (DOMAIN"/DesktopFile/Icon/Empty", test_desktop_icon_empty);1116 g_test_add_func (DOMAIN"/DesktopFile/Icon/Empty", test_desktop_icon_empty);
@@ -797,12 +1119,22 @@
797 g_test_add_func (DOMAIN"/DesktopFile/Icon/FullPath/Invalid", test_icon_full_path_invalid);1119 g_test_add_func (DOMAIN"/DesktopFile/Icon/FullPath/Invalid", test_icon_full_path_invalid);
798 g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/Valid", test_get_mime_types);1120 g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/Valid", test_get_mime_types);
799 g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/None", test_get_mime_types_none);1121 g_test_add_func (DOMAIN"/DesktopFile/MimeTypes/None", test_get_mime_types_none);
1122 g_test_add_func (DOMAIN"/DesktopFile/MainChild", test_desktop_app_main_child);
1123 g_test_add_func (DOMAIN"/DesktopFile/MainChild/NotMatchEmblems", test_desktop_app_main_child_doesnt_match_emblems);
1124 g_test_add_func (DOMAIN"/DesktopFile/MainChild/NotUpdatesEmblems", test_desktop_app_main_child_doesnt_update_emblems);
800 g_test_add_func (DOMAIN"/DesktopLess/Icon/ClassName", test_icon_class_name);1125 g_test_add_func (DOMAIN"/DesktopLess/Icon/ClassName", test_icon_class_name);
801 g_test_add_func (DOMAIN"/DesktopLess/Icon/Exec", test_icon_exec_string);1126 g_test_add_func (DOMAIN"/DesktopLess/Icon/Exec", test_icon_exec_string);
802 g_test_add_func (DOMAIN"/DesktopLess/Icon/Embedded", test_icon_embedded);1127 g_test_add_func (DOMAIN"/DesktopLess/Icon/Embedded", test_icon_embedded);
803 g_test_add_func (DOMAIN"/DesktopLess/Icon/Priority", test_icon_priority);1128 g_test_add_func (DOMAIN"/DesktopLess/Icon/Priority", test_icon_priority);
804 g_test_add_func (DOMAIN"/DesktopLess/Icon/Generic/Class", test_icon_generic_class);1129 g_test_add_func (DOMAIN"/DesktopLess/Icon/Generic/Class", test_icon_generic_class);
805 g_test_add_func (DOMAIN"/DesktopLess/Icon/Generic/Exec", test_icon_generic_exec);1130 g_test_add_func (DOMAIN"/DesktopLess/Icon/Generic/Exec", test_icon_generic_exec);
1131 g_test_add_func (DOMAIN"/DesktopLess/MainChild", test_app_main_child);
1132 g_test_add_func (DOMAIN"/DesktopLess/MainChild/MatchesEmblems", test_app_main_child_matches_emblems);
1133 g_test_add_func (DOMAIN"/DesktopLess/MainChild/UpdatesEmblems", test_app_main_child_updates_emblems);
1134 g_test_add_func (DOMAIN"/DesktopLess/MainChild/MultipleChildren", test_app_main_child_multiple_children);
1135 g_test_add_func (DOMAIN"/DesktopLess/MainChild/NormalPriority", test_app_main_child_normal_priority);
1136 g_test_add_func (DOMAIN"/DesktopLess/MainChild/Removal", test_app_main_child_on_window_removal);
1137 g_test_add_func (DOMAIN"/DesktopLess/MainChild/ReplaceOnRemoval", test_app_main_child_on_window_replace_on_removal);
806 g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid);1138 g_test_add_func (DOMAIN"/ManagesXid", test_manages_xid);
807 g_test_add_func (DOMAIN"/GetWindow", test_get_window);1139 g_test_add_func (DOMAIN"/GetWindow", test_get_window);
808 g_test_add_func (DOMAIN"/Xids", test_get_xids);1140 g_test_add_func (DOMAIN"/Xids", test_get_xids);
8091141
=== modified file 'tests/bamfdaemon/test-bamf.c'
--- tests/bamfdaemon/test-bamf.c 2013-06-21 20:58:53 +0000
+++ tests/bamfdaemon/test-bamf.c 2013-07-16 16:30:44 +0000
@@ -34,6 +34,20 @@
3434
35static int result = 1;35static int result = 1;
3636
37static gboolean
38not_fatal_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
39 const gchar *message, gpointer user_data)
40{
41 // Don't crash if used
42 return FALSE;
43}
44
45void
46ignore_fatal_errors (void)
47{
48 g_test_log_set_fatal_handler (not_fatal_log_handler, NULL);
49}
50
37static void51static void
38on_bus_acquired (GDBusConnection *connection, const gchar *name, gpointer data)52on_bus_acquired (GDBusConnection *connection, const gchar *name, gpointer data)
39{53{

Subscribers

People subscribed via source and target branches