26
26
#include <stdlib.h>
27
27
#include <string.h>
29
32
#include <libxfce4util/libxfce4util.h>
31
34
#include "xfpm-backlight.h"
32
#include "xfpm-brightness-hal.h"
33
#include "xfpm-brightness-widget.h"
35
static void xfpm_backlight_finalize (GObject *object);
37
static void xfpm_backlight_dbus_class_init (XfpmBacklightClass *klass);
38
static void xfpm_backlight_dbus_init (XfpmBacklight *bk);
35
#include "egg-idletime.h"
36
#include "xfpm-notify.h"
37
#include "xfpm-xfconf.h"
38
#include "xfpm-power.h"
39
#include "xfpm-config.h"
40
#include "xfpm-button.h"
41
#include "xfpm-brightness.h"
42
#include "xfpm-debug.h"
43
#include "xfpm-icons.h"
45
#include "gsd-media-keys-window.h"
47
static void xfpm_backlight_finalize (GObject *object);
49
static void xfpm_backlight_create_popup (XfpmBacklight *backlight);
51
#define ALARM_DISABLED 9
52
#define BRIGHTNESS_POPUP_SIZE 180
40
54
#define XFPM_BACKLIGHT_GET_PRIVATE(o) \
41
(G_TYPE_INSTANCE_GET_PRIVATE((o), XFPM_TYPE_BACKLIGHT, XfpmBacklightPrivate))
55
(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFPM_TYPE_BACKLIGHT, XfpmBacklightPrivate))
43
57
struct XfpmBacklightPrivate
45
XfpmBrightnessHal *br;
46
XfpmBrightnessWidget *widget;
59
XfpmBrightness *brightness;
67
NotifyNotification *n;
81
gboolean brightness_in_hw;
51
G_DEFINE_TYPE(XfpmBacklight, xfpm_backlight, G_TYPE_OBJECT)
54
xfpm_backlight_brightness_up (XfpmBrightnessHal *brg, guint level, XfpmBacklight *bk)
56
xfpm_brightness_widget_set_level (bk->priv->widget, level);
60
xfpm_backlight_brightness_down (XfpmBrightnessHal *brg, guint level, XfpmBacklight *bk)
62
xfpm_brightness_widget_set_level (bk->priv->widget, level);
66
xfpm_backlight_get_device (XfpmBacklight *bk)
69
bk->priv->br = xfpm_brightness_hal_new ();
70
bk->priv->has_hw = xfpm_brightness_hal_has_hw (bk->priv->br);
72
if ( bk->priv->has_hw == FALSE )
73
g_object_unref (bk->priv->br);
76
bk->priv->widget = xfpm_brightness_widget_new ();
77
g_signal_connect (G_OBJECT(bk->priv->br), "brigthness-up",
78
G_CALLBACK (xfpm_backlight_brightness_up), bk);
80
g_signal_connect (G_OBJECT(bk->priv->br), "brigthness-down",
81
G_CALLBACK (xfpm_backlight_brightness_down), bk);
85
G_DEFINE_TYPE (XfpmBacklight, xfpm_backlight, G_TYPE_OBJECT)
88
xfpm_backlight_dim_brightness (XfpmBacklight *backlight)
92
ret = xfpm_brightness_get_level (backlight->priv->brightness, &backlight->priv->last_level);
96
g_warning ("Unable to get current brightness level");
99
XFPM_DEBUG ("Current brightness level before dimming : %u", backlight->priv->last_level);
101
backlight->priv->dimmed = xfpm_brightness_dim_down (backlight->priv->brightness);
105
xfpm_backlight_destroy_popup (gpointer data)
107
XfpmBacklight *backlight;
109
backlight = XFPM_BACKLIGHT (data);
111
if ( backlight->priv->osd )
113
gtk_widget_destroy (backlight->priv->osd);
114
backlight->priv->osd = NULL;
117
if ( backlight->priv->n )
119
g_object_unref (backlight->priv->n);
120
backlight->priv->n = NULL;
127
xfpm_backlight_composited_changed_cb (XfpmBacklight *backlight)
129
xfpm_backlight_destroy_popup (backlight);
130
xfpm_backlight_create_popup (backlight);
134
xfpm_backlight_show_notification (XfpmBacklight *backlight, gfloat value)
138
static const char *display_icon_name[] =
140
"notification-display-brightness-off",
141
"notification-display-brightness-low",
142
"notification-display-brightness-medium",
143
"notification-display-brightness-high",
144
"notification-display-brightness-full",
148
if ( backlight->priv->n == NULL )
150
backlight->priv->n = xfpm_notify_new_notification (backlight->priv->notify,
159
i = (gint)value / 25;
161
if ( i > 4 || i < 0 )
164
notify_notification_set_hint_int32 (backlight->priv->n,
168
notify_notification_set_hint_string (backlight->priv->n,
169
"x-canonical-private-synchronous",
172
notify_notification_update (backlight->priv->n,
175
display_icon_name[i]);
177
notify_notification_show (backlight->priv->n, NULL);
181
xfpm_backlight_create_popup (XfpmBacklight *backlight)
183
if ( backlight->priv->osd != NULL )
83
max_level = xfpm_brightness_hal_get_max_level (bk->priv->br);
84
xfpm_brightness_widget_set_max_level (bk->priv->widget,
91
xfpm_backlight_class_init(XfpmBacklightClass *klass)
93
GObjectClass *object_class = G_OBJECT_CLASS(klass);
186
backlight->priv->osd = gsd_media_keys_window_new ();
187
gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (backlight->priv->osd),
188
XFPM_DISPLAY_BRIGHTNESS_ICON,
190
gtk_window_set_position (GTK_WINDOW (backlight->priv->osd), GTK_WIN_POS_CENTER);
192
g_signal_connect_swapped (backlight->priv->osd, "composited-changed",
193
G_CALLBACK (xfpm_backlight_composited_changed_cb), backlight);
198
xfpm_backlight_show (XfpmBacklight *backlight, gint level)
204
XFPM_DEBUG ("Level %u", level);
206
g_object_get (G_OBJECT (backlight->priv->conf),
207
SHOW_BRIGHTNESS_POPUP, &show_popup,
213
g_object_get (G_OBJECT (backlight->priv->notify),
217
value = (gfloat) 100 * level / backlight->priv->max_level;
219
if ( !sync ) /*Notification server doesn't support sync notifications*/
221
xfpm_backlight_create_popup (backlight);
222
gsd_media_keys_window_set_volume_level (GSD_MEDIA_KEYS_WINDOW (backlight->priv->osd),
224
if ( !GTK_WIDGET_VISIBLE (backlight->priv->osd))
225
gtk_window_present (GTK_WINDOW (backlight->priv->osd));
229
xfpm_backlight_show_notification (backlight, value);
232
if ( backlight->priv->destroy_id != 0 )
234
g_source_remove (backlight->priv->destroy_id);
235
backlight->priv->destroy_id = 0;
239
/* Release the memory after 60 seconds */
240
backlight->priv->destroy_id = g_timeout_add_seconds (60, (GSourceFunc) xfpm_backlight_destroy_popup, backlight);
245
xfpm_backlight_alarm_timeout_cb (EggIdletime *idle, guint id, XfpmBacklight *backlight)
247
backlight->priv->block = FALSE;
249
if ( id == TIMEOUT_BRIGHTNESS_ON_AC && !backlight->priv->on_battery)
250
xfpm_backlight_dim_brightness (backlight);
251
else if ( id == TIMEOUT_BRIGHTNESS_ON_BATTERY && backlight->priv->on_battery)
252
xfpm_backlight_dim_brightness (backlight);
256
xfpm_backlight_reset_cb (EggIdletime *idle, XfpmBacklight *backlight)
258
if ( backlight->priv->dimmed)
260
if ( !backlight->priv->block)
262
XFPM_DEBUG ("Alarm reset, setting level to %i", backlight->priv->last_level);
263
xfpm_brightness_set_level (backlight->priv->brightness, backlight->priv->last_level);
265
backlight->priv->dimmed = FALSE;
270
xfpm_backlight_button_pressed_cb (XfpmButton *button, XfpmButtonKey type, XfpmBacklight *backlight)
275
gboolean enable_brightness, show_popup;
277
g_object_get (G_OBJECT (backlight->priv->conf),
278
ENABLE_BRIGHTNESS_CONTROL, &enable_brightness,
279
SHOW_BRIGHTNESS_POPUP, &show_popup,
282
if ( type == BUTTON_MON_BRIGHTNESS_UP )
284
backlight->priv->block = TRUE;
286
if ( !backlight->priv->brightness_in_hw && enable_brightness)
287
ret = xfpm_brightness_up (backlight->priv->brightness, &level);
289
if ( enable_brightness )
290
ret = xfpm_brightness_up (backlight->priv->brightness, &level);
292
if ( ret && show_popup)
293
xfpm_backlight_show (backlight, level);
295
else if ( type == BUTTON_MON_BRIGHTNESS_DOWN )
297
backlight->priv->block = TRUE;
299
if ( !backlight->priv->brightness_in_hw && enable_brightness )
300
ret = xfpm_brightness_down (backlight->priv->brightness, &level);
302
if ( enable_brightness )
303
ret = xfpm_brightness_down (backlight->priv->brightness, &level);
305
if ( ret && show_popup)
306
xfpm_backlight_show (backlight, level);
311
xfpm_backlight_brightness_on_ac_settings_changed (XfpmBacklight *backlight)
315
g_object_get (G_OBJECT (backlight->priv->conf),
316
BRIGHTNESS_ON_AC, &timeout_on_ac,
319
XFPM_DEBUG ("Alarm on ac timeout changed %u", timeout_on_ac);
321
if ( timeout_on_ac == ALARM_DISABLED )
323
egg_idletime_alarm_remove (backlight->priv->idle, TIMEOUT_BRIGHTNESS_ON_AC );
327
egg_idletime_alarm_set (backlight->priv->idle, TIMEOUT_BRIGHTNESS_ON_AC, timeout_on_ac * 1000);
332
xfpm_backlight_brightness_on_battery_settings_changed (XfpmBacklight *backlight)
334
guint timeout_on_battery ;
336
g_object_get (G_OBJECT (backlight->priv->conf),
337
BRIGHTNESS_ON_BATTERY, &timeout_on_battery,
340
XFPM_DEBUG ("Alarm on battery timeout changed %u", timeout_on_battery);
342
if ( timeout_on_battery == ALARM_DISABLED )
344
egg_idletime_alarm_remove (backlight->priv->idle, TIMEOUT_BRIGHTNESS_ON_BATTERY );
348
egg_idletime_alarm_set (backlight->priv->idle, TIMEOUT_BRIGHTNESS_ON_BATTERY, timeout_on_battery * 1000);
354
xfpm_backlight_set_timeouts (XfpmBacklight *backlight)
356
xfpm_backlight_brightness_on_ac_settings_changed (backlight);
357
xfpm_backlight_brightness_on_battery_settings_changed (backlight);
361
xfpm_backlight_on_battery_changed_cb (XfpmPower *power, gboolean on_battery, XfpmBacklight *backlight)
363
backlight->priv->on_battery = on_battery;
367
xfpm_backlight_class_init (XfpmBacklightClass *klass)
369
GObjectClass *object_class = G_OBJECT_CLASS (klass);
95
371
object_class->finalize = xfpm_backlight_finalize;
97
g_type_class_add_private(klass,sizeof(XfpmBacklightPrivate));
99
xfpm_backlight_dbus_class_init (klass);
103
xfpm_backlight_init(XfpmBacklight *bk)
105
bk->priv = XFPM_BACKLIGHT_GET_PRIVATE(bk);
107
xfpm_backlight_get_device (bk);
109
xfpm_backlight_dbus_init (bk);
113
xfpm_backlight_finalize(GObject *object)
117
bk = XFPM_BACKLIGHT(object);
119
if ( bk->priv->has_hw == TRUE )
121
g_object_unref (bk->priv->br);
122
g_object_unref (bk->priv->widget);
125
G_OBJECT_CLASS(xfpm_backlight_parent_class)->finalize(object);
373
g_type_class_add_private (klass, sizeof (XfpmBacklightPrivate));
377
xfpm_backlight_init (XfpmBacklight *backlight)
379
backlight->priv = XFPM_BACKLIGHT_GET_PRIVATE (backlight);
381
backlight->priv->brightness = xfpm_brightness_new ();
382
backlight->priv->has_hw = xfpm_brightness_setup (backlight->priv->brightness);
384
backlight->priv->osd = NULL;
385
backlight->priv->notify = NULL;
386
backlight->priv->idle = NULL;
387
backlight->priv->conf = NULL;
388
backlight->priv->button = NULL;
389
backlight->priv->power = NULL;
390
backlight->priv->dimmed = FALSE;
391
backlight->priv->block = FALSE;
392
backlight->priv->destroy_id = 0;
394
if ( !backlight->priv->has_hw )
396
g_object_unref (backlight->priv->brightness);
397
backlight->priv->brightness = NULL;
401
backlight->priv->idle = egg_idletime_new ();
402
backlight->priv->conf = xfpm_xfconf_new ();
403
backlight->priv->button = xfpm_button_new ();
404
backlight->priv->power = xfpm_power_get ();
405
backlight->priv->notify = xfpm_notify_new ();
406
backlight->priv->max_level = xfpm_brightness_get_max_level (backlight->priv->brightness);
408
if ( xfpm_brightness_get_control (backlight->priv->brightness) == XFPM_BRIGHTNESS_CONTROL_HAL )
409
backlight->priv->brightness_in_hw = xfpm_brightness_in_hw (backlight->priv->brightness);
411
g_signal_connect (backlight->priv->idle, "alarm-expired",
412
G_CALLBACK (xfpm_backlight_alarm_timeout_cb), backlight);
414
g_signal_connect (backlight->priv->idle, "reset",
415
G_CALLBACK(xfpm_backlight_reset_cb), backlight);
417
g_signal_connect (backlight->priv->button, "button-pressed",
418
G_CALLBACK (xfpm_backlight_button_pressed_cb), backlight);
420
g_signal_connect_swapped (backlight->priv->conf, "notify::" BRIGHTNESS_ON_AC,
421
G_CALLBACK (xfpm_backlight_brightness_on_ac_settings_changed), backlight);
423
g_signal_connect_swapped (backlight->priv->conf, "notify::" BRIGHTNESS_ON_BATTERY,
424
G_CALLBACK (xfpm_backlight_brightness_on_battery_settings_changed), backlight);
426
g_signal_connect (backlight->priv->power, "on-battery-changed",
427
G_CALLBACK (xfpm_backlight_on_battery_changed_cb), backlight);
428
g_object_get (G_OBJECT (backlight->priv->power),
429
"on-battery", &backlight->priv->on_battery,
431
xfpm_brightness_get_level (backlight->priv->brightness, &backlight->priv->last_level);
432
xfpm_backlight_set_timeouts (backlight);
437
xfpm_backlight_finalize (GObject *object)
439
XfpmBacklight *backlight;
441
backlight = XFPM_BACKLIGHT (object);
443
xfpm_backlight_destroy_popup (backlight);
445
if ( backlight->priv->brightness )
446
g_object_unref (backlight->priv->brightness);
448
if ( backlight->priv->idle )
449
g_object_unref (backlight->priv->idle);
451
if ( backlight->priv->conf )
452
g_object_unref (backlight->priv->conf);
454
if ( backlight->priv->button )
455
g_object_unref (backlight->priv->button);
457
if ( backlight->priv->power )
458
g_object_unref (backlight->priv->power);
460
if ( backlight->priv->notify)
461
g_object_unref (backlight->priv->notify);
463
G_OBJECT_CLASS (xfpm_backlight_parent_class)->finalize (object);
129
xfpm_backlight_new(void)
131
XfpmBacklight *bk = NULL;
132
bk = g_object_new (XFPM_TYPE_BACKLIGHT, NULL);
138
* DBus server implementation for org.freedesktop.PowerManagement.Backlight (Not standard)
142
static gboolean xfpm_backlight_dbus_update_brightness (XfpmBacklight *bk,
146
#include "org.freedesktop.PowerManagement.Backlight.h"
148
static void xfpm_backlight_dbus_class_init (XfpmBacklightClass *klass)
150
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS(klass),
151
&dbus_glib_xfpm_backlight_object_info);
154
static void xfpm_backlight_dbus_init (XfpmBacklight *bk)
156
DBusGConnection *bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
158
dbus_g_connection_register_g_object (bus,
159
"/org/freedesktop/PowerManagement/Backlight",
164
static gboolean xfpm_backlight_dbus_update_brightness (XfpmBacklight *bk,
168
TRACE("Update backlight message received");
169
if ( bk->priv->has_hw )
170
xfpm_brightness_hal_update_level (bk->priv->br, IN_level);
175
gboolean xfpm_backlight_has_hw (XfpmBacklight *bk)
177
g_return_val_if_fail (XFPM_IS_BACKLIGHT (bk), FALSE);
179
return bk->priv->has_hw;
182
void xfpm_backlight_reload (XfpmBacklight *bk)
184
g_return_if_fail (XFPM_IS_BACKLIGHT (bk));
186
if ( bk->priv->has_hw == TRUE )
188
g_object_unref (bk->priv->br);
189
g_object_unref (bk->priv->widget);
192
xfpm_backlight_get_device (bk);
467
xfpm_backlight_new (void)
469
XfpmBacklight *backlight = NULL;
470
backlight = g_object_new (XFPM_TYPE_BACKLIGHT, NULL);
474
gboolean xfpm_backlight_has_hw (XfpmBacklight *backlight)
476
return backlight->priv->has_hw;