From 17719352f36200345017124fc259449d52c18a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 9 Feb 2022 18:14:04 +0100 Subject: [PATCH] shell: Use g_object_notify_by_pspec() where possible It's slightly more efficient not having to do property lookups. While that is unlikely to be a concern for the properties in question, it's still good practice and makes the code base a bit more consistent. Part-of: --- src/shell-app.c | 101 +++++++------- src/shell-global.c | 275 ++++++++++++++++++------------------- src/shell-keyring-prompt.c | 93 +++++++++---- src/shell-window-tracker.c | 24 ++-- 4 files changed, 266 insertions(+), 227 deletions(-) diff --git a/src/shell-app.c b/src/shell-app.c index 8790dba0f..43b098020 100644 --- a/src/shell-app.c +++ b/src/shell-app.c @@ -90,14 +90,19 @@ struct _ShellApp enum { PROP_0, + PROP_STATE, PROP_BUSY, PROP_ID, PROP_ACTION_GROUP, PROP_ICON, - PROP_APP_INFO + PROP_APP_INFO, + + N_PROPS }; +static GParamSpec *props[N_PROPS] = { NULL, }; + enum { WINDOWS_CHANGED, LAST_SIGNAL @@ -212,7 +217,7 @@ on_window_icon_changed (GObject *object, if (!app->fallback_icon) app->fallback_icon = g_themed_icon_new ("application-x-executable"); - g_object_notify (G_OBJECT (app), "icon"); + g_object_notify_by_pspec (G_OBJECT (app), props[PROP_ICON]); } /** @@ -511,7 +516,7 @@ shell_app_update_window_actions (ShellApp *app, MetaWindow *window) g_assert (app->running_state->muxer); gtk_action_muxer_insert (app->running_state->muxer, "win", actions); - g_object_notify (G_OBJECT (app), "action-group"); + g_object_notify_by_pspec (G_OBJECT (app), props[PROP_ACTION_GROUP]); } } @@ -963,7 +968,7 @@ shell_app_state_transition (ShellApp *app, _shell_app_system_notify_app_state_changed (shell_app_system_get_default (), app); - g_object_notify (G_OBJECT (app), "state"); + g_object_notify_by_pspec (G_OBJECT (app), props[PROP_STATE]); } static void @@ -1053,7 +1058,7 @@ busy_changed_cb (GObject *object, g_assert (SHELL_IS_APP (app)); - g_object_notify (G_OBJECT (app), "busy"); + g_object_notify_by_pspec (G_OBJECT (app), props[PROP_BUSY]); } static void @@ -1076,7 +1081,7 @@ get_application_proxy (GObject *source, G_CALLBACK (busy_changed_cb), app); if (shell_org_gtk_application_get_busy (proxy)) - g_object_notify (G_OBJECT (app), "busy"); + g_object_notify_by_pspec (G_OBJECT (app), props[PROP_BUSY]); } if (app->running_state != NULL && @@ -1178,7 +1183,7 @@ _shell_app_remove_window (ShellApp *app, /* Select a new icon from a different window. */ g_clear_object (&app->fallback_icon); - g_object_notify (G_OBJECT (app), "icon"); + g_object_notify_by_pspec (G_OBJECT (app), props[PROP_ICON]); } g_object_unref (window); @@ -1681,27 +1686,25 @@ shell_app_class_init(ShellAppClass *klass) * The high-level state of the application, effectively whether it's * running or not, or transitioning between those states. */ - g_object_class_install_property (gobject_class, - PROP_STATE, - g_param_spec_enum ("state", - "State", - "Application state", - SHELL_TYPE_APP_STATE, - SHELL_APP_STATE_STOPPED, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_STATE] = + g_param_spec_enum ("state", + "State", + "Application state", + SHELL_TYPE_APP_STATE, + SHELL_APP_STATE_STOPPED, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellApp:busy: * * Whether the application has marked itself as busy. */ - g_object_class_install_property (gobject_class, - PROP_BUSY, - g_param_spec_boolean ("busy", - "Busy", - "Busy state", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_BUSY] = + g_param_spec_boolean ("busy", + "Busy", + "Busy state", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellApp:id: @@ -1709,26 +1712,24 @@ shell_app_class_init(ShellAppClass *klass) * The id of this application (a desktop filename, or a special string * like window:0xabcd1234) */ - g_object_class_install_property (gobject_class, - PROP_ID, - g_param_spec_string ("id", - "Application id", - "The desktop file id of this ShellApp", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_ID] = + g_param_spec_string ("id", + "Application id", + "The desktop file id of this ShellApp", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellApp:icon: * * The #GIcon representing this ShellApp */ - g_object_class_install_property (gobject_class, - PROP_ICON, - g_param_spec_object ("icon", - "GIcon", - "The GIcon representing this app", - G_TYPE_ICON, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_ICON] = + g_param_spec_object ("icon", + "GIcon", + "The GIcon representing this app", + G_TYPE_ICON, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellApp:action-group: @@ -1736,24 +1737,24 @@ shell_app_class_init(ShellAppClass *klass) * The #GDBusActionGroup associated with this ShellApp, if any. See the * documentation of #GApplication and #GActionGroup for details. */ - g_object_class_install_property (gobject_class, - PROP_ACTION_GROUP, - g_param_spec_object ("action-group", - "Application Action Group", - "The action group exported by the remote application", - G_TYPE_ACTION_GROUP, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_ACTION_GROUP] = + g_param_spec_object ("action-group", + "Application Action Group", + "The action group exported by the remote application", + G_TYPE_ACTION_GROUP, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + /** * ShellApp:app-info: * * The #GDesktopAppInfo associated with this ShellApp, if any. */ - g_object_class_install_property (gobject_class, - PROP_APP_INFO, - g_param_spec_object ("app-info", - "DesktopAppInfo", - "The DesktopAppInfo associated with this app", - G_TYPE_DESKTOP_APP_INFO, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + props[PROP_APP_INFO] = + g_param_spec_object ("app-info", + "DesktopAppInfo", + "The DesktopAppInfo associated with this app", + G_TYPE_DESKTOP_APP_INFO, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (gobject_class, N_PROPS, props); } diff --git a/src/shell-global.c b/src/shell-global.c index ac8edb1e5..23551790c 100644 --- a/src/shell-global.c +++ b/src/shell-global.c @@ -109,8 +109,12 @@ enum { PROP_FRAME_TIMESTAMPS, PROP_FRAME_FINISH_TIMESTAMP, PROP_SWITCHEROO_CONTROL, + + N_PROPS }; +static GParamSpec *props[N_PROPS] = { NULL, }; + /* Signals */ enum { @@ -144,7 +148,7 @@ got_switcheroo_control_gpus_property_cb (GObject *source_object, global = user_data; g_dbus_proxy_set_cached_property (global->switcheroo_control, "GPUs", gpus); - g_object_notify (G_OBJECT (global), "switcheroo-control"); + g_object_notify_by_pspec (G_OBJECT (global), props[PROP_SWITCHEROO_CONTROL]); } static void @@ -173,7 +177,7 @@ switcheroo_control_ready_cb (GObject *source_object, cached_props = g_dbus_proxy_get_cached_property_names (global->switcheroo_control); if (cached_props != NULL && g_strv_contains ((const gchar * const *) cached_props, "GPUs")) { - g_object_notify (G_OBJECT (global), "switcheroo-control"); + g_object_notify_by_pspec (G_OBJECT (global), props[PROP_SWITCHEROO_CONTROL]); return; } /* Delay property notification until we have all the properties gathered */ @@ -330,7 +334,7 @@ switcheroo_vanished_cb (GDBusConnection *connection, g_debug ("switcheroo-control vanished"); g_clear_object (&global->switcheroo_control); - g_object_notify (G_OBJECT (global), "switcheroo-control"); + g_object_notify_by_pspec (G_OBJECT (global), props[PROP_SWITCHEROO_CONTROL]); } static void @@ -488,145 +492,140 @@ shell_global_class_init (ShellGlobalClass *klass) NULL, NULL, NULL, G_TYPE_NONE, 0); - g_object_class_install_property (gobject_class, - PROP_SESSION_MODE, - g_param_spec_string ("session-mode", - "Session Mode", - "The session mode to use", - "user", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + props[PROP_SESSION_MODE] = + g_param_spec_string ("session-mode", + "Session Mode", + "The session mode to use", + "user", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (gobject_class, - PROP_SCREEN_WIDTH, - g_param_spec_int ("screen-width", - "Screen Width", - "Screen width, in pixels", - 0, G_MAXINT, 1, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_SCREEN_WIDTH] = + g_param_spec_int ("screen-width", + "Screen Width", + "Screen width, in pixels", + 0, G_MAXINT, 1, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (gobject_class, - PROP_SCREEN_HEIGHT, - g_param_spec_int ("screen-height", - "Screen Height", - "Screen height, in pixels", - 0, G_MAXINT, 1, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_BACKEND, - g_param_spec_object ("backend", - "Backend", - "MetaBackend object", - META_TYPE_BACKEND, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_CONTEXT, - g_param_spec_object ("context", - "Context", - "MetaContext object", - META_TYPE_CONTEXT, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_DISPLAY, - g_param_spec_object ("display", - "Display", - "Metacity display object for the shell", - META_TYPE_DISPLAY, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_SCREEN_HEIGHT] = + g_param_spec_int ("screen-height", + "Screen Height", + "Screen height, in pixels", + 0, G_MAXINT, 1, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (gobject_class, - PROP_WORKSPACE_MANAGER, - g_param_spec_object ("workspace-manager", - "Workspace manager", - "Workspace manager", - META_TYPE_WORKSPACE_MANAGER, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_BACKEND] = + g_param_spec_object ("backend", + "Backend", + "MetaBackend object", + META_TYPE_BACKEND, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (gobject_class, - PROP_STAGE, - g_param_spec_object ("stage", - "Stage", - "Stage holding the desktop scene graph", - CLUTTER_TYPE_ACTOR, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_WINDOW_GROUP, - g_param_spec_object ("window-group", - "Window Group", - "Actor holding window actors", - CLUTTER_TYPE_ACTOR, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_CONTEXT] = + g_param_spec_object ("context", + "Context", + "MetaContext object", + META_TYPE_CONTEXT, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (gobject_class, - PROP_TOP_WINDOW_GROUP, - g_param_spec_object ("top-window-group", - "Top Window Group", - "Actor holding override-redirect windows", - CLUTTER_TYPE_ACTOR, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_DISPLAY] = + g_param_spec_object ("display", + "Display", + "Metacity display object for the shell", + META_TYPE_DISPLAY, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (gobject_class, - PROP_WINDOW_MANAGER, - g_param_spec_object ("window-manager", - "Window Manager", - "Window management interface", - SHELL_TYPE_WM, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_SETTINGS, - g_param_spec_object ("settings", - "Settings", - "GSettings instance for gnome-shell configuration", - G_TYPE_SETTINGS, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_DATADIR, - g_param_spec_string ("datadir", - "Data directory", - "Directory containing gnome-shell data files", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_IMAGEDIR, - g_param_spec_string ("imagedir", - "Image directory", - "Directory containing gnome-shell image files", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_USERDATADIR, - g_param_spec_string ("userdatadir", - "User data directory", - "Directory containing gnome-shell user data", - NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_FOCUS_MANAGER, - g_param_spec_object ("focus-manager", - "Focus manager", - "The shell's StFocusManager", - ST_TYPE_FOCUS_MANAGER, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_FRAME_TIMESTAMPS, - g_param_spec_boolean ("frame-timestamps", - "Frame Timestamps", - "Whether to log frame timestamps in the performance log", - FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_FRAME_FINISH_TIMESTAMP, - g_param_spec_boolean ("frame-finish-timestamp", - "Frame Finish Timestamps", - "Whether at the end of a frame to call glFinish and log paintCompletedTimestamp", - FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, - PROP_SWITCHEROO_CONTROL, - g_param_spec_object ("switcheroo-control", - "switcheroo-control", - "D-Bus Proxy for switcheroo-control daemon", - G_TYPE_DBUS_PROXY, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_WORKSPACE_MANAGER] = + g_param_spec_object ("workspace-manager", + "Workspace manager", + "Workspace manager", + META_TYPE_WORKSPACE_MANAGER, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_STAGE] = + g_param_spec_object ("stage", + "Stage", + "Stage holding the desktop scene graph", + CLUTTER_TYPE_ACTOR, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_WINDOW_GROUP] = + g_param_spec_object ("window-group", + "Window Group", + "Actor holding window actors", + CLUTTER_TYPE_ACTOR, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_TOP_WINDOW_GROUP] = + g_param_spec_object ("top-window-group", + "Top Window Group", + "Actor holding override-redirect windows", + CLUTTER_TYPE_ACTOR, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_WINDOW_MANAGER] = + g_param_spec_object ("window-manager", + "Window Manager", + "Window management interface", + SHELL_TYPE_WM, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_SETTINGS] = + g_param_spec_object ("settings", + "Settings", + "GSettings instance for gnome-shell configuration", + G_TYPE_SETTINGS, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_DATADIR] = + g_param_spec_string ("datadir", + "Data directory", + "Directory containing gnome-shell data files", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_IMAGEDIR] = + g_param_spec_string ("imagedir", + "Image directory", + "Directory containing gnome-shell image files", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_USERDATADIR] = + g_param_spec_string ("userdatadir", + "User data directory", + "Directory containing gnome-shell user data", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_FOCUS_MANAGER] = + g_param_spec_object ("focus-manager", + "Focus manager", + "The shell's StFocusManager", + ST_TYPE_FOCUS_MANAGER, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + props[PROP_FRAME_TIMESTAMPS] = + g_param_spec_boolean ("frame-timestamps", + "Frame Timestamps", + "Whether to log frame timestamps in the performance log", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + props[PROP_FRAME_FINISH_TIMESTAMP] = + g_param_spec_boolean ("frame-finish-timestamp", + "Frame Finish Timestamps", + "Whether at the end of a frame to call glFinish and log paintCompletedTimestamp", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + props[PROP_SWITCHEROO_CONTROL] = + g_param_spec_object ("switcheroo-control", + "switcheroo-control", + "D-Bus Proxy for switcheroo-control daemon", + G_TYPE_DBUS_PROXY, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPS, props); } /* @@ -857,7 +856,7 @@ global_stage_notify_width (GObject *gobject, { ShellGlobal *global = SHELL_GLOBAL (data); - g_object_notify (G_OBJECT (global), "screen-width"); + g_object_notify_by_pspec (G_OBJECT (global), props[PROP_SCREEN_WIDTH]); } static void @@ -867,7 +866,7 @@ global_stage_notify_height (GObject *gobject, { ShellGlobal *global = SHELL_GLOBAL (data); - g_object_notify (G_OBJECT (global), "screen-height"); + g_object_notify_by_pspec (G_OBJECT (global), props[PROP_SCREEN_HEIGHT]); } static gboolean diff --git a/src/shell-keyring-prompt.c b/src/shell-keyring-prompt.c index ccf3ffb05..f25d9f847 100644 --- a/src/shell-keyring-prompt.c +++ b/src/shell-keyring-prompt.c @@ -65,6 +65,17 @@ struct _ShellKeyringPrompt enum { PROP_0, + + PROP_PASSWORD_VISIBLE, + PROP_CONFIRM_VISIBLE, + PROP_WARNING_VISIBLE, + PROP_CHOICE_VISIBLE, + PROP_PASSWORD_ACTOR, + PROP_CONFIRM_ACTOR, + + N_PROPS, + + /* GcrPrompt */ PROP_TITLE, PROP_MESSAGE, PROP_DESCRIPTION, @@ -75,15 +86,11 @@ enum { PROP_PASSWORD_STRENGTH, PROP_CALLER_WINDOW, PROP_CONTINUE_LABEL, - PROP_CANCEL_LABEL, - PROP_PASSWORD_VISIBLE, - PROP_CONFIRM_VISIBLE, - PROP_WARNING_VISIBLE, - PROP_CHOICE_VISIBLE, - PROP_PASSWORD_ACTOR, - PROP_CONFIRM_ACTOR + PROP_CANCEL_LABEL }; +static GParamSpec *props[N_PROPS] = { NULL, }; + static void shell_keyring_prompt_iface (GcrPromptIface *iface); G_DEFINE_TYPE_WITH_CODE (ShellKeyringPrompt, shell_keyring_prompt, G_TYPE_OBJECT, @@ -163,7 +170,7 @@ shell_keyring_prompt_set_property (GObject *obj, if (!self->warning) self->warning = g_strdup (""); g_object_notify (obj, "warning"); - g_object_notify (obj, "warning-visible"); + g_object_notify_by_pspec (obj, props[PROP_WARNING_VISIBLE]); break; case PROP_CHOICE_LABEL: g_free (self->choice_label); @@ -171,7 +178,7 @@ shell_keyring_prompt_set_property (GObject *obj, if (!self->choice_label) self->choice_label = g_strdup (""); g_object_notify (obj, "choice-label"); - g_object_notify (obj, "choice-visible"); + g_object_notify_by_pspec (obj, props[PROP_CHOICE_VISIBLE]); break; case PROP_CHOICE_CHOSEN: self->choice_chosen = g_value_get_boolean (value); @@ -180,7 +187,7 @@ shell_keyring_prompt_set_property (GObject *obj, case PROP_PASSWORD_NEW: self->password_new = g_value_get_boolean (value); g_object_notify (obj, "password-new"); - g_object_notify (obj, "confirm-visible"); + g_object_notify_by_pspec (obj, props[PROP_CONFIRM_VISIBLE]); break; case PROP_CALLER_WINDOW: /* ignored */ @@ -345,54 +352,74 @@ shell_keyring_prompt_class_init (ShellKeyringPromptClass *klass) * * Whether the password entry is visible or not. */ - g_object_class_install_property (gobject_class, PROP_PASSWORD_VISIBLE, - g_param_spec_boolean ("password-visible", "Password visible", "Password field is visible", - FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_PASSWORD_VISIBLE] = + g_param_spec_boolean ("password-visible", + "Password visible", + "Password field is visible", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellKeyringPrompt:confirm-visible: * * Whether the password confirm entry is visible or not. */ - g_object_class_install_property (gobject_class, PROP_CONFIRM_VISIBLE, - g_param_spec_boolean ("confirm-visible", "Confirm visible", "Confirm field is visible", - FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_CONFIRM_VISIBLE] = + g_param_spec_boolean ("confirm-visible", + "Confirm visible", + "Confirm field is visible", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellKeyringPrompt:warning-visible: * * Whether the warning label is visible or not. */ - g_object_class_install_property (gobject_class, PROP_WARNING_VISIBLE, - g_param_spec_boolean ("warning-visible", "Warning visible", "Warning is visible", - FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_WARNING_VISIBLE] = + g_param_spec_boolean ("warning-visible", + "Warning visible", + "Warning is visible", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellKeyringPrompt:choice-visible: * * Whether the choice check box is visible or not. */ - g_object_class_install_property (gobject_class, PROP_CHOICE_VISIBLE, - g_param_spec_boolean ("choice-visible", "Choice visible", "Choice is visible", - FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_CHOICE_VISIBLE] = + g_param_spec_boolean ("choice-visible", + "Choice visible", + "Choice is visible", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); /** * ShellKeyringPrompt:password-actor: * * Text field for password */ - g_object_class_install_property (gobject_class, PROP_PASSWORD_ACTOR, - g_param_spec_object ("password-actor", "Password actor", "Text field for password", - CLUTTER_TYPE_TEXT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + props[PROP_PASSWORD_ACTOR] = + g_param_spec_object ("password-actor", + "Password actor", + "Text field for password", + CLUTTER_TYPE_TEXT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); /** * ShellKeyringPrompt:confirm-actor: * * Text field for confirmation password */ - g_object_class_install_property (gobject_class, PROP_CONFIRM_ACTOR, - g_param_spec_object ("confirm-actor", "Confirm actor", "Text field for confirming password", - CLUTTER_TYPE_TEXT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + props[PROP_CONFIRM_ACTOR] = + g_param_spec_object ("confirm-actor", + "Confirm actor", + "Text field for confirming password", + CLUTTER_TYPE_TEXT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPS, props); signals[SIGNAL_SHOW_PASSWORD] = g_signal_new ("show-password", G_TYPE_FROM_CLASS (klass), 0, 0, NULL, NULL, @@ -645,6 +672,9 @@ shell_keyring_prompt_set_password_actor (ShellKeyringPrompt *self, g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); g_return_if_fail (password_actor == NULL || CLUTTER_IS_TEXT (password_actor)); + if (self->password_actor == password_actor) + return; + if (password_actor) { buffer = shell_secure_text_buffer_new (); @@ -661,7 +691,7 @@ shell_keyring_prompt_set_password_actor (ShellKeyringPrompt *self, } self->password_actor = password_actor; - g_object_notify (G_OBJECT (self), "password-actor"); + g_object_notify_by_pspec (G_OBJECT (self), props[PROP_PASSWORD_ACTOR]); } /** @@ -680,6 +710,9 @@ shell_keyring_prompt_set_confirm_actor (ShellKeyringPrompt *self, g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); g_return_if_fail (confirm_actor == NULL || CLUTTER_IS_TEXT (confirm_actor)); + if (self->confirm_actor == confirm_actor) + return; + if (confirm_actor) { buffer = shell_secure_text_buffer_new (); @@ -691,7 +724,7 @@ shell_keyring_prompt_set_confirm_actor (ShellKeyringPrompt *self, if (self->confirm_actor) g_object_unref (self->confirm_actor); self->confirm_actor = confirm_actor; - g_object_notify (G_OBJECT (self), "confirm-actor"); + g_object_notify_by_pspec (G_OBJECT (self), props[PROP_CONFIRM_ACTOR]); } /** diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c index a8c85edc7..8c3de6f32 100644 --- a/src/shell-window-tracker.c +++ b/src/shell-window-tracker.c @@ -48,9 +48,14 @@ G_DEFINE_TYPE (ShellWindowTracker, shell_window_tracker, G_TYPE_OBJECT); enum { PROP_0, - PROP_FOCUS_APP + + PROP_FOCUS_APP, + + N_PROPS }; +static GParamSpec *props[N_PROPS] = { NULL, }; + enum { STARTUP_SEQUENCE_CHANGED, TRACKED_WINDOWS_CHANGED, @@ -97,13 +102,14 @@ shell_window_tracker_class_init (ShellWindowTrackerClass *klass) gobject_class->get_property = shell_window_tracker_get_property; gobject_class->finalize = shell_window_tracker_finalize; - g_object_class_install_property (gobject_class, - PROP_FOCUS_APP, - g_param_spec_object ("focus-app", - "Focus App", - "Focused application", - SHELL_TYPE_APP, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + props[PROP_FOCUS_APP] = + g_param_spec_object ("focus-app", + "Focus App", + "Focused application", + SHELL_TYPE_APP, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPS, props); signals[STARTUP_SEQUENCE_CHANGED] = g_signal_new ("startup-sequence-changed", SHELL_TYPE_WINDOW_TRACKER, @@ -731,7 +737,7 @@ set_focus_app (ShellWindowTracker *tracker, if (tracker->focus_app != NULL) g_object_ref (tracker->focus_app); - g_object_notify (G_OBJECT (tracker), "focus-app"); + g_object_notify_by_pspec (G_OBJECT (tracker), props[PROP_FOCUS_APP]); } static void