okra pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=d03c254f5ea82ec75b9c33b392ca53ab3b1fbc76

commit d03c254f5ea82ec75b9c33b392ca53ab3b1fbc76
Author: Stephen 'Okra' Houston <smhousto...@gmail.com>
Date:   Wed Jul 12 01:08:34 2017 -0500

    Sysinfo - Cpuclock: Add the left click info and right click config popup.
---
 src/modules/Makefile_sysinfo.mk                |   1 +
 src/modules/sysinfo/cpuclock/cpuclock.c        | 172 ++++++-
 src/modules/sysinfo/cpuclock/cpuclock.h        |  22 +
 src/modules/sysinfo/cpuclock/cpuclock_config.c | 617 +++++++++++++++++++++++++
 src/modules/sysinfo/mod.c                      |   3 +-
 src/modules/sysinfo/sysinfo.c                  |   2 +
 src/modules/sysinfo/sysinfo.h                  |   3 +
 7 files changed, 818 insertions(+), 2 deletions(-)

diff --git a/src/modules/Makefile_sysinfo.mk b/src/modules/Makefile_sysinfo.mk
index faf424776..9965321e3 100644
--- a/src/modules/Makefile_sysinfo.mk
+++ b/src/modules/Makefile_sysinfo.mk
@@ -25,6 +25,7 @@ src_modules_sysinfo_module_la_SOURCES = 
src/modules/sysinfo/mod.c \
                          src/modules/sysinfo/cpuclock/cpuclock.h \
                          src/modules/sysinfo/cpuclock/cpuclock.c \
                          src/modules/sysinfo/cpuclock/cpuclock_sysfs.c \
+                         src/modules/sysinfo/cpuclock/cpuclock_config.c \
                          src/modules/sysinfo/cpumonitor/cpumonitor.h \
                          src/modules/sysinfo/cpumonitor/cpumonitor.c \
                          src/modules/sysinfo/cpumonitor/cpumonitor_config.c \
diff --git a/src/modules/sysinfo/cpuclock/cpuclock.c 
b/src/modules/sysinfo/cpuclock/cpuclock.c
index f93017509..394f262bf 100644
--- a/src/modules/sysinfo/cpuclock/cpuclock.c
+++ b/src/modules/sysinfo/cpuclock/cpuclock.c
@@ -120,7 +120,7 @@ _cpuclock_set_governor(const char *governor)
    ecore_thread_run(_cpuclock_set_thread_governor, _cpuclock_set_thread_done, 
NULL, governor);
 }
 
-static void
+void
 _cpuclock_set_frequency(int frequency)
 {
    char buf[4096];
@@ -259,6 +259,106 @@ _cpuclock_event_cb_powersave(void *data, int type, void 
*event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static Evas_Object *
+_cpuclock_configure_cb(Evas_Object *g)
+{
+   Instance *inst = evas_object_data_get(g, "Instance");
+
+   if (!sysinfo_config) return NULL;
+   if (inst->cfg->cpuclock.popup) return NULL;
+   return cpuclock_configure(inst);
+}
+
+static void
+_cpuclock_popup_dismissed(void *data, Evas_Object *obj, void *event_info 
EINA_UNUSED)
+{
+   Instance *inst = data;
+   E_FREE_FUNC(obj, evas_object_del);
+
+   inst->cfg->cpuclock.popup = NULL;
+   inst->cfg->cpuclock.popup_label = NULL;
+}
+
+static void
+_cpuclock_popup_deleted(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Instance *inst = data;
+   inst->cfg->cpuclock.popup = NULL;
+}
+
+static Evas_Object *
+_cpuclock_popup_create(Instance *inst)
+{
+   Evas_Object *popup, *box, *label;
+   double f = inst->cfg->cpuclock.status->cur_frequency;
+   char buf[100];
+
+   if (f < 1000000)
+     {
+        f += 500;
+        f /= 1000;
+     }
+   else
+     {
+        f += 50000;
+        f /= 1000000;
+     }
+
+   popup = elm_ctxpopup_add(e_comp->elm);
+   elm_object_style_set(popup, "noblock");
+   evas_object_smart_callback_add(popup, "dismissed",
+                                  _cpuclock_popup_dismissed, inst);
+   evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL,
+                                  _cpuclock_popup_deleted, inst);
+
+   box = elm_box_add(popup);
+   elm_box_horizontal_set(box, EINA_FALSE);
+   E_EXPAND(box); E_FILL(box);
+   elm_object_content_set(popup, box);
+   evas_object_show(box);
+
+   label = elm_label_add(box);
+   elm_object_style_set(label, "marker");
+   snprintf(buf, 100, "%s: %1.1f", _("Frequency"), f);
+   elm_object_text_set(label, buf);
+   elm_box_pack_end(box, label);
+   evas_object_show(label);
+   inst->cfg->cpuclock.popup_label = label;
+
+   e_gadget_util_ctxpopup_place(inst->o_main, popup,
+                                inst->cfg->cpuclock.o_gadget);
+   evas_object_show(popup);
+
+   return popup;
+}
+
+static void
+_cpuclock_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_data)
+{
+   Evas_Event_Mouse_Down *ev = event_data;
+   Instance *inst = data;
+
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+   if (ev->button != 3)
+     {
+        if (inst->cfg->cpuclock.popup)
+          elm_ctxpopup_dismiss(inst->cfg->cpuclock.popup);
+        else
+          inst->cfg->cpuclock.popup = _cpuclock_popup_create(inst);
+     }
+   else
+     {
+        if (inst->cfg->cpuclock.popup)
+          elm_ctxpopup_dismiss(inst->cfg->cpuclock.popup);
+        if (!sysinfo_config) return;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+        if (inst->cfg->esm != E_SYSINFO_MODULE_CPUCLOCK)
+          cpuclock_configure(inst);
+        else
+          e_gadget_configure(inst->o_main);
+     }
+}
+
 void
 _cpuclock_config_updated(Instance *inst)
 {
@@ -318,6 +418,25 @@ _cpuclock_face_update_current(Instance *inst)
         
edje_object_message_send(elm_layout_edje_get(inst->cfg->cpuclock.o_gadget), 
EDJE_MESSAGE_STRING, 4,
                                  &governor_msg);
      }
