diff --git a/gnome-panel-2.24.0-smoother-slide-in.patch b/gnome-panel-2.24.0-smoother-slide-in.patch new file mode 100644 index 0000000..b0fb4d8 --- /dev/null +++ b/gnome-panel-2.24.0-smoother-slide-in.patch @@ -0,0 +1,451 @@ +--- gnome-panel-2.24.0/gnome-panel/applet.c ++++ gnome-panel-2.24.0/gnome-panel/applet.c +@@ -792,6 +792,7 @@ typedef struct { + } PanelAppletToLoad; + + static GSList *panel_applets_to_load = NULL; ++static GSList *panel_applets_loading = NULL; + static gboolean panel_applet_have_load_idle = FALSE; + + static void +@@ -818,8 +819,40 @@ panel_applet_on_load_queue (const char *id) + return FALSE; + } + ++static void ++on_applet_loaded (const char *id, ++ gpointer user_data) ++{ ++ PanelAppletToLoad *applet; ++ GSList *l, *applet_link; ++ ++ GClosure *closure = (GClosure *) user_data; ++ ++ applet_link = NULL; ++ for (l = panel_applets_loading; l; l = l->next) { ++ applet = l->data; ++ ++ if (strcmp (applet->id, id) == 0) { ++ break; ++ } ++ } ++ ++ if (l == NULL) ++ return; ++ ++ panel_applets_loading = g_slist_delete_link (panel_applets_loading, l); ++ free_applet_to_load (applet); ++ ++ if (panel_applets_loading == NULL && closure != NULL) { ++ GValue param = { 0 }; ++ g_value_init (¶m, G_TYPE_POINTER); ++ g_value_set_instance (¶m, NULL); ++ g_cclosure_marshal_VOID__VOID (closure, NULL, 1, ¶m, 0, NULL); ++ } ++} ++ + static gboolean +-panel_applet_load_idle_handler (gpointer dummy) ++panel_applet_load_idle_handler (GClosure *closure) + { + PanelAppletToLoad *applet = NULL; + PanelToplevel *toplevel = NULL; +@@ -848,8 +881,8 @@ panel_applet_load_idle_handler (gpointer dummy) + panel_applet_have_load_idle = FALSE; + return FALSE; + } +- + panel_applets_to_load = g_slist_delete_link (panel_applets_to_load, l); ++ panel_applets_loading = g_slist_append (panel_applets_loading, applet); + + panel_widget = panel_toplevel_get_panel_widget (toplevel); + +@@ -866,13 +900,16 @@ panel_applet_load_idle_handler (gpointer dummy) + panel_widget, + applet->locked, + applet->position, +- applet->id); ++ applet->id, ++ on_applet_loaded, ++ closure); + break; + case PANEL_OBJECT_DRAWER: + drawer_load_from_gconf (panel_widget, + applet->locked, + applet->position, + applet->id); ++ on_applet_loaded (applet->id, closure); + break; + case PANEL_OBJECT_MENU: + panel_menu_button_load_from_gconf (panel_widget, +@@ -880,12 +917,14 @@ panel_applet_load_idle_handler (gpointer dummy) + applet->position, + TRUE, + applet->id); ++ on_applet_loaded (applet->id, closure); + break; + case PANEL_OBJECT_LAUNCHER: + launcher_load_from_gconf (panel_widget, + applet->locked, + applet->position, + applet->id); ++ on_applet_loaded (applet->id, closure); + break; + case PANEL_OBJECT_LOGOUT: + case PANEL_OBJECT_LOCK: +@@ -896,6 +935,7 @@ panel_applet_load_idle_handler (gpointer dummy) + applet->position, + TRUE, + applet->id); ++ on_applet_loaded (applet->id, closure); + break; + case PANEL_OBJECT_ACTION: + panel_action_button_load_from_gconf ( +@@ -904,6 +944,7 @@ panel_applet_load_idle_handler (gpointer dummy) + applet->position, + TRUE, + applet->id); ++ on_applet_loaded (applet->id, closure); + break; + case PANEL_OBJECT_MENU_BAR: + panel_menu_bar_load_from_gconf ( +@@ -912,18 +953,18 @@ panel_applet_load_idle_handler (gpointer dummy) + applet->position, + TRUE, + applet->id); ++ on_applet_loaded (applet->id, closure); + break; + case PANEL_OBJECT_SEPARATOR: + panel_separator_load_from_gconf (panel_widget, + applet->locked, + applet->position, + applet->id); ++ on_applet_loaded (applet->id, closure); + default: + break; + } + +- free_applet_to_load (applet); +- + return TRUE; + } + +@@ -969,8 +1010,11 @@ panel_applet_compare (const PanelAppletToLoad *a, + } + + void +-panel_applet_load_queued_applets (void) ++panel_applet_load_queued_applets (GFunc queue_empty_func, ++ gpointer user_data) + { ++ GClosure *closure; ++ + if (!panel_applets_to_load) + return; + +@@ -978,7 +1022,11 @@ panel_applet_load_queued_applets (void) + (GCompareFunc) panel_applet_compare); + + if ( ! panel_applet_have_load_idle) { +- g_idle_add (panel_applet_load_idle_handler, NULL); ++ if (queue_empty_func != NULL) ++ closure = g_cclosure_new_swap (G_CALLBACK (queue_empty_func), user_data, NULL); ++ else ++ closure = NULL; ++ g_idle_add ((GSourceFunc) panel_applet_load_idle_handler, closure); + panel_applet_have_load_idle = TRUE; + } + } +--- gnome-panel-2.24.0/gnome-panel/applet.h ++++ gnome-panel-2.24.0/gnome-panel/applet.h +@@ -28,6 +28,7 @@ typedef struct { + char *id; + } AppletInfo; + ++typedef void (* AppletLoadingDoneFunc) (const char *id, gpointer data); + typedef gboolean (* CallbackEnabledFunc) (void); + + typedef struct { +@@ -69,7 +70,8 @@ void panel_applet_queue_applet_to_load (const char *id, + int position, + gboolean right_stick, + gboolean locked); +-void panel_applet_load_queued_applets (void); ++void panel_applet_load_queued_applets (GFunc queue_empty_func, ++ gpointer user_data); + gboolean panel_applet_on_load_queue (const char *id); + + +--- gnome-panel-2.24.0/gnome-panel/panel-applet-frame.c ++++ gnome-panel-2.24.0/gnome-panel/panel-applet-frame.c +@@ -80,6 +80,8 @@ typedef struct { + int position; + gboolean exactpos; + char *id; ++ AppletLoadingDoneFunc done_func; ++ gpointer user_data; + } PanelAppletFrameActivating; + + /* Keep in sync with panel-applet.h. Uggh. +@@ -326,7 +328,9 @@ panel_applet_frame_load (const gchar *iid, + gboolean locked, + int position, + gboolean exactpos, +- const char *id) ++ const char *id, ++ AppletLoadingDoneFunc done_func, ++ gpointer user_data) + { + PanelAppletFrame *frame; + CORBA_Environment ev; +@@ -337,11 +341,17 @@ panel_applet_frame_load (const gchar *iid, + g_return_if_fail (id != NULL); + + if (g_slist_find_custom (no_reload_applets, id, +- (GCompareFunc) strcmp)) ++ (GCompareFunc) strcmp)) { ++ if (done_func) ++ done_func (id, user_data); + return; ++ } + +- if (panel_lockdown_is_applet_disabled (iid)) ++ if (panel_lockdown_is_applet_disabled (iid)) { ++ if (done_func) ++ done_func (id, user_data); + return; ++ } + + frame = g_object_new (PANEL_TYPE_APPLET_FRAME, NULL); + frame->priv->panel = panel; +@@ -353,6 +363,8 @@ panel_applet_frame_load (const gchar *iid, + frame_act->position = position; + frame_act->exactpos = exactpos; + frame_act->id = g_strdup (id); ++ frame_act->done_func = done_func; ++ frame_act->user_data = user_data; + + CORBA_exception_init (&ev); + +@@ -367,7 +379,9 @@ void + panel_applet_frame_load_from_gconf (PanelWidget *panel_widget, + gboolean locked, + int position, +- const char *id) ++ const char *id, ++ AppletLoadingDoneFunc done_func, ++ gpointer user_data) + { + const char *key; + char *applet_iid; +@@ -379,11 +393,14 @@ panel_applet_frame_load_from_gconf (PanelWidget *panel_widget, + applet_iid = gconf_client_get_string (panel_gconf_get_client (), + key, NULL); + +- if (!applet_iid || !applet_iid[0]) ++ if (!applet_iid || !applet_iid[0]) { ++ done_func (id, user_data); + return; ++ } + + panel_applet_frame_load (applet_iid, panel_widget, +- locked, position, TRUE, id); ++ locked, position, TRUE, id, ++ done_func, user_data); + + g_free (applet_iid); + } +@@ -890,7 +907,7 @@ panel_applet_frame_reload_response (GtkWidget *dialog, + } + + panel_applet_frame_load (iid, panel, locked, +- position, TRUE, id); ++ position, TRUE, id, NULL, NULL); + + g_free (iid); + g_free (id); +@@ -1286,6 +1303,8 @@ panel_applet_frame_activated (CORBA_Object object, + if (!in_default_panel_config (frame_act->id)) { + panel_applet_frame_loading_failed (frame, frame_act->id); + } ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + return; +@@ -1328,6 +1347,8 @@ panel_applet_frame_activated (CORBA_Object object, + panel_applet_frame_loading_failed (frame, frame_act->id); + CORBA_exception_free (&corba_ev); + bonobo_object_release_unref (object, NULL); ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + g_free (error); +@@ -1344,6 +1365,8 @@ panel_applet_frame_activated (CORBA_Object object, + g_warning (G_STRLOC ": failed to load applet %s", + frame->priv->iid); + panel_applet_frame_loading_failed (frame, frame_act->id); ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + return; +@@ -1355,6 +1378,8 @@ panel_applet_frame_activated (CORBA_Object object, + "(cannot get control frame)", frame->priv->iid); + panel_applet_frame_loading_failed (frame, frame_act->id); + gtk_object_sink (GTK_OBJECT (widget)); ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + return; +@@ -1371,6 +1396,8 @@ panel_applet_frame_activated (CORBA_Object object, + frame->priv->iid, error); + panel_applet_frame_loading_failed (frame, frame_act->id); + gtk_object_sink (GTK_OBJECT (widget)); ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + g_free (error); +@@ -1394,6 +1421,8 @@ panel_applet_frame_activated (CORBA_Object object, + frame->priv->iid, error); + panel_applet_frame_loading_failed (frame, frame_act->id); + gtk_object_sink (GTK_OBJECT (widget)); ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + g_free (error); +@@ -1418,6 +1447,8 @@ panel_applet_frame_activated (CORBA_Object object, + "(cannot get control)", frame->priv->iid); + panel_applet_frame_loading_failed (frame, frame_act->id); + gtk_object_sink (GTK_OBJECT (widget)); ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + return; +@@ -1430,6 +1461,8 @@ panel_applet_frame_activated (CORBA_Object object, + "(cannot get applet shell)", frame->priv->iid); + panel_applet_frame_loading_failed (frame, frame_act->id); + gtk_object_sink (GTK_OBJECT (widget)); ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + return; +@@ -1461,6 +1494,8 @@ panel_applet_frame_activated (CORBA_Object object, + panel_lockdown_notify_add (G_CALLBACK (panel_applet_frame_sync_menu_state), + frame); + ++ if (frame_act->done_func) ++ frame_act->done_func (frame_act->id, frame_act->user_data); + g_free (frame_act->id); + g_free (frame_act); + } +--- gnome-panel-2.24.0/gnome-panel/panel-applet-frame.h ++++ gnome-panel-2.24.0/gnome-panel/panel-applet-frame.h +@@ -73,7 +73,9 @@ void panel_applet_frame_change_background (PanelAppletFrame *frame, + void panel_applet_frame_load_from_gconf (PanelWidget *panel_widget, + gboolean locked, + int position, +- const char *id); ++ const char *id, ++ AppletLoadingDoneFunc done_func, ++ gpointer user_data); + + void panel_applet_frame_set_panel (PanelAppletFrame *frame, + PanelWidget *panel); +--- gnome-panel-2.24.0/gnome-panel/panel-profile.c ++++ gnome-panel-2.24.0/gnome-panel/panel-profile.c +@@ -2195,7 +2195,7 @@ panel_profile_object_id_list_notify (GConfClient *client, + g_slist_free (sublist); + g_slist_free (object_ids); + +- panel_applet_load_queued_applets (); ++ panel_applet_load_queued_applets (NULL, NULL); + } + + static void +@@ -2446,6 +2446,22 @@ panel_profile_ensure_toplevel_per_screen (GConfClient *client, + g_slist_free (empty_screens); + } + ++static void ++panel_profile_on_loaded (void) ++{ ++ GSList *toplevels; ++ GSList *l; ++ ++ toplevels = panel_toplevel_list_toplevels (); ++ ++ for (l = toplevels; l; l = l->next) { ++ PanelToplevel *toplevel; ++ ++ toplevel = PANEL_TOPLEVEL (l->data); ++ panel_toplevel_queue_initial_unhide (toplevel); ++ } ++} ++ + void + panel_profile_load (void) + { +@@ -2477,7 +2493,7 @@ panel_profile_load (void) + + panel_profile_ensure_toplevel_per_screen (client, PANEL_CONFIG_DIR); + +- panel_applet_load_queued_applets (); ++ panel_applet_load_queued_applets ((GFunc) panel_profile_on_loaded, NULL); + } + + static gboolean +--- gnome-panel-2.24.0/gnome-panel/panel-toplevel.c ++++ gnome-panel-2.24.0/gnome-panel/panel-toplevel.c +@@ -2898,12 +2899,15 @@ static void + panel_toplevel_initially_hide (PanelToplevel *toplevel) + { + if (!toplevel->priv->attached) { ++ ++ /* We start the panel off hidden until all the ++ * applets are loaded, and then finally slide it ++ * down when it's ready to be used ++ */ + toplevel->priv->initial_animation_done = FALSE; + + toplevel->priv->state = PANEL_STATE_AUTO_HIDDEN; + gtk_widget_queue_resize (GTK_WIDGET (toplevel)); +- +- panel_toplevel_queue_auto_unhide (toplevel); + } else + toplevel->priv->initial_animation_done = TRUE; + +@@ -3638,6 +3642,17 @@ panel_toplevel_queue_auto_unhide (PanelToplevel *toplevel) + toplevel); + } + ++void ++panel_toplevel_queue_initial_unhide (PanelToplevel *toplevel) ++{ ++ if (toplevel->priv->initial_animation_done) ++ return; ++ /* Give the applets a second or so to frob after registering */ ++ toplevel->priv->unhide_timeout = ++ g_timeout_add_seconds (1, (GSourceFunc) panel_toplevel_auto_unhide_timeout_handler, ++ toplevel); ++} ++ + static gboolean + panel_toplevel_enter_notify_event (GtkWidget *widget, + GdkEventCrossing *event) +--- gnome-panel-2.24.0/gnome-panel/panel-toplevel.h ++++ gnome-panel-2.24.0/gnome-panel/panel-toplevel.h +@@ -136,6 +136,7 @@ void panel_toplevel_hide (PanelToplevel + void panel_toplevel_unhide (PanelToplevel *toplevel); + void panel_toplevel_queue_auto_hide (PanelToplevel *toplevel); + void panel_toplevel_queue_auto_unhide (PanelToplevel *toplevel); ++void panel_toplevel_queue_initial_unhide (PanelToplevel *toplevel); + void panel_toplevel_push_autohide_disabler (PanelToplevel *toplevel); + void panel_toplevel_pop_autohide_disabler (PanelToplevel *toplevel); + diff --git a/gnome-panel.spec b/gnome-panel.spec index 7462d99..6a61552 100644 --- a/gnome-panel.spec +++ b/gnome-panel.spec @@ -23,7 +23,7 @@ Summary: GNOME panel Name: gnome-panel Version: 2.24.0 -Release: 3%{?dist} +Release: 4%{?dist} URL: http://www.gnome.org Source0: http://download.gnome.org/sources/gnome-panel/2.24/%{name}-%{version}.tar.bz2 @@ -113,6 +113,8 @@ Patch11: applet-error.patch # http://bugzilla.gnome.org/show_bug.cgi?id=520111 Patch24: gnome-panel-2.21.92-allow-spurious-view-done-signals.patch +Patch25: gnome-panel-2.24.0-smoother-slide-in.patch + Patch35: clock-wakeups.patch Conflicts: gnome-power-manager < 2.15.3 @@ -160,6 +162,7 @@ Panel Applets using the libpanel-applet library. %patch10 -p1 -b .preferred-apps %patch11 -p1 -b .applet-error %patch24 -p1 -b .allow-spurious-view-done-signals +%patch25 -p1 -b .smoother-slide-in %patch35 -p1 -b .clock-wakeups . %{SOURCE6} @@ -360,6 +363,9 @@ fi %{_datadir}/gtk-doc/html/* %changelog +* Fri Sep 26 2008 Ray Strode - 2.24.0-4 +- Try to make initial panel slide-in animation be smooth + * Thu Sep 25 2008 Matthias Clasen - 2.24.0-3 - Save some space