Long press is long press.
[tweakr] / modules / maemo-tweaks-mce.c
index 7b313c5..2b244c3 100644 (file)
         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
         MAEMO_TWEAKS_TYPE_MCE_SECTION))
 
+#define DISABLE_LABEL "Disable"
+#define SHOW_MENU_LABEL "Show menu"
+#define POWER_OFF_LABEL "Power off"
+#define LOCK_LABEL "Lock"
+
 enum {
     SHORT_POWER_KEY_DISABLED,
     SHORT_POWER_KEY_MENU,
@@ -33,6 +38,22 @@ enum {
     SHORT_POWER_KEY_N
 };
 
+enum {
+    LONG_POWER_KEY_DISABLED,
+    LONG_POWER_KEY_MENU,
+    LONG_POWER_KEY_OFF,
+    LONG_POWER_KEY_N
+};
+
+enum {
+    DOUBLE_POWER_KEY_DISABLED,
+    DOUBLE_POWER_KEY_MENU,
+    DOUBLE_POWER_KEY_OFF,
+    DOUBLE_POWER_KEY_LOCK,
+    DOUBLE_POWER_KEY_N
+};
+
+
 typedef struct _picker_t
 {
     guint index;
@@ -41,10 +62,24 @@ typedef struct _picker_t
 } picker_t;
 
 static picker_t spk [] = {
-    {SHORT_POWER_KEY_DISABLED, "disabled", "Disabled"},
-    {SHORT_POWER_KEY_MENU, "menu", "Show menu"},
-    {SHORT_POWER_KEY_OFF, "poweroff", "Power off"}
-};    
+    {SHORT_POWER_KEY_DISABLED, "disabled", DISABLE_LABEL},
+    {SHORT_POWER_KEY_MENU, "menu", SHOW_MENU_LABEL},
+    {SHORT_POWER_KEY_OFF, "poweroff", POWER_OFF_LABEL}
+};
+
+static picker_t lpk [] = {
+    {LONG_POWER_KEY_DISABLED, "disabled", DISABLE_LABEL},
+    {LONG_POWER_KEY_MENU, "menu", SHOW_MENU_LABEL},
+    {LONG_POWER_KEY_OFF, "poweroff", POWER_OFF_LABEL}
+};
+
+static picker_t dpk [] = {
+    {DOUBLE_POWER_KEY_DISABLED, "disabled", DISABLE_LABEL},
+    {DOUBLE_POWER_KEY_MENU, "menu", SHOW_MENU_LABEL},
+    {DOUBLE_POWER_KEY_OFF, "poweroff", POWER_OFF_LABEL},
+    {DOUBLE_POWER_KEY_LOCK, "tklock", LOCK_LABEL}
+};
+
 
 typedef struct _MaemoTweaksMceSection MaemoTweaksMceSection;
 typedef struct _MaemoTweaksMceSectionClass
@@ -56,6 +91,10 @@ struct _MaemoTweaksMceSection
 
     GKeyFile *ini;
     GtkWidget *short_power_key;
+    GtkWidget *long_power_key;
+    GtkWidget *double_power_key;
+
+    guint value_changed : 1;
 };
 
 struct _MaemoTweaksMceSectionClass
@@ -71,7 +110,7 @@ static void maemo_tweaks_mce_section_init
     (MaemoTweaksMceSection *section);
 static void maemo_tweaks_mce_section_dispose (GObject *obj);
 
-static void _save (MaemoTweaksSection *section);
+static void _save (MaemoTweaksSection *section, gboolean *requires_restart);
 
 static GType maemo_tweaks_mce_section_type = 0;
 static MaemoTweaksSectionClass *
@@ -133,7 +172,14 @@ maemo_tweaks_mce_section_class_init
     object_class->dispose = maemo_tweaks_mce_section_dispose;
 }
 
-GtkWidget * _build_short_power_key (void)
+static void _value_changed (HildonPickerButton *b, gpointer user_data)
+{
+    MaemoTweaksMceSection *section = MAEMO_TWEAKS_MCE_SECTION (user_data);
+
+    section->value_changed = TRUE;
+}
+
+GtkWidget * _build_short_power_key (MaemoTweaksMceSection *section)
 {
     gint i;
     GtkWidget *button, *selector;
@@ -149,23 +195,87 @@ GtkWidget * _build_short_power_key (void)
                                        HILDON_BUTTON_ARRANGEMENT_VERTICAL);
 
     hildon_button_set_title (HILDON_BUTTON (button),
-                             "Power button short press");
+                             "Power key: short press");
+    gtk_button_set_alignment (GTK_BUTTON (button), 0.0f, 0.5f);
+    hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
+                                       HILDON_TOUCH_SELECTOR (selector));
+
+    g_signal_connect (G_OBJECT (button), "value-changed",
+                      G_CALLBACK (_value_changed), section);
+
+    gtk_widget_show (button);
+    return button;
+}
+
+GtkWidget * _build_long_power_key (MaemoTweaksMceSection *section)
+{
+    gint i;
+    GtkWidget *button, *selector;
+
+    selector = hildon_touch_selector_new_text ();
+    for (i = 0; i < LONG_POWER_KEY_N; i++)
+    {
+        hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
+                                           lpk[i].label);
+    }
+
+    button = hildon_picker_button_new (HILDON_SIZE_AUTO,
+                                       HILDON_BUTTON_ARRANGEMENT_VERTICAL);
+
+    hildon_button_set_title (HILDON_BUTTON (button),
+                             "Power key: long press");
+    gtk_button_set_alignment (GTK_BUTTON (button), 0.0f, 0.5f);
+    hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
+                                       HILDON_TOUCH_SELECTOR (selector));
+
+    g_signal_connect (G_OBJECT (button), "value-changed",
+                      G_CALLBACK (_value_changed), section);
+
+    gtk_widget_show (button);
+    return button;
+}
+
+GtkWidget * _build_double_power_key (MaemoTweaksMceSection *section)
+{
+    gint i;
+    GtkWidget *button, *selector;
+
+    selector = hildon_touch_selector_new_text ();
+    for (i = 0; i < DOUBLE_POWER_KEY_N; i++)
+    {
+        hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
+                                           dpk[i].label);
+    }
+
+    button = hildon_picker_button_new (HILDON_SIZE_AUTO,
+                                       HILDON_BUTTON_ARRANGEMENT_VERTICAL);
+
+    hildon_button_set_title (HILDON_BUTTON (button),
+                             "Power key: double press");
     gtk_button_set_alignment (GTK_BUTTON (button), 0.0f, 0.5f);
     hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (button),
                                        HILDON_TOUCH_SELECTOR (selector));
 