+
+   if (inst->cfg->cpuclock.popup)
+     {
+        double f = inst->cfg->cpuclock.status->cur_frequency;
+        char buf[100];
+
+        if (f < 1000000)
+          {
+             f += 500;
+             f /= 1000;
+          }
+        else
+          {
+             f += 50000;
+             f /= 1000000;
+          }
+        snprintf(buf, 100, "%s: %1.1f", _("Frequency"), f);
+        elm_object_text_set(inst->cfg->cpuclock.popup_label, buf);
+     }
 }
 
 static void
@@ -792,6 +911,14 @@ _cpuclock_removed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_data)
 
    if (inst->o_main != event_data) return;
 
+   if (inst->cfg->cpuclock.popup_label)
+     E_FREE_FUNC(inst->cfg->cpuclock.popup, evas_object_del);
+   if (inst->cfg->cpuclock.popup)
+     E_FREE_FUNC(inst->cfg->cpuclock.popup, evas_object_del);
+
+   if (inst->cfg->cpuclock.configure)
+     E_FREE_FUNC(inst->cfg->cpuclock.configure, evas_object_del);
+
     if (inst->cfg->cpuclock.handler)
      ecore_event_handler_del(inst->cfg->cpuclock.handler);
 
@@ -816,6 +943,14 @@ sysinfo_cpuclock_remove(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
 {
    Instance *inst = data;
 
+   if (inst->cfg->cpuclock.popup_label)
+     E_FREE_FUNC(inst->cfg->cpuclock.popup, evas_object_del);
+   if (inst->cfg->cpuclock.popup)
+     E_FREE_FUNC(inst->cfg->cpuclock.popup, evas_object_del);
+
+   if (inst->cfg->cpuclock.configure)
+     E_FREE_FUNC(inst->cfg->cpuclock.configure, evas_object_del);
+
    if (inst->cfg->cpuclock.handler)
      ecore_event_handler_del(inst->cfg->cpuclock.handler);
 
@@ -835,6 +970,9 @@ _cpuclock_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED)
 {
    Instance *inst = data;
    E_Gadget_Site_Orient orient = 
e_gadget_site_orient_get(e_gadget_site_get(inst->o_main));
+   Eina_List *l = NULL;
+
+   e_gadget_configure_cb_set(inst->o_main, _cpuclock_configure_cb);
 
    if (inst->cfg->cpuclock.pstate_min == 0) inst->cfg->cpuclock.pstate_min = 1;
    if (inst->cfg->cpuclock.pstate_max == 0) inst->cfg->cpuclock.pstate_max = 
101;
@@ -857,6 +995,9 @@ _cpuclock_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED)
                                    _cpuclock_face_cb_set_frequency, inst);
    evas_object_event_callback_add(inst->cfg->cpuclock.o_gadget, 
EVAS_CALLBACK_RESIZE, _cpuclock_resize_cb, inst);
    elm_box_pack_end(inst->o_main, inst->cfg->cpuclock.o_gadget);
+   evas_object_event_callback_add(inst->cfg->cpuclock.o_gadget,
+                                  EVAS_CALLBACK_MOUSE_DOWN,
+                                  _cpuclock_mouse_down_cb, inst);
    evas_object_show(inst->cfg->cpuclock.o_gadget);
    evas_object_smart_callback_del_full(obj, "gadget_created", 
_cpuclock_created_cb, data);
    inst->cfg->cpuclock.status = _cpuclock_status_new();
@@ -865,11 +1006,24 @@ _cpuclock_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED)
    inst->cfg->cpuclock.handler = 
