diff options
-rw-r--r-- | .bzrignore | 6 | ||||
-rw-r--r-- | Makefile.am | 12 | ||||
-rw-r--r-- | configure.ac | 14 | ||||
-rw-r--r-- | data/Makefile.am | 35 | ||||
-rw-r--r-- | data/com.canonical.indicator.session.gschema.xml.in | 24 | ||||
-rw-r--r-- | data/indicator-session.convert | 5 | ||||
-rw-r--r-- | data/indicator-session.schemas.in | 50 | ||||
-rw-r--r-- | po/POTFILES.in | 4 | ||||
-rw-r--r-- | src/Makefile.am | 8 | ||||
-rw-r--r-- | src/dbus-shared-names.h | 6 | ||||
-rw-r--r-- | src/device-menu-mgr.c | 75 | ||||
-rw-r--r-- | src/dialog.c | 6 | ||||
-rw-r--r-- | src/gtk-logout-helper.c | 2 | ||||
-rw-r--r-- | src/indicator-session.c | 8 | ||||
-rw-r--r-- | src/settings-helper.c (renamed from src/gconf-helper.c) | 102 | ||||
-rw-r--r-- | src/settings-helper.h (renamed from src/gconf-helper.h) | 26 | ||||
-rw-r--r-- | src/user-menu-mgr.c | 46 | ||||
-rw-r--r-- | src/user-widget.c | 487 |
18 files changed, 599 insertions, 317 deletions
@@ -1,6 +1,6 @@ compile m4 -po +po/indicator-session.pot src/libmessaging.la src/libmessaging_la-indicator-messages.lo config.guess.cdbs-orig @@ -38,6 +38,7 @@ debian/indicator-sus.substvars gtk-logout-helper .deps .libs +test-ellipsis src/libsession.la src/libsession_la-indicator-session.lo src/status-provider-pidgin-marshal.c @@ -199,3 +200,6 @@ src/Makefile modified: .bzrignore src/libsession_la-user-widget.lo +consolekit-seat-client.h +data/com.canonical.indicator.session.gschema.valid +data/com.canonical.indicator.session.gschema.xml diff --git a/Makefile.am b/Makefile.am index 391ff49..5850769 100644 --- a/Makefile.am +++ b/Makefile.am @@ -33,3 +33,15 @@ dist-hook: else \ echo Failed to generate AUTHORS: not a branch >&2; \ fi + +TESTS = \ + test-ellipsis + +test-ellipsis: po + @echo "#!/bin/bash" > $@ + @echo "(cd po && make $(GETTEXT_PACKAGE).pot)" >> $@ + @echo "grep -c -e \"^msgid.*\.\.\.\\\"\" po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"Ellipsis found in user visible strings\" >&2 && exit 1" >> $@ + @echo "exit 0" >> $@ + @chmod +x $@ + +CLEANFILES = $(TESTS) diff --git a/configure.ac b/configure.ac index 19cc4bc..0240b9c 100644 --- a/configure.ac +++ b/configure.ac @@ -4,10 +4,12 @@ AC_INIT(src/indicator-session.c) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-session, 0.3.1) +AM_INIT_AUTOMAKE(indicator-session, 0.3.2) AM_MAINTAINER_MODE +GLIB_GSETTINGS + IT_PROG_INTLTOOL([0.35.0]) AC_ISC_POSIX @@ -89,16 +91,6 @@ AS_IF([test "x$with_gtk" = x3], AC_SUBST(GTKLOGOUTHELPER_CFLAGS) AC_SUBST(GTKLOGOUTHELPER_LIBS) -AC_PATH_PROG(GCONFTOOL, gconftool-2) -dnl Specify the gconf configuration source, -dnl default to xml::$(sysconfdir)/gconf/gconf.xml.defaults - -AM_GCONF_SOURCE_2 - -PKG_CHECK_MODULES(GCONF, gconf-2.0 >= 2.0) -AC_SUBST(GCONF_CFLAGS) -AC_SUBST(GCONF_LIBS) - ########################### # Check to see if we're local ########################### diff --git a/data/Makefile.am b/data/Makefile.am index 1f522d7..27328fb 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -9,37 +9,22 @@ dbus_services_DATA = $(service_in_files:.service.in=.service) %.service: %.service.in sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ -############################## -# GConf Schema -############################## - -schemadir = \ - $(GCONF_SCHEMA_FILE_DIR) - -schema_in_files = \ - indicator-session.schemas.in - -schema_DATA = \ - $(schema_in_files:.schemas.in=.schemas) - @INTLTOOL_SCHEMAS_RULE@ +@INTLTOOL_XML_NOMERGE_RULE@ +@GSETTINGS_RULES@ +gsettings_SCHEMAS = com.canonical.indicator.session.gschema.xml + +convertdir = $(datadir)/GConf/gsettings +dist_convert_DATA = indicator-session.convert -#$(dbus_services_DATA): $(service_in_files) Makefile -# sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ EXTRA_DIST = \ $(service_in_files) \ - $(schema_in_files) + $(gsettings_SCHEMAS:.xml=.xml.in) + CLEANFILES = \ $(dbus_services_DATA) \ - $(schema_DATA) - -if GCONF_SCHEMAS_INSTALL -install-data-local: - GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ - gconftool-2 --makefile-install-rule $(schema_DATA) -else -install-data-local: -endif + $(gsettings_SCHEMAS) + diff --git a/data/com.canonical.indicator.session.gschema.xml.in b/data/com.canonical.indicator.session.gschema.xml.in new file mode 100644 index 0000000..0cb6815 --- /dev/null +++ b/data/com.canonical.indicator.session.gschema.xml.in @@ -0,0 +1,24 @@ +<schemalist> + <schema id="com.canonical.indicator.session" path="/apps/indicator-session/"> + <key name="suppress-logout-restart-shutdown" type="b"> + <default>false</default> + <_summary>Suppress the dialog to confirm logout, restart and shutdown action</_summary> + <_description>Whether or not to show confirmation dialogs for logout, restart and shutdown actions.</_description> + </key> + <key name="suppress-logout-menuitem" type="b"> + <default>false</default> + <_summary>Remove the Log Out item from the session menu</_summary> + <_description>Makes it so that the logout button doesn't show in the session menu.</_description> + </key> + <key name="suppress-restart-menuitem" type="b"> + <default>false</default> + <_summary>Remove the Restart item from the session menu</_summary> + <_description>Makes it so that the restart button doesn't show in the session menu.</_description> + </key> + <key name="suppress-shutdown-menuitem" type="b"> + <default>false</default> + <_summary>Remove the shutdown item from the session menu</_summary> + <_description>Makes it so that the shutdown button doesn't show in the session menu.</_description> + </key> + </schema> +</schemalist> diff --git a/data/indicator-session.convert b/data/indicator-session.convert new file mode 100644 index 0000000..3a087a6 --- /dev/null +++ b/data/indicator-session.convert @@ -0,0 +1,5 @@ +[com.canonical.indicator.session] +suppress_logout_restart_shutdown = /apps/indicator-session/suppress_logout_restart_shutdown +suppress_logout_menuitem = /apps/indicator-session/suppress_logout_menuitem +suppress_restart_menuitem = /apps/indicator-session/suppress_restart_menuitem +suppress_shutdown_menuitem = /apps/indicator-session/suppress_shutdown_menuitem diff --git a/data/indicator-session.schemas.in b/data/indicator-session.schemas.in deleted file mode 100644 index f4e70da..0000000 --- a/data/indicator-session.schemas.in +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0"?> -<gconfschemafile> - <schemalist> - <schema> - <key>/schemas/apps/indicator-session/suppress_logout_restart_shutdown</key> - <applyto>/apps/indicator-session/suppress_logout_restart_shutdown</applyto> - <owner>indicator-session</owner> - <type>bool</type> - <default>FALSE</default> - <locale name="C"> - <short>Suppress the dialog to confirm logout, restart and shutdown action</short> - <long>Whether or not to show confirmation dialogs for logout, - restart and shutdown actions.</long> - </locale> - </schema> - <schema> - <key>/schemas/apps/indicator-session/suppress_logout_menuitem</key> - <applyto>/apps/indicator-session/suppress_logout_menuitem</applyto> - <owner>indicator-session</owner> - <type>bool</type> - <default>FALSE</default> - <locale name="C"> - <short>Remove the Log Out item from the session menu</short> - <long>Makes it so that the logout button doesn't show in the session menu.</long> - </locale> - </schema> - <schema> - <key>/schemas/apps/indicator-session/suppress_restart_menuitem</key> - <applyto>/apps/indicator-session/suppress_restart_menuitem</applyto> - <owner>indicator-session</owner> - <type>bool</type> - <default>FALSE</default> - <locale name="C"> - <short>Remove the Restart item from the session menu</short> - <long>Makes it so that the restart button doesn't show in the session menu.</long> - </locale> - </schema> - <schema> - <key>/schemas/apps/indicator-session/suppress_shutdown_menuitem</key> - <applyto>/apps/indicator-session/suppress_shutdown_menuitem</applyto> - <owner>indicator-session</owner> - <type>bool</type> - <default>FALSE</default> - <locale name="C"> - <short>Remove the shutdown item from the session menu</short> - <long>Makes it so that the shutdown button doesn't show in the session menu.</long> - </locale> - </schema> - </schemalist> -</gconfschemafile> diff --git a/po/POTFILES.in b/po/POTFILES.in index 08eff5f..df89ec9 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,7 +1,7 @@ [encoding: UTF-8] -data/indicator-session.schemas.in +data/com.canonical.indicator.session.gschema.xml.in data/extra-sessions/classic-desktop.desktop.in.in -src/gconf-helper.c +src/settings-helper.c src/lock-helper.c src/gtk-logout-helper.c src/dialog.c diff --git a/src/Makefile.am b/src/Makefile.am index 3bfd790..dba0a9e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -96,11 +96,11 @@ indicator_session_service_SOURCES = \ session-dbus.h \ gen-session-dbus.xml.c \ dbusmenu-shared.h \ - gconf-helper.c \ + settings-helper.c \ users-service-dbus.h \ users-service-dbus.c \ user-menu-mgr.h \ - user-menu-mgr.c \ + user-menu-mgr.c \ device-menu-mgr.h \ device-menu-mgr.c \ apt-watcher.h \ @@ -126,8 +126,8 @@ indicator_session_service_LDADD = \ gtk_logout_helper_SOURCES = \ gtk-logout-helper.c \ - gconf-helper.c \ - gconf-helper.h \ + settings-helper.c \ + settings-helper.h \ dialog.c \ dialog.h diff --git a/src/dbus-shared-names.h b/src/dbus-shared-names.h index d9dfff1..c5372e4 100644 --- a/src/dbus-shared-names.h +++ b/src/dbus-shared-names.h @@ -55,13 +55,13 @@ typedef enum { #define USER_ITEM_PROP_LOGGED_IN "user-item-logged-in" #define USER_ITEM_PROP_IS_CURRENT_USER "user-item-is-current-user" #define USER_ITEM_PROP_ICON "user-item-icon-path" -#define USER_ITEM_ICON_DEFAULT "user-offline" +#define USER_ITEM_ICON_DEFAULT "avatar-default" #define RESTART_ITEM_TYPE "x-canonical-restart-item" #define RESTART_ITEM_LABEL "restart-label" #define RESTART_ITEM_ICON "restart-icon" -#define ICON_DEFAULT "system-shutdown-panel" -#define ICON_RESTART "system-shutdown-panel-restart" +#define ICON_DEFAULT "system-devices-panel" +#define ICON_RESTART "system-devices-panel-alert" #endif /* __DBUS_SHARED_NAMES_H__ */ diff --git a/src/device-menu-mgr.c b/src/device-menu-mgr.c index cbddaa3..c298682 100644 --- a/src/device-menu-mgr.c +++ b/src/device-menu-mgr.c @@ -21,7 +21,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libdbusmenu-gtk3/menuitem.h> #include "device-menu-mgr.h" -#include "gconf-helper.h" +#include "settings-helper.h" #include "dbus-shared-names.h" #include "dbusmenu-shared.h" #include "lock-helper.h" @@ -44,7 +44,8 @@ struct _DeviceMenuMgr UdevMgr* udev_mgr; }; -static GConfClient *gconf_client = NULL; +static GSettings *lockdown_settings = NULL; +static GSettings *keybinding_settings = NULL; static DbusmenuMenuitem *lock_menuitem = NULL; static DbusmenuMenuitem *system_settings_menuitem = NULL; static DbusmenuMenuitem *display_settings_menuitem = NULL; @@ -72,7 +73,7 @@ static gboolean allow_suspend = TRUE; static DBusGProxy * up_main_proxy = NULL; static DBusGProxy * up_prop_proxy = NULL; -static void device_menu_mgr_ensure_gconf_client (DeviceMenuMgr* self); +static void device_menu_mgr_ensure_settings_client (DeviceMenuMgr* self); static void setup_restart_watch (DeviceMenuMgr* self); static void setup_up (DeviceMenuMgr* self); static void device_menu_mgr_rebuild_items (DeviceMenuMgr *self); @@ -128,21 +129,18 @@ device_menu_mgr_class_init (DeviceMenuMgrClass *klass) // TODO // Is this needed anymore static void -lockdown_changed (GConfClient *client, - guint cnxd_id, - GConfEntry *entry, +lockdown_changed (GSettings * settings, + const gchar * key, gpointer user_data) { - DeviceMenuMgr* self = DEVICE_MENU_MGR (user_data); - GConfValue *value = gconf_entry_get_value (entry); - const gchar *key = gconf_entry_get_key (entry); + DeviceMenuMgr* self = DEVICE_MENU_MGR (user_data); - if (value == NULL || key == NULL) { + if (key == NULL) { return; } if (g_strcmp0 (key, LOCKDOWN_KEY_USER) == 0 || - g_strcmp0 (key, LOCKDOWN_KEY_SCREENSAVER) == 0) { + g_strcmp0 (key, LOCKDOWN_KEY_SCREENSAVER) == 0) { device_menu_mgr_rebuild_items(self); } @@ -150,23 +148,19 @@ lockdown_changed (GConfClient *client, } static void -keybinding_changed (GConfClient *client, - guint cnxd_id, - GConfEntry *entry, +keybinding_changed (GSettings *settings, + const gchar *key, gpointer user_data) { - GConfValue *value = gconf_entry_get_value (entry); - const gchar *key = gconf_entry_get_key (entry); - - if (value == NULL || key == NULL) { + if (key == NULL) { return; } if (g_strcmp0 (key, KEY_LOCK_SCREEN) == 0) { - g_debug("Keybinding changed to: %s", gconf_value_get_string(value)); + g_debug("Keybinding changed to: %s", g_settings_get_string(settings, key)); if (lock_menuitem != NULL) { dbusmenu_menuitem_property_set_shortcut_string (lock_menuitem, - gconf_value_get_string(value)); + g_settings_get_string(settings, key)); } } return; @@ -176,9 +170,9 @@ keybinding_changed (GConfClient *client, locking the screen. If not, lock it. */ static void lock_if_possible (DeviceMenuMgr* self) { - device_menu_mgr_ensure_gconf_client (self); + device_menu_mgr_ensure_settings_client (self); - if (!gconf_client_get_bool (gconf_client, LOCKDOWN_KEY_SCREENSAVER, NULL)) { + if (!g_settings_get_boolean (lockdown_settings, LOCKDOWN_KEY_SCREENSAVER)) { lock_screen (NULL, 0, NULL); } return; @@ -659,10 +653,9 @@ device_menu_mgr_build_static_items (DeviceMenuMgr* self, gboolean greeter_mode) /* Make sure we have a valid GConf client, and build one if needed */ - device_menu_mgr_ensure_gconf_client (self); - can_lockscreen = !gconf_client_get_bool ( gconf_client, - LOCKDOWN_KEY_SCREENSAVER, - NULL); + device_menu_mgr_ensure_settings_client (self); + can_lockscreen = !g_settings_get_boolean (lockdown_settings, + LOCKDOWN_KEY_SCREENSAVER); /* Lock screen item */ if (can_lockscreen) { lock_menuitem = dbusmenu_menuitem_new(); @@ -670,7 +663,7 @@ device_menu_mgr_build_static_items (DeviceMenuMgr* self, gboolean greeter_mode) DBUSMENU_MENUITEM_PROP_LABEL, _("Lock Screen")); - gchar * shortcut = gconf_client_get_string(gconf_client, KEY_LOCK_SCREEN, NULL); + gchar * shortcut = g_settings_get_string(keybinding_settings, KEY_LOCK_SCREEN); if (shortcut != NULL) { g_debug("Lock screen shortcut: %s", shortcut); dbusmenu_menuitem_property_set_shortcut_string(lock_menuitem, shortcut); @@ -830,26 +823,18 @@ setup_restart_watch (DeviceMenuMgr* self) /* Ensures that we have a GConf client and if we build one set up the signal handler. */ static void -device_menu_mgr_ensure_gconf_client (DeviceMenuMgr* self) +device_menu_mgr_ensure_settings_client (DeviceMenuMgr* self) { - if (!gconf_client) { - gconf_client = gconf_client_get_default (); - gconf_client_add_dir(gconf_client, LOCKDOWN_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_notify_add (gconf_client, - LOCKDOWN_DIR, - lockdown_changed, - self, - NULL, - NULL); - - gconf_client_add_dir(gconf_client, KEYBINDING_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_notify_add (gconf_client, - KEYBINDING_DIR, - keybinding_changed, - self, - NULL, - NULL); + if (!lockdown_settings) { + lockdown_settings = g_settings_new (LOCKDOWN_SCHEMA); + g_signal_connect(lockdown_settings, "changed", G_CALLBACK(lockdown_changed), self); + } + if (!keybinding_settings) { + keybinding_settings = g_settings_new (KEYBINDING_SCHEMA); + g_signal_connect(lockdown_settings, "changed::" KEY_LOCK_SCREEN, G_CALLBACK(keybinding_changed), self); } + + return; } DbusmenuMenuitem* diff --git a/src/dialog.c b/src/dialog.c index 299f954..45cfdcb 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -53,15 +53,15 @@ static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { they are also going to get a password dialog to do the action. */ static const gchar * button_auth_strings[LOGOUT_DIALOG_TYPE_CNT] = { /* LOGOUT_DIALOG_LOGOUT, */ NC_("button auth", "Log Out"), - /* LOGOUT_DIALOG_RESTART, */ NC_("button auth", "Restart..."), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button auth", "Shut Down...") + /* LOGOUT_DIALOG_RESTART, */ NC_("button auth", "Restart…"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button auth", "Shut Down…") }; /* TRANSLATORS: This button appears on the logout dialog when there are updates that require restart. It will do a restart in place of a log out. */ static const gchar * restart_updates = N_("Restart Instead"); -static const gchar * restart_auth = N_("Restart Instead..."); +static const gchar * restart_auth = N_("Restart Instead…"); static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { diff --git a/src/gtk-logout-helper.c b/src/gtk-logout-helper.c index b8923c6..33dce3a 100644 --- a/src/gtk-logout-helper.c +++ b/src/gtk-logout-helper.c @@ -26,7 +26,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <gtk/gtk.h> #include <dbus/dbus-glib.h> #include "dialog.h" -#include "gconf-helper.h" +#include "settings-helper.h" static void consolekit_fallback (LogoutDialogType action) diff --git a/src/indicator-session.c b/src/indicator-session.c index f6727d9..fab47b3 100644 --- a/src/indicator-session.c +++ b/src/indicator-session.c @@ -167,7 +167,7 @@ indicator_session_init (IndicatorSession *self) // devices self->devices.menu = GTK_MENU (dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT)); - self->devices.image = indicator_image_helper ("system-devices-panel"); + self->devices.image = indicator_image_helper (ICON_DEFAULT); gtk_widget_show (GTK_WIDGET(self->devices.menu)); gtk_widget_show (GTK_WIDGET(self->devices.image)); @@ -499,7 +499,7 @@ receive_signal (GDBusProxy * proxy, } else if (g_strcmp0(signal_name, "RebootRequired") == 0) { // TODO waiting on design to give me a name. - self->devices.image = indicator_image_helper ("system-devices-alert-panel"); + self->devices.image = indicator_image_helper (ICON_RESTART); } } @@ -527,7 +527,7 @@ switch_property_change (DbusmenuMenuitem * item, if (variant == NULL || g_variant_get_string(variant, NULL) == NULL || g_variant_get_string(variant, NULL)[0] == '\0' || no_name_in_lang) { - finalstring = _("Switch User..."); + finalstring = _("Switch User…"); set_ellipsize = FALSE; } @@ -554,7 +554,7 @@ switch_property_change (DbusmenuMenuitem * item, gdouble ems = width / pixels_per_em; g_debug("Username width %fem", ems); - finalstring = g_strdup_printf(_("Switch From %s..."), username); + finalstring = g_strdup_printf(_("Switch From %s…"), username); if (ems >= 20.0f) { set_ellipsize = TRUE; } else { diff --git a/src/gconf-helper.c b/src/settings-helper.c index 93ae96f..5a69d17 100644 --- a/src/gconf-helper.c +++ b/src/settings-helper.c @@ -1,5 +1,5 @@ /* -A small wrapper utility for connecting to gconf. +A small wrapper utility for connecting to GSettings. Copyright 2009 Canonical Ltd. @@ -19,9 +19,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -#include <gconf/gconf-client.h> - +#include <gio/gio.h> #include <glib/gi18n.h> #include <dbus/dbus-glib.h> @@ -31,53 +29,52 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libdbusmenu-glib/menuitem.h> #include "dbus-shared-names.h" -#include "gconf-helper.h" +#include "settings-helper.h" + +static GSettings* settings = NULL; -static GConfClient * gconf_client = NULL; static guint confirmation_notify = 0; static guint logout_notify = 0; static guint restart_notify = 0; static guint shutdown_notify = 0; +static void +build_settings (void) { + if(!settings) { + settings = g_settings_new (SESSION_SCHEMA); + } + return; +} + gboolean supress_confirmations (void) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - return gconf_client_get_bool (gconf_client, SUPPRESS_KEY, NULL) ; + build_settings(); + return g_settings_get_boolean (settings, SUPPRESS_KEY) ; } gboolean show_logout (void) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - return !gconf_client_get_bool (gconf_client, LOGOUT_KEY, NULL) ; + build_settings(); + return !g_settings_get_boolean (settings, LOGOUT_KEY) ; } gboolean show_restart (void) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - return !gconf_client_get_bool (gconf_client, RESTART_KEY, NULL) ; + build_settings(); + return !g_settings_get_boolean (settings, RESTART_KEY) ; } gboolean show_shutdown (void) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - return !gconf_client_get_bool (gconf_client, SHUTDOWN_KEY, NULL) ; + build_settings(); + return !g_settings_get_boolean (settings, SHUTDOWN_KEY) ; } -static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { +static void update_menu_entries_callback (GSettings * settings, const gchar * key, gpointer data) { RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi = (RestartShutdownLogoutMenuItems*) data; - GConfValue * value = gconf_entry_get_value (entry); - const gchar * key = gconf_entry_get_key (entry); if(g_strcmp0 (key, SUPPRESS_KEY) == 0) { - if (gconf_value_get_bool (value)) { + if (g_settings_get_boolean (settings, key)) { dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, RESTART_ITEM_LABEL, _("Restart")); dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shut Down")); @@ -90,80 +87,65 @@ static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GC } static void -update_logout_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { +update_logout_callback (GSettings * settings, const gchar * key, gpointer data) { DbusmenuMenuitem * mi = (DbusmenuMenuitem*) data; - GConfValue * value = gconf_entry_get_value (entry); - const gchar * key = gconf_entry_get_key (entry); if(g_strcmp0 (key, LOGOUT_KEY) == 0) { - dbusmenu_menuitem_property_set_bool(mi, DBUSMENU_MENUITEM_PROP_VISIBLE, !gconf_value_get_bool(value)); + dbusmenu_menuitem_property_set_bool(mi, DBUSMENU_MENUITEM_PROP_VISIBLE, !g_settings_get_boolean(settings, key)); } } static void -update_restart_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { +update_restart_callback (GSettings * settings, const gchar * key, gpointer data) { DbusmenuMenuitem * mi = (DbusmenuMenuitem*) data; - GConfValue * value = gconf_entry_get_value (entry); - const gchar * key = gconf_entry_get_key (entry); if(g_strcmp0 (key, RESTART_KEY) == 0) { - dbusmenu_menuitem_property_set_bool(mi, DBUSMENU_MENUITEM_PROP_VISIBLE, !gconf_value_get_bool(value)); + dbusmenu_menuitem_property_set_bool(mi, DBUSMENU_MENUITEM_PROP_VISIBLE, !g_settings_get_boolean(settings, key)); } } static void -update_shutdown_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { +update_shutdown_callback (GSettings * settings, const gchar * key, gpointer data) { DbusmenuMenuitem * mi = (DbusmenuMenuitem*) data; - GConfValue * value = gconf_entry_get_value (entry); - const gchar * key = gconf_entry_get_key (entry); if(g_strcmp0 (key, SHUTDOWN_KEY) == 0) { - dbusmenu_menuitem_property_set_bool(mi, DBUSMENU_MENUITEM_PROP_VISIBLE, !gconf_value_get_bool(value)); + dbusmenu_menuitem_property_set_bool(mi, DBUSMENU_MENUITEM_PROP_VISIBLE, !g_settings_get_boolean(settings, key)); } } void update_menu_entries(RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi) { /* If we don't have a client, build one. */ - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - - /* If we've not gotten any notifications, then we need - to add the directory for notifications to come from. */ - if (confirmation_notify == 0 || logout_notify == 0) { - gconf_client_add_dir (gconf_client, GLOBAL_DIR, - GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - } + build_settings(); if (confirmation_notify != 0) { - gconf_client_notify_remove (gconf_client, confirmation_notify); + g_signal_handler_disconnect (settings, confirmation_notify); confirmation_notify = 0; } if (logout_notify != 0) { - gconf_client_notify_remove (gconf_client, logout_notify); + g_signal_handler_disconnect (settings, logout_notify); logout_notify = 0; } if (restart_notify != 0) { - gconf_client_notify_remove (gconf_client, restart_notify); + g_signal_handler_disconnect (settings, restart_notify); restart_notify = 0; } if (shutdown_notify != 0) { - gconf_client_notify_remove (gconf_client, shutdown_notify); + g_signal_handler_disconnect (settings, shutdown_notify); shutdown_notify = 0; } - confirmation_notify = gconf_client_notify_add (gconf_client, SUPPRESS_KEY, - update_menu_entries_callback, restart_shutdown_logout_mi, NULL, NULL); - logout_notify = gconf_client_notify_add (gconf_client, LOGOUT_KEY, - update_logout_callback, restart_shutdown_logout_mi->logout_mi, NULL, NULL); - restart_notify = gconf_client_notify_add (gconf_client, RESTART_KEY, - update_restart_callback, restart_shutdown_logout_mi->restart_mi, NULL, NULL); - shutdown_notify = gconf_client_notify_add (gconf_client, SHUTDOWN_KEY, - update_shutdown_callback, restart_shutdown_logout_mi->shutdown_mi, NULL, NULL); + confirmation_notify = g_signal_connect (settings, "changed::" SUPPRESS_KEY, + G_CALLBACK(update_menu_entries_callback), restart_shutdown_logout_mi); + logout_notify = g_signal_connect (settings, "changed::" LOGOUT_KEY, + G_CALLBACK(update_logout_callback), restart_shutdown_logout_mi->logout_mi); + restart_notify = g_signal_connect (settings, "changed::" RESTART_KEY, + G_CALLBACK(update_restart_callback), restart_shutdown_logout_mi->restart_mi); + shutdown_notify = g_signal_connect (settings, "changed::" SHUTDOWN_KEY, + G_CALLBACK(update_shutdown_callback), restart_shutdown_logout_mi->shutdown_mi); return; } diff --git a/src/gconf-helper.h b/src/settings-helper.h index 039b309..7b377ca 100644 --- a/src/gconf-helper.h +++ b/src/settings-helper.h @@ -1,5 +1,5 @@ /* -A small wrapper utility for connecting to gconf. +A small wrapper utility for connecting to GSettings. Copyright 2009 Canonical Ltd. @@ -23,8 +23,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #ifndef __GCONF_HELPER_H__ #define __GCONF_HELPER_H__ 1 -#include <gconf/gconf-client.h> - #include <glib/gi18n.h> #include <dbus/dbus-glib.h> @@ -33,17 +31,17 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libdbusmenu-glib/server.h> #include <libdbusmenu-glib/menuitem.h> -#define GLOBAL_DIR "/apps/indicator-session" -#define SUPPRESS_KEY GLOBAL_DIR "/suppress_logout_restart_shutdown" -#define LOGOUT_KEY GLOBAL_DIR "/suppress_logout_menuitem" -#define RESTART_KEY GLOBAL_DIR "/suppress_restart_menuitem" -#define SHUTDOWN_KEY GLOBAL_DIR "/suppress_shutdown_menuitem" - -#define LOCKDOWN_DIR "/desktop/gnome/lockdown" -#define LOCKDOWN_KEY_USER LOCKDOWN_DIR "/disable_user_switching" -#define LOCKDOWN_KEY_SCREENSAVER LOCKDOWN_DIR "/disable_lock_screen" -#define KEYBINDING_DIR "/apps/gnome_settings_daemon/keybindings" -#define KEY_LOCK_SCREEN KEYBINDING_DIR "/screensaver" +#define SESSION_SCHEMA "com.canonical.indicator.session" +#define SUPPRESS_KEY "suppress-logout-restart-shutdown" +#define LOGOUT_KEY "suppress-logout-menuitem" +#define RESTART_KEY "suppress-restart-menuitem" +#define SHUTDOWN_KEY "suppress-shutdown-menuitem" + +#define LOCKDOWN_SCHEMA "org.gnome.desktop.lockdown" +#define LOCKDOWN_KEY_USER "disable-user-switching" +#define LOCKDOWN_KEY_SCREENSAVER "disable-lock-screen" +#define KEYBINDING_SCHEMA "org.gnome.settings-daemon.plugins.media-keys" +#define KEY_LOCK_SCREEN "screensaver" typedef struct _RestartShutdownLogoutMenuItems { diff --git a/src/user-menu-mgr.c b/src/user-menu-mgr.c index 7c95ab3..bf00a34 100644 --- a/src/user-menu-mgr.c +++ b/src/user-menu-mgr.c @@ -20,13 +20,13 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libdbusmenu-glib/client.h> #include "user-menu-mgr.h" -#include "gconf-helper.h" +#include "settings-helper.h" #include "dbus-shared-names.h" #include "dbusmenu-shared.h" #include "lock-helper.h" #include "users-service-dbus.h" -static GConfClient * gconf_client = NULL; +static GSettings* settings = NULL; static DbusmenuMenuitem *switch_menuitem = NULL; struct _UserMenuMgr @@ -56,7 +56,7 @@ static void user_change (UsersServiceDbus *service, const gchar *user_id, gpointer user_data); -static void ensure_gconf_client (); +static void ensure_settings_client (); static gboolean check_guest_session (void); static void activate_guest_session (DbusmenuMenuitem * mi, guint timestamp, @@ -92,8 +92,6 @@ static void user_menu_mgr_class_init (UserMenuMgrClass *klass) { GObjectClass* object_class = G_OBJECT_CLASS (klass); - //GObjectClass* parent_class = G_OBJECT_CLASS (klass); - object_class->finalize = user_menu_mgr_finalize; } @@ -110,11 +108,11 @@ user_menu_mgr_rebuild_items (UserMenuMgr *self, gboolean greeter_mode) /* Make sure we have a valid GConf client, and build one if needed */ - ensure_gconf_client (); + ensure_settings_client (); /* Check to see which menu items we're allowed to have */ can_activate = users_service_dbus_can_activate_session (self->users_dbus_interface) && - !gconf_client_get_bool (gconf_client, LOCKDOWN_KEY_USER, NULL); + !g_settings_get_boolean (settings, LOCKDOWN_KEY_USER); /* Remove the old menu items if that makes sense */ children = dbusmenu_menuitem_take_children (self->root_item); @@ -212,15 +210,7 @@ user_menu_mgr_rebuild_items (UserMenuMgr *self, gboolean greeter_mode) dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, conflictedname); g_free(conflictedname); } else { - //g_debug ("%i %s", (gint)user->uid, user->real_name); - //g_debug ("users uid = %i", (gint)user->uid); - //g_debug ("users real name = %s", user->real_name); - if (user == NULL){ - g_debug ("USER pointer is NULL"); - return; - } - g_debug ("%p: %s", user, user->real_name); - + g_debug ("%p: %s", user, user->real_name); dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); @@ -229,9 +219,16 @@ user_menu_mgr_rebuild_items (UserMenuMgr *self, gboolean greeter_mode) USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); if (user->icon_file != NULL && user->icon_file[0] != '\0') { - dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, user->icon_file); + g_debug ("user %s has this icon : %s", + user->user_name, + user->icon_file); + dbusmenu_menuitem_property_set (mi, + USER_ITEM_PROP_ICON, + user->icon_file); } else { - dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, USER_ITEM_ICON_DEFAULT); + dbusmenu_menuitem_property_set (mi, + USER_ITEM_PROP_ICON, + USER_ITEM_ICON_DEFAULT); } gboolean logged_in = g_strcmp0 (user->user_name, g_get_user_name()) == 0; @@ -288,9 +285,9 @@ check_new_session () locking the screen. If not, lock it. */ static void lock_if_possible (void) { - ensure_gconf_client (); + ensure_settings_client (); - if (!gconf_client_get_bool (gconf_client, LOCKDOWN_KEY_SCREENSAVER, NULL)) { + if (!g_settings_get_boolean (settings, LOCKDOWN_KEY_SCREENSAVER)) { lock_screen(NULL, 0, NULL); } @@ -373,13 +370,12 @@ user_change (UsersServiceDbus *service, /* Ensures that we have a GConf client and if we build one set up the signal handler. */ static void -ensure_gconf_client () +ensure_settings_client () { - if (!gconf_client) { - gconf_client = gconf_client_get_default (); - gconf_client_add_dir (gconf_client, LOCKDOWN_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_add_dir (gconf_client, KEYBINDING_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + if(!settings) { + settings = g_settings_new (LOCKDOWN_SCHEMA); } + return; } DbusmenuMenuitem* diff --git a/src/user-widget.c b/src/user-widget.c index 6495e80..a3ad1e4 100644 --- a/src/user-widget.c +++ b/src/user-widget.c @@ -3,7 +3,8 @@ Copyright 2011 Canonical Ltd. Authors: Conor Curran <conor.curran@canonical.com> - + Mirco Müller <mirco.mueller@canonical.com> + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 3, as published by the Free Software Foundation. @@ -24,6 +25,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <glib/gi18n.h> #include <gtk/gtk.h> #include <glib.h> +#include <math.h> #include <libindicator/indicator-image-helper.h> #include "user-widget.h" #include "dbus-shared-names.h" @@ -35,6 +37,7 @@ struct _UserWidgetPrivate { DbusmenuMenuitem* twin_item; GtkWidget* user_image; + gboolean using_personal_icon; GtkWidget* user_name; GtkWidget* container; GtkWidget* tick_icon; @@ -44,6 +47,13 @@ struct _UserWidgetPrivate #define USER_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), USER_WIDGET_TYPE, UserWidgetPrivate)) +typedef struct +{ + double r; + double g; + double b; +} CairoColorRGB; + /* Prototypes */ static void user_widget_class_init (UserWidgetClass *klass); static void user_widget_init (UserWidget *self); @@ -60,10 +70,22 @@ static void user_widget_property_update (DbusmenuMenuitem* item, gchar* property, GVariant* value, gpointer userdata); + + +static void _color_shade (const CairoColorRGB *a, + float k, + CairoColorRGB *b); + +static void draw_album_border (GtkWidget *widget, gboolean selected); + #if GTK_CHECK_VERSION(3, 0, 0) static gboolean user_widget_primitive_draw_cb_gtk_3 (GtkWidget *image, cairo_t* cr, gpointer user_data); +static gboolean user_widget_draw_usericon_gtk_3 (GtkWidget *widget, + cairo_t* cr, + gpointer user_data); + #else static gboolean user_widget_primitive_draw_cb (GtkWidget *image, GdkEventExpose *event, @@ -106,24 +128,9 @@ user_widget_init (UserWidget *self) // Create the UI elements. priv->user_image = gtk_image_new (); + gtk_misc_set_alignment(GTK_MISC(priv->user_image), 0.0, 0.0); + gtk_misc_set_padding (GTK_MISC(priv->user_image),0, 4.0); - // Just for now set the image to the default avator image - GdkPixbuf* pixbuf = NULL; - GError* error = NULL; - pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), - "avatar-default", - 32, - GTK_ICON_LOOKUP_FORCE_SIZE, - &error); - - if (pixbuf == NULL || error != NULL) { - g_warning ("Could not load the default avatar image for some reason"); - } - else{ - gtk_image_set_from_pixbuf (GTK_IMAGE(priv->user_image), pixbuf); - g_object_unref (pixbuf); - } - priv->user_name = gtk_label_new (""); priv->container = gtk_hbox_new (FALSE, 0); priv->tick_icon = gtk_image_new_from_icon_name ("account-logged-in", @@ -146,18 +153,23 @@ user_widget_init (UserWidget *self) FALSE, FALSE, 5); - gtk_widget_show_all (priv->container); - gtk_container_add (GTK_CONTAINER (self), priv->container); - + gtk_widget_show_all (priv->container); + gtk_container_add (GTK_CONTAINER (self), priv->container); gtk_widget_show_all (priv->tick_icon); gtk_widget_set_no_show_all (priv->tick_icon, TRUE); gtk_widget_hide (priv->tick_icon); + // Fetch the drawing context. #if GTK_CHECK_VERSION(3, 0, 0) g_signal_connect_after (GTK_WIDGET(self), "draw", G_CALLBACK(user_widget_primitive_draw_cb_gtk_3), GTK_WIDGET(self)); + + g_signal_connect_after (GTK_WIDGET(priv->user_image), "draw", + G_CALLBACK(user_widget_draw_usericon_gtk_3), + GTK_WIDGET(self)); + #else g_signal_connect_after (GTK_WIDGET(self), "expose-event", G_CALLBACK(user_widget_primitive_draw_cb), @@ -168,8 +180,6 @@ user_widget_init (UserWidget *self) static void user_widget_dispose (GObject *object) { - //UserWidgetPrivate * priv = USER_WIDGET_GET_PRIVATE(USER_WIDGET(object)); - G_OBJECT_CLASS (user_widget_parent_class)->dispose (object); } @@ -180,9 +190,11 @@ user_widget_finalize (GObject *object) G_OBJECT_CLASS (user_widget_parent_class)->finalize (object); } + +/*****************************************************************/ + #if GTK_CHECK_VERSION(3, 0, 0) -// Draw the radio dot and/or green check mark // TODO handle drawing of green check mark static gboolean user_widget_primitive_draw_cb_gtk_3 (GtkWidget *widget, @@ -201,15 +213,13 @@ user_widget_primitive_draw_cb_gtk_3 (GtkWidget *widget, } GtkStyle *style; - gdouble x, y; - gdouble offset = 15.0; - + gdouble x, y; style = gtk_widget_get_style (widget); GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); x = allocation.x + 13; - y = offset; + y = allocation.height / 2; cairo_arc (cr, x, y, 3.0, 0.0, 2 * G_PI);; @@ -221,68 +231,362 @@ user_widget_primitive_draw_cb_gtk_3 (GtkWidget *widget, return FALSE; } +static gboolean +user_widget_draw_usericon_gtk_3 (GtkWidget *widget, + cairo_t* cr, + gpointer user_data) +{ + g_return_val_if_fail(IS_USER_WIDGET(user_data), FALSE); + UserWidget* meta = USER_WIDGET(user_data); + UserWidgetPrivate * priv = USER_WIDGET_GET_PRIVATE(meta); + + if (priv->using_personal_icon == FALSE) + return FALSE; + + draw_album_border (widget, FALSE); + return FALSE; +} +/** + * TODO: + * Sort out gtk2 + */ // GTK 2 Expose handler #else - -// Draw the triangle if the player is running ... static gboolean user_widget_primitive_draw_cb (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { - /* g_return_val_if_fail(IS_USER_WIDGET(user_data), FALSE); UserWidget* meta = USER_WIDGET(user_data); UserWidgetPrivate * priv = USER_WIDGET_GET_PRIVATE(meta); + // Draw dot only when user is the current user. + if (!dbusmenu_menuitem_property_get_bool (priv->twin_item, + USER_ITEM_PROP_IS_CURRENT_USER)){ + return FALSE; + } + GtkStyle *style; cairo_t *cr; - int x, y, arrow_width, arrow_height; - - gint offset = 3; - arrow_width = 5; - arrow_height = 9; + cr = (cairo_t*) gdk_cairo_create (gtk_widget_get_window (widget)); + gdouble x, y; style = gtk_widget_get_style (widget); - - cr = (cairo_t*) gdk_cairo_create (gtk_widget_get_window (widget)); - GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); - x = allocation.x; - y = allocation.y; - - // Draw player icon - if (priv->icon_buf != NULL){ - gdk_cairo_set_source_pixbuf (cr, - priv->icon_buf, - x + arrow_width + 1, - y + offset); - cairo_paint (cr); - } - - // Draw triangle but only if the player is running. - if (dbusmenu_menuitem_property_get_bool (priv->twin_item, - DBUSMENU_METADATA_MENUITEM_PLAYER_RUNNING)){ - y += (double)arrow_height/2.0 + offset; - cairo_set_line_width (cr, 1.0); - - cairo_move_to (cr, x, y); - cairo_line_to (cr, x, y + arrow_height); - cairo_line_to (cr, x + arrow_width, y + (double)arrow_height/2.0); - cairo_close_path (cr); - cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0, - style->fg[gtk_widget_get_state(widget)].green/65535.0, - style->fg[gtk_widget_get_state(widget)].blue/65535.0); - cairo_fill (cr); - } + x = allocation.x + 13; + y = allocation.height / 2; - cairo_destroy (cr);*/ + cairo_arc (cr, x, y, 3.0, 0.0, 2 * G_PI);; + + cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0, + style->fg[gtk_widget_get_state(widget)].green/65535.0, + style->fg[gtk_widget_get_state(widget)].blue/65535.0); + cairo_fill (cr); + cairo_destroy (cr); + return FALSE; } #endif +static void +draw_album_border(GtkWidget *widg, gboolean selected) +{ + cairo_t *cr; + cr = gdk_cairo_create (gtk_widget_get_window (widg)); + #if GTK_CHECK_VERSION(3, 0, 0) + gtk_style_context_add_class (gtk_widget_get_style_context (widg), + "menu"); + #endif + + GtkStyle *style; + style = gtk_widget_get_style (widg); + + GtkAllocation alloc; + gtk_widget_get_allocation (widg, &alloc); + gint offset = 0; + gint v_offset = 4; + + alloc.width = alloc.width + (offset * 2); + alloc.height = alloc.height - v_offset - 2; + alloc.x = alloc.x - offset; + alloc.y = alloc.y + v_offset/2 +1; + + CairoColorRGB bg_normal, fg_normal; + + bg_normal.r = style->bg[0].red/65535.0; + bg_normal.g = style->bg[0].green/65535.0; + bg_normal.b = style->bg[0].blue/65535.0; + + gint state = selected ? 5 : 0; + + fg_normal.r = style->fg[state].red/65535.0; + fg_normal.g = style->fg[state].green/65535.0; + fg_normal.b = style->fg[state].blue/65535.0; + + CairoColorRGB dark_top_color; + CairoColorRGB light_bottom_color; + CairoColorRGB background_color; + + _color_shade ( &bg_normal, 0.93, &background_color ); + _color_shade ( &bg_normal, 0.23, &dark_top_color ); + _color_shade ( &fg_normal, 0.55, &light_bottom_color ); + + cairo_rectangle (cr, + alloc.x, alloc.y, + alloc.width, alloc.height); + + cairo_set_line_width (cr, 1.0); + + cairo_clip ( cr ); + + cairo_move_to (cr, alloc.x, alloc.y ); + cairo_line_to (cr, alloc.x + alloc.width, + alloc.y ); + cairo_line_to ( cr, alloc.x + alloc.width, + alloc.y + alloc.height ); + cairo_line_to ( cr, alloc.x, alloc.y + alloc.height ); + cairo_line_to ( cr, alloc.x, alloc.y); + cairo_close_path (cr); + + cairo_set_source_rgba ( cr, + background_color.r, + background_color.g, + background_color.b, + 1.0 ); + + cairo_stroke ( cr ); + + cairo_move_to (cr, alloc.x, alloc.y ); + cairo_line_to (cr, alloc.x + alloc.width, + alloc.y ); + + cairo_close_path (cr); + cairo_set_source_rgba ( cr, + dark_top_color.r, + dark_top_color.g, + dark_top_color.b, + 1.0 ); + + cairo_stroke ( cr ); + + cairo_move_to ( cr, alloc.x + alloc.width, + alloc.y + alloc.height ); + cairo_line_to ( cr, alloc.x, alloc.y + alloc.height ); + + cairo_close_path (cr); + cairo_set_source_rgba ( cr, + light_bottom_color.r, + light_bottom_color.g, + light_bottom_color.b, + 1.0); + + cairo_stroke ( cr ); + cairo_destroy (cr); +} + +static void +_color_rgb_to_hls (gdouble *r, + gdouble *g, + gdouble *b) +{ + gdouble min; + gdouble max; + gdouble red; + gdouble green; + gdouble blue; + gdouble h = 0; + gdouble l; + gdouble s; + gdouble delta; + + red = *r; + green = *g; + blue = *b; + + if (red > green) + { + if (red > blue) + max = red; + else + max = blue; + + if (green < blue) + min = green; + else + min = blue; + } + else + { + if (green > blue) + max = green; + else + max = blue; + + if (red < blue) + min = red; + else + min = blue; + } + l = (max+min)/2; + if (fabs (max-min) < 0.0001) + { + h = 0; + s = 0; + } + else + { + if (l <= 0.5) + s = (max-min)/(max+min); + else + s = (max-min)/(2-max-min); + + delta = (max -min) != 0 ? (max -min) : 1; + + if(delta == 0) + delta = 1; + if (red == max) + h = (green-blue)/delta; + else if (green == max) + h = 2+(blue-red)/delta; + else if (blue == max) + h = 4+(red-green)/delta; + + h *= 60; + if (h < 0.0) + h += 360; + } + + *r = h; + *g = l; + *b = s; +} + +static void +_color_hls_to_rgb (gdouble *h, + gdouble *l, + gdouble *s) +{ + gdouble hue; + gdouble lightness; + gdouble saturation; + gdouble m1, m2; + gdouble r, g, b; + + lightness = *l; + saturation = *s; + + if (lightness <= 0.5) + m2 = lightness*(1+saturation); + else + m2 = lightness+saturation-lightness*saturation; + + m1 = 2*lightness-m2; + + if (saturation == 0) + { + *h = lightness; + *l = lightness; + *s = lightness; + } + else + { + hue = *h+120; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + r = m1+(m2-m1)*hue/60; + else if (hue < 180) + r = m2; + else if (hue < 240) + r = m1+(m2-m1)*(240-hue)/60; + else + r = m1; + + hue = *h; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + g = m1+(m2-m1)*hue/60; + else if (hue < 180) + g = m2; + else if (hue < 240) + g = m1+(m2-m1)*(240-hue)/60; + else + g = m1; + + hue = *h-120; + while (hue > 360) + hue -= 360; + while (hue < 0) + hue += 360; + + if (hue < 60) + b = m1+(m2-m1)*hue/60; + else if (hue < 180) + b = m2; + else if (hue < 240) + b = m1+(m2-m1)*(240-hue)/60; + else + b = m1; + + *h = r; + *l = g; + *s = b; + } +} + +void +_color_shade (const CairoColorRGB *a, float k, CairoColorRGB *b) +{ + double red; + double green; + double blue; + + red = a->r; + green = a->g; + blue = a->b; + + if (k == 1.0) + { + b->r = red; + b->g = green; + b->b = blue; + return; + } + + _color_rgb_to_hls (&red, &green, &blue); + + green *= k; + if (green > 1.0) + green = 1.0; + else if (green < 0.0) + green = 0.0; + + blue *= k; + if (blue > 1.0) + blue = 1.0; + else if (blue < 0.0) + blue = 0.0; + + _color_hls_to_rgb (&red, &green, &blue); + + b->r = red; + b->g = green; + b->b = blue; +} + + +/*****************************************************************/ + /* Suppress/consume keyevents */ static gboolean user_widget_button_release_event (GtkWidget *menuitem, @@ -291,6 +595,10 @@ user_widget_button_release_event (GtkWidget *menuitem, return FALSE; } + +/** + * TODO, be sensitive to UI updates + * */ static void user_widget_property_update (DbusmenuMenuitem* item, gchar* property, GVariant* value, gpointer userdata) @@ -300,6 +608,8 @@ user_widget_property_update (DbusmenuMenuitem* item, gchar* property, } + + static void user_widget_set_twin_item (UserWidget* self, DbusmenuMenuitem* twin_item) @@ -325,9 +635,48 @@ user_widget_set_twin_item (UserWidget* self, gtk_widget_hide(priv->tick_icon); } - g_debug("Using user icon for '%s' from file: %s", - dbusmenu_menuitem_property_get(twin_item, USER_ITEM_PROP_NAME), icon_name); + GdkPixbuf* pixbuf = NULL; + GError* error = NULL; + pixbuf = gdk_pixbuf_new_from_file_at_size(icon_name, 32, 32, NULL); + if (pixbuf == NULL || error != NULL) { + g_warning ("Could not load the user image (%s) for some reason", + icon_name); + if (pixbuf != NULL){ + g_object_unref (pixbuf); + pixbuf = NULL; + } + if (error != NULL){ + g_error_free (error); + error = NULL; + } + + priv->using_personal_icon = FALSE; + + pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), + USER_ITEM_ICON_DEFAULT, + 32, + GTK_ICON_LOOKUP_FORCE_SIZE, + &error); + } + else{ + priv->using_personal_icon = TRUE; + } + + if (pixbuf == NULL || error != NULL) { + g_warning ("Could not load the user image"); + if (error != NULL){ + g_error_free (error); + error = NULL; + } + } + else{ + gtk_image_set_from_pixbuf (GTK_IMAGE(priv->user_image), pixbuf); + } + if (pixbuf != NULL){ + g_object_unref (pixbuf); + pixbuf = NULL; + } } /** |