57
68
#define XFPM_MANAGER_GET_PRIVATE(o) \
58
69
(G_TYPE_INSTANCE_GET_PRIVATE((o), XFPM_TYPE_MANAGER, XfpmManagerPrivate))
71
#define SLEEP_KEY_TIMEOUT 6.0f
60
73
struct XfpmManagerPrivate
75
DBusGConnection *session_bus;
82
XfpmBacklight *backlight;
83
XfpmConsoleKit *console;
65
84
XfpmDBusMonitor *monitor;
67
DBusGConnection *session_bus;
95
gboolean session_managed;
70
G_DEFINE_TYPE(XfpmManager, xfpm_manager, G_TYPE_OBJECT)
73
xfpm_manager_hal_connection_changed_cb (XfpmDBusMonitor *monitor, gboolean connected, XfpmManager *manager)
75
TRACE("connected = %s", xfpm_bool_to_string (connected));
77
if ( connected == TRUE )
79
if ( manager->priv->engine == NULL)
81
manager->priv->engine = xfpm_engine_new ();
85
xfpm_engine_reload_hal_objects (manager->priv->engine);
91
xfpm_manager_system_bus_connection_changed_cb (XfpmDBusMonitor *monitor, gboolean connected, XfpmManager *manager)
93
if ( connected == TRUE )
95
TRACE ("System bus connection changed to TRUE, restarting the power manager");
96
xfpm_manager_quit (manager);
97
g_spawn_command_line_async ("xfce4-power-manager", NULL);
102
xfpm_manager_session_die_cb (XfpmSession *session, XfpmManager *manager)
104
TRACE ("Session die signal, exiting");
105
xfpm_manager_quit (manager);
98
G_DEFINE_TYPE (XfpmManager, xfpm_manager, G_TYPE_OBJECT)
109
101
xfpm_manager_class_init (XfpmManagerClass *klass)
190
188
"org.freedesktop.PowerManagement") )
192
190
g_warning ("Unable to reserve bus name: Maybe any already running instance?\n");
193
xfpm_session_quit (manager->priv->session);
194
192
g_object_unref (G_OBJECT (manager));
195
193
gtk_main_quit ();
201
xfpm_manager_shutdown (XfpmManager *manager)
203
GError *error = NULL;
204
xfpm_console_kit_shutdown (manager->priv->console, &error );
208
g_warning ("Failed to shutdown the system : %s", error->message);
209
g_error_free (error);
210
/* Try with the session then */
211
if ( manager->priv->session_managed )
212
xfce_sm_client_request_shutdown (manager->priv->client, XFCE_SM_CLIENT_SHUTDOWN_HINT_HALT);
217
xfpm_manager_ask_shutdown (XfpmManager *manager)
219
if ( manager->priv->session_managed )
220
xfce_sm_client_request_shutdown (manager->priv->client, XFCE_SM_CLIENT_SHUTDOWN_HINT_ASK);
224
xfpm_manager_sleep_request (XfpmManager *manager, XfpmShutdownRequest req, gboolean force)
228
case XFPM_DO_NOTHING:
230
case XFPM_DO_SUSPEND:
231
xfpm_power_suspend (manager->priv->power, force);
233
case XFPM_DO_HIBERNATE:
234
xfpm_power_hibernate (manager->priv->power, force);
236
case XFPM_DO_SHUTDOWN:
237
xfpm_manager_shutdown (manager);
240
xfpm_manager_ask_shutdown (manager);
243
g_warn_if_reached ();
249
xfpm_manager_reset_sleep_timer (XfpmManager *manager)
251
g_timer_reset (manager->priv->timer);
255
xfpm_manager_button_pressed_cb (XfpmButton *bt, XfpmButtonKey type, XfpmManager *manager)
257
XfpmShutdownRequest req = XFPM_DO_NOTHING;
259
XFPM_DEBUG_ENUM (type, XFPM_TYPE_BUTTON_KEY, "Received button press event");
261
if ( type == BUTTON_MON_BRIGHTNESS_DOWN || type == BUTTON_MON_BRIGHTNESS_UP )
264
if ( type == BUTTON_POWER_OFF )
266
g_object_get (G_OBJECT (manager->priv->conf),
267
POWER_SWITCH_CFG, &req,
270
else if ( type == BUTTON_SLEEP )
272
g_object_get (G_OBJECT (manager->priv->conf),
273
SLEEP_SWITCH_CFG, &req,
276
else if ( type == BUTTON_HIBERNATE )
278
g_object_get (G_OBJECT (manager->priv->conf),
279
HIBERNATE_SWITCH_CFG, &req,
284
g_return_if_reached ();
287
XFPM_DEBUG_ENUM (req, XFPM_TYPE_SHUTDOWN_REQUEST, "Shutdown request : ");
289
if ( req == XFPM_ASK )
290
xfpm_manager_ask_shutdown (manager);
293
if ( g_timer_elapsed (manager->priv->timer, NULL) > SLEEP_KEY_TIMEOUT )
295
g_timer_reset (manager->priv->timer);
296
xfpm_manager_sleep_request (manager, req, FALSE);
302
xfpm_manager_lid_changed_cb (XfpmPower *power, gboolean lid_is_closed, XfpmManager *manager)
304
XfpmLidTriggerAction action;
307
g_object_get (G_OBJECT (power),
308
"on-battery", &on_battery,
311
g_object_get (G_OBJECT (manager->priv->conf),
312
on_battery ? LID_SWITCH_ON_BATTERY_CFG : LID_SWITCH_ON_AC_CFG, &action,
317
XFPM_DEBUG_ENUM (action, XFPM_TYPE_LID_TRIGGER_ACTION, "LID close event");
319
if ( action == LID_TRIGGER_NOTHING )
321
if ( !xfpm_is_multihead_connected () )
322
xfpm_dpms_force_level (manager->priv->dpms, DPMSModeOff);
324
else if ( action == LID_TRIGGER_LOCK_SCREEN )
326
if ( !xfpm_is_multihead_connected () )
332
* Force sleep here as lid is closed and no point of asking the
333
* user for confirmation in case of an application is inhibiting
336
xfpm_manager_sleep_request (manager, action, TRUE);
342
XFPM_DEBUG_ENUM (action, XFPM_TYPE_LID_TRIGGER_ACTION, "LID opened");
343
xfpm_dpms_force_level (manager->priv->dpms, DPMSModeOn);
348
xfpm_manager_inhibit_changed_cb (XfpmInhibit *inhibit, gboolean inhibited, XfpmManager *manager)
350
manager->priv->inhibited = inhibited;
354
xfpm_manager_alarm_timeout_cb (EggIdletime *idle, guint id, XfpmManager *manager)
356
XFPM_DEBUG ("Alarm inactivity timeout id %d", id);
358
if ( id == TIMEOUT_INACTIVITY_ON_AC || id == TIMEOUT_INACTIVITY_ON_BATTERY )
360
XfpmShutdownRequest req = XFPM_DO_NOTHING;
364
if ( manager->priv->inhibited )
366
XFPM_DEBUG ("Idle sleep alarm timeout, but power manager is currently inhibited, action ignored");
370
g_object_get (G_OBJECT (manager->priv->conf),
371
INACTIVITY_SLEEP_MODE, &sleep_mode,
374
g_object_get (G_OBJECT (manager->priv->power),
375
"on-battery", &on_battery,
378
if ( !g_strcmp0 (sleep_mode, "Suspend") )
379
req = XFPM_DO_SUSPEND;
381
req = XFPM_DO_HIBERNATE;
385
if ( id == TIMEOUT_INACTIVITY_ON_AC && on_battery == FALSE )
386
xfpm_manager_sleep_request (manager, req, FALSE);
387
else if ( id == TIMEOUT_INACTIVITY_ON_BATTERY && on_battery )
388
xfpm_manager_sleep_request (manager, req, FALSE);
393
xfpm_manager_set_idle_alarm_on_ac (XfpmManager *manager)
397
g_object_get (G_OBJECT (manager->priv->conf),
398
ON_AC_INACTIVITY_TIMEOUT, &on_ac,
403
TRACE ("setting inactivity sleep timeout on ac to never");
405
TRACE ("setting inactivity sleep timeout on ac to %d", on_ac);
410
egg_idletime_alarm_remove (manager->priv->idle, TIMEOUT_INACTIVITY_ON_AC );
414
egg_idletime_alarm_set (manager->priv->idle, TIMEOUT_INACTIVITY_ON_AC, on_ac * 1000 * 60);
419
xfpm_manager_set_idle_alarm_on_battery (XfpmManager *manager)
423
g_object_get (G_OBJECT (manager->priv->conf),
424
ON_BATTERY_INACTIVITY_TIMEOUT, &on_battery,
428
if ( on_battery == 14 )
429
TRACE ("setting inactivity sleep timeout on battery to never");
431
TRACE ("setting inactivity sleep timeout on battery to %d", on_battery);
434
if ( on_battery == 14 )
436
egg_idletime_alarm_remove (manager->priv->idle, TIMEOUT_INACTIVITY_ON_BATTERY );
440
egg_idletime_alarm_set (manager->priv->idle, TIMEOUT_INACTIVITY_ON_BATTERY, on_battery * 1000 * 60);
445
xfpm_manager_on_battery_changed_cb (XfpmPower *power, gboolean on_battery, XfpmManager *manager)
447
egg_idletime_alarm_reset_all (manager->priv->idle);
451
xfpm_manager_set_idle_alarm (XfpmManager *manager)
453
xfpm_manager_set_idle_alarm_on_ac (manager);
454
xfpm_manager_set_idle_alarm_on_battery (manager);
202
xfpm_manager_new (DBusGConnection *bus)
459
xfpm_manager_new (DBusGConnection *bus, const gchar *client_id)
204
461
XfpmManager *manager = NULL;
205
manager = g_object_new(XFPM_TYPE_MANAGER,NULL);
462
GError *error = NULL;
465
const gchar *restart_command[] =
467
"xfce4-power-manager",
472
manager = g_object_new (XFPM_TYPE_MANAGER, NULL);
207
474
manager->priv->session_bus = bus;
209
xfpm_manager_dbus_class_init (XFPM_MANAGER_GET_CLASS(manager));
476
current_dir = g_get_current_dir ();
477
manager->priv->client = xfce_sm_client_get_full (XFCE_SM_CLIENT_RESTART_NORMAL,
478
XFCE_SM_CLIENT_PRIORITY_DEFAULT,
482
SYSCONFDIR "/xdg/autostart/" PACKAGE_NAME ".desktop");
484
g_free (current_dir);
486
manager->priv->session_managed = xfce_sm_client_connect (manager->priv->client, &error);
490
g_warning ("Unable to connect to session managet : %s", error->message);
491
g_error_free (error);
495
g_signal_connect_swapped (manager->priv->client, "quit",
496
G_CALLBACK (xfpm_manager_quit), manager);
499
xfpm_manager_dbus_class_init (XFPM_MANAGER_GET_CLASS (manager));
210
500
xfpm_manager_dbus_init (manager);
224
512
XFPM_TYPE_ERROR);
226
hal_running = xfpm_dbus_monitor_hal_connected (manager->priv->monitor);
230
xfpm_error (_("Xfce power manager"), _("HAL daemon is not running"));
233
manager->priv->engine = xfpm_engine_new ();
514
manager->priv->power = xfpm_power_get ();
515
manager->priv->button = xfpm_button_new ();
516
manager->priv->conf = xfpm_xfconf_new ();
517
manager->priv->console = xfpm_console_kit_new ();
518
manager->priv->monitor = xfpm_dbus_monitor_new ();
519
manager->priv->disks = xfpm_disks_new ();
520
manager->priv->inhibit = xfpm_inhibit_new ();
521
manager->priv->idle = egg_idletime_new ();
523
g_signal_connect (manager->priv->idle, "alarm-expired",
524
G_CALLBACK (xfpm_manager_alarm_timeout_cb), manager);
526
g_signal_connect (manager->priv->conf, "notify::" ON_AC_INACTIVITY_TIMEOUT,
527
G_CALLBACK (xfpm_manager_set_idle_alarm_on_ac), manager);
529
g_signal_connect (manager->priv->conf, "notify::" ON_BATTERY_INACTIVITY_TIMEOUT,
530
G_CALLBACK (xfpm_manager_set_idle_alarm_on_battery), manager);
532
xfpm_manager_set_idle_alarm (manager);
534
g_signal_connect (manager->priv->inhibit, "has-inhibit-changed",
535
G_CALLBACK (xfpm_manager_inhibit_changed_cb), manager);
537
g_signal_connect (manager->priv->monitor, "system-bus-connection-changed",
538
G_CALLBACK (xfpm_manager_system_bus_connection_changed_cb), manager);
540
manager->priv->backlight = xfpm_backlight_new ();
543
manager->priv->dpms = xfpm_dpms_new ();
546
g_signal_connect (manager->priv->button, "button_pressed",
547
G_CALLBACK (xfpm_manager_button_pressed_cb), manager);
549
g_signal_connect (manager->priv->power, "lid-changed",
550
G_CALLBACK (xfpm_manager_lid_changed_cb), manager);
552
g_signal_connect (manager->priv->power, "on-battery-changed",
553
G_CALLBACK (xfpm_manager_on_battery_changed_cb), manager);
555
g_signal_connect_swapped (manager->priv->power, "waking-up",
556
G_CALLBACK (xfpm_manager_reset_sleep_timer), manager);
558
g_signal_connect_swapped (manager->priv->power, "sleeping",
559
G_CALLBACK (xfpm_manager_reset_sleep_timer), manager);
561
g_signal_connect_swapped (manager->priv->power, "ask-shutdown",
562
G_CALLBACK (xfpm_manager_ask_shutdown), manager);
564
g_signal_connect_swapped (manager->priv->power, "shutdown",
565
G_CALLBACK (xfpm_manager_shutdown), manager);
239
571
void xfpm_manager_stop (XfpmManager *manager)
573
XFPM_DEBUG ("Stopping");
242
574
g_return_if_fail (XFPM_IS_MANAGER (manager));
243
575
xfpm_manager_quit (manager);
578
GHashTable *xfpm_manager_get_config (XfpmManager *manager)
582
guint8 mapped_buttons;
583
gboolean auth_hibernate = FALSE;
584
gboolean auth_suspend = FALSE;
585
gboolean can_suspend = FALSE;
586
gboolean can_hibernate = FALSE;
587
gboolean has_sleep_button = FALSE;
588
gboolean has_hibernate_button = FALSE;
589
gboolean has_power_button = FALSE;
590
gboolean has_battery = TRUE;
591
gboolean has_lcd_brightness = TRUE;
592
gboolean can_shutdown = TRUE;
593
gboolean has_lid = FALSE;
594
gboolean can_spin = FALSE;
595
gboolean devkit_disk = FALSE;
597
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
599
g_object_get (G_OBJECT (manager->priv->console),
600
"can-shutdown", &can_shutdown,
603
g_object_get (G_OBJECT (manager->priv->power),
604
"auth-suspend", &auth_suspend,
605
"auth-hibernate", &auth_hibernate,
606
"can-suspend", &can_suspend,
607
"can-hibernate", &can_hibernate,
611
can_spin = xfpm_disks_get_can_spin (manager->priv->disks);
612
devkit_disk = xfpm_disks_kit_is_running (manager->priv->disks);
614
has_battery = xfpm_power_has_battery (manager->priv->power);
615
has_lcd_brightness = xfpm_backlight_has_hw (manager->priv->backlight);
617
mapped_buttons = xfpm_button_get_mapped (manager->priv->button);
619
if ( mapped_buttons & SLEEP_KEY )
620
has_sleep_button = TRUE;
621
if ( mapped_buttons & HIBERNATE_KEY )
622
has_hibernate_button = TRUE;
623
if ( mapped_buttons & POWER_KEY )
624
has_power_button = TRUE;
626
g_hash_table_insert (hash, g_strdup ("sleep-button"), g_strdup (xfpm_bool_to_string (has_sleep_button)));
627
g_hash_table_insert (hash, g_strdup ("power-button"), g_strdup (xfpm_bool_to_string (has_power_button)));
628
g_hash_table_insert (hash, g_strdup ("hibernate-button"), g_strdup (xfpm_bool_to_string (has_hibernate_button)));
629
g_hash_table_insert (hash, g_strdup ("auth-suspend"), g_strdup (xfpm_bool_to_string (auth_suspend)));
630
g_hash_table_insert (hash, g_strdup ("auth-hibernate"), g_strdup (xfpm_bool_to_string (auth_hibernate)));
631
g_hash_table_insert (hash, g_strdup ("can-suspend"), g_strdup (xfpm_bool_to_string (can_suspend)));
632
g_hash_table_insert (hash, g_strdup ("can-hibernate"), g_strdup (xfpm_bool_to_string (can_hibernate)));
633
g_hash_table_insert (hash, g_strdup ("can-shutdown"), g_strdup (xfpm_bool_to_string (can_shutdown)));
635
g_hash_table_insert (hash, g_strdup ("has-battery"), g_strdup (xfpm_bool_to_string (has_battery)));
636
g_hash_table_insert (hash, g_strdup ("has-lid"), g_strdup (xfpm_bool_to_string (has_lid)));
637
g_hash_table_insert (hash, g_strdup ("can-spin"), g_strdup (xfpm_bool_to_string (can_spin)));
638
g_hash_table_insert (hash, g_strdup ("devkit-disk"), g_strdup (xfpm_bool_to_string (devkit_disk)));
640
g_hash_table_insert (hash, g_strdup ("has-brightness"), g_strdup (xfpm_bool_to_string (has_lcd_brightness)));
248
647
* DBus server implementation