aboutsummaryrefslogtreecommitdiffstats
path: root/community/phosh/0001-app-list-model-phantom-launcher.patch
blob: b2aa205d26af23afcfe5bf7efa58b1b23747e245 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
Taken from upstream, fixes an issue where an application launcher would
in some cases disappear making it impossible to launch that application
via the GUI.

From 1b642cd8ba63fd10ad40030e1e9c16e04c090e6e Mon Sep 17 00:00:00 2001
From: Zander Brown <zbrown@gnome.org>
Date: Fri, 19 Jun 2020 19:49:14 +0100
Subject: [PATCH] app-list-model: phantom launcher

At last a fix for the missing item problem

tl;dr: we skipped the first entry

The reason it was weirdly deterministic is that we _always_ skipped
the first item and as long as the entries didn't change the item would
_always_ be the same

Why was the item seemingly random? Because the list doesn't have any
sorting at the point we lost an item

So why didn't this effect more people? A system has many, many entries -
a lot of which aren't actually app launchers. For example my laptop
currently has 301 entries of which 172 should actually be shown. By pure
fluke we got lucky most of the time and skipped an unintersting one.

The fix is painfully simple: iterate the GList properly
---
 src/app-list-model.c  | 18 +++++++++--------
 tools/dump-app-list.c | 47 +++++++++++++++++++++++++++++++++++++++++++
 tools/meson.build     |  3 +++
 3 files changed, 60 insertions(+), 8 deletions(-)
 create mode 100644 tools/dump-app-list.c

diff --git a/src/app-list-model.c b/src/app-list-model.c
index 648ee00..5281985 100644
--- a/src/app-list-model.c
+++ b/src/app-list-model.c
@@ -1,12 +1,14 @@
 /*
- * Copyright © 2019 Zander Brown <zbrown@gnome.org>
+ * Copyright © 2019-2020 Zander Brown <zbrown@gnome.org>
  *
  * Inspired by gliststore.c:
  *     Copyright 2015 Lars Uebernickel
  *     Copyright 2015 Ryan Lortie
  * https://gitlab.gnome.org/GNOME/glib/blob/713fec9dcb1ee49c4f64bbb6f483a5cd1db9966a/gio/gliststore.c
  *
- * SPDX-License-Identifier: GPL-3.0+
+ * SPDX-License-Identifier: GPL-3-or-later
+ *
+ * Author: Zander Brown <zbrown@gnome.org>
  */
 
 #include "app-list-model.h"
@@ -116,27 +118,27 @@ items_changed (gpointer data)
 {
   PhoshAppListModel *self = PHOSH_APP_LIST_MODEL (data);
   PhoshAppListModelPrivate *priv = phosh_app_list_model_get_instance_private (self);
-  GList *new_apps;
+  g_autolist(GAppInfo) new_apps = NULL;
   int removed;
   int added = 0;
 
   new_apps = g_app_info_get_all ();
 
+  g_return_val_if_fail (new_apps != NULL, G_SOURCE_REMOVE);
+
   removed = g_sequence_get_length (priv->items);
 
   g_sequence_remove_range (g_sequence_get_begin_iter (priv->items),
                            g_sequence_get_end_iter (priv->items));
 
-  while ((new_apps = g_list_next (new_apps))) {
-    if (!g_app_info_should_show (G_APP_INFO (new_apps->data))) {
+  for (GList *l = new_apps; l; l = g_list_next (l)) {
+    if (!g_app_info_should_show (G_APP_INFO (l->data))) {
       continue;
     }
-    g_sequence_append (priv->items, g_object_ref (new_apps->data));
+    g_sequence_append (priv->items, g_object_ref (l->data));
     added++;
   }
 
-  g_list_free_full (new_apps, g_object_unref);
-
   priv->last.is_valid = FALSE;
   priv->last.iter = NULL;
   priv->last.position = 0;
diff --git a/tools/dump-app-list.c b/tools/dump-app-list.c
new file mode 100644
index 0000000..2f7919d
--- /dev/null
+++ b/tools/dump-app-list.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright © 2020 Zander Brown <zbrown@gnome.org>
+ *
+ * SPDX-License-Identifier: GPL-3-or-later
+ *
+ * Author: Zander Brown <zbrown@gnome.org>
+ *
+ * Print the contents of PhoshAppListModel
+ */
+
+#include <app-list-model.h>
+
+int
+main (int argc, char **argv)
+{
+  PhoshAppListModel *list = phosh_app_list_model_get_default ();
+  int i = 0;
+  GAppInfo *info;
+  GMainLoop *loop;
+
+  g_print ("Populating...\n");
+
+  /* Let the main loop run a bit for the timeouts/idle callbacks to run */
+  loop = g_main_loop_new (NULL, FALSE);
+  g_timeout_add_seconds (2, G_SOURCE_FUNC (g_main_loop_quit), loop);
+  g_main_loop_run (loop);
+
+  while ((info = g_list_model_get_item (G_LIST_MODEL (list), i))) {
+    if (G_IS_DESKTOP_APP_INFO (info)) {
+      g_print ("%s\n - %s\n",
+               g_app_info_get_id (info),
+               g_desktop_app_info_get_filename (G_DESKTOP_APP_INFO (info)));
+    } else {
+      /* Unlikely but handle it just in case */
+      g_print ("%s\n - %s\n",
+               g_app_info_get_id (info),
+               G_OBJECT_TYPE_NAME (info));
+    }
+
+    i++;
+    g_clear_object (&info);
+  }
+
+  g_print ("=== %i items\n", i);
+
+  return 0;
+}
diff --git a/tools/meson.build b/tools/meson.build
index 65a6a6d..d3fdd13 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -34,3 +34,6 @@ executable('notify-blocks', ['notify-blocks.c'],
 
 executable('notify-server-standalone', ['notify-server-standalone.c'] + stubs,
            dependencies: phosh_dep)
+
+executable('dump-app-list', ['dump-app-list.c'],
+           dependencies: phosh_dep)
-- 
2.27.0