[Xfce4-commits] <xfce4-panel:devel> Support drag motion when autohide is enabled.
Nick Schermer
nick at xfce.org
Tue Aug 11 20:34:55 CEST 2009
Updating branch refs/heads/devel
to 7543fb968d601c986fcf1643b4f59d8342ea0c61 (commit)
from 07b02d349a86f67aaa25ccc30a95cb1ba7733d28 (commit)
commit 7543fb968d601c986fcf1643b4f59d8342ea0c61
Author: Nick Schermer <nick at xfce.org>
Date: Wed Jun 10 18:53:15 2009 +0200
Support drag motion when autohide is enabled.
panel/panel-window.c | 111 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 94 insertions(+), 17 deletions(-)
diff --git a/panel/panel-window.c b/panel/panel-window.c
index 9452129..91f3d1e 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -78,6 +78,14 @@ static gboolean panel_window_enter_notify_event (GtkWidget *w
GdkEventCrossing *event);
static gboolean panel_window_leave_notify_event (GtkWidget *widget,
GdkEventCrossing *event);
+static gboolean panel_window_drag_motion (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint drag_time);
+static void panel_window_drag_leave (GtkWidget *widget,
+ GdkDragContext *context,
+ guint drag_time);
static gboolean panel_window_motion_notify_event (GtkWidget *widget,
GdkEventMotion *event);
static gboolean panel_window_button_press_event (GtkWidget *widget,
@@ -277,6 +285,8 @@ panel_window_class_init (PanelWindowClass *klass)
gtkwidget_class->expose_event = panel_window_expose_event;
gtkwidget_class->enter_notify_event = panel_window_enter_notify_event;
gtkwidget_class->leave_notify_event = panel_window_leave_notify_event;
+ gtkwidget_class->drag_motion = panel_window_drag_motion;
+ gtkwidget_class->drag_leave = panel_window_drag_leave;
gtkwidget_class->motion_notify_event = panel_window_motion_notify_event;
gtkwidget_class->button_press_event = panel_window_button_press_event;
gtkwidget_class->button_release_event = panel_window_button_release_event;
@@ -352,6 +362,9 @@ panel_window_init (PanelWindow *window)
/* set additional events */
gtk_widget_add_events (GTK_WIDGET (window), GDK_BUTTON_PRESS_MASK);
+ /* create a 'fake' drop zone for autohide drag motion */
+ gtk_drag_dest_set (GTK_WIDGET (window), 0, NULL, 0, 0);
+
/* init vars */
window->screen = NULL;
window->struts_edge = STRUTS_EDGE_NONE;
@@ -714,7 +727,7 @@ panel_window_leave_notify_event (GtkWidget *widget,
{
PanelWindow *window = PANEL_WINDOW (widget);
- /* queue a new autohide time if needed */
+ /* queue an autohide timeout if needed */
if (event->detail != GDK_NOTIFY_INFERIOR
&& window->autohide_state != AUTOHIDE_DISABLED
&& window->autohide_state != AUTOHIDE_BLOCKED)
@@ -726,6 +739,32 @@ panel_window_leave_notify_event (GtkWidget *widget,
static gboolean
+panel_window_drag_motion (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint drag_time)
+{
+ return TRUE;
+}
+
+
+
+static void
+panel_window_drag_leave (GtkWidget *widget,
+ GdkDragContext *context,
+ guint drag_time)
+{
+ PanelWindow *window = PANEL_WINDOW (widget);
+
+ /* queue an autohide timeout if needed */
+ if (window->autohide_state == AUTOHIDE_VISIBLE)
+ panel_window_autohide_queue (window, AUTOHIDE_POPDOWN);
+}
+
+
+
+static gboolean
panel_window_motion_notify_event (GtkWidget *widget,
GdkEventMotion *event)
{
@@ -1707,30 +1746,57 @@ panel_window_autohide_queue (PanelWindow *window,
static gboolean
+panel_window_autohide_drag_motion (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint drag_time,
+ PanelWindow *window)
+{
+ panel_return_val_if_fail (PANEL_IS_WINDOW (window), TRUE);
+ panel_return_val_if_fail (window->autohide_window == widget, TRUE);
+
+ /* queue a popup is state is hidden */
+ if (window->autohide_state == AUTOHIDE_HIDDEN)
+ panel_window_autohide_queue (window, AUTOHIDE_POPUP);
+
+ return TRUE;
+}
+
+
+
+static void
+panel_window_autohide_drag_leave (GtkWidget *widget,
+ GdkDragContext *drag_context,
+ guint drag_time,
+ PanelWindow *window)
+{
+ panel_return_if_fail (PANEL_IS_WINDOW (window));
+ panel_return_if_fail (window->autohide_window == widget);
+
+ /* we left the window before it was hidden, stop the queue */
+ if (window->autohide_timeout_id != 0)
+ g_source_remove (window->autohide_timeout_id);
+
+ /* update the status */
+ if (window->autohide_state == AUTOHIDE_POPUP)
+ window->autohide_state = AUTOHIDE_HIDDEN;
+}
+
+
+
+static gboolean
panel_window_autohide_event (GtkWidget *widget,
GdkEventCrossing *event,
PanelWindow *window)
{
- gboolean enter = !!(event->type == GDK_ENTER_NOTIFY);
-
panel_return_val_if_fail (PANEL_IS_WINDOW (window), FALSE);
panel_return_val_if_fail (window->autohide_window == widget, FALSE);
- if (enter)
- {
- /* queue a popup */
- panel_window_autohide_queue (window, AUTOHIDE_POPUP);
- }
+ if (event->type == GDK_ENTER_NOTIFY)
+ panel_window_autohide_queue (window, AUTOHIDE_POPUP);
else
- {
- /* we left the window before it was hidden, stop the queue */
- if (window->autohide_timeout_id != 0)
- g_source_remove (window->autohide_timeout_id);
-
- /* update the status */
- if (window->autohide_state == AUTOHIDE_POPUP)
- window->autohide_state = AUTOHIDE_HIDDEN;
- }
+ panel_window_autohide_drag_leave (widget, NULL, 0, window);
return FALSE;
}
@@ -1751,6 +1817,9 @@ panel_window_set_autohide (PanelWindow *window,
if ((window->autohide_state != AUTOHIDE_DISABLED) == autohide)
return;
+ /* respond to drag motion */
+ gtk_drag_dest_set_track_motion (GTK_WIDGET (window), autohide);
+
if (autohide)
{
/* create the window */
@@ -1773,6 +1842,14 @@ panel_window_set_autohide (PanelWindow *window,
g_signal_connect (G_OBJECT (popup), "leave-notify-event",
G_CALLBACK (panel_window_autohide_event), window);
+ /* show/hide the panel on drag events */
+ gtk_drag_dest_set (popup, 0, NULL, 0, 0);
+ gtk_drag_dest_set_track_motion (popup, TRUE);
+ g_signal_connect (G_OBJECT (popup), "drag-motion",
+ G_CALLBACK (panel_window_autohide_drag_motion), window);
+ g_signal_connect (G_OBJECT (popup), "drag-leave",
+ G_CALLBACK (panel_window_autohide_drag_leave), window);
+
/* show the window */
window->autohide_window = popup;
gtk_widget_show (popup);
More information about the Xfce4-commits
mailing list