diff options
Diffstat (limited to 'applets/brightness/brightness-applet.c')
-rw-r--r-- | applets/brightness/brightness-applet.c | 295 |
1 files changed, 146 insertions, 149 deletions
diff --git a/applets/brightness/brightness-applet.c b/applets/brightness/brightness-applet.c index d3570b8..8e5345d 100644 --- a/applets/brightness/brightness-applet.c +++ b/applets/brightness/brightness-applet.c @@ -22,12 +22,9 @@ */ #ifdef HAVE_CONFIG_H -# include <config.h> +#include <config.h> #endif -/* FIXME: gdk_gc_* needs porting to cairo */ -#undef GDK_DISABLE_DEPRECATED - #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -35,16 +32,10 @@ #include <gtk/gtk.h> #include <glib/gi18n.h> #include <gdk/gdkkeysyms.h> -#if GTK_CHECK_VERSION (3, 0, 0) -#include <gdk/gdkkeysyms-compat.h> -#define GtkObject GtkWidget -#endif #include <glib-object.h> #include <dbus/dbus-glib.h> -#include <libmate-desktop/mate-aboutdialog.h> #include "egg-debug.h" -#include "egg-dbus-monitor.h" #include "gpm-common.h" #define GPM_TYPE_BRIGHTNESS_APPLET (gpm_brightness_applet_get_type ()) @@ -67,7 +58,7 @@ typedef struct{ /* connection to g-p-m */ DBusGProxy *proxy; DBusGConnection *connection; - EggDbusMonitor *monitor; + guint bus_watch_id; guint level; /* a cache for panel size */ gint size; @@ -80,6 +71,10 @@ typedef struct{ GType gpm_brightness_applet_get_type (void); +#define GPM_DBUS_SERVICE "org.mate.PowerManager" +#define GPM_DBUS_PATH_BACKLIGHT "/org/mate/PowerManager/Backlight" +#define GPM_DBUS_INTERFACE_BACKLIGHT "org.mate.PowerManager.Backlight" + static void gpm_brightness_applet_class_init (GpmBrightnessAppletClass *klass); static void gpm_brightness_applet_init (GpmBrightnessApplet *applet); @@ -90,11 +85,7 @@ static void gpm_applet_check_size (GpmBrightnessApplet *applet); static gboolean gpm_applet_draw_cb (GpmBrightnessApplet *applet); static void gpm_applet_change_background_cb (GpmBrightnessApplet *applet, MatePanelAppletBackgroundType arg1, -#if GTK_CHECK_VERSION (3, 0, 0) cairo_pattern_t *arg2, gpointer data); -#else - GdkColor *arg2, GdkPixmap *arg3, gpointer data); -#endif static void gpm_applet_theme_change_cb (GtkIconTheme *icon_theme, gpointer data); static void gpm_applet_stop_scroll_events_cb (GtkWidget *widget, GdkEvent *event); static gboolean gpm_applet_destroy_popup_cb (GpmBrightnessApplet *applet); @@ -109,7 +100,7 @@ static void gpm_applet_create_popup (GpmBrightnessApplet *applet); static gboolean gpm_applet_popup_cb (GpmBrightnessApplet *applet, GdkEventButton *event); static void gpm_applet_dialog_about_cb (GtkAction *action, gpointer data); static gboolean gpm_applet_cb (MatePanelApplet *_applet, const gchar *iid, gpointer data); -static void gpm_applet_destroy_cb (GtkObject *object); +static void gpm_applet_destroy_cb (GtkWidget *widget); #define GPM_BRIGHTNESS_APPLET_ID "BrightnessApplet" #define GPM_BRIGHTNESS_APPLET_FACTORY_ID "BrightnessAppletFactory" @@ -268,16 +259,10 @@ static gboolean gpm_applet_draw_cb (GpmBrightnessApplet *applet) { gint w, h, bg_type; -#if GTK_CHECK_VERSION (3, 0, 0) GdkRGBA color; cairo_t *cr; cairo_pattern_t *pattern; GtkStyleContext *context; -#else - GdkColor color; - GdkGC *gc; - GdkPixmap *background; -#endif GtkAllocation allocation; if (gtk_widget_get_window (GTK_WIDGET(applet)) == NULL) { @@ -300,74 +285,38 @@ gpm_applet_draw_cb (GpmBrightnessApplet *applet) w = allocation.width; h = allocation.height; -#if GTK_CHECK_VERSION (3, 0, 0) cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET(applet))); -#else - gc = gdk_gc_new (gtk_widget_get_window (GTK_WIDGET(applet))); -#endif /* draw pixmap background */ -#if GTK_CHECK_VERSION (3, 0, 0) bg_type = mate_panel_applet_get_background (MATE_PANEL_APPLET (applet), &color, &pattern); -#else - bg_type = mate_panel_applet_get_background (MATE_PANEL_APPLET (applet), &color, &background); -#endif if (bg_type == PANEL_PIXMAP_BACKGROUND && !applet->popped) { /* fill with given background pixmap */ -#if GTK_CHECK_VERSION (3, 0, 0) cairo_set_source (cr, pattern); cairo_rectangle (cr, 0, 0, w, h); cairo_fill (cr); -#else - gdk_draw_drawable (gtk_widget_get_window (GTK_WIDGET(applet)), gc, background, 0, 0, 0, 0, w, h); -#endif } /* draw color background */ if (bg_type == PANEL_COLOR_BACKGROUND && !applet->popped) { -#if GTK_CHECK_VERSION (3, 0, 0) gdk_cairo_set_source_rgba (cr, &color); cairo_rectangle (cr, 0, 0, w, h); cairo_fill (cr); -#else - gdk_gc_set_rgb_fg_color (gc,&color); - gdk_gc_set_fill (gc,GDK_SOLID); - gdk_draw_rectangle (gtk_widget_get_window (GTK_WIDGET(applet)), gc, TRUE, 0, 0, w, h); -#endif } /* fill with selected color if popped */ if (applet->popped) { -#if GTK_CHECK_VERSION (3, 0, 0) context = gtk_widget_get_style_context (GTK_WIDGET(applet)); gtk_style_context_get_color (context, GTK_STATE_FLAG_SELECTED, &color); gdk_cairo_set_source_rgba (cr, &color); cairo_rectangle (cr, 0, 0, w, h); cairo_fill (cr); -#else - color = gtk_rc_get_style (GTK_WIDGET(applet))->bg[GTK_STATE_SELECTED]; - gdk_gc_set_rgb_fg_color (gc,&color); - gdk_gc_set_fill (gc,GDK_SOLID); - gdk_draw_rectangle (gtk_widget_get_window (GTK_WIDGET(applet)), gc, TRUE, 0, 0, w, h); -#endif } /* draw icon at center */ -#if GTK_CHECK_VERSION (3, 0, 0) gdk_cairo_set_source_pixbuf (cr, applet->icon, (w - applet->icon_width)/2, (h - applet->icon_height)/2); cairo_paint (cr); -#else - gdk_draw_pixbuf (gtk_widget_get_window (GTK_WIDGET(applet)), gc, applet->icon, - 0, 0, (w - applet->icon_width)/2, (h - applet->icon_height)/2, - applet->icon_width, applet->icon_height, - GDK_RGB_DITHER_NONE, 0, 0); -#endif -#if GTK_CHECK_VERSION (3, 0, 0) cairo_destroy (cr); -#else - g_object_unref (gc); -#endif return TRUE; } @@ -380,11 +329,7 @@ gpm_applet_draw_cb (GpmBrightnessApplet *applet) static void gpm_applet_change_background_cb (GpmBrightnessApplet *applet, MatePanelAppletBackgroundType arg1, -#if GTK_CHECK_VERSION (3, 0, 0) cairo_pattern_t *arg2, gpointer data) -#else - GdkColor *arg2, GdkPixmap *arg3, gpointer data) -#endif { gtk_widget_queue_draw (GTK_WIDGET (applet)); } @@ -520,19 +465,19 @@ gpm_applet_key_press_cb (GpmBrightnessApplet *applet, GdkEventKey *event) int i; switch (event->keyval) { - case GDK_KP_Enter: - case GDK_ISO_Enter: - case GDK_3270_Enter: - case GDK_Return: - case GDK_space: - case GDK_KP_Space: - case GDK_Escape: + case GDK_KEY_KP_Enter: + case GDK_KEY_ISO_Enter: + case GDK_KEY_3270_Enter: + case GDK_KEY_Return: + case GDK_KEY_space: + case GDK_KEY_KP_Space: + case GDK_KEY_Escape: /* if yet popped, release focus and hide then redraw applet unselected */ if (applet->popped) { gdk_keyboard_ungrab (GDK_CURRENT_TIME); gdk_pointer_ungrab (GDK_CURRENT_TIME); gtk_grab_remove (GTK_WIDGET(applet)); - gtk_widget_set_state (GTK_WIDGET(applet), GTK_STATE_NORMAL); + gtk_widget_set_state_flags (GTK_WIDGET(applet), GTK_STATE_FLAG_NORMAL, TRUE); gtk_widget_hide (applet->popup); applet->popped = FALSE; gpm_applet_draw_cb (applet); @@ -542,25 +487,25 @@ gpm_applet_key_press_cb (GpmBrightnessApplet *applet, GdkEventKey *event) return FALSE; } break; - case GDK_Page_Up: + case GDK_KEY_Page_Up: for (i = 0;i < 10;i++) { gpm_applet_plus_cb (NULL, applet); } return TRUE; break; - case GDK_Left: - case GDK_Up: + case GDK_KEY_Left: + case GDK_KEY_Up: gpm_applet_plus_cb (NULL, applet); return TRUE; break; - case GDK_Page_Down: + case GDK_KEY_Page_Down: for (i = 0;i < 10;i++) { gpm_applet_minus_cb (NULL, applet); } return TRUE; break; - case GDK_Right: - case GDK_Down: + case GDK_KEY_Right: + case GDK_KEY_Down: gpm_applet_minus_cb (NULL, applet); return TRUE; break; @@ -604,6 +549,35 @@ gpm_applet_scroll_cb (GpmBrightnessApplet *applet, GdkEventScroll *event) } /** + * on_popup_button_press: + * @applet: Brightness applet instance + * @event: The button press event + * + * hide popup on focus loss. + **/ +static gboolean +on_popup_button_press (GtkWidget *widget, + GdkEventButton *event, + GpmBrightnessApplet *applet) +{ + GtkWidget *event_widget; + + if (event->type != GDK_BUTTON_PRESS) { + return FALSE; + } + event_widget = gtk_get_event_widget ((GdkEvent *)event); + g_debug ("Button press: %p dock=%p", event_widget, widget); + if (event_widget == widget) { + gtk_widget_hide (applet->popup); + applet->popped = FALSE; + gpm_applet_update_tooltip (applet); + return TRUE; + } + + return FALSE; +} + +/** * gpm_applet_create_popup: * @applet: Brightness applet instance * @@ -619,10 +593,10 @@ gpm_applet_create_popup (GpmBrightnessApplet *applet) /* slider */ if (MATE_PANEL_APPLET_VERTICAL(orientation)) { - applet->slider = gtk_hscale_new_with_range (0, 100, 1); + applet->slider = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); gtk_widget_set_size_request (applet->slider, 100, -1); } else { - applet->slider = gtk_vscale_new_with_range (0, 100, 1); + applet->slider = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, 0, 100, 1); gtk_widget_set_size_request (applet->slider, -1, 100); } gtk_range_set_inverted (GTK_RANGE(applet->slider), TRUE); @@ -633,18 +607,20 @@ gpm_applet_create_popup (GpmBrightnessApplet *applet) /* minus button */ applet->btn_minus = gtk_button_new_with_label ("\342\210\222"); /* U+2212 MINUS SIGN */ gtk_button_set_relief (GTK_BUTTON(applet->btn_minus), GTK_RELIEF_NONE); + gtk_widget_set_can_focus (applet->btn_minus, FALSE); g_signal_connect (G_OBJECT(applet->btn_minus), "pressed", G_CALLBACK(gpm_applet_minus_cb), applet); /* plus button */ applet->btn_plus = gtk_button_new_with_label ("+"); gtk_button_set_relief (GTK_BUTTON(applet->btn_plus), GTK_RELIEF_NONE); + gtk_widget_set_can_focus (applet->btn_plus, FALSE); g_signal_connect (G_OBJECT(applet->btn_plus), "pressed", G_CALLBACK(gpm_applet_plus_cb), applet); /* box */ if (MATE_PANEL_APPLET_VERTICAL(orientation)) { - box = gtk_hbox_new (FALSE, 1); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1); } else { - box = gtk_vbox_new (FALSE, 1); + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1); } gtk_box_pack_start (GTK_BOX(box), applet->btn_plus, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(box), applet->slider, TRUE, TRUE, 0); @@ -657,12 +633,25 @@ gpm_applet_create_popup (GpmBrightnessApplet *applet) /* window */ applet->popup = gtk_window_new (GTK_WINDOW_POPUP); -#if !GTK_CHECK_VERSION (2, 90, 0) - GTK_WIDGET_UNSET_FLAGS (applet->popup, GTK_TOPLEVEL); -#endif gtk_window_set_type_hint (GTK_WINDOW(applet->popup), GDK_WINDOW_TYPE_HINT_UTILITY); - gtk_widget_set_parent (applet->popup, GTK_WIDGET(applet)); gtk_container_add (GTK_CONTAINER(applet->popup), frame); + + /* window events */ + g_signal_connect (G_OBJECT(applet->popup), "button-press-event", + G_CALLBACK (on_popup_button_press), applet); + + g_signal_connect (G_OBJECT(applet->popup), "key-press-event", + G_CALLBACK(gpm_applet_key_press_cb), applet); + + /* Set volume control frame, slider and toplevel window to follow panel volume control theme */ + GtkWidget *toplevel = gtk_widget_get_toplevel (frame); + GtkStyleContext *context; + context = gtk_widget_get_style_context (GTK_WIDGET(toplevel)); + gtk_style_context_add_class(context,"mate-panel-applet-slider"); + /*Make transparency possible in gtk3 theme3 */ + GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(toplevel)); + GdkVisual *visual = gdk_screen_get_rgba_visual(screen); + gtk_widget_set_visual(GTK_WIDGET(toplevel), visual); } /** @@ -676,6 +665,11 @@ gpm_applet_popup_cb (GpmBrightnessApplet *applet, GdkEventButton *event) { GtkAllocation allocation, popup_allocation; gint orientation, x, y; + GdkWindow *window; + GdkDisplay *display; + GdkDeviceManager *device_manager; + GdkDevice *pointer; + GdkDevice *keyboard; /* react only to left mouse button */ if (event->button != 1) { @@ -684,23 +678,19 @@ gpm_applet_popup_cb (GpmBrightnessApplet *applet, GdkEventButton *event) /* if yet popped, release focus and hide then redraw applet unselected */ if (applet->popped) { - gdk_keyboard_ungrab (GDK_CURRENT_TIME); - gdk_pointer_ungrab (GDK_CURRENT_TIME); - gtk_grab_remove (GTK_WIDGET(applet)); - gtk_widget_set_state (GTK_WIDGET(applet), GTK_STATE_NORMAL); gtk_widget_hide (applet->popup); applet->popped = FALSE; - gpm_applet_draw_cb (applet); gpm_applet_update_tooltip (applet); return TRUE; } - /* update UI for current brightness */ - gpm_applet_update_popup_level (applet); + /* don't show the popup if brightness is unavailable */ + if (applet->level == -1) { + return FALSE; + } /* otherwise pop */ applet->popped = TRUE; - gpm_applet_draw_cb (applet); /* create a new popup (initial or if panel parameters changed) */ if (applet->popup == NULL) { @@ -748,16 +738,19 @@ gpm_applet_popup_cb (GpmBrightnessApplet *applet, GdkEventButton *event) gtk_window_move (GTK_WINDOW (applet->popup), x, y); /* grab input */ - gtk_widget_grab_focus (GTK_WIDGET(applet)); - gtk_grab_add (GTK_WIDGET(applet)); - gdk_pointer_grab (gtk_widget_get_window (GTK_WIDGET(applet)), TRUE, - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_POINTER_MOTION_MASK, - NULL, NULL, GDK_CURRENT_TIME); - gdk_keyboard_grab (gtk_widget_get_window (GTK_WIDGET(applet)), - TRUE, GDK_CURRENT_TIME); - gtk_widget_set_state (GTK_WIDGET(applet), GTK_STATE_SELECTED); + window = gtk_widget_get_window (GTK_WIDGET (applet->popup)); + display = gdk_window_get_display (window); + device_manager = gdk_display_get_device_manager (display); + pointer = gdk_device_manager_get_client_pointer (device_manager); + keyboard = gdk_device_get_associated_device (pointer); + gdk_device_grab (pointer, window, + GDK_OWNERSHIP_NONE, TRUE, + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK, + NULL, GDK_CURRENT_TIME); + gdk_device_grab (keyboard, window, + GDK_OWNERSHIP_NONE, TRUE, + GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, + NULL, GDK_CURRENT_TIME); return TRUE; } @@ -794,7 +787,7 @@ gpm_applet_stop_scroll_events_cb (GtkWidget *widget, GdkEvent *event) static void gpm_applet_dialog_about_cb (GtkAction *action, gpointer data) { - MateAboutDialog *about; + GtkAboutDialog *about; GdkPixbuf *logo = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), @@ -806,6 +799,11 @@ gpm_applet_dialog_about_cb (GtkAction *action, gpointer data) "Richard Hughes <[email protected]>", NULL }; + + char copyright[] = \ + "Copyright \xc2\xa9 2012-2016 MATE developers\n" + "Copyright \xc2\xa9 2006 Benjamin Canou"; + const char *documenters [] = { NULL }; @@ -830,17 +828,17 @@ gpm_applet_dialog_about_cb (GtkAction *action, gpointer data) license_trans = g_strconcat (_(license[0]), "\n\n", _(license[1]), "\n\n", _(license[2]), "\n\n", _(license[3]), "\n", NULL); - about = (MateAboutDialog*) mate_about_dialog_new (); - mate_about_dialog_set_program_name (about, GPM_BRIGHTNESS_APPLET_NAME); - mate_about_dialog_set_version (about, VERSION); - mate_about_dialog_set_copyright (about, _("Copyright \xc2\xa9 2006 Benjamin Canou")); - mate_about_dialog_set_comments (about, GPM_BRIGHTNESS_APPLET_DESC); - mate_about_dialog_set_authors (about, authors); - mate_about_dialog_set_documenters (about, documenters); - mate_about_dialog_set_translator_credits (about, translator_credits); - mate_about_dialog_set_logo (about, logo); - mate_about_dialog_set_license (about, license_trans); - mate_about_dialog_set_website (about, GPM_HOMEPAGE_URL); + about = (GtkAboutDialog*) gtk_about_dialog_new (); + gtk_about_dialog_set_program_name (about, GPM_BRIGHTNESS_APPLET_NAME); + gtk_about_dialog_set_version (about, VERSION); + gtk_about_dialog_set_copyright (about, copyright); + gtk_about_dialog_set_comments (about, GPM_BRIGHTNESS_APPLET_DESC); + gtk_about_dialog_set_authors (about, authors); + gtk_about_dialog_set_documenters (about, documenters); + gtk_about_dialog_set_translator_credits (about, translator_credits); + gtk_about_dialog_set_logo (about, logo); + gtk_about_dialog_set_license (about, license_trans); + gtk_about_dialog_set_website (about, "http://www.mate-desktop.org/"); g_signal_connect (G_OBJECT(about), "response", G_CALLBACK(gtk_widget_destroy), NULL); @@ -864,19 +862,16 @@ gpm_applet_help_cb (GtkAction *action, gpointer data) /** * gpm_applet_destroy_cb: - * @object: Class instance to destroy + * @widget: Class instance to destroy **/ static void -gpm_applet_destroy_cb (GtkObject *object) +gpm_applet_destroy_cb (GtkWidget *widget) { - GpmBrightnessApplet *applet = GPM_BRIGHTNESS_APPLET(object); + GpmBrightnessApplet *applet = GPM_BRIGHTNESS_APPLET(widget); - if (applet->monitor != NULL) { - g_object_unref (applet->monitor); - } - if (applet->icon != NULL) { + g_bus_unwatch_name (applet->bus_watch_id); + if (applet->icon != NULL) g_object_unref (applet->icon); - } } /** @@ -957,25 +952,30 @@ gpm_brightness_applet_dbus_disconnect (GpmBrightnessApplet *applet) } /** - * monitor_connection_cb: - * @proxy: The dbus raw proxy - * @status: The status of the service, where TRUE is connected - * @screensaver: This class instance + * gpm_brightness_applet_name_appeared_cb: **/ static void -monitor_connection_cb (EggDbusMonitor *monitor, - gboolean status, - GpmBrightnessApplet *applet) +gpm_brightness_applet_name_appeared_cb (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + GpmBrightnessApplet *applet) { - if (status) { - gpm_brightness_applet_dbus_connect (applet); - gpm_applet_update_tooltip (applet); - gpm_applet_draw_cb (applet); - } else { - gpm_brightness_applet_dbus_disconnect (applet); - gpm_applet_update_tooltip (applet); - gpm_applet_draw_cb (applet); - } + gpm_brightness_applet_dbus_connect (applet); + gpm_applet_update_tooltip (applet); + gpm_applet_draw_cb (applet); +} + +/** + * gpm_brightness_applet_name_vanished_cb: + **/ +void +gpm_brightness_applet_name_vanished_cb (GDBusConnection *connection, + const gchar *name, + GpmBrightnessApplet *applet) +{ + gpm_brightness_applet_dbus_disconnect (applet); + gpm_applet_update_tooltip (applet); + gpm_applet_draw_cb (applet); } /** @@ -1001,12 +1001,14 @@ gpm_brightness_applet_init (GpmBrightnessApplet *applet) GPM_DATA G_DIR_SEPARATOR_S "icons"); - applet->monitor = egg_dbus_monitor_new (); - g_signal_connect (applet->monitor, "connection-changed", - G_CALLBACK (monitor_connection_cb), applet); - connection = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); - egg_dbus_monitor_assign (applet->monitor, connection, GPM_DBUS_SERVICE); - gpm_brightness_applet_dbus_connect (applet); + /* monitor the daemon */ + applet->bus_watch_id = + g_bus_watch_name (G_BUS_TYPE_SESSION, + GPM_DBUS_SERVICE, + G_BUS_NAME_WATCHER_FLAGS_NONE, + (GBusNameAppearedCallback) gpm_brightness_applet_name_appeared_cb, + (GBusNameVanishedCallback) gpm_brightness_applet_name_vanished_cb, + applet, NULL); /* coldplug */ applet->call_worked = gpm_applet_get_brightness (applet); @@ -1034,13 +1036,8 @@ gpm_brightness_applet_init (GpmBrightnessApplet *applet) /* We use g_signal_connect_after because letting the panel draw * the background is the only way to have the correct * background when a theme defines a background picture. */ -#if GTK_CHECK_VERSION (3, 0, 0) g_signal_connect_after (G_OBJECT(applet), "draw", G_CALLBACK(gpm_applet_draw_cb), NULL); -#else - g_signal_connect_after (G_OBJECT(applet), "expose-event", - G_CALLBACK(gpm_applet_draw_cb), NULL); -#endif g_signal_connect (G_OBJECT(applet), "change-background", G_CALLBACK(gpm_applet_change_background_cb), NULL); |