~charlesk/indicator-power/lp-1224931

« back to all changes in this revision

Viewing changes to src/service.c

  • Committer: Tarmac
  • Author(s): Charles Kerr
  • Date: 2013-08-23 14:45:19 UTC
  • mfrom: (187.1.6 lp-811777)
  • Revision ID: tarmac-20130823144519-t5n7n1oi83mg4bp9
Updates the power indicator to match the spec changes at <https://wiki.ubuntu.com/Power?action=diff&rev2=37&rev1=36>.

This patch is based from hloeung's nice patch, fixes a few edge cases, adds unit tests for labels, headers, & accessible text for all combinations of show time & show percentage, and cleans up the bindings between GSettings and the checkbox actions.

. Fixes: https://bugs.launchpad.net/bugs/811777.

Approved by Ted Gould, PS Jenkins bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
 
34
34
#define SETTINGS_SHOW_TIME_S "show-time"
35
35
#define SETTINGS_ICON_POLICY_S "icon-policy"
 
36
#define SETTINGS_SHOW_PERCENTAGE_S "show-percentage"
36
37
 
37
38
G_DEFINE_TYPE (IndicatorPowerService,
38
39
               indicator_power_service,
112
113
  GSimpleActionGroup * actions;
113
114
  GSimpleAction * header_action;
114
115
  GSimpleAction * show_time_action;
 
116
  GSimpleAction * show_percentage_action;
115
117
  GSimpleAction * battery_level_action;
116
118
  GSimpleAction * brightness_action;
117
119
 
318
320
 
319
321
  if (p->primary_device != NULL)
320
322
    {
321
 
      gchar * details;
322
 
 
323
 
      indicator_power_device_get_time_details (p->primary_device,
324
 
                                               &label,
325
 
                                               &details,
326
 
                                               &a11y);
 
323
      indicator_power_device_get_header (p->primary_device,
 
324
                                         g_settings_get_boolean (p->settings, SETTINGS_SHOW_TIME_S),
 
325
                                         g_settings_get_boolean (p->settings, SETTINGS_SHOW_PERCENTAGE_S),
 
326
                                         &label,
 
327
                                         &a11y);
327
328
 
328
329
      icon = indicator_power_device_get_gicon (p->primary_device);
329
 
 
330
 
      g_free (details);
331
330
    }
332
331
 
333
332
  g_variant_builder_init (&b, G_VARIANT_TYPE("a{sv}"));
337
336
 
338
337
  if (label != NULL)
339
338
    {
340
 
      if (g_settings_get_boolean (p->settings, SETTINGS_SHOW_TIME_S))
341
 
        g_variant_builder_add (&b, "{sv}", "label",
342
 
                               g_variant_new_string (label));
 
339
      g_variant_builder_add (&b, "{sv}", "label", g_variant_new_string (label));
343
340
 
344
341
      g_free (label);
345
342
    }
376
373
 
377
374
  if (kind != UP_DEVICE_KIND_LINE_POWER)
378
375
  {
379
 
    char * brief;
 
376
    GIcon * icon;
380
377
    char * label;
381
 
    char * a11y;
382
378
    GMenuItem * menu_item;
383
 
    GIcon * icon = indicator_power_device_get_gicon (device);
384
 
 
385
 
    indicator_power_device_get_time_details (device,
386
 
                                             &brief,
387
 
                                             &label,
388
 
                                             &a11y);
389
 
 
 
379
 
 
380
    icon = indicator_power_device_get_gicon (device);
 
381
    label = indicator_power_device_get_label (device);
390
382
    menu_item = g_menu_item_new (label, "indicator.activate-statistics");
391
383
 
392
384
    if (icon != NULL)
393
 
      {
394
 
        g_menu_item_set_attribute_value (menu_item,
395
 
                                         G_MENU_ATTRIBUTE_ICON,
396
 
                                         g_icon_serialize (icon));
397
 
      }
 
385
      g_menu_item_set_attribute_value (menu_item,
 
386
                                       G_MENU_ATTRIBUTE_ICON,
 
387
                                       g_icon_serialize (icon));
398
388
 
399
389
    g_menu_append_item (menu, menu_item);
400
390
    g_object_unref (menu_item);
401
391
 
402
392
    g_clear_object (&icon);
403
 
    g_free (brief);
404
393
    g_free (label);
405
 
    g_free (a11y);
406
394
  }
407
395
}
408
396
 