+    g_signal_connect (G_OBJECT (button), "value-changed",
+                      G_CALLBACK (_value_changed), section);
+
     gtk_widget_show (button);
     return button;
 }
 
+
 static void
 maemo_tweaks_mce_section_init (MaemoTweaksMceSection *section)
 {
     MaemoTweaksSection *iface;
     gchar *short_power_key_value;
+    gchar *long_power_key_value;
+    gchar *double_power_key_value;
     gint i;
 
-    section->short_power_key = _build_short_power_key ();
+    section->short_power_key = _build_short_power_key (section);
+    section->long_power_key = _build_long_power_key (section);
+    section->double_power_key = _build_double_power_key (section);
 
     section->ini = g_key_file_new ();
 
@@ -179,6 +289,12 @@ maemo_tweaks_mce_section_init (MaemoTweaksMceSection *section)
     short_power_key_value = g_key_file_get_string (section->ini, "PowerKey",
                                                    "PowerKeyShortAction",
                                                    NULL);
+    long_power_key_value = g_key_file_get_string (section->ini, "PowerKey",
+                                                  "PowerKeyLongAction",
+                                                  NULL);
+    double_power_key_value = g_key_file_get_string (section->ini, "PowerKey",
+                                                    "PowerKeyDoubleAction",
+                                                    NULL);
 
     for (i = 0; i < SHORT_POWER_KEY_N; i++)
     {
@@ -189,11 +305,34 @@ maemo_tweaks_mce_section_init (MaemoTweaksMceSection *section)
         }
     }
 
+    for (i = 0; i < LONG_POWER_KEY_N; i++)
+    {
+        if (g_strcmp0 (long_power_key_value, lpk[i].value) == 0)
+        {
+            hildon_picker_button_set_active
+                (HILDON_PICKER_BUTTON (section->long_power_key), i);
+        }
+    }
+
+    for (i = 0; i < DOUBLE_POWER_KEY_N; i++)
+    {
+        if (g_strcmp0 (double_power_key_value, dpk[i].value) == 0)
+        {
+            hildon_picker_button_set_active
+                (HILDON_PICKER_BUTTON (section->double_power_key), i);
+        }
+    }
+
+    section->value_changed = FALSE;
 
     iface = MAEMO_TWEAKS_SECTION (section);
     iface->widget = gtk_vbox_new (FALSE, 0);
     gtk_box_pack_start (GTK_BOX (iface->widget), section->short_power_key,
                         TRUE, TRUE, 0);
+    gtk_box_pack_start (GTK_BOX (iface->widget), section->long_power_key,
+                        TRUE, TRUE, 0);
+    gtk_box_pack_start (GTK_BOX (iface->widget), section->double_power_key,
+                        TRUE, TRUE, 0);
 }
 
 static void
@@ -210,25 +349,40 @@ maemo_tweaks_mce_section_dispose (GObject *obj)
         (obj);
 }
 
-
-static void _save (MaemoTweaksSection *section)
+static void _save (MaemoTweaksSection *section, gboolean *requires_restart)
 {
-    gchar *argv[3];
-    gint active;
+    gchar *argv[5];
+    gint short_active, long_active, double_active;
+    gint i;
+
+    if (!MAEMO_TWEAKS_MCE_SECTION (section)->value_changed)
+        return;
 
-    active = hildon_picker_button_get_active
+    *requires_restart = TRUE;
+
+    short_active = hildon_picker_button_get_active
         (HILDON_PICKER_BUTTON (MAEMO_TWEAKS_MCE_SECTION
                                (section)->short_power_key));
 
+    long_active = hildon_picker_button_get_active
+        (HILDON_PICKER_BUTTON (MAEMO_TWEAKS_MCE_SECTION
+                               (section)->long_power_key));
+
+    double_active = hildon_picker_button_get_active
+        (HILDON_PICKER_BUTTON (MAEMO_TWEAKS_MCE_SECTION
+                               (section)->double_power_key));
+
     argv[0] = g_strdup ("/usr/bin/maemo-tweaks-mce-save");
-    argv[1] = g_strdup_printf ("%s", spk[active].value);
-    argv[2] = NULL;
+    argv[1] = g_strdup_printf ("%s", spk[short_active].value);
+    argv[2] = g_strdup_printf ("%s", lpk[long_active].value);
+    argv[3] = g_strdup_printf ("%s", dpk[double_active].value);
+    argv[4] = NULL;
 
     g_spawn_sync ("/home/user", argv, NULL,
                   G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
                   NULL, NULL, NULL, NULL, NULL, NULL);
 
-    g_free (argv[0]);
-    g_free (argv[1]);
+    for (i = 0; i < (sizeof (argv) / sizeof (gchar *)) - 1; i++)
+        g_free (argv[i]);
 }