~jbicha/hud/build-depend-on-valac-not-gir

« back to all changes in this revision

Viewing changes to src/hudindicatorsource.c

  • Committer: Tarmac
  • Author(s): Ted Gould, Pete Woods, Antti Kaijanmäki, Ted Gould, Albert Astals, Ryan Lortie, Łukasz 'sil2100' Zemczak, Albert Astals Cid, Mathieu Trudel-Lapierre, Kaleo, Tarmac, Ricardo Salveti de Araujo, Michael Terry, Automatic PS uploader
  • Date: 2013-04-10 16:04:51 UTC
  • mfrom: (227.3.148 phablet)
  • Revision ID: tarmac-20130410160451-o3owpv3zaxulm5of
HUD 2.0 Merge.

Approved by PS Jenkins bot, Mathieu Trudel-Lapierre.

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
{
48
48
  const gchar *dbus_name;
49
49
  const gchar *dbus_menu_path;
 
50
  const gchar *action_path; /* Only if gmenumodel */
50
51
  const gchar *indicator_name;
51
52
  const gchar *user_visible_name;
52
53
  const gchar *icon;
 
54
  const gchar *dbus_path;
53
55
  gboolean     uses_gmenumodel;
54
56
} IndicatorInfo;
55
57
 
 
58
#define HUD_PATH_BASE "/com/canonical/hud/indicator/"
 
59
 
56
60
static const IndicatorInfo indicator_info[] = {
57
61
  {
58
62
    .dbus_name         = "com.canonical.indicator.datetime",
59
63
    .dbus_menu_path    = "/com/canonical/indicator/datetime/menu",
 
64
    .dbus_path         = HUD_PATH_BASE "datetime",
60
65
    .indicator_name    = "indicator-datetime",
61
66
    .user_visible_name = N_("Date"),
62
67
    .icon              = "office-calendar"
64
69
  {
65
70
    .dbus_name         = "com.canonical.indicator.session",
66
71
    .dbus_menu_path    = "/com/canonical/indicator/session/menu",
 
72
    .dbus_path         = HUD_PATH_BASE "session",
67
73
    .indicator_name    = "indicator-session-device",
68
74
    .user_visible_name = N_("Device"),
69
75
    .icon              = "system-devices-panel"
70
76
  },
71
77
  {
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"
77
 
  },
78
 
  {
79
78
    .dbus_name         = "com.canonical.indicator.sound",
80
79
    .dbus_menu_path    = "/com/canonical/indicator/sound/menu",
 
80
    .dbus_path         = HUD_PATH_BASE "sound",
81
81
    .indicator_name    = "indicator-sound",
82
82
    .user_visible_name = N_("Sound"),
83
 
    .icon              = "audio-volume-high-panel"
 
83
    .icon              = "indicator-sound-hud"
84
84
  },
85
85
  {
86
86
    .dbus_name         = "com.canonical.indicator.messages",
87
87
    .dbus_menu_path    = "/com/canonical/indicator/messages/menu",
 
88
    .action_path       = "/com/canonical/indicator/messages/menu",
 
89
    .dbus_path         = HUD_PATH_BASE "messages",
88
90
    .indicator_name    = "indicator-messages",
89
91
    .user_visible_name = N_("Messages"),
90
 
    .icon              = "indicator-messages",
 
92
    .icon              = "indicator-messages-hud",
 
93
    .uses_gmenumodel   = TRUE
 
94
  },
 
95
  {
 
96
    .dbus_name         = "com.canonical.indicator.messages",
 
97
    .dbus_menu_path    = "/com/canonical/indicator/messages/phone",
 
98
    .action_path       = "/com/canonical/indicator/messages",
 
99
    .dbus_path         = HUD_PATH_BASE "messages_phone",
 
100
    .indicator_name    = "indicator-messages-phone",
 
101
    .user_visible_name = N_("Messages"),
 
102
    .icon              = "indicator-messages-hud",
 
103
    .uses_gmenumodel   = TRUE
 
104
  },
 
105
  {
 
106
    .dbus_name         = "com.canonical.indicator.battery",
 
107
    .dbus_menu_path    = "/com/canonical/indicator/battery/phone",
 
108
    .action_path       = "/com/canonical/indicator/battery",
 
109
    .dbus_path         = HUD_PATH_BASE "battery",
 
110
    .indicator_name    = "indicator-battery-phone",
 
111
    .user_visible_name = N_("Battery"),
 
112
    .icon              = "indicator-battery-hud",
 
113
    .uses_gmenumodel   = TRUE
 
114
  },
 
115
  {
 
116
    .dbus_name         = "com.canonical.indicator.time",
 
117
    .dbus_menu_path    = "/com/canonical/indicator/time/phone",
 
118
    .action_path       = "/com/canonical/indicator/time",
 
119
    .dbus_path         = HUD_PATH_BASE "time",
 
120
    .indicator_name    = "indicator-time-phone",
 
121
    .user_visible_name = N_("Date and Time"),
 
122
    .icon              = "indicator-time",
 
123
    .uses_gmenumodel   = TRUE
 
124
  },
 
125
  {
 
126
    .dbus_name         = "com.canonical.settings.network",
 
127
    .dbus_menu_path    = "/com/canonical/settings/network/phone",
 
128
    .action_path       = "/com/canonical/settings/network",
 
129
    .dbus_path         = HUD_PATH_BASE "network",
 
130
    .indicator_name    = "indicator-network-phone",
 
131
    .user_visible_name = N_("Network"),
 
132
    .icon              = "indicator-network-hud",
 
133
    .uses_gmenumodel   = TRUE
 
134
  },
 
135
  {
 
136
    .dbus_name         = "com.canonical.settings.sound",
 
137
    .dbus_menu_path    = "/com/canonical/settings/sound/phone",
 
138
    .action_path       = "/com/canonical/settings/sound",
 
139
    .dbus_path         = HUD_PATH_BASE "sound",
 
140
    .indicator_name    = "indicator-sound-phone",
 
141
    .user_visible_name = N_("Sound"),
 
142
    .icon              = "indicator-sound-hud",
91
143
    .uses_gmenumodel   = TRUE
92
144
  }
93
145
};
97
149
  const IndicatorInfo *info;
98
150
  HudIndicatorSource *source;
99
151
  HudSource *collector;
 
152
  guint watch_id;
100
153
} HudIndicatorSourceIndicator;
101
154
 