ecore_event_handler_add(E_EVENT_POWERSAVE_UPDATE,
                                                _cpuclock_event_cb_powersave, 
inst);
    _cpuclock_config_updated(inst);
+   if ((inst->cfg->cpuclock.restore_governor) && 
(inst->cfg->cpuclock.governor))
+     {
+        for (l = inst->cfg->cpuclock.status->governors; l; l = l->next)
+          {
+             if (!strcmp(l->data, inst->cfg->cpuclock.governor))
+               {
+                  _cpuclock_set_governor(inst->cfg->cpuclock.governor);
+                  break;
+               }
+         }
+     }
 }
 
 Evas_Object *
 sysinfo_cpuclock_create(Evas_Object *parent, Instance *inst)
 {
+   Eina_List *l = NULL;
+
    if (inst->cfg->cpuclock.pstate_min == 0) inst->cfg->cpuclock.pstate_min = 1;
    if (inst->cfg->cpuclock.pstate_max == 0) inst->cfg->cpuclock.pstate_max = 
101;
 
@@ -878,6 +1032,9 @@ sysinfo_cpuclock_create(Evas_Object *parent, Instance 
*inst)
                            "e/gadget/cpuclock/main");
    E_EXPAND(inst->cfg->cpuclock.o_gadget);
    E_FILL(inst->cfg->cpuclock.o_gadget);
+   evas_object_event_callback_add(inst->cfg->cpuclock.o_gadget,
+                                  EVAS_CALLBACK_MOUSE_DOWN,
+                                  _cpuclock_mouse_down_cb, inst);
    
edje_object_signal_callback_add(elm_layout_edje_get(inst->cfg->cpuclock.o_gadget),
 "e,action,governor,next", "*",
                                    _cpuclock_face_cb_set_governor, inst);
    
edje_object_signal_callback_add(elm_layout_edje_get(inst->cfg->cpuclock.o_gadget),
 "e,action,frequency,increase", "*",
@@ -892,6 +1049,17 @@ sysinfo_cpuclock_create(Evas_Object *parent, Instance 
*inst)
    inst->cfg->cpuclock.handler = 
ecore_event_handler_add(E_EVENT_POWERSAVE_UPDATE,
                                                _cpuclock_event_cb_powersave, 
inst);
    _cpuclock_config_updated(inst);
+   if ((inst->cfg->cpuclock.restore_governor) && 
(inst->cfg->cpuclock.governor))
+     {
+        for (l = inst->cfg->cpuclock.status->governors; l; l = l->next)
+          {
+             if (!strcmp(l->data, inst->cfg->cpuclock.governor))
+               {
+                  _cpuclock_set_governor(inst->cfg->cpuclock.governor);
+                  break;
+               }
+          }
+     }
 
    return inst->cfg->cpuclock.o_gadget;
 }
@@ -923,6 +1091,7 @@ _conf_item_get(int *id)
    ci->cpuclock.governor = NULL;
    ci->cpuclock.pstate_min = 1;
    ci->cpuclock.pstate_max = 101;
+   ci->cpuclock.configure = NULL;
 
    sysinfo_config->items = eina_list_append(sysinfo_config->items, ci);
 
@@ -939,6 +1108,7 @@ cpuclock_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient EINA_U
    *id = inst->cfg->id;
    inst->o_main = elm_box_add(parent);
    E_EXPAND(inst->o_main);
+   evas_object_data_set(inst->o_main, "Instance", inst);
    evas_object_smart_callback_add(parent, "gadget_created", 
_cpuclock_created_cb, inst);
    evas_object_smart_callback_add(parent, "gadget_removed", 
_cpuclock_removed_cb, inst);
    evas_object_event_callback_add(inst->o_main, EVAS_CALLBACK_DEL, 
sysinfo_cpuclock_remove, inst);
diff --git a/src/modules/sysinfo/cpuclock/cpuclock.h 
b/src/modules/sysinfo/cpuclock/cpuclock.h
index f61b4f99d..5161cd8e6 100644
--- a/src/modules/sysinfo/cpuclock/cpuclock.h
+++ b/src/modules/sysinfo/cpuclock/cpuclock.h
@@ -3,7 +3,29 @@
 
 #include "../sysinfo.h"
 
+typedef struct _Cpuclock_Config Cpuclock_Config;
+
+struct _Cpuclock_Config
+{
+   Instance *inst;
+   Evas_Object *max;
+   Evas_Object *min;
+   Evas_Object *general;
+   Evas_Object *policy;
+   Evas_Object *saving;
+   Evas_Object *freq;
+   Evas_Object *ps;
+   Eina_List *powersaves;
+   Eina_Bool frequencies;
+   Eina_Bool pstate;
+};
+
+
+Evas_Object *cpuclock_configure(Instance *inst);
 void _cpuclock_config_updated(Instance *inst);
