AC_E_OPTIONAL_MODULE([systray], true)
AC_E_OPTIONAL_MODULE([comp], true)
AC_E_OPTIONAL_MODULE([shot], true)
+AC_E_OPTIONAL_MODULE([backlight], true)
SUSPEND=""
HIBERNATE=""
src/modules/comp/module.desktop
src/modules/shot/Makefile
src/modules/shot/module.desktop
+src/modules/backlight/Makefile
+src/modules/backlight/module.desktop
src/preload/Makefile
data/Makefile
data/images/Makefile
/////////////////////////////////////////////////////////////////////////////
+/*** MOD: BACKLIGHT ***/
+ group { name: "e/modules/backlight/main";
+ images {
+ image: "bulb.png" COMP;
+ }
+ min: 16 16;
+ max: 128 128;
+ parts {
+ part {
+ name: "base";
+ description {
+ state: "default" 0.0;
+ aspect: 1.0 1.0;
+ aspect_preference: BOTH;
+ image.normal: "bulb.png";
+ }
+ }
+ }
+ }
+
+/////////////////////////////////////////////////////////////////////////////
#define CLOCK_SECONDS 1
/*** MOD: CLOCK ***/
-
group { name: "e/modules/clock/digital";
min: 56 16;
max: 512 128;
flip_pmt.png \
flip_shad.png \
flip_t.png \
-flip_colon.png
+flip_colon.png \
+bulb.png
e_actions.h \
e_alert.h \
e_atoms.h \
+e_backlight.h \
e_bg.h \
e_bindings.h \
e_border.h \
e_actions.c \
e_alert.c \
e_atoms.c \
+e_backlight.c \
e_bg.c \
e_bindings.c \
e_border.c \
{
if (obj)
{
- if (obj->type == E_MANAGER_TYPE)
- return e_util_zone_current_get((E_Manager *)obj);
- else if (obj->type == E_CONTAINER_TYPE)
- return e_util_zone_current_get(((E_Container *)obj)->manager);
- else if (obj->type == E_ZONE_TYPE)
- return e_util_zone_current_get(((E_Zone *)obj)->container->manager);
- else
- return e_util_zone_current_get(e_manager_current_get());
+ if (obj->type == (int)E_MANAGER_TYPE) return e_util_zone_current_get((E_Manager *)obj);
+ else if (obj->type == (int)E_CONTAINER_TYPE) return e_util_zone_current_get(((E_Container *)obj)->manager);
+ else if (obj->type == (int)E_ZONE_TYPE) return (E_Zone *)obj;
+ else if (obj->type == (int)E_BORDER_TYPE) return ((E_Border *)obj)->zone;
+ else if (obj->type == (int)E_SHELF_TYPE) return ((E_Shelf *)obj)->zone;
+ else if (obj->type == (int)E_POPUP_TYPE) return ((E_Popup *)obj)->zone;
+ else if (obj->type == (int)E_WIN_TYPE) return ((E_Win *)obj)->border->zone;
}
return e_util_zone_current_get(e_manager_current_get());
}
ACT_FN_GO_ACPI(dim_screen, __UNUSED__)
{
- printf("Dim Screen\n");
+ E_Zone *zone = _e_actions_zone_get(obj);
+ e_backlight_mode_set(zone, E_BACKLIGHT_MODE_DIM);
}
ACT_FN_GO_ACPI(undim_screen, __UNUSED__)
{
- printf("Undim Screen\n");
+ E_Zone *zone = _e_actions_zone_get(obj);
+ e_backlight_mode_set(zone, E_BACKLIGHT_MODE_NORMAL);
+}
+
+ACT_FN_GO_ACPI(backlight_set, )
+{
+ E_Zone *zone = _e_actions_zone_get(obj);
+ double v = atof(params);
+ e_backlight_mode_set(zone, E_BACKLIGHT_MODE_NORMAL);
+ e_backlight_level_set(zone, v, -1.0);
+}
+
+ACT_FN_GO_ACPI(backlight_adjust, )
+{
+ E_Zone *zone = _e_actions_zone_get(obj);
+ double v = atof(params);
+ e_backlight_mode_set(zone, E_BACKLIGHT_MODE_NORMAL);
+ e_backlight_level_set(zone, e_backlight_level_get(zone) + v, -1.0);
}
/* local subsystem globals */
"screen_send_by", NULL,
"syntax: N-offset, example: -2", 1);
+ ACT_GO_ACPI(dim_screen);
+ e_action_predef_name_set(N_("Screen"), N_("Dim"), "dim_screen",
+ NULL, NULL, 0);
+ ACT_GO_ACPI(undim_screen);
+ e_action_predef_name_set(N_("Screen"), N_("Undim"), "undim_screen",
+ NULL, NULL, 0);
+ ACT_GO_ACPI(backlight_set);
+ e_action_predef_name_set(N_("Screen"), N_("Backlight Set"), "backlight_set",
+ NULL, "syntax: brightness(0.0 - 1.0), example: 0.5", 1);
+ e_action_predef_name_set(N_("Screen"), N_("Backlight Min"), "backlight_set",
+ "0.0", NULL, 0);
+ e_action_predef_name_set(N_("Screen"), N_("Backlight Mid"), "backlight_set",
+ "0.5", NULL, 0);
+ e_action_predef_name_set(N_("Screen"), N_("Backlight Max"), "backlight_set",
+ "1.0", NULL, 0);
+ ACT_GO_ACPI(backlight_adjust);
+ e_action_predef_name_set(N_("Screen"), N_("Backlight Adjust"), "backlight_adjust",
+ NULL, "syntax: brightness(-1.0 - 1.0), example: -0.2", 1);
+ e_action_predef_name_set(N_("Screen"), N_("Backlight Up"), "backlight_adjust",
+ "0.1", NULL, 0);
+ e_action_predef_name_set(N_("Screen"), N_("Backlight Down"), "backlight_adjust",
+ "-0.1", NULL, 0);
+
/* window_move_to_center */
ACT_GO(window_move_to_center);
e_action_predef_name_set(N_("Window : Actions"), N_("Move To Center"),
ACT_END_KEY(delayed_action);
ACT_END_MOUSE(delayed_action);
- ACT_GO_ACPI(dim_screen);
- e_action_predef_name_set(N_("Acpi"), N_("Dim Screen"), "dim_screen",
- NULL, NULL, 0);
-
- ACT_GO_ACPI(undim_screen);
- e_action_predef_name_set(N_("Acpi"), N_("Undim Screen"), "undim_screen",
- NULL, NULL, 0);
-
return 1;
}
--- /dev/null
+#include "e.h"
+#include <E_DBus.h>
+#include <E_Hal.h>
+
+// FIXME: backlight should be tied per zone but this implementation is just
+// a signleton right now as thats 99% of use cases. but api supports
+// doing more. for now make it work in the singleton
+
+// FIXME: backlight should have config values for:
+// 1. normal mode (eg on login/ start of e)
+// 2. dim level (eg 0.5)
+// 3. anim slide time (eg 0.5)
+
+// FIXME: tried using hal backlight stuff... doesn't work
+//#define HAL_BL 1
+
+#define MODE_RANDR 0
+#define MODE_HAL 1
+
+static double bl_val = 1.0;
+static double bl_animval = 1.0;
+static E_Backlight_Mode bl_mode = E_BACKLIGHT_MODE_NORMAL;
+static int sysmode = MODE_RANDR;
+static Ecore_Animator *bl_anim = NULL;
+
+#ifdef HAL_BL
+static E_DBus_Connection *_hal_conn = NULL;
+static const char *_hal_bl_dev = NULL;
+static const char *_hal_bl_iface = NULL;
+static int _hal_nlevels = 1;
+#endif
+
+static void _e_backlight_update(E_Zone *zone);
+static void _e_backlight_set(E_Zone *zone, double val);
+static Eina_Bool _bl_anim(void *data, double pos);
+
+EINTERN int
+e_backlight_init(void)
+{
+ e_backlight_update();
+ e_backlight_level_set(NULL, 0.0, 0.0);
+ e_backlight_level_set(NULL, e_config->backlight.normal, 1.0);
+ return 1;
+}
+
+EINTERN int
+e_backlight_shutdown(void)
+{
+#ifdef HAL_BL
+ if (_hal_conn)
+ {
+ e_dbus_connection_close(_hal_conn);
+ _hal_conn = NULL;
+ e_hal_shutdown();
+ e_dbus_shutdown();
+ if (_hal_bl_dev)
+ {
+ eina_stringshare_del(_hal_bl_dev);
+ _hal_bl_dev = NULL;
+ }
+ if (_hal_bl_iface)
+ {
+ eina_stringshare_del(_hal_bl_iface);
+ _hal_bl_iface = NULL;
+ }
+ }
+#endif
+ if (bl_anim) ecore_animator_del(bl_anim);
+ bl_anim = NULL;
+ return 1;
+}
+
+EAPI void
+e_backlight_update(void)
+{
+ Eina_List *m, *c, *z;
+ E_Manager *man;
+ E_Container *con;
+ E_Zone *zone;
+
+ EINA_LIST_FOREACH(e_manager_list(), m, man)
+ {
+ EINA_LIST_FOREACH(man->containers, c, con)
+ {
+ EINA_LIST_FOREACH(con->zones, z, zone)
+ {
+ _e_backlight_update(zone);
+ }
+ }
+ }
+}
+
+EAPI void
+e_backlight_level_set(E_Zone *zone, double val, double tim)
+{
+ double bl_now;
+ // zone == NULL == everything
+ // set backlight associated with zone to val over period of tim
+ // if tim == 0.0 - then do it instantnly, if time == -1 use some default
+ // transition time
+ if (!zone) e_backlight_update();
+ else _e_backlight_update(zone);
+ if (val == bl_val) return;
+ if (!zone) zone = e_util_zone_current_get(e_manager_current_get());
+ bl_now = bl_val;
+ bl_val = val;
+ if (bl_mode != E_BACKLIGHT_MODE_NORMAL) return;
+ if (tim < 0.0) tim = e_config->backlight.transition;
+ // FIXME: save bl level for normal
+ if (tim == 0.0)
+ {
+ if (bl_anim)
+ {
+ ecore_animator_del(bl_anim);
+ bl_anim = NULL;
+ }
+ _e_backlight_set(zone, val);
+ return;
+ }
+ if (bl_anim) ecore_animator_del(bl_anim);
+ bl_anim = ecore_animator_timeline_add(tim, _bl_anim, zone);
+ bl_animval = bl_now;
+}
+
+EAPI double
+e_backlight_level_get(E_Zone *zone)
+{
+ // zone == NULL == everything
+ if (!zone) e_backlight_update();
+ else _e_backlight_update(zone);
+ return bl_val;
+}
+
+EAPI void
+e_backlight_mode_set(E_Zone *zone, E_Backlight_Mode mode)
+{
+ // zone == NULL == everything
+ if (bl_mode == mode) return;
+ bl_mode = mode;
+ if (bl_mode == E_BACKLIGHT_MODE_NORMAL)
+ e_backlight_level_set(zone, bl_val, -1.0);
+ else if (bl_mode == E_BACKLIGHT_MODE_OFF)
+ e_backlight_level_set(zone, 0.0, -1.0);
+ else if (bl_mode == E_BACKLIGHT_MODE_DIM)
+ e_backlight_level_set(zone, 0.0, -1.0);
+ else if (bl_mode == E_BACKLIGHT_MODE_DIM)
+ e_backlight_level_set(zone, e_config->backlight.dim, -1.0);
+ else if (bl_mode == E_BACKLIGHT_MODE_MAX)
+ e_backlight_level_set(zone, 1.0, -1.0);
+}
+
+EAPI E_Backlight_Mode
+e_backlight_mode_get(E_Zone *zone __UNUSED__)
+{
+ // zone == NULL == everything
+ return bl_mode;
+}
+
+/* local subsystem functions */
+#ifdef HAL_BL
+void
+_e_backlight_hal_val_reply(void *data __UNUSED__,
+ DBusMessage *reply,
+ DBusError *error)
+{
+ dbus_uint32_t val;
+
+ if (dbus_error_is_set(error))
+ {
+ printf("Error: %s - %s\n", error->name, error->message);
+ return;
+ }
+ dbus_message_get_args(reply, error, DBUS_TYPE_UINT32,
+ &val, DBUS_TYPE_INVALID);
+ printf("Received: %i\n", val);
+}
+
+static void
+_e_backlight_hal_val_get(void)
+{
+ DBusMessage *msg;
+
+ if (!_hal_bl_dev) return;
+ msg = dbus_message_new_method_call
+ ("org.freedesktop.Hal",
+ _hal_bl_dev,
+ _hal_bl_iface,
+ "GetBrightness"
+ );
+ e_dbus_message_send(_hal_conn, msg, _e_backlight_hal_val_reply, -1, NULL);
+ dbus_message_unref(msg);
+}
+
+static void
+_e_backlight_hal_val_set(double val)
+{
+ DBusMessage *msg;
+ dbus_uint32_t ival = 0;
+
+ if (!_hal_bl_dev) return;
+ msg = dbus_message_new_method_call
+ ("org.freedesktop.Hal",
+ _hal_bl_dev,
+ _hal_bl_iface,
+ "SetBrightness"
+ );
+ ival = val * (_hal_nlevels - 1);
+ printf("hal set %i\n", ival);
+ dbus_message_append_args(msg, DBUS_TYPE_UINT32, &ival, DBUS_TYPE_INVALID);
+ dbus_message_set_no_reply(msg, EINA_TRUE);
+ e_dbus_message_send(_hal_conn, msg, NULL, -1, NULL);
+ dbus_message_unref(msg);
+}
+
+static void
+_e_backlight_prop(void *data __UNUSED__,
+ void *reply_data,
+ DBusError *error)
+{
+ E_Hal_Properties *ret = reply_data;
+ int err;
+ int nlevels;
+ const Eina_List *sl;
+
+ if (!ret) goto error;
+
+ if (dbus_error_is_set(error))
+ {
+ dbus_error_free(error);
+ goto error;
+ }
+ nlevels = e_hal_property_bool_get(ret, "laptop_panel.num_levels", &err);
+ if (err) goto error;
+ _hal_nlevels = nlevels;
+ printf("nlevels: %i\n", nlevels);
+
+ sl = e_hal_property_strlist_get(ret, "info.interfaces", &err);
+ if (err) goto error;
+ if (sl)
+ {
+ if (_hal_bl_iface) eina_stringshare_del(_hal_bl_iface);
+ _hal_bl_iface = eina_stringshare_add(sl->data);
+ printf("%s\n", _hal_bl_iface);
+ }
+ _e_backlight_hal_val_get();
+ return;
+error:
+ if (_hal_bl_dev)
+ {
+ eina_stringshare_del(_hal_bl_dev);
+ _hal_bl_dev = NULL;
+ }
+ if (_hal_bl_iface)
+ {
+ eina_stringshare_del(_hal_bl_iface);
+ _hal_bl_iface = NULL;
+ }
+}
+
+static void
+_e_backlight_panel_found(void *user_data __UNUSED__,
+ void *reply_data,
+ DBusError *error)
+{
+ E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
+ Eina_List *l;
+ char *device;
+
+ if (!ret || !ret->strings) return;
+
+ if (dbus_error_is_set(error))
+ {
+ dbus_error_free(error);
+ return;
+ }
+ if (!_hal_bl_dev)
+ {
+ EINA_LIST_FOREACH(ret->strings, l, device)
+ {
+ printf("BL+: %s\n", device);
+ if (!_hal_bl_dev) _hal_bl_dev = eina_stringshare_add(device);
+ }
+ }
+ if (_hal_bl_dev)
+ {
+ e_hal_device_get_all_properties(_hal_conn, _hal_bl_dev,
+ _e_backlight_prop, NULL);
+ }
+}
+#endif
+
+static void
+_e_backlight_update(E_Zone *zone)
+{
+ double x_bl = -1.0;
+ Ecore_X_Window root;
+ Ecore_X_Randr_Output *out;
+ int num = 0;
+
+ root = zone->container->manager->root;
+ // try randr
+ out = ecore_x_randr_window_outputs_get(root, &num);
+ if ((out) && (num > 0))
+ x_bl = ecore_x_randr_output_backlight_level_get(root, out[0]);
+ if (out) free(out);
+ if (x_bl >= 0.0)
+ {
+ bl_val = x_bl;
+ sysmode = MODE_RANDR;
+ }
+ else
+ {
+#ifdef HAL_BL
+ sysmode = MODE_HAL;
+ if (!_hal_conn)
+ {
+ e_dbus_init();
+ e_hal_init();
+ _hal_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
+ }
+ if (_hal_conn)
+ {
+ if (!_hal_bl_dev)
+ e_hal_manager_find_device_by_capability
+ (_hal_conn, "laptop_panel",
+ _e_backlight_panel_found, NULL);
+ }
+#endif
+ }
+}
+
+static void
+_e_backlight_set(E_Zone *zone, double val)
+{
+ if (sysmode == MODE_RANDR)
+ {
+ Ecore_X_Window root;
+ Ecore_X_Randr_Output *out;
+ int num = 0;
+
+ root = zone->container->manager->root;
+ out = ecore_x_randr_window_outputs_get(root, &num);
+ if ((out) && (num > 0))
+ {
+ ecore_x_randr_output_backlight_level_set(root, out[0], val);
+ }
+ if (out) free(out);
+ }
+ else if (sysmode == MODE_HAL)
+ {
+#ifdef HAL_BL
+ _e_backlight_hal_val_set(val);
+#endif
+ }
+}
+
+static Eina_Bool
+_bl_anim(void *data, double pos)
+{
+ E_Zone *zone = data;
+ double v;
+
+ // FIXME: if zone is deleted while anim going... bad things.
+ pos = ecore_animator_pos_map(pos, ECORE_POS_MAP_DECELERATE, 0.0, 0.0);
+ v = (bl_animval * (1.0 - pos)) + (bl_val *pos);
+ _e_backlight_set(zone, v);
+ if (pos >= 1.0)
+ {
+ bl_anim = NULL;
+ return EINA_FALSE;
+ }
+ return EINA_TRUE;
+}
--- /dev/null
+#ifdef E_TYPEDEFS
+
+//typedef struct _E_Screen E_Screen;
+
+typedef enum _E_Backlight_Mode
+{
+ E_BACKLIGHT_MODE_NORMAL = 0,
+ E_BACKLIGHT_MODE_OFF = 1,
+ E_BACKLIGHT_MODE_MIN = 2,
+ E_BACKLIGHT_MODE_DIM = 3,
+ E_BACKLIGHT_MODE_MAX = 4
+ // for the future. right now not working as we'd need an optical
+ // sensor support framework
+// E_BACKLIGHT_MODE_AUTO = 5
+} E_Backlight_Mode;
+
+#else
+#ifndef E_BACKLIGHT_H
+#define E_BACKLIGHT_H
+
+//struct _E_Screen
+//{
+// int screen, escreen;
+// int x, y, w, h;
+//};
+
+EINTERN int e_backlight_init(void);
+EINTERN int e_backlight_shutdown(void);
+EAPI void e_backlight_update(void);
+EAPI void e_backlight_level_set(E_Zone *zone, double val, double tim);
+EAPI double e_backlight_level_get(E_Zone *zone);
+EAPI void e_backlight_mode_set(E_Zone *zone, E_Backlight_Mode mode);
+EAPI E_Backlight_Mode e_backlight_mode_get(E_Zone *zone);
+
+#endif
+#endif
E_CONFIG_LIST(D, T, env_vars, _e_config_env_var_edd);
+ E_CONFIG_VAL(D, T, backlight.normal, DOUBLE);
+ E_CONFIG_VAL(D, T, backlight.dim, DOUBLE);
+ E_CONFIG_VAL(D, T, backlight.transition, DOUBLE);
+
e_config_load();
e_config_save_queue();
unsigned char null_container_win;
Eina_List *env_vars;
+
+ struct {
+ double normal;
+ double dim;
+ double transition;
+ } backlight;
};
struct _E_Config_Env_Var
#include "e_widget_toolbook.h"
#include "e_acpi.h"
#include "e_env.h"
+#include "e_backlight.h"
e_acpi_init();
_e_main_shutdown_push(e_acpi_shutdown);
+ e_init_status_set(_("Setup Backlight"));
+ TS("backlight");
+ /* setup dpms */
+ if (!e_backlight_init())
+ {
+ e_error_message_show(_("Enlightenment cannot configure the backlight."));
+ _e_main_shutdown(-1);
+ }
+ _e_main_shutdown_push(e_backlight_shutdown);
+
e_init_status_set(_("Setup DPMS"));
TS("dpms");
/* setup dpms */
if (wd->dval) *(wd->dval) = e_slider_value_get(wd->o_slider);
else if (wd->ival) *(wd->ival) = e_slider_value_get(wd->o_slider);
e_widget_change(wd->o_widget);
+ evas_object_smart_callback_call(wd->o_widget, "changed", NULL);
}
static void
SUBDIRS += shot
endif
+if USE_MODULE_BACKLIGHT
+SUBDIRS += backlight
+endif
--- /dev/null
+.deps
+.libs
+Makefile
+Makefile.in
+*.lo
+module.la
+module.desktop
--- /dev/null
+MAINTAINERCLEANFILES = Makefile.in
+MODULE = backlight
+
+# data files for the module
+filesdir = $(libdir)/enlightenment/modules/$(MODULE)
+files_DATA = \
+e-module-$(MODULE).edj module.desktop
+
+EXTRA_DIST = $(files_DATA)
+
+# the module .so file
+INCLUDES = -I. \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/src/modules/$(MODULE) \
+ -I$(top_srcdir)/src/bin \
+ -I$(top_builddir)/src/bin \
+ -I$(top_srcdir)/src/modules \
+ @e_cflags@
+pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+module_la_SOURCES = e_mod_main.c \
+ e_mod_main.h
+module_la_LIBADD = @e_libs@ @dlopen_libs@
+module_la_LDFLAGS = -module -avoid-version
+module_la_DEPENDENCIES = $(top_builddir)/config.h
+
+uninstall:
+ rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE)
--- /dev/null
+#include "e.h"
+#include "e_mod_main.h"
+
+/* gadcon requirements */
+static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style);
+static void _gc_shutdown(E_Gadcon_Client *gcc);
+static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient);
+static char *_gc_label(E_Gadcon_Client_Class *client_class);
+static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas);
+static const char *_gc_id_new(E_Gadcon_Client_Class *client_class);
+
+/* and actually define the gadcon class that this module provides (just 1) */
+static const E_Gadcon_Client_Class _gadcon_class =
+{
+ GADCON_CLIENT_CLASS_VERSION,
+ "backlight",
+ {
+ _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, NULL
+ },
+ E_GADCON_CLIENT_STYLE_PLAIN
+};
+
+/* actual module specifics */
+typedef struct _Instance Instance;
+
+struct _Instance
+{
+ E_Gadcon_Client *gcc;
+ Evas_Object *o_backlight, *o_table, *o_slider;
+ E_Gadcon_Popup *popup;
+ E_Menu *menu;
+ double val;
+};
+
+static Eina_List *backlight_instances = NULL;
+static E_Module *backlight_module = NULL;
+
+static void
+_backlight_settings_cb(void *d1, void *d2 __UNUSED__)
+{
+ Instance *inst = d1;
+ e_configure_registry_call("screen/power_management",
+ inst->gcc->gadcon->zone->container, NULL);
+ e_object_del(E_OBJECT(inst->popup));
+ inst->popup = NULL;
+}
+
+static void
+_slider_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+ Instance *inst = data;
+ e_backlight_mode_set(inst->gcc->gadcon->zone, E_BACKLIGHT_MODE_NORMAL);
+ e_backlight_level_set(inst->gcc->gadcon->zone, inst->val, 0.0);
+}
+
+static void
+_backlight_popup_new(Instance *inst)
+{
+ Evas *evas;
+ Evas_Object *o;
+
+ if (inst->popup) return;
+
+ e_backlight_update();
+ e_backlight_mode_set(inst->gcc->gadcon->zone, E_BACKLIGHT_MODE_NORMAL);
+ inst->val = e_backlight_level_get(inst->gcc->gadcon->zone);
+
+ inst->popup = e_gadcon_popup_new(inst->gcc);
+ evas = inst->popup->win->evas;
+
+ inst->o_table = e_widget_table_add(evas, 0);
+
+ o = e_widget_slider_add(evas, 0, 0, NULL, 0.0, 1.0, 0.0, 0, &(inst->val), NULL, 200);
+ evas_object_smart_callback_add(o, "changed", _slider_cb, inst);
+ inst->o_slider = o;
+ e_widget_table_object_align_append(inst->o_table, o,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0.5, 0.5);
+
+ o = e_widget_button_add(evas, NULL, "preferences-system",
+ _backlight_settings_cb, inst, NULL);
+ e_widget_table_object_align_append(inst->o_table, o,
+ 0, 1, 1, 1, 0, 0, 0, 0, 0.5, 1.0);
+
+ e_gadcon_popup_content_set(inst->popup, inst->o_table);
+ e_gadcon_popup_show(inst->popup);
+}
+
+static void
+_backlight_popup_free(Instance *inst)
+{
+ if (!inst->popup) return;
+ if (inst->popup) e_object_del(E_OBJECT(inst->popup));
+ inst->popup = NULL;
+}
+
+static void
+_backlight_menu_cb_post(void *data, E_Menu *menu __UNUSED__)
+{
+ Instance *inst = data;
+ if ((!inst) || (!inst->menu))
+ return;
+ if (inst->menu)
+ {
+ e_object_del(E_OBJECT(inst->menu));
+ inst->menu = NULL;
+ }
+}
+
+static void
+_backlight_menu_cb_cfg(void *data, E_Menu *menu __UNUSED__, E_Menu_Item *mi __UNUSED__)
+{
+ Instance *inst = data;
+ E_Container *con;
+
+ if (inst->popup)
+ {
+ e_object_del(E_OBJECT(inst->popup));
+ inst->popup = NULL;
+ }
+ con = e_container_current_get(e_manager_current_get());
+// e_int_config_backlight_module(con, NULL);
+}
+
+static void
+_backlight_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event)
+{
+ Instance *inst = data;
+ Evas_Event_Mouse_Down *ev = event;
+
+ if (ev->button == 1)
+ {
+ if (inst->popup) _backlight_popup_free(inst);
+ else _backlight_popup_new(inst);
+ }
+ else if ((ev->button == 3) && (!inst->menu))
+ {
+ E_Zone *zone;
+ E_Menu *m;
+ E_Menu_Item *mi;
+ int x, y;
+
+ zone = e_util_zone_current_get(e_manager_current_get());
+
+ m = e_menu_new();
+
+ mi = e_menu_item_new(m);
+ e_menu_item_label_set(mi, _("Settings"));
+ e_util_menu_item_theme_icon_set(mi, "configure");
+ e_menu_item_callback_set(mi, _backlight_menu_cb_cfg, inst);
+
+ m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0);
+ e_menu_post_deactivate_callback_set(m, _backlight_menu_cb_post, inst);
+ inst->menu = m;
+
+ e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL);
+ e_menu_activate_mouse(m, zone, x + ev->output.x, y + ev->output.y,
+ 1, 1, E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
+ evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button,
+ EVAS_BUTTON_NONE, ev->timestamp, NULL);
+ }
+}
+
+static E_Gadcon_Client *
+_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
+{
+ Evas_Object *o;
+ E_Gadcon_Client *gcc;
+ Instance *inst;
+
+ inst = E_NEW(Instance, 1);
+
+ o = edje_object_add(gc->evas);
+ e_theme_edje_object_set(o, "base/theme/modules/backlight",
+ "e/modules/backlight/main");
+ evas_object_show(o);
+
+ gcc = e_gadcon_client_new(gc, name, id, style, o);
+ gcc->data = inst;
+
+ inst->gcc = gcc;
+ inst->o_backlight = o;
+
+ e_backlight_update();
+ inst->val = e_backlight_level_get(inst->gcc->gadcon->zone);
+
+ evas_object_event_callback_add(inst->o_backlight,
+ EVAS_CALLBACK_MOUSE_DOWN,
+ _backlight_cb_mouse_down,
+ inst);
+
+ e_gadcon_client_util_menu_attach(gcc);
+
+ backlight_instances = eina_list_append(backlight_instances, inst);
+ return gcc;
+}
+
+static void
+_gc_shutdown(E_Gadcon_Client *gcc)
+{
+ Instance *inst;
+
+ inst = gcc->data;
+ if (inst->menu)
+ {
+ e_object_del(E_OBJECT(inst->menu));
+ inst->menu = NULL;
+ }
+ backlight_instances = eina_list_remove(backlight_instances, inst);
+ evas_object_del(inst->o_backlight);
+ _backlight_popup_free(inst);
+ free(inst);
+}
+
+static void
+_gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__)
+{
+ Instance *inst;
+ Evas_Coord mw, mh;
+
+ inst = gcc->data;
+ mw = 0, mh = 0;
+ edje_object_size_min_get(inst->o_backlight, &mw, &mh);
+ if ((mw < 1) || (mh < 1))
+ edje_object_size_min_calc(inst->o_backlight, &mw, &mh);
+ if (mw < 4) mw = 4;
+ if (mh < 4) mh = 4;
+ e_gadcon_client_aspect_set(gcc, mw, mh);
+ e_gadcon_client_min_size_set(gcc, mw, mh);
+}
+
+static char *
+_gc_label(E_Gadcon_Client_Class *client_class __UNUSED__)
+{
+ return _("Backlight");
+}
+
+static Evas_Object *
+_gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas)
+{
+ Evas_Object *o;
+ char buf[4096];
+
+ o = edje_object_add(evas);
+ snprintf(buf, sizeof(buf), "%s/e-module-backlight.edj",
+ e_module_dir_get(backlight_module));
+ edje_object_file_set(o, buf, "icon");
+ return o;
+}
+
+static const char *
+_gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__)
+{
+ return _gadcon_class.name;
+}
+
+/* module setup */
+EAPI E_Module_Api e_modapi =
+{
+ E_MODULE_API_VERSION,
+ "Backlight"
+};
+
+EAPI void *
+e_modapi_init(E_Module *m)
+{
+ backlight_module = m;
+ e_gadcon_provider_register(&_gadcon_class);
+ return m;
+}
+
+EAPI int
+e_modapi_shutdown(E_Module *m __UNUSED__)
+{
+ backlight_module = NULL;
+ e_gadcon_provider_unregister(&_gadcon_class);
+ return 1;
+}
+
+EAPI int
+e_modapi_save(E_Module *m __UNUSED__)
+{
+ return 1;
+}
--- /dev/null
+#ifndef E_MOD_MAIN_H
+#define E_MOD_MAIN_H
+
+EAPI extern E_Module_Api e_modapi;
+
+EAPI void *e_modapi_init (E_Module *m);
+EAPI int e_modapi_shutdown (E_Module *m);
+EAPI int e_modapi_save (E_Module *m);
+
+#endif
--- /dev/null
+[Desktop Entry]
+Type=Link
+Name=Backlight
+Icon=e-module-backlight
+X-Enlightenment-ModuleType=utils
+Comment=Backlight control slider gadget
double suspend_timeout;
double off_timeout;
Eina_List *dpms_list;
+
+ double backlight_normal;
+ double backlight_dim;
+ double backlight_transition;
};
static E_Dialog *dpms_dialog = NULL;
+/* always allow as dmps now has backlight too
static void
_cb_dpms_dialog_ok(void *data __UNUSED__, E_Dialog *dia __UNUSED__)
{
e_object_del(E_OBJECT(dpms_dialog));
dpms_dialog = NULL;
}
+*/
static int
_e_int_config_dpms_capable(void)
{
+ return 1;
+/* always allow as dmps now has backlight too
+ * this all needs to merge with screensaver too into a simple screen blank+
+ * dim+brightness etc. config
if (ecore_x_dpms_capable_get()) return 1;
if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog));
e_dialog_button_focus_num(dpms_dialog, 1);
e_win_centered_set(dpms_dialog->win, 1);
e_dialog_show(dpms_dialog);
+ */
return 0;
}
static int
_e_int_config_dpms_available(void)
{
+ return 1;
+/* always allow as dmps now has backlight too
if (ecore_x_dpms_query()) return 1;
if (dpms_dialog) e_object_del(E_OBJECT(dpms_dialog));
e_win_centered_set(dpms_dialog->win, 1);
e_dialog_show(dpms_dialog);
return 0;
+ */
}
E_Config_Dialog *
cfdata->suspend_timeout = e_config->dpms_suspend_timeout / 60;
cfdata->enable_off = e_config->dpms_off_enable;
cfdata->off_timeout = e_config->dpms_off_timeout / 60;
+ cfdata->backlight_normal = e_config->backlight.normal * 100.0;
+ cfdata->backlight_dim = e_config->backlight.dim * 100.0;
+ cfdata->backlight_transition = e_config->backlight.transition;
}
static void
static void
_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
- eina_list_free(cfdata->dpms_list);
- E_FREE(cfdata);
+ eina_list_free(cfdata->dpms_list);
+ E_FREE(cfdata);
}
static int
e_config->dpms_standby_timeout = cfdata->standby_timeout * 60;
e_config->dpms_suspend_timeout = cfdata->suspend_timeout * 60;
e_config->dpms_off_timeout = cfdata->off_timeout * 60;
-
+
+ e_config->backlight.normal = cfdata->backlight_normal / 100.0;
+ e_config->backlight.dim = cfdata->backlight_dim / 100.0;
+ e_config->backlight.transition = cfdata->backlight_transition;
+
+ e_backlight_mode_set(NULL, E_BACKLIGHT_MODE_NORMAL);
+ e_backlight_level_set(NULL, e_config->backlight.normal, -1.0);
+
e_config_save_queue();
e_dpms_update();
return 1;
(e_config->dpms_off_enable != cfdata->enable_off) ||
(e_config->dpms_standby_timeout / 60 != cfdata->standby_timeout) ||
(e_config->dpms_suspend_timeout / 60 != cfdata->suspend_timeout) ||
- (e_config->dpms_off_timeout / 60 != cfdata->off_timeout);
+ (e_config->dpms_off_timeout / 60 != cfdata->off_timeout) ||
+ (e_config->backlight.normal * 100.0 != cfdata->backlight_normal) ||
+ (e_config->backlight.dim * 100.0 != cfdata->backlight_dim) ||
+ (e_config->backlight.transition != cfdata->backlight_transition);
}
static int
static Evas_Object *
_advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
{
- Evas_Object *o, *of, *ob;
+ Evas_Object *o, *of, *ob, *otb;
Evas_Object *dpms_check;
+ otb = e_widget_toolbook_add(evas, (24 * e_scale), (24 * e_scale));
+
+ /* dpms */
o = e_widget_list_add(evas, 0, 0);
dpms_check = e_widget_check_add(evas, _("Enable Display Power Management"),
_list_disabled_state_apply(cfdata->dpms_list, !cfdata->enable_dpms);
e_widget_list_object_append(o, of, 1, 1, 0.5);
- return o;
+
+ e_widget_toolbook_page_append(otb, NULL, _("DPMS"), o,
+ 1, 0, 1, 0, 0.5, 0.0);
+
+ o = e_widget_list_add(evas, 0, 0);
+
+ ob = e_widget_label_add(evas, _("Normal Backlight"));
+ e_widget_list_object_append(o, ob, 1, 1, 0.5);
+ ob = e_widget_slider_add(evas, 1, 0, _("%3.0f"), 0.0, 100.0, 1.0, 0,
+ &(cfdata->backlight_normal), NULL, 100);
+ e_widget_list_object_append(o, ob, 1, 1, 0.5);
+
+ ob = e_widget_label_add(evas, _("Dim Backlight"));
+ e_widget_list_object_append(o, ob, 1, 1, 0.5);
+ ob = e_widget_slider_add(evas, 1, 0, _("%3.0f"), 0.0, 100.0, 1.0, 0,
+ &(cfdata->backlight_dim), NULL, 100);
+ e_widget_list_object_append(o, ob, 1, 1, 0.5);
+
+ ob = e_widget_label_add(evas, _("Fade Time"));
+ e_widget_list_object_append(o, ob, 1, 1, 0.5);
+ ob = e_widget_slider_add(evas, 1, 0, _("%1.1f sec"), 0.0, 5.0, 0.1, 0,
+ &(cfdata->backlight_transition), NULL, 100);
+ e_widget_list_object_append(o, ob, 1, 1, 0.5);
+
+ e_widget_toolbook_page_append(otb, NULL, _("Backlight"), o,
+ 1, 0, 1, 0, 0.5, 0.0);
+
+ e_widget_toolbook_page_show(otb, 0);
+
+ return otb;
}
/* general functionality/callbacks */