2
* Copyright © 2012 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License version 3, as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License along
14
* with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authors: Ryan Lortie <desrt@desrt.ca>
17
* Ted Gould <ted@canonical.com>
20
#include "hudindicatorsource.h"
22
#include <glib/gi18n.h>
25
#include "hudsettings.h"
26
#include "huddbusmenucollector.h"
27
#include "hudmenumodelcollector.h"
28
#include "hudsource.h"
31
* SECTION:hudindicatorsource
32
* @title:HudIndicatorSource
33
* @short_description: a #HudSource to search through the menus of
36
* #HudIndicatorSource searches through the menu items of the
43
* This is an opaque structure type.
48
const gchar *dbus_name;
49
const gchar *dbus_menu_path;
50
const gchar *indicator_name;
51
const gchar *user_visible_name;
53
gboolean uses_gmenumodel;
56
static const IndicatorInfo indicator_info[] = {
58
.dbus_name = "com.canonical.indicator.datetime",
59
.dbus_menu_path = "/com/canonical/indicator/datetime/menu",
60
.indicator_name = "indicator-datetime",
61
.user_visible_name = N_("Date"),
62
.icon = "office-calendar"
65
.dbus_name = "com.canonical.indicator.session",
66
.dbus_menu_path = "/com/canonical/indicator/session/menu",
67
.indicator_name = "indicator-session-device",
68
.user_visible_name = N_("Device"),
69
.icon = "system-devices-panel"
72
.dbus_name = "com.canonical.indicator.session",
73
.dbus_menu_path = "/com/canonical/indicator/users/menu",
74
.indicator_name = "indicator-session-user",
75
.user_visible_name = N_("Users"),
76
.icon = "avatar-default"
79
.dbus_name = "com.canonical.indicator.sound",
80
.dbus_menu_path = "/com/canonical/indicator/sound/menu",
81
.indicator_name = "indicator-sound",
82
.user_visible_name = N_("Sound"),
83
.icon = "audio-volume-high-panel"
86
.dbus_name = "com.canonical.indicator.messages",
87
.dbus_menu_path = "/com/canonical/indicator/messages/menu",
88
.indicator_name = "indicator-messages",
89
.user_visible_name = N_("Messages"),
90
.icon = "indicator-messages",
91
.uses_gmenumodel = TRUE
97
const IndicatorInfo *info;
98
HudIndicatorSource *source;
100
} HudIndicatorSourceIndicator;
102
struct _HudIndicatorSource
104
GObject parent_instance;
106
HudIndicatorSourceIndicator *indicators;
111
typedef GObjectClass HudIndicatorSourceClass;
113
static void hud_indicator_source_iface_init (HudSourceInterface *iface);
114
G_DEFINE_TYPE_WITH_CODE (HudIndicatorSource, hud_indicator_source, G_TYPE_OBJECT,
115
G_IMPLEMENT_INTERFACE (HUD_TYPE_SOURCE, hud_indicator_source_iface_init))
118
hud_indicator_source_use (HudSource *hud_source)
120
HudIndicatorSource *source = HUD_INDICATOR_SOURCE (hud_source);
123
if (source->use_count == 0)
125
for (i = 0; i < source->n_indicators; i++)
126
if (source->indicators[i].collector)
127
hud_source_use (source->indicators[i].collector);
134
hud_indicator_source_unuse (HudSource *hud_source)
136
HudIndicatorSource *source = HUD_INDICATOR_SOURCE (hud_source);
139
g_return_if_fail (source->use_count > 0);
143
if (source->use_count == 0)
145
for (i = 0; i < source->n_indicators; i++)
146
if (source->indicators[i].collector)
147
hud_source_unuse (source->indicators[i].collector);
152
hud_indicator_source_search (HudSource *hud_source,
153
GPtrArray *results_array,
154
HudTokenList *search_string)
156
HudIndicatorSource *source = HUD_INDICATOR_SOURCE (hud_source);
159
for (i = 0; i < source->n_indicators; i++)
160
if (source->indicators[i].collector)
161
hud_source_search (source->indicators[i].collector, results_array, search_string);
165
hud_indicator_source_finalize (GObject *object)
167
g_assert_not_reached ();
171
hud_indicator_source_collector_changed (HudSource *source,
174
HudIndicatorSourceIndicator *indicator = user_data;
176
hud_source_changed (HUD_SOURCE (indicator->source));
180
hud_indicator_source_name_appeared (GDBusConnection *connection,
182
const gchar *name_owner,
185
HudIndicatorSourceIndicator *indicator = user_data;
187
if (indicator->info->uses_gmenumodel)
189
HudMenuModelCollector *collector;
191
collector = hud_menu_model_collector_new_for_endpoint (indicator->info->indicator_name,
192
_(indicator->info->user_visible_name),
193
indicator->info->icon,
194
hud_settings.indicator_penalty,
196
indicator->info->dbus_menu_path);
198
indicator->collector = HUD_SOURCE (collector);
202
HudDbusmenuCollector *collector;
204
collector = hud_dbusmenu_collector_new_for_endpoint (indicator->info->indicator_name,
205
_(indicator->info->user_visible_name),
206
indicator->info->icon,
207
hud_settings.indicator_penalty,
208
name_owner, indicator->info->dbus_menu_path);
209
indicator->collector = HUD_SOURCE (collector);
212
g_signal_connect (indicator->collector, "changed",
213
G_CALLBACK (hud_indicator_source_collector_changed), indicator);
215
/* Set initial use count on new indicator if query is active. */
216
if (indicator->source->use_count)
217
hud_source_use (indicator->collector);
219
hud_source_changed (HUD_SOURCE (indicator->source));
223
hud_indicator_source_name_vanished (GDBusConnection *connection,
227
HudIndicatorSourceIndicator *indicator = user_data;
229
if (indicator->collector)
231
g_signal_handlers_disconnect_by_func (indicator->collector, hud_indicator_source_collector_changed, indicator);
232
/* Drop our use count on dying indicator (if any) */
233
if (indicator->source->use_count)
234
hud_source_unuse (indicator->collector);
235
g_clear_object (&indicator->collector);
238
hud_source_changed (HUD_SOURCE (indicator->source));
242
hud_indicator_source_init (HudIndicatorSource *source)
246
source->n_indicators = G_N_ELEMENTS (indicator_info);
247
source->indicators = g_new0 (HudIndicatorSourceIndicator, source->n_indicators);
249
for (i = 0; i < source->n_indicators; i++)
251
HudIndicatorSourceIndicator *indicator = &source->indicators[i];
253
indicator->info = &indicator_info[i];
254
indicator->source = source;
256
g_bus_watch_name (G_BUS_TYPE_SESSION, indicator->info->dbus_name, G_BUS_NAME_WATCHER_FLAGS_NONE,
257
hud_indicator_source_name_appeared, hud_indicator_source_name_vanished, indicator, NULL);
262
hud_indicator_source_iface_init (HudSourceInterface *iface)
264
iface->use = hud_indicator_source_use;
265
iface->unuse = hud_indicator_source_unuse;
266
iface->search = hud_indicator_source_search;
270
hud_indicator_source_class_init (HudIndicatorSourceClass *class)
272
class->finalize = hud_indicator_source_finalize;
276
* hud_indicator_source_new:
278
* Creates a #HudIndicatorSource.
280
* Returns: a new #HudIndicatorSource
283
hud_indicator_source_new (void)
285
return g_object_new (HUD_TYPE_INDICATOR_SOURCE, NULL);