+void _cpuclock_set_governor(const char *governor);
+void _cpuclock_set_frequency(int frequency);
+void _cpuclock_set_pstate(int min, int max, int turbo);
 int _cpuclock_sysfs_setall(const char *control, const char *value);
 int _cpuclock_sysfs_set(const char *control, const char *value);
 int _cpuclock_sysfs_pstate(int min, int max, int turbo);
diff --git a/src/modules/sysinfo/cpuclock/cpuclock_config.c 
b/src/modules/sysinfo/cpuclock/cpuclock_config.c
new file mode 100644
index 000000000..995258370
--- /dev/null
+++ b/src/modules/sysinfo/cpuclock/cpuclock_config.c
@@ -0,0 +1,617 @@
+#include "cpuclock.h"
+
+static void
+_config_close(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+
+   E_FREE_FUNC(inst->cfg->cpuclock.configure, evas_object_del);
+   E_FREE_FUNC(cc->powersaves, eina_list_free);
+   E_FREE_FUNC(cc, free);
+   e_config_save_queue();
+}
+
+static void
+_config_show_general(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+
+   evas_object_hide(cc->policy);
+   evas_object_hide(cc->saving);
+   if (cc->pstate)
+     evas_object_hide(cc->ps);
+   if (cc->frequencies)
+     evas_object_hide(cc->freq);
+   evas_object_show(cc->general);
+}
+
+static void
+_config_show_policy(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+
+   evas_object_hide(cc->general);
+   evas_object_hide(cc->saving);
+   if (cc->pstate)
+     evas_object_hide(cc->ps);
+   if (cc->frequencies)
+     evas_object_hide(cc->freq);
+   evas_object_show(cc->policy);
+}
+
+static void
+_config_show_saving(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+
+   evas_object_hide(cc->general);
+   evas_object_hide(cc->policy);
+   if (cc->pstate)
+     evas_object_hide(cc->ps);
+   if (cc->frequencies)
+     evas_object_hide(cc->freq);
+   evas_object_show(cc->saving);
+}
+
+static void
+_config_show_frequencies(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+
+   evas_object_hide(cc->general);
+   evas_object_hide(cc->policy);
+   evas_object_hide(cc->saving);
+   if (cc->pstate)
+     evas_object_hide(cc->ps);
+   evas_object_show(cc->freq);
+}
+
+static void
+_config_show_pstate(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+
+   evas_object_hide(cc->general);
+   evas_object_hide(cc->policy);
+   evas_object_hide(cc->saving);
+   if (cc->frequencies)
+     evas_object_hide(cc->freq);
+   evas_object_show(cc->ps);
+}
+
+static void
+_update_max_power(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+   int value = elm_slider_value_get(cc->max);
+
+   inst->cfg->cpuclock.pstate_max = value;
+   _cpuclock_set_pstate(inst->cfg->cpuclock.pstate_min - 1,
+                  inst->cfg->cpuclock.pstate_max - 1, 
inst->cfg->cpuclock.status->pstate_turbo);
+   e_config_save_queue();
+   _cpuclock_config_updated(inst);
+}
+
+static void
+_update_min_power(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+   int value = elm_slider_value_get(cc->min);
+
+   inst->cfg->cpuclock.pstate_min = value;
+   _cpuclock_set_pstate(inst->cfg->cpuclock.pstate_min - 1,
+                  inst->cfg->cpuclock.pstate_max - 1, 
inst->cfg->cpuclock.status->pstate_turbo);
+   e_config_save_queue();
+   _cpuclock_config_updated(inst);
+}
+
+static void
+_auto_powersave(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+   Eina_List *l = NULL;
+   Evas_Object *o = NULL;
+
+   inst->cfg->cpuclock.auto_powersave = elm_check_state_get(obj);
+   EINA_LIST_FOREACH(cc->powersaves, l, o)
+     elm_object_disabled_set(o, inst->cfg->cpuclock.auto_powersave);
+   e_config_save_queue();
+   _cpuclock_config_updated(inst);
+}
+
+static void
+_restore_governor(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+
+   inst->cfg->cpuclock.restore_governor = elm_check_state_get(obj);
+   if ((!inst->cfg->cpuclock.governor) || 
+       (strcmp(inst->cfg->cpuclock.status->cur_governor, 
inst->cfg->cpuclock.governor)))
+     {
+        eina_stringshare_replace(&inst->cfg->cpuclock.governor, 
inst->cfg->cpuclock.status->cur_governor);
+     }
+   e_config_save_queue();
+   _cpuclock_config_updated(inst);
+}
+
+static void
+_frequency_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info 
EINA_UNUSED)
+{
+   const char *value = elm_object_text_get(obj);
+   int frequency = atol(value);
+
+   if (frequency > 0)
+     _cpuclock_set_frequency(frequency);
+}
+
+static void
+_powersave_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+   const char *value = elm_object_text_get(obj);
+
+   if (value)
+     eina_stringshare_replace(&inst->cfg->cpuclock.powersave_governor, value);
+   e_config_save_queue();
+   _cpuclock_config_updated(inst);
+}
+
+static void
+_governor_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+   const char *value = elm_object_text_get(obj);
+
+   if (value)
+     {
+        eina_stringshare_replace(&inst->cfg->cpuclock.governor, value);
+        _cpuclock_set_governor(inst->cfg->cpuclock.governor);
+     }
+
+   e_config_save_queue();
+   _cpuclock_config_updated(inst);
+}
+
+static void
+_poll_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Cpuclock_Config *cc = data;
+   Instance *inst = cc->inst;
+   int value = elm_radio_value_get(obj);
+
+   switch (value)
+     {
+        case 0:
+          inst->cfg->cpuclock.poll_interval = 4;
+          break;
+        case 1:
+          inst->cfg->cpuclock.poll_interval = 8;
+          break;
+        case 2:
+          inst->cfg->cpuclock.poll_interval = 32;
+          break;
+        case 3:
+          inst->cfg->cpuclock.poll_interval = 64;
+          break;
+        case 4:
+          inst->cfg->cpuclock.poll_interval = 256;
+          break;
+        default:
+          inst->cfg->cpuclock.poll_interval = 32;
+     }
+
+   e_config_save_queue();
+   _cpuclock_config_updated(inst);
+}
+
+Evas_Object *
+cpuclock_configure(Instance *inst)
+{
+   Evas_Object *popup, *tb, *frame, *box, *o, *group, *lbl, *slider, *list, 
*check;
+   Evas_Object *groupg = NULL, *groups = NULL, *groupf = NULL;
+   Elm_Object_Item *it;
+   E_Zone *zone = e_zone_current_get();
+   Eina_List *l = NULL;
+   Cpuclock_Config *cc = E_NEW(Cpuclock_Config, 1);
+   int i = 0, value = 0;
+
+   cc->inst = inst;
+   cc->powersaves = NULL;
+   cc->frequencies = EINA_FALSE;
+   cc->pstate = EINA_FALSE;
+
+   if ((inst->cfg->cpuclock.status->frequencies) &&
+       (inst->cfg->cpuclock.status->can_set_frequency) &&
+       (!inst->cfg->cpuclock.status->pstate))
+     {
+        cc->frequencies = EINA_TRUE;
+     }
+   if ((inst->cfg->cpuclock.status) && (inst->cfg->cpuclock.status->pstate))
+     {
+        cc->pstate = EINA_TRUE;
+     }
+
+   popup = elm_popup_add(e_comp->elm);
+   E_EXPAND(popup);
+   elm_popup_allow_events_set(popup, 1);
+   elm_popup_scrollable_set(popup, 1);
+
+   tb = elm_table_add(popup);
+   E_EXPAND(tb);
+   evas_object_show(tb);
+   elm_object_content_set(popup, tb);
+
+   lbl = elm_label_add(tb);
+   evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_style_set(lbl, "marker");
+   elm_object_text_set(lbl, _("CpuClock Configuration"));
+   elm_table_pack(tb, lbl, 0, 0, 2, 1);
+   evas_object_show(lbl);
+
+   list = elm_list_add(tb);
+   E_ALIGN(list, 0, EVAS_HINT_FILL);
+   E_WEIGHT(list, 0, EVAS_HINT_EXPAND);
+   elm_table_pack(tb, list, 0, 1, 1, 1);
+   elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS);
+   elm_scroller_content_min_limit(list, 1, 1);
+   it = elm_list_item_append(list, _("General"), NULL, NULL,
+       _config_show_general, cc);
+   elm_list_item_selected_set(it, 1);
+   it = elm_list_item_append(list, _("Power Policy"), NULL, NULL,
+       _config_show_policy, cc);
+   it = elm_list_item_append(list, _("Power Saving"), NULL, NULL,
+       _config_show_saving, cc);
+   if (cc->pstate)
+     it = elm_list_item_append(list, _("Power State"), NULL, NULL,
+       _config_show_pstate, cc);
+   if (cc->frequencies)
+     it = elm_list_item_append(list, _("Frequencies"), NULL, NULL,
+       _config_show_frequencies, cc);
+   elm_list_go(list);
+   evas_object_show(list);
+
+   frame = elm_frame_add(tb);
+   elm_object_text_set(frame, _("General"));
+   E_EXPAND(frame);
+   E_FILL(frame);
+   elm_table_pack(tb, frame, 1, 1, 1, 1);
+   evas_object_show(frame);
+   cc->general = frame;
+
+   box = elm_box_add(frame);
+   elm_box_horizontal_set(box, EINA_FALSE);
+   E_EXPAND(box);
+   evas_object_show(box);
+
+   lbl = elm_label_add(tb);
+   E_ALIGN(lbl, 0.0, 0.0);
+   E_WEIGHT(lbl, EVAS_HINT_EXPAND, 0);
+   elm_object_text_set(lbl, _("Update Poll Interval"));
+   elm_box_pack_end(box, lbl);
+   evas_object_show(lbl);
+
+   o = elm_radio_add(box);
+   elm_radio_state_value_set(o, 0);
+   E_ALIGN(o, 0.0, 0.0);
+   E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+   elm_object_text_set(o, _("Fast (4 ticks)"));
+   elm_box_pack_end(box, o);
+   evas_object_smart_callback_add(o, "changed", _poll_changed, cc);
+   evas_object_show(o);
+   group = o;
+
+   o = elm_radio_add(box);
+   elm_radio_state_value_set(o, 1);
+   elm_radio_group_add(o, group);
+   E_ALIGN(o, 0.0, 0.0);
+   E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+   elm_object_text_set(o, _("Medium (8 ticks)"));
+   elm_box_pack_end(box, o);
+   evas_object_smart_callback_add(o, "changed", _poll_changed, cc);
+   evas_object_show(o);
+
+   o = elm_radio_add(box);
+   elm_radio_state_value_set(o, 2);
+   elm_radio_group_add(o, group);
+   E_ALIGN(o, 0.0, 0.0);
+   E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+   elm_object_text_set(o, _("Normal (32 ticks)"));
+   elm_box_pack_end(box, o);
+   evas_object_smart_callback_add(o, "changed", _poll_changed, cc);
+   evas_object_show(o);
+
+   o = elm_radio_add(box);
+   elm_radio_state_value_set(o, 3);
+   elm_radio_group_add(o, group);
+   E_ALIGN(o, 0.0, 0.0);
+   E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+   elm_object_text_set(o, _("Slow (64 ticks)"));
+   elm_box_pack_end(box, o);
+   evas_object_smart_callback_add(o, "changed", _poll_changed, cc);
+   evas_object_show(o);
+
+   o = elm_radio_add(box);
+   elm_radio_state_value_set(o, 4);
+   elm_radio_group_add(o, group);
+   E_ALIGN(o, 0.0, 0.0);
+   E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+   elm_object_text_set(o, _("Very Slow (256 ticks)"));
+   elm_box_pack_end(box, o);
+   evas_object_smart_callback_add(o, "changed", _poll_changed, cc);
+   evas_object_show(o);
+
+   switch(inst->cfg->cpuclock.poll_interval)
+     {
+        case 4:
+          elm_radio_value_set(group, 0);
+          break;
+        case 8:
+          elm_radio_value_set(group, 1);
+          break;
+        case 32:
+          elm_radio_value_set(group, 2);
+          break;
+        case 64:
+          elm_radio_value_set(group, 3);
+          break;
+        case 256:
+          elm_radio_value_set(group, 4);
+          break;
+        default:
+          elm_radio_value_set(group, 2);
+     }
+
+   elm_object_content_set(frame, box);
+
+   frame = elm_frame_add(tb);
+   elm_object_text_set(frame, _("Power Policy"));
+   E_EXPAND(frame);
+   E_FILL(frame);
+   elm_table_pack(tb, frame, 1, 1, 1, 1);
+   evas_object_show(frame);
+   cc->policy = frame;
+
+   box = elm_box_add(frame);
+   elm_box_horizontal_set(box, EINA_FALSE);
+   E_EXPAND(box);
+   evas_object_show(box);
+
+   i = 0;
+   for (l = inst->cfg->cpuclock.status->governors; l; l = l->next)
+     {
+        o = elm_radio_add(box);
+        elm_radio_state_value_set(o, i);
+       E_ALIGN(o, 0.0, 0.0);
+        E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+        if (!strcmp(l->data, "ondemand"))
+          elm_object_text_set(o, _("Automatic"));
+        else if (!strcmp(l->data, "conservative"))
+          elm_object_text_set(o, _("Lower Power Automatic"));
+        else if (!strcmp(l->data, "interactive"))
+          elm_object_text_set(o, _("Automatic Interactive"));
+        else if (!strcmp(l->data, "powersave"))
+          elm_object_text_set(o, _("Minimum Speed"));
+        else if (!strcmp(l->data, "performance"))
+          elm_object_text_set(o, _("Maximum Speed"));
+        else
+          elm_object_text_set(o, l->data);
+        elm_box_pack_end(box, o);
+        evas_object_smart_callback_add(o, "changed", _governor_changed, cc);
+        evas_object_show(o);
+
+        if (!strcmp(inst->cfg->cpuclock.status->cur_governor, l->data))
+          value = i;
+
+       if (!groupg)
+          groupg = o;
+       else
+          elm_radio_group_add(o, groupg);
+        i++;
+     }
+   if (groupg)
+     elm_radio_value_set(groupg, value);
+
+   check = elm_check_add(box);
+   elm_object_text_set(check, _("Restore CPU Power Policy"));
+   elm_check_state_set(check, inst->cfg->cpuclock.restore_governor);
+   E_ALIGN(check, 0.0, 0.0);
+   E_WEIGHT(check, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(check, "changed", _restore_governor, cc);
+   elm_box_pack_end(box, check);
+   evas_object_show(check);
+
+   elm_object_content_set(frame, box);
+
+   frame = elm_frame_add(tb);
+   elm_object_text_set(frame, _("Power Saving"));
+   E_EXPAND(frame);
+   E_FILL(frame);
+   elm_table_pack(tb, frame, 1, 1, 1, 1);
+   evas_object_show(frame);
+   cc->saving = frame;
+
+   box = elm_box_add(frame);
+   elm_box_horizontal_set(box, EINA_FALSE);
+   E_EXPAND(box);
+   evas_object_show(box);
+
+   check = elm_check_add(box);
+   elm_object_text_set(check, _("Automatic Powersaving"));
+   elm_check_state_set(check, inst->cfg->cpuclock.auto_powersave);
+   E_ALIGN(check, 0.0, 0.0);
+   E_WEIGHT(check, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(check, "changed", _auto_powersave, cc);
+   elm_box_pack_end(box, check);
+   evas_object_show(check);
+
+   i = 0;
+   for (l = inst->cfg->cpuclock.status->governors; l; l = l->next)
+     {
+        o = elm_radio_add(box);
+        elm_radio_state_value_set(o, i);
+        E_ALIGN(o, 0.0, 0.0);
+        E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+        if (!strcmp(l->data, "ondemand"))
+          elm_object_text_set(o, _("Automatic"));
+        else if (!strcmp(l->data, "conservative"))
+          elm_object_text_set(o, _("Lower Power Automatic"));
+        else if (!strcmp(l->data, "interactive"))
+          elm_object_text_set(o, _("Automatic Interactive"));
+        else if (!strcmp(l->data, "powersave"))
+          elm_object_text_set(o, _("Minimum Speed"));
+        else if (!strcmp(l->data, "performance"))
+          elm_object_text_set(o, _("Maximum Speed"));
+        else
+          elm_object_text_set(o, l->data);
+        elm_object_disabled_set(o, inst->cfg->cpuclock.auto_powersave);
+       elm_box_pack_end(box, o);
+        evas_object_smart_callback_add(o, "changed", _powersave_changed, cc);
+        evas_object_show(o);
+        cc->powersaves = eina_list_append(cc->powersaves, o);
+
+        if (inst->cfg->cpuclock.powersave_governor && 
!strcmp(inst->cfg->cpuclock.powersave_governor, l->data))
+          value = i;
+
+        if (!groups)
+          groups = o;
+        else
+          elm_radio_group_add(o, groups);
+        i++;
+     }
+   if (groups)
+     elm_radio_value_set(groups, value);
+
+   elm_object_content_set(frame, box);
+
+   if (cc->pstate)
+     {
+        frame = elm_frame_add(tb);
+        elm_object_text_set(frame, _("Power State"));
+        E_EXPAND(frame);
+        E_FILL(frame);
+        elm_table_pack(tb, frame, 1, 1, 1, 1);
+        evas_object_show(frame);
+        cc->ps = frame;
+
+        box = elm_box_add(frame);
+        elm_box_horizontal_set(box, EINA_FALSE);
+        E_EXPAND(box);
+        evas_object_show(box);
+
+        slider = elm_slider_add(box);
+        elm_object_text_set(slider, _("Maximum Power State:"));
+        elm_slider_unit_format_set(slider, "%3.0f");
+        elm_slider_indicator_format_set(slider, "%3.0f");
+        elm_slider_min_max_set(slider, 2, 100);
+        elm_slider_value_set(slider, inst->cfg->cpuclock.pstate_max);
+        elm_slider_step_set(slider, 1);
+        elm_slider_span_size_set(slider, 100);
+        evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
+        evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
+        evas_object_smart_callback_add(slider, "delay,changed", 
_update_max_power, cc);
+        elm_box_pack_end(box, slider);
+        evas_object_show(slider);
+        cc->max = slider;
+
+        slider = elm_slider_add(box);
+        elm_object_text_set(slider, _("Minimum Power State:"));
+        elm_slider_unit_format_set(slider, "%3.0f");
+        elm_slider_indicator_format_set(slider, "%3.0f");
+        elm_slider_min_max_set(slider, 0, 100);
+        elm_slider_value_set(slider, inst->cfg->cpuclock.pstate_min);
+        elm_slider_step_set(slider, 1);
+        elm_slider_span_size_set(slider, 100);
+        evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5);
+        evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0);
+        evas_object_smart_callback_add(slider, "delay,changed", 
_update_min_power, cc);
+        elm_box_pack_end(box, slider);
+        evas_object_show(slider);
+        cc->min = slider;
+
+        elm_object_content_set(frame, box);
+     }
+   if (cc->frequencies)
+     {
+        frame = elm_frame_add(tb);
+        elm_object_text_set(frame, _("Frequencies"));
+        E_EXPAND(frame);
+        E_FILL(frame);
+        elm_table_pack(tb, frame, 1, 1, 1, 1);
+        evas_object_show(frame);
+        cc->freq = frame;
+
+        box = elm_box_add(frame);
+        elm_box_horizontal_set(box, EINA_FALSE);
+        E_EXPAND(box);
+        evas_object_show(box);
+
+       i = 0;
+        for (l = inst->cfg->cpuclock.status->frequencies; l; l = l->next)
+          {
+             char buf[4096];
+             int frequency;
+
+             frequency = (long)l->data;
+
+             o = elm_radio_add(box);
+             elm_radio_state_value_set(o, i);
+             E_ALIGN(o, 0.0, 0.0);
+             E_WEIGHT(o, EVAS_HINT_EXPAND, 0);
+#ifdef __OpenBSD__
+             snprintf(buf, sizeof(buf), "%i %%", frequency);
+#else
+             if (frequency < 1000000)
+               snprintf(buf, sizeof(buf), _("%i MHz"), frequency / 1000);
+             else
+               snprintf(buf, sizeof(buf), _("%'.1f GHz"),
+                       frequency / 1000000.);
+#endif
+             elm_object_text_set(o, buf);
+             elm_box_pack_end(box, o);
+             evas_object_smart_callback_add(o, "changed", _frequency_changed, 
cc);
+             evas_object_show(o);
+
+#ifdef __OpenBSD__
+             if (inst->cfg->cpuclock.status->cur_percent == frequency)
+               value = i;
+#else
+             if (inst->cfg->cpuclock.status->cur_frequency == frequency)
+               value = i;
+#endif
+            if (!groupf)
+               groupf = o;
+             else
+               elm_radio_group_add(o, groupf);
+             i++;
+          }
+        if (groupf)
+          elm_radio_value_set(groupf, value);
+
+        elm_object_content_set(frame, box);
+        evas_object_hide(cc->freq);
+     }
+   if (cc->pstate)
+     evas_object_hide(cc->ps);
+   evas_object_hide(cc->policy);
+   evas_object_hide(cc->saving);
+   evas_object_show(cc->general);
+
+   popup = e_comp_object_util_add(popup, E_COMP_OBJECT_TYPE_NONE);
+   evas_object_layer_set(popup, E_LAYER_POPUP);
+   evas_object_resize(popup, zone->w / 4, zone->h / 3);
+   e_comp_object_util_center_on_zone(popup, zone);
+   evas_object_show(popup);
+   e_comp_object_util_autoclose(popup, NULL, 
e_comp_object_util_autoclose_on_escape, NULL);
+   evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _config_close, cc);
+
+   return inst->cfg->cpuclock.configure = popup;
+}
+
diff --git a/src/modules/sysinfo/mod.c b/src/modules/sysinfo/mod.c
index 0fb0f1be5..5dad8227d 100644
--- a/src/modules/sysinfo/mod.c
+++ b/src/modules/sysinfo/mod.c
@@ -104,7 +104,8 @@ sysinfo_init(void)
         ci->cpuclock.governor = NULL;
         ci->cpuclock.pstate_min = 1;
         ci->cpuclock.pstate_max = 101;