102
155
struct _HudIndicatorSource
150
203
 
151
204
static void
152
205
hud_indicator_source_search (HudSource    *hud_source,
153
 
                             GPtrArray    *results_array,
154
 
                             HudTokenList *search_string)
155
 
{
156
 
  HudIndicatorSource *source = HUD_INDICATOR_SOURCE (hud_source);
157
 
  gint i;
158
 
 
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);
 
206
                             HudTokenList *search_string,
 
207
                             void        (*append_func) (HudResult * result, gpointer user_data),
 
208
                             gpointer      user_data)
 
209
{
 
210
  HudIndicatorSource *source = HUD_INDICATOR_SOURCE (hud_source);
 
211
  gint i;
 
212
 
 
213
  for (i = 0; i < source->n_indicators; i++)
 
214
    if (source->indicators[i].collector)
 
215
      hud_source_search (source->indicators[i].collector, search_string, append_func, user_data);
 
216
}
 
217
 
 
218
static void
 
219
hud_indicator_source_list_applications (HudSource    *hud_source,
 
220
                                        HudTokenList *search_string,
 
221
                                        void        (*append_func) (const gchar *application_id, const gchar *application_icon, HudSourceItemType type, gpointer user_data),
 
222
                                        gpointer      user_data)
 
223
{
 
224
  HudIndicatorSource *source = HUD_INDICATOR_SOURCE (hud_source);
 
225
  gint i;
 
226
 
 
227
  for (i = 0; i < source->n_indicators; i++)
 
228
    if (source->indicators[i].collector)
 
229
      hud_source_list_applications (source->indicators[i].collector, search_string, append_func, user_data);
 
230
}
 
