On Thu, 15 Aug 2013 08:40:36 -0300 Gustavo Sverzut Barbieri
<[email protected]> said:

> Raster, heads up here that you can use eldbus_proxy that will make your life
> easier writing these things.
> 
> For instance you can manage all the pending call lifetime to the object and
> proxy, if you delete it (unref) it would do for all pending methods, signal
> handlers, etc
> 
> It may be new to you, but check the examples or my code to upower/systemd
> uses it as well.

i saw some of the proxy use - i wasn't sure why i needed it actually. i didn't
use any pending handles so it turned out for that bit of code, it's not needed.

btw... i put this in e right now, BUT... i totally expect that ecore may get
these features, so the code can be pasted in when we decie just how it will
look like. i just wanted to do some work to support systemd etc. :) this was a
simple/easy place/thing to do. :)

> --Gustavo
> 
> Sent from my iPhone
> 
> On 15/08/2013, at 07:10, Carsten Haitzler (Rasterman) - Enlightenment Git
> <[email protected]> wrote:
> 
> > raster pushed a commit to branch master.
> > 
> > commit ea88d880a785ed83b470e5e7b9e973edafa8d6bb
> > Author: Carsten Haitzler (Rasterman) <[email protected]>
> > Date:   Thu Aug 15 19:09:33 2013 +0900
> > 
> >    add systemd support to e_sys for shutdown/reboot/suspend/hibernate
> > ---
> > src/bin/e_sys.c | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> > +--- 1 file changed, 197 insertions(+), 11 deletions(-)
> > 
> > diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c
> > index 1966717..d6cd060 100644
> > --- a/src/bin/e_sys.c
> > +++ b/src/bin/e_sys.c
> > @@ -42,9 +42,20 @@ static void (*_e_sys_shutdown_func)(void) = NULL;
> > static void (*_e_sys_logout_func)(void) = NULL;
> > static void (*_e_sys_resume_func)(void) = NULL;
> > 
> > +static void _e_sys_systemd_handle_inhibit(void);
> > +static void _e_sys_systemd_works_check(void);
> > +static void _e_sys_systemd_poweroff(void);
> > +static void _e_sys_systemd_reboot(void);
> > +static void _e_sys_systemd_suspend(void);
> > +static void _e_sys_systemd_hibernate(void);
> > +
> > +static Eina_Bool systemd_works = EINA_FALSE;
> > +
> > static const int E_LOGOUT_AUTO_TIME = 60;
> > static const int E_LOGOUT_WAIT_TIME = 15;
> > 
> > +static Eldbus_Connection *conn = NULL;
> > +
> > EAPI int E_EVENT_SYS_SUSPEND = -1;
> > EAPI int E_EVENT_SYS_HIBERNATE = -1;
> > EAPI int E_EVENT_SYS_RESUME = -1;
> > @@ -53,14 +64,17 @@ EAPI int E_EVENT_SYS_RESUME = -1;
> > EINTERN int
> > e_sys_init(void)
> > {
> > +   eldbus_init();
> > +   conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
> > +   _e_sys_systemd_handle_inhibit();
> > +   
> >    E_EVENT_SYS_SUSPEND = ecore_event_type_new();
> >    E_EVENT_SYS_HIBERNATE = ecore_event_type_new();
> >    E_EVENT_SYS_RESUME = ecore_event_type_new();
> >    /* this is not optimal - but it does work cleanly */
> >    _e_sys_exe_exit_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
> >                                                      _e_sys_cb_exit, NULL);
> > -   /* delay this for 1.0 seconds while the rest of e starts up */
> > -   ecore_timer_add(1.0, _e_sys_cb_timer, NULL);
> > +   _e_sys_systemd_works_check();
> >    return 1;
> > }
> > 
> > @@ -74,6 +88,9 @@ e_sys_shutdown(void)
> >    _e_sys_reboot_check_exe = NULL;
> >    _e_sys_suspend_check_exe = NULL;
> >    _e_sys_hibernate_check_exe = NULL;
> > +   if (conn) eldbus_connection_unref(conn);
> > +   conn = NULL;
> > +   eldbus_shutdown();
> >    return 1;
> > }
> > 
> > @@ -253,6 +270,126 @@ e_sys_handlers_set(void (*suspend_func)(void),
> >    _e_sys_resume_func = resume_func;
> > }
> > 
> > +static Eldbus_Message *
> > +_e_sys_systemd_login_manager_msg(const char *method)
> > +{
> > +   return eldbus_message_method_call_new("org.freedesktop.login1",
> > +                                      "/org/freedesktop/login1",
> > +                                      "org.freedesktop.login1.Manager",
> > +                                      method);
> > +}
> > +
> > +static void
> > +_e_sys_systemd_handle_inhibit(void)
> > +{
> > +   Eldbus_Message *m;
> > +   
> > +   if (!conn) return;
> > +   if (!(m = _e_sys_systemd_login_manager_msg("Inhibit"))) return;
> > +   eldbus_message_arguments_append
> > +     (m, "ssss",
> > +         "handle-power-key:"
> > +         "handle-suspend-key:"
> > +         "handle-hibernate-key:"
> > +         "handle-lid-switch", // what
> > +         "Enlightenment", // who (string)
> > +         "Normal Execution", // why (string)
> > +         "block");
> > +   eldbus_connection_send(conn, m, NULL, NULL, -1);
> > +}
> > +
> > +static void
> > +_e_sys_systemd_check_cb(void *data, const Eldbus_Message *m,
> > Eldbus_Pending *p __UNUSED__) +{
> > +   int *dest = data;
> > +   char *s = NULL;
> > +   if (!eldbus_message_arguments_get(m, "s", &s)) return;
> > +   if (!s) return;
> > +   if (!strcmp(s, "yes")) *dest = 1;
> > +   else *dest = 1;
> > +}
> > +
> > +static void
> > +_e_sys_systemd_check(void)
> > +{
> > +   Eldbus_Message *m;
> > +   
> > +   if (!conn) return;
> > +   if (!(m = _e_sys_systemd_login_manager_msg("CanPowerOff"))) return;
> > +   eldbus_connection_send(conn, m, _e_sys_systemd_check_cb,
> > &_e_sys_can_halt, -1);
> > +   if (!(m = _e_sys_systemd_login_manager_msg("CanReboot"))) return;
> > +   eldbus_connection_send(conn, m, _e_sys_systemd_check_cb,
> > &_e_sys_can_reboot, -1);
> > +   if (!(m = _e_sys_systemd_login_manager_msg("CanSuspend"))) return;
> > +   eldbus_connection_send(conn, m, _e_sys_systemd_check_cb,
> > &_e_sys_can_suspend, -1);
> > +   if (!(m = _e_sys_systemd_login_manager_msg("CanHibernate"))) return;
> > +   eldbus_connection_send(conn, m, _e_sys_systemd_check_cb,
> > &_e_sys_can_hibernate, -1); +}
> > +
> > +static void
> > +_e_sys_systemd_exists_cb(void *data __UNUSED__, const Eldbus_Message *m,
> > Eldbus_Pending *p __UNUSED__) +{
> > +   const char *id = NULL;
> > +   
> > +   if (eldbus_message_error_get(m, NULL, NULL)) goto fail;
> > +   if (!eldbus_message_arguments_get(m, "s", &id)) goto fail;
> > +   if ((!id) || (id[0] != ':')) goto fail;
> > +   systemd_works = EINA_TRUE;
> > +   _e_sys_systemd_check();
> > +   return;
> > +fail:
> > +   systemd_works = EINA_FALSE;
> > +   /* delay this for 1.0 seconds while the rest of e starts up */
> > +   ecore_timer_add(1.0, _e_sys_cb_timer, NULL);
> > +}
> > +
> > +static void
> > +_e_sys_systemd_works_check(void)
> > +{
> > +   if (!conn)
> > +     {
> > +        /* delay this for 1.0 seconds while the rest of e starts up */
> > +        ecore_timer_add(1.0, _e_sys_cb_timer, NULL);
> > +        return;
> > +     }
> > +   eldbus_name_owner_get(conn, "org.freedesktop.login1",
> > +                         _e_sys_systemd_exists_cb, NULL);
> > +}
> > +
> > +static void
> > +_e_sys_systemd_login_manager_power_call(const char *method)
> > +{
> > +   Eldbus_Message *m;
> > +   
> > +   if (!conn) return;
> > +   if (!(m = _e_sys_systemd_login_manager_msg(method))) return;
> > +   eldbus_message_arguments_append(m, "b", 0);
> > +   eldbus_connection_send(conn, m, NULL, NULL, -1);
> > +}
> > +
> > +static void
> > +_e_sys_systemd_poweroff(void)
> > +{
> > +   _e_sys_systemd_login_manager_power_call("PowerOff");
> > +}
> > +
> > +static void
> > +_e_sys_systemd_reboot(void)
> > +{
> > +   _e_sys_systemd_login_manager_power_call("Reboot");
> > +}
> > +
> > +static void
> > +_e_sys_systemd_suspend(void)
> > +{
> > +   _e_sys_systemd_login_manager_power_call("Suspend");
> > +}
> > +
> > +static void
> > +_e_sys_systemd_hibernate(void)
> > +{
> > +   _e_sys_systemd_login_manager_power_call("Hibernate");
> > +}
> > +
> > static Eina_Bool
> > _e_sys_susp_hib_check_timer_cb(void *data __UNUSED__)
> > {
> > @@ -668,6 +805,7 @@ _e_sys_action_do(E_Sys_Action a, char *param
> > __UNUSED__, Eina_Bool raw) {
> >    char buf[PATH_MAX];
> >    E_Obj_Dialog *od;
> > +   int ret = 0;
> > 
> >    switch (a)
> >      {
> > @@ -733,7 +871,13 @@ _e_sys_action_do(E_Sys_Action a, char *param
> > __UNUSED__, Eina_Bool raw) if (raw)
> >                {
> >                   _e_sys_begin_time = ecore_time_get();
> > -                  _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                  if (systemd_works)
> > +                    _e_sys_systemd_poweroff();
> > +                  else
> > +                    {
> > +                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       ret = 1;
> > +                    }
> >                }
> >              else
> >                {
> > @@ -745,7 +889,13 @@ _e_sys_action_do(E_Sys_Action a, char *param
> > __UNUSED__, Eina_Bool raw) else
> >                     {
> >                        _e_sys_begin_time = ecore_time_get();
> > -                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       if (systemd_works)
> > +                         _e_sys_systemd_hibernate();
> > +                       else
> > +                         {
> > +                            _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                            ret = 1;
> > +                         }
> >                        od = e_obj_dialog_new(e_container_current_get
> > (e_manager_current_get()), _("Power off"), "E", "_sys_halt");
> >                        e_obj_dialog_obj_theme_set(od, "base/theme/sys",
> > "e/sys/halt"); @@ -780,7 +930,13 @@ _e_sys_action_do(E_Sys_Action a, char
> > *param __UNUSED__, Eina_Bool raw) if (raw)
> >                {
> >                   _e_sys_begin_time = ecore_time_get();
> > -                  _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                  if (systemd_works)
> > +                    _e_sys_systemd_reboot();
> > +                  else
> > +                    {
> > +                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       ret = 1;
> > +                    }
> >                }
> >              else
> >                {
> > @@ -792,7 +948,13 @@ _e_sys_action_do(E_Sys_Action a, char *param
> > __UNUSED__, Eina_Bool raw) else
> >                     {
> >                        _e_sys_begin_time = ecore_time_get();
> > -                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       if (systemd_works)
> > +                         _e_sys_systemd_reboot();
> > +                       else
> > +                         {
> > +                            _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                            ret = 1;
> > +                         }
> >                        od = e_obj_dialog_new(e_container_current_get
> > (e_manager_current_get()), _("Resetting"), "E", "_sys_reboot");
> >                        e_obj_dialog_obj_theme_set(od, "base/theme/sys",
> > "e/sys/reboot"); @@ -829,7 +991,13 @@ _e_sys_action_do(E_Sys_Action a, char
> > *param __UNUSED__, Eina_Bool raw) if (e_config->desklock_on_suspend)
> >                     e_desklock_show(EINA_TRUE);
> >                   _e_sys_begin_time = ecore_time_get();
> > -                  _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                  if (systemd_works)
> > +                    _e_sys_systemd_suspend();
> > +                  else
> > +                    {
> > +                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       ret = 1;
> > +                    }
> >                }
> >              else
> >                {
> > @@ -847,7 +1015,13 @@ _e_sys_action_do(E_Sys_Action a, char *param
> > __UNUSED__, Eina_Bool raw) _e_sys_susp_hib_check();
> > 
> >                        _e_sys_begin_time = ecore_time_get();
> > -                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       if (systemd_works)
> > +                         _e_sys_systemd_suspend();
> > +                       else
> > +                         {
> > +                            _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                            ret = 1;
> > +                         }
> >                        od = e_obj_dialog_new(e_container_current_get
> > (e_manager_current_get()), _("Suspending"), "E", "_sys_suspend");
> >                        e_obj_dialog_obj_theme_set(od, "base/theme/sys",
> > "e/sys/suspend"); @@ -884,7 +1058,13 @@ _e_sys_action_do(E_Sys_Action a,
> > char *param __UNUSED__, Eina_Bool raw) if (e_config->desklock_on_suspend)
> >                     e_desklock_show(EINA_TRUE);
> >                   _e_sys_begin_time = ecore_time_get();
> > -                  _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                  if (systemd_works)
> > +                    _e_sys_systemd_hibernate();
> > +                  else
> > +                    {
> > +                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       ret = 1;
> > +                    }
> >                }
> >              else
> >                {
> > @@ -902,7 +1082,13 @@ _e_sys_action_do(E_Sys_Action a, char *param
> > __UNUSED__, Eina_Bool raw) _e_sys_susp_hib_check();
> > 
> >                        _e_sys_begin_time = ecore_time_get();
> > -                       _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                       if (systemd_works)
> > +                         _e_sys_systemd_hibernate();
> > +                       else
> > +                         {
> > +                            _e_sys_exe = ecore_exe_run(buf, NULL);
> > +                            ret = 1;
> > +                         }
> >                        od = e_obj_dialog_new(e_container_current_get
> > (e_manager_current_get()), _("Hibernating"), "E", "_sys_hibernate");
> >                        e_obj_dialog_obj_theme_set(od, "base/theme/sys",
> > "e/sys/hibernate"); @@ -923,7 +1109,7 @@ _e_sys_action_do(E_Sys_Action a,
> > char *param __UNUSED__, Eina_Bool raw) default:
> >         return 0;
> >      }
> > -   return 1;
> > +   return ret;
> > }
> > 
> > static void
> > 
> > -- 
> > 
> > ------------------------------------------------------------------------------
> > Get 100% visibility into Java/.NET code with AppDynamics Lite!
> > It's a free troubleshooting tool designed for production.
> > Get down to code-level detail for bottlenecks, with <2% overhead. 
> > Download for free and get started troubleshooting in minutes. 
> > http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
> 
> ------------------------------------------------------------------------------
> Get 100% visibility into Java/.NET code with AppDynamics Lite!
> It's a free troubleshooting tool designed for production.
> Get down to code-level detail for bottlenecks, with <2% overhead. 
> Download for free and get started troubleshooting in minutes. 
> http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
> _______________________________________________
> enlightenment-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [email protected]


------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to