-        ci->cpumonitor.poll_interval = 32;
+        ci->cpuclock.configure = NULL;
+       ci->cpumonitor.poll_interval = 32;
         ci->cpumonitor.total = 0;
         ci->cpumonitor.idle = 0;
         ci->cpumonitor.percent = 0;
diff --git a/src/modules/sysinfo/sysinfo.c b/src/modules/sysinfo/sysinfo.c
index 353ab2a78..4b97fae54 100644
--- a/src/modules/sysinfo/sysinfo.c
+++ b/src/modules/sysinfo/sysinfo.c
@@ -112,6 +112,8 @@ _conf_item_get(int *id)
    ci->cpuclock.governor = NULL;
    ci->cpuclock.pstate_min = 1;
    ci->cpuclock.pstate_max = 101;
+   ci->cpuclock.popup = NULL;
+   ci->cpuclock.configure = NULL;
    ci->cpumonitor.poll_interval = 32;
    ci->cpumonitor.total = 0;
    ci->cpumonitor.idle = 0;
diff --git a/src/modules/sysinfo/sysinfo.h b/src/modules/sysinfo/sysinfo.h
index 896cd83a4..ae9a07981 100644
--- a/src/modules/sysinfo/sysinfo.h
+++ b/src/modules/sysinfo/sysinfo.h
@@ -173,6 +173,9 @@ struct _Config_Item
    struct
    {
       Evas_Object         *o_gadget;
+      Evas_Object         *popup;
+      Evas_Object         *popup_label;
+      Evas_Object         *configure;
       int                  poll_interval;
       int                  restore_governor;
       int                  auto_powersave;

-- 


Reply via email to