231
 
 
232
static HudSource *
 
233
hud_indicator_source_get (HudSource     *hud_source,
 
234
                          const gchar   *application_id)
 
235
{
 
236
  HudIndicatorSource *source = HUD_INDICATOR_SOURCE (hud_source);
 
237
  gint i;
 
238
 
 
239
  for (i = 0; i < source->n_indicators; i++)
 
240
    if (source->indicators[i].collector) {
 
241
      HudSource *result = hud_source_get (source->indicators[i].collector, application_id);
 
242
      if (result != NULL)
 
243
        return result;
 
244
    }
 
245
 
 
246
  return NULL;
162
247
}
163
248
 
164
249
static void
165
250
hud_indicator_source_finalize (GObject *object)
166
251
{
 
252
  gint i;
 
253
  HudIndicatorSource *source = HUD_INDICATOR_SOURCE(object);
 
254
 
 
255
  for (i = 0; i < source->n_indicators; i++)
 
256
  {
 
257
    HudIndicatorSourceIndicator *indicator = &source->indicators[i];
 
258
    if (indicator->collector)
 
259
    {
 
260
      g_object_unref(indicator->collector);
 
261
    }
 
262
    g_bus_unwatch_name(indicator->watch_id);
 
263
  }
 
264
 
 
265
  g_free (source->indicators);
167
266
 
168
267
  G_OBJECT_CLASS(hud_indicator_source_parent_class)->finalize(object);
169
 
  return;
170
268
}
171
269
 
172
270
static void
188
286
 
189
287
  if (indicator->info->uses_gmenumodel)
190
288
    {
191
 
      HudMenuModelCollector *collector;
 
289
      HudMenuModelCollector *collector = hud_menu_model_collector_new(indicator->info->indicator_name, indicator->info->icon, hud_settings.indicator_penalty, indicator->info->dbus_path, HUD_SOURCE_ITEM_TYPE_INDICATOR);
192
290
 
193
 
      collector = hud_menu_model_collector_new_for_endpoint (indicator->info->indicator_name,
194
 
                                                             _(indicator->info->user_visible_name),
195
 
                                                             indicator->info->icon,
196
 
                                                             hud_settings.indicator_penalty,
197
 
                                                             name_owner,
198
 
                                                             indicator->info->dbus_menu_path);
 
291
      hud_menu_model_collector_add_endpoint (collector,
 
292
                                             _(indicator->info->user_visible_name),
 
293
                                             name_owner,
 
294
                                             indicator->info->dbus_menu_path,
 
295
                                             indicator->info->action_path);
199
296
 
200
297
      indicator->collector = HUD_SOURCE (collector);
201
298
    }
203
300
    {
204
301
      HudDbusmenuCollector *collector;
205
302
 
206
 
      collector = hud_dbusmenu_collector_new_for_endpoint (indicator->info->indicator_name,
207
 
                                                           _(indicator->info->user_visible_name),
208
 
                                                           indicator->info->icon,
209
 
                                                           hud_settings.indicator_penalty,
210
 
                                                           name_owner, indicator->info->dbus_menu_path);
211
 
      indicator->collector = HUD_SOURCE (collector);
212
 
    }
213
 
 
214
 
  g_signal_connect (indicator->collector, "changed",
215
 
                    G_CALLBACK (hud_indicator_source_collector_changed), indicator);
216
 
 
217
 
  /* Set initial use count on new indicator if query is active. */
218
 
  if (indicator->source->use_count)
219
 
    hud_source_use (indicator->collector);
220
 
 
221
 
  hud_source_changed (HUD_SOURCE (indicator->source));
 
303
      GError *error = NULL;
 
