diff -rupN gnome-panel-2.30.2.orig/gnome-panel/drawer.c gnome-panel-2.30.2/gnome-panel/drawer.c --- gnome-panel-2.30.2.orig/gnome-panel/drawer.c 2010-06-22 19:27:02.000000000 +0200 +++ gnome-panel-2.30.2/gnome-panel/drawer.c 2010-09-15 01:06:39.925133624 +0200 @@ -35,9 +35,9 @@ static void drawer_click (GtkWidget *w, Drawer *drawer) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) - panel_toplevel_hide (drawer->toplevel, FALSE, -1); - else - panel_toplevel_unhide (drawer->toplevel); + panel_toplevel_hide_drawer (drawer->toplevel, FALSE, -1); + else + panel_toplevel_unhide_drawer (drawer->toplevel); } static void diff -rupN gnome-panel-2.30.2.orig/gnome-panel/panel-toplevel.c gnome-panel-2.30.2/gnome-panel/panel-toplevel.c --- gnome-panel-2.30.2.orig/gnome-panel/panel-toplevel.c 2010-06-22 19:27:02.000000000 +0200 +++ gnome-panel-2.30.2/gnome-panel/panel-toplevel.c 2010-09-15 01:06:50.181129121 +0200 @@ -3496,6 +3496,72 @@ panel_toplevel_start_animation (PanelTop g_timeout_add (20, (GSourceFunc) panel_toplevel_animation_timeout, toplevel); } +static void +panel_toplevel_start_animation_drawer (PanelToplevel *toplevel) +{ + GdkScreen *screen; + int deltax, deltay, deltaw = 0, deltah = 0; + int cur_x = -1, cur_y = -1; + long t; + + panel_toplevel_calculate_animation_end_geometry (toplevel); + + toplevel->priv->animating = TRUE; + + panel_toplevel_update_struts (toplevel, TRUE); + panel_struts_update_toplevel_geometry (toplevel, + &toplevel->priv->animation_end_x, + &toplevel->priv->animation_end_y, + &toplevel->priv->animation_end_width, + &toplevel->priv->animation_end_height); + panel_toplevel_update_struts (toplevel, FALSE); + + gdk_window_get_origin (GTK_WIDGET (toplevel)->window, &cur_x, &cur_y); + + screen = gtk_widget_get_screen (GTK_WIDGET (toplevel)); + + cur_x -= panel_multiscreen_x (screen, toplevel->priv->monitor); + cur_y -= panel_multiscreen_y (screen, toplevel->priv->monitor); + + deltax = toplevel->priv->animation_end_x - cur_x; + deltay = toplevel->priv->animation_end_y - cur_y; + + if (toplevel->priv->animation_end_width != -1) + deltaw = toplevel->priv->animation_end_width - + GTK_WIDGET (toplevel)->requisition.width; + + if (toplevel->priv->animation_end_height != -1) + deltah = toplevel->priv->animation_end_height - + GTK_WIDGET (toplevel)->requisition.height; + + if (deltax == 0 && deltay == 0 && deltaw == 0 && deltah == 0) { + toplevel->priv->animation_end_x = -1; + toplevel->priv->animation_end_y = -1; + toplevel->priv->animation_end_width = -1; + toplevel->priv->animation_end_height = -1; + toplevel->priv->animating = FALSE; + return; + } + + if (toplevel->priv->attached) { + /* Re-map unmapped attached toplevels */ + if (!gtk_widget_get_mapped (GTK_WIDGET (toplevel))) + gtk_widget_map (GTK_WIDGET (toplevel)); + + gtk_window_present (GTK_WINDOW (toplevel->priv->attach_toplevel)); + } + + g_get_current_time (&toplevel->priv->animation_start_time); + + t = 0; + g_get_current_time (&toplevel->priv->animation_end_time); + g_time_val_add (&toplevel->priv->animation_end_time, t); + + if (!toplevel->priv->animation_timeout) + toplevel->priv->animation_timeout = + g_timeout_add (20, (GSourceFunc) panel_toplevel_animation_timeout, toplevel); +} + void panel_toplevel_hide (PanelToplevel *toplevel, gboolean auto_hide, @@ -3554,6 +3620,64 @@ panel_toplevel_hide (PanelToplevel *t gtk_widget_queue_resize (GTK_WIDGET (toplevel)); } +void +panel_toplevel_hide_drawer (PanelToplevel *toplevel, + gboolean auto_hide, + GtkDirectionType direction) +{ + g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel)); + + if (toplevel->priv->state != PANEL_STATE_NORMAL) + return; + + g_signal_emit (toplevel, toplevel_signals [HIDE_SIGNAL], 0); + + if (toplevel->priv->attach_toplevel) + panel_toplevel_pop_autohide_disabler (toplevel->priv->attach_toplevel); + + if (auto_hide) + toplevel->priv->state = PANEL_STATE_AUTO_HIDDEN; + else { + if (direction == -1) { + if (toplevel->priv->orientation & PANEL_VERTICAL_MASK) + direction = GTK_DIR_UP; + else + direction = GTK_DIR_LEFT; + } + + switch (direction) { + case GTK_DIR_UP: + g_return_if_fail (toplevel->priv->orientation & PANEL_VERTICAL_MASK); + toplevel->priv->state = PANEL_STATE_HIDDEN_UP; + break; + case GTK_DIR_DOWN: + g_return_if_fail (toplevel->priv->orientation & PANEL_VERTICAL_MASK); + toplevel->priv->state = PANEL_STATE_HIDDEN_DOWN; + break; + case GTK_DIR_LEFT: + g_return_if_fail (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK); + toplevel->priv->state = PANEL_STATE_HIDDEN_LEFT; + break; + case GTK_DIR_RIGHT: + g_return_if_fail (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK); + toplevel->priv->state = PANEL_STATE_HIDDEN_RIGHT; + break; + default: + g_assert_not_reached (); + break; + } + + panel_toplevel_update_hide_buttons (toplevel); + } + + if (toplevel->priv->animate && gtk_widget_get_realized (GTK_WIDGET (toplevel))) + panel_toplevel_start_animation_drawer (toplevel); + else if (toplevel->priv->attached) + gtk_widget_hide (GTK_WIDGET (toplevel)); + + gtk_widget_queue_resize (GTK_WIDGET (toplevel)); +} + static gboolean panel_toplevel_auto_hide_timeout_handler (PanelToplevel *toplevel) { @@ -3605,6 +3729,32 @@ panel_toplevel_unhide (PanelToplevel *to g_signal_emit (toplevel, toplevel_signals [UNHIDE_SIGNAL], 0); } +void +panel_toplevel_unhide_drawer (PanelToplevel *toplevel) +{ + g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel)); + + if (toplevel->priv->state == PANEL_STATE_NORMAL) + return; + + toplevel->priv->state = PANEL_STATE_NORMAL; + + panel_toplevel_update_hide_buttons (toplevel); + + if (toplevel->priv->attach_toplevel) + panel_toplevel_push_autohide_disabler (toplevel->priv->attach_toplevel); + + if (toplevel->priv->animate && gtk_widget_get_realized (GTK_WIDGET (toplevel))) + panel_toplevel_start_animation_drawer (toplevel); + else if (toplevel->priv->attached) + gtk_widget_show (GTK_WIDGET (toplevel)); + + gtk_widget_queue_resize (GTK_WIDGET (toplevel)); + + if (!toplevel->priv->animate) + g_signal_emit (toplevel, toplevel_signals [UNHIDE_SIGNAL], 0); +} + static gboolean panel_toplevel_auto_unhide_timeout_handler (PanelToplevel *toplevel) { diff -rupN gnome-panel-2.30.2.orig/gnome-panel/panel-toplevel.h gnome-panel-2.30.2/gnome-panel/panel-toplevel.h --- gnome-panel-2.30.2.orig/gnome-panel/panel-toplevel.h 2010-04-30 04:01:51.000000000 +0200 +++ gnome-panel-2.30.2/gnome-panel/panel-toplevel.h 2010-09-15 01:06:50.186629289 +0200 @@ -133,7 +133,11 @@ PanelState panel_toplevel_get_ void panel_toplevel_hide (PanelToplevel *toplevel, gboolean auto_hide, GtkDirectionType direction); +void panel_toplevel_hide_drawer (PanelToplevel *toplevel, + gboolean auto_hide, + GtkDirectionType direction); void panel_toplevel_unhide (PanelToplevel *toplevel); +void panel_toplevel_unhide_drawer (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);