521
509
                 "indicator.show-time");
522
510
 
523
511
  g_menu_append (menu,
 
512
                 _("Show Percentage in Menu Bar"),
 
513
                 "indicator.show-percentage");
 
514
 
 
515
  g_menu_append (menu,
524
516
                 _("Power Settings…"),
525
517
                 "indicator.activate-settings");
526
518
 
706
698
  execute_command ("gnome-power-statistics");
707
699
}
708
700
 
709
 
/* FIXME: use a GBinding to tie the gaction's state and the GSetting together? */
710
 
 
711
 
static void
712
 
set_show_time_flag (IndicatorPowerService * self, gboolean b)
713
 
{
714
 
  GVariant * v;
715
 
  priv_t * p = self->priv;
716
 
 
717
 
  /* update the settings */
718
 
  if (b != g_settings_get_boolean (p->settings, SETTINGS_SHOW_TIME_S))
719
 
    g_settings_set_boolean (p->settings, SETTINGS_SHOW_TIME_S, b);
720
 
 
721
 
  /* update the action state */
722
 
  v = g_action_get_state (G_ACTION(p->show_time_action));
723
 
  if (b != g_variant_get_boolean (v))
724
 
    g_simple_action_set_state (p->show_time_action, g_variant_new_boolean (b));
725
 
  g_variant_unref (v);
726
 
 
727
 
  rebuild_header_now (self);
728
 
}
729
 
static void
730
 
on_show_time_setting_changed (GSettings * settings, gchar * key, gpointer gself)
731
 
{
732
 
  set_show_time_flag (INDICATOR_POWER_SERVICE(gself),
733
 
                      g_settings_get_boolean (settings, key));
734
 
}
735
 
 
736
 
static void
737
 
on_show_time_action_state_changed (GAction    * action,
738
 
                                   GParamSpec * pspec   G_GNUC_UNUSED,
739
 
                                   gpointer     gself)
740
 
{
741
 
  GVariant * v = g_action_get_state (action);
742
 
  set_show_time_flag (INDICATOR_POWER_SERVICE(gself),
743
 
                      g_variant_get_boolean (v));
744
 
  g_variant_unref (v);
745
 
}
 
701
/***
 
702
****
 
703
***/
746
704
 
747
705
/* toggles the state */
748
706
static void
749
 
on_show_time_action_activated (GSimpleAction * simple,
750
 
                               GVariant      * parameter G_GNUC_UNUSED,
751
 
                               gpointer        unused    G_GNUC_UNUSED)
 
707
on_toggle_action_activated (GSimpleAction * simple,
 
708
                            GVariant      * parameter G_GNUC_UNUSED,
 
709
                            gpointer        unused    G_GNUC_UNUSED)
752
710
{
753
711
  GVariant * v = g_action_get_state (G_ACTION (simple));
754
712
  gboolean flag = g_variant_get_boolean (v);
756
714
  g_variant_unref (v);
757
715
}
758
716
 
 
717
static gboolean
 
718
settings_to_action_state (GValue    * value,
 
719
                          GVariant  * variant,
 
720
                          gpointer    user_data  G_GNUC_UNUSED)
 
721
{
 
722
  g_value_set_variant (value, variant);
 
723
  return TRUE;
 
724
}
 
725
 
 
726
static GVariant *
 
727
action_state_to_settings (const GValue       * value,
 
728
                          const GVariantType * expected_type G_GNUC_UNUSED,
 
729
                          gpointer             user_data     G_GNUC_UNUSED)
 
730
{
 
731
  return g_value_dup_variant (value);
 
732
}
 
733
 
759
734
static void
760
735
init_gactions (IndicatorPowerService * self)
761
736
{
762
737
  GSimpleAction * a;
763
 
  gboolean show_time;
764
738
  priv_t * p = self->priv;
765
739
 
766
740
  GActionEntry entries[] = {
777
751
 
778
752
  /* add the header action */
779
753
  a = g_simple_action_new_stateful ("_header", NULL, create_header_state (self));
780
 
  g_simple_action_group_insert (p->actions, G_ACTION(a));
 
754
  g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a));
781
755
  p->header_action = a;
782
756
 
783
757
  /* add the power-level action */
784
758
  a = g_simple_action_new_stateful ("battery-level", NULL, g_variant_new_uint32(0));
785
759
  g_simple_action_set_enabled (a, FALSE);
786
 
  g_simple_action_group_insert (p->actions, G_ACTION(a));
 
760
  g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a));
787
761
  p->battery_level_action = a;
788
762
 
789
763
  /* add the brightness action */
790
764
  a = g_simple_action_new_stateful ("brightness", NULL, action_state_for_brightness (self));
791
 
  g_simple_action_group_insert (p->actions, G_ACTION(a));
 
765
  g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a));
792
766
  g_signal_connect (a, "change-state", G_CALLBACK(on_brightness_change_requested), self);
793
767
  p->brightness_action = a;
794
768
 
795
769
  /* add the show-time action */
796
 
  show_time = g_settings_get_boolean (p->settings, SETTINGS_SHOW_TIME_S);
797
 
  a = g_simple_action_new_stateful ("show-time",
798
 
                                    NULL,
799
 
                                    g_variant_new_boolean(show_time));
800
 
  g_signal_connect (a, "activate",
801
 
                    G_CALLBACK(on_show_time_action_activated), self);
802
 
  g_signal_connect (a, "notify",
803
 
                    G_CALLBACK(on_show_time_action_state_changed), self);
804
 
  g_simple_action_group_insert (p->actions, G_ACTION(a));
 
770
  a = g_simple_action_new ("show-time", NULL);
 
771
  g_settings_bind_with_mapping (p->settings, SETTINGS_SHOW_TIME_S,
 
772
                                a, "state",
 
773
                                G_SETTINGS_BIND_DEFAULT,
 
774
                                settings_to_action_state,
 
775
                                action_state_to_settings,
 
776
                                NULL, NULL);
 
777
  g_signal_connect (a, "activate", G_CALLBACK(on_toggle_action_activated), self);
 
778
  g_signal_connect_swapped (a, "notify", G_CALLBACK(rebuild_header_now), self);
 
779
  g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a));
805
780
  p->show_time_action = a;
806
781
 
 
782
  /* add the show-percentage action */
 
783
  a = g_simple_action_new ("show-percentage", NULL);
 
784
  g_settings_bind_with_mapping (p->settings, SETTINGS_SHOW_PERCENTAGE_S,
 
785
                                a, "state",
 
786
                                G_SETTINGS_BIND_DEFAULT,
 
787
                                settings_to_action_state,
 
788
                                action_state_to_settings,
 
789
                                NULL, NULL);
 
790
  g_signal_connect (a, "activate", G_CALLBACK(on_toggle_action_activated), self);
 
791
  g_signal_connect_swapped (a, "notify", G_CALLBACK(rebuild_header_now), self);
 
792
  g_action_map_add_action (G_ACTION_MAP(p->actions), G_ACTION(a));
 
793
  p->show_percentage_action = a;
 
794
 
807
795
  rebuild_header_now (self);
808
796
}
809
797
 
949
937
{
950
938
  IndicatorPowerService * self = INDICATOR_POWER_SERVICE (o);
951
939
  priv_t * p = self->priv;
952
 
 
 
940
 
953
941
  switch (property_id)
954
942
    {
955
943
      case PROP_DEVICE_PROVIDER:
1014
1002
      g_clear_object (&p->show_time_action);
1015
1003
    }
1016
1004
 
 
1005
  if (p->show_percentage_action != NULL)
 
1006
    {
 
1007
      g_signal_handlers_disconnect_by_data (p->show_percentage_action, self);
 
1008
 
 
1009
      g_clear_object (&p->show_percentage_action);
 
1010
    }
 
1011
 
1017
1012
  g_clear_object (&p->brightness_action);
1018
1013
  g_clear_object (&p->battery_level_action);
1019
1014
  g_clear_object (&p->header_action);
1020
 
  g_clear_object (&p->show_time_action);
1021
1015
  g_clear_object (&p->actions);
1022
1016
 
1023
1017
  g_clear_object (&p->conn);
1051
1045
 
1052
1046
  g_signal_connect_swapped (p->settings, "changed::" SETTINGS_ICON_POLICY_S,
1053
1047
                            G_CALLBACK(rebuild_header_now), self);
1054
 
  g_signal_connect (p->settings, "changed::" SETTINGS_SHOW_TIME_S,
1055
 
                    G_CALLBACK(on_show_time_setting_changed), self);
1056
1048
 
1057
1049
  p->own_id = g_bus_own_name (G_BUS_TYPE_SESSION,
1058
1050
                              BUS_NAME,