304
      if (!g_dbus_connection_call_sync (connection, name_owner,
 
305
          indicator->info->dbus_menu_path, "com.canonical.dbusmenu", "GetLayout",
 
306
          g_variant_new ("(iias)", 0, 1, NULL ), NULL, G_DBUS_CALL_FLAGS_NONE, -1,
 
307
          NULL, &error))
 
308
        {
 
309
          g_error_free (error);
 
310
        }
 
311
      else
 
312
        {
 
313
          collector = hud_dbusmenu_collector_new_for_endpoint (indicator->info->indicator_name,
 
314
                                                               _(indicator->info->user_visible_name),
 
315
                                                               indicator->info->icon,
 
316
                                                               hud_settings.indicator_penalty,
 
317
                                                               name_owner, indicator->info->dbus_menu_path,
 
318
                                                               HUD_SOURCE_ITEM_TYPE_INDICATOR);
 
319
          indicator->collector = HUD_SOURCE (collector);
 
320
        }
 
321
    }
 
322
 
 
323
  if (indicator->collector)
 
324
    {
 
325
      g_signal_connect (indicator->collector, "changed",
 
326
                        G_CALLBACK (hud_indicator_source_collector_changed), indicator);
 
327
 
 
328
      /* Set initial use count on new indicator if query is active. */
 
329
      if (indicator->source->use_count)
 
330
        hud_source_use (indicator->collector);
 
331
 
 
332
      hud_source_changed (HUD_SOURCE (indicator->source));
 
333
    }
222
334
}
223
335
 
224
336
static void
243
355
static void
244
356
hud_indicator_source_init (HudIndicatorSource *source)
245
357
{
246
 
  gint i;
247
 
 
248
358
  source->n_indicators = G_N_ELEMENTS (indicator_info);
249
359
  source->indicators = g_new0 (HudIndicatorSourceIndicator, source->n_indicators);
250
 
 
251
 
  for (i = 0; i < source->n_indicators; i++)
252
 
    {
253
 
      HudIndicatorSourceIndicator *indicator = &source->indicators[i];
254
 
 
255
 
      indicator->info = &indicator_info[i];
256
 
      indicator->source = source;
257
 
 
258
 
      g_bus_watch_name (G_BUS_TYPE_SESSION, indicator->info->dbus_name, G_BUS_NAME_WATCHER_FLAGS_NONE,
259
 
                        hud_indicator_source_name_appeared, hud_indicator_source_name_vanished, indicator, NULL);
260
 
    }
261
360
}
262
361
 
263
362
static void
266
365
  iface->use = hud_indicator_source_use;
267
366
  iface->unuse = hud_indicator_source_unuse;
268
367
  iface->search = hud_indicator_source_search;
 
368
  iface->list_applications = hud_indicator_source_list_applications;
 
369
  iface->get = hud_indicator_source_get;
269
370
}
270
371
 
271
372
static void
282
383
 * Returns: a new #HudIndicatorSource
283
384
 **/
284
385
HudIndicatorSource *
285
 
hud_indicator_source_new (void)
 
386
hud_indicator_source_new (GDBusConnection *connection)
286
387
{
287
 
  return g_object_new (HUD_TYPE_INDICATOR_SOURCE, NULL);
 
388
  gint i;
 
389
  HudIndicatorSource *source = g_object_new (HUD_TYPE_INDICATOR_SOURCE, NULL );
 
390
 
 
391
  for (i = 0; i < source->n_indicators; i++)
 
392
    {
 
393
      HudIndicatorSourceIndicator *indicator = &source->indicators[i];
 
394
 
 
395
      indicator->info = &indicator_info[i];
 
396
      indicator->source = source;
 
397
 
 
398
      indicator->watch_id = g_bus_watch_name_on_connection (connection,
 
399
          indicator->info->dbus_name, G_BUS_NAME_WATCHER_FLAGS_NONE,
 
400
          hud_indicator_source_name_appeared, hud_indicator_source_name_vanished,
 
401
          indicator, NULL );
 
402
    }
 
403
 
 
404
  return source;
288
405
}