diff --git a/configure.ac b/configure.ac index 4f9f0c10f..95e97b2bc 100644 --- a/configure.ac +++ b/configure.ac @@ -711,6 +711,7 @@ AC_E_OPTIONAL_MODULE([everything], true) 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="" @@ -856,6 +857,8 @@ src/modules/comp/Makefile 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 diff --git a/data/themes/default.edc b/data/themes/default.edc index 0f0609e46..35a8e638f 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -11882,10 +11882,30 @@ collections { } +///////////////////////////////////////////////////////////////////////////// +/*** 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; diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am index 2e55c21bb..b9b20cefd 100644 --- a/data/themes/images/Makefile.am +++ b/data/themes/images/Makefile.am @@ -453,4 +453,5 @@ flip_pmb.png \ flip_pmt.png \ flip_shad.png \ flip_t.png \ -flip_colon.png +flip_colon.png \ +bulb.png diff --git a/data/themes/images/bulb.png b/data/themes/images/bulb.png new file mode 100644 index 000000000..105a7431f Binary files /dev/null and b/data/themes/images/bulb.png differ diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 872792bfb..21cadf276 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -37,6 +37,7 @@ e_acpi.h \ e_actions.h \ e_alert.h \ e_atoms.h \ +e_backlight.h \ e_bg.h \ e_bindings.h \ e_border.h \ @@ -184,6 +185,7 @@ e_acpi.c \ e_actions.c \ e_alert.c \ e_atoms.c \ +e_backlight.c \ e_bg.c \ e_bindings.c \ e_border.c \ diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c index 1a5eced35..4759c5299 100644 --- a/src/bin/e_actions.c +++ b/src/bin/e_actions.c @@ -1237,14 +1237,13 @@ _e_actions_zone_get(E_Object *obj) { 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()); } @@ -2635,12 +2634,30 @@ ACT_FN_END_MOUSE(delayed_action, ) 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 */ @@ -2933,6 +2950,29 @@ e_actions_init(void) "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"), @@ -3077,14 +3117,6 @@ e_actions_init(void) 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; } diff --git a/src/bin/e_backlight.c b/src/bin/e_backlight.c new file mode 100644 index 000000000..fb6ae3141 --- /dev/null +++ b/src/bin/e_backlight.c @@ -0,0 +1,373 @@ +#include "e.h" +#include +#include + +// 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; +} diff --git a/src/bin/e_backlight.h b/src/bin/e_backlight.h new file mode 100644 index 000000000..848a17fcf --- /dev/null +++ b/src/bin/e_backlight.h @@ -0,0 +1,36 @@ +#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 diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 88594dae9..ab8a5196f 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -906,6 +906,10 @@ e_config_init(void) 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(); diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 8fe1a4633..9454f156f 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -343,6 +343,12 @@ struct _E_Config unsigned char null_container_win; Eina_List *env_vars; + + struct { + double normal; + double dim; + double transition; + } backlight; }; struct _E_Config_Env_Var diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 82460a18f..5666b605f 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -138,3 +138,4 @@ #include "e_widget_toolbook.h" #include "e_acpi.h" #include "e_env.h" +#include "e_backlight.h" diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 3993e8263..eab79bac2 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -959,6 +959,16 @@ main(int argc, char **argv) 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 */ diff --git a/src/bin/e_widget_slider.c b/src/bin/e_widget_slider.c index 39be27afb..b16d886b4 100644 --- a/src/bin/e_widget_slider.c +++ b/src/bin/e_widget_slider.c @@ -223,6 +223,7 @@ _e_wid_cb_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UN 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 diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index fb2c93737..c9585f871 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -175,3 +175,6 @@ if USE_MODULE_SHOT SUBDIRS += shot endif +if USE_MODULE_BACKLIGHT +SUBDIRS += backlight +endif diff --git a/src/modules/backlight/.cvsignore b/src/modules/backlight/.cvsignore new file mode 100644 index 000000000..06d064a84 --- /dev/null +++ b/src/modules/backlight/.cvsignore @@ -0,0 +1,7 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +module.la +module.desktop diff --git a/src/modules/backlight/Makefile.am b/src/modules/backlight/Makefile.am new file mode 100644 index 000000000..6c994b88b --- /dev/null +++ b/src/modules/backlight/Makefile.am @@ -0,0 +1,28 @@ +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) diff --git a/src/modules/backlight/e-module-backlight.edj b/src/modules/backlight/e-module-backlight.edj new file mode 100644 index 000000000..c16263fee Binary files /dev/null and b/src/modules/backlight/e-module-backlight.edj differ diff --git a/src/modules/backlight/e_mod_main.c b/src/modules/backlight/e_mod_main.c new file mode 100644 index 000000000..0a82265af --- /dev/null +++ b/src/modules/backlight/e_mod_main.c @@ -0,0 +1,283 @@ +#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; +} diff --git a/src/modules/backlight/e_mod_main.h b/src/modules/backlight/e_mod_main.h new file mode 100644 index 000000000..4adf2f1fb --- /dev/null +++ b/src/modules/backlight/e_mod_main.h @@ -0,0 +1,10 @@ +#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 diff --git a/src/modules/backlight/module.desktop.in b/src/modules/backlight/module.desktop.in new file mode 100644 index 000000000..8eb04ef30 --- /dev/null +++ b/src/modules/backlight/module.desktop.in @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Link +Name=Backlight +Icon=e-module-backlight +X-Enlightenment-ModuleType=utils +Comment=Backlight control slider gadget diff --git a/src/modules/conf_display/e_int_config_dpms.c b/src/modules/conf_display/e_int_config_dpms.c index bebf01767..4d9995c8d 100644 --- a/src/modules/conf_display/e_int_config_dpms.c +++ b/src/modules/conf_display/e_int_config_dpms.c @@ -36,20 +36,30 @@ struct _E_Config_Dialog_Data 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)); @@ -65,12 +75,15 @@ _e_int_config_dpms_capable(void) 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)); @@ -87,6 +100,7 @@ _e_int_config_dpms_available(void) e_win_centered_set(dpms_dialog->win, 1); e_dialog_show(dpms_dialog); return 0; + */ } E_Config_Dialog * @@ -125,6 +139,9 @@ _fill_data(E_Config_Dialog_Data *cfdata) 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 @@ -156,8 +173,8 @@ _create_data(E_Config_Dialog *cfd) 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 @@ -171,7 +188,14 @@ _apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 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; @@ -187,7 +211,10 @@ _advanced_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *c (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 @@ -200,9 +227,12 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) 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"), @@ -253,7 +283,36 @@ _advanced_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_D _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 */