1998-08-18 03:59:41 +00:00
|
|
|
/* GDK - The GIMP Drawing Kit
|
|
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
1998-02-26 21:28:00 +00:00
|
|
|
#include <X11/Xlib.h>
|
|
|
|
#include <X11/Xatom.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "gdkx.h"
|
|
|
|
#include "gdk.h"
|
|
|
|
|
|
|
|
/* Nothing much here now, but we have to make a start some time ;-) */
|
|
|
|
|
|
|
|
void
|
|
|
|
gdk_dnd_set_drag_cursors(GdkCursor *default_cursor, GdkCursor *goahead_cursor)
|
|
|
|
{
|
|
|
|
gdk_dnd.c->gdk_cursor_dragdefault =
|
|
|
|
((GdkCursorPrivate *)default_cursor)->xcursor;
|
|
|
|
gdk_dnd.c->gdk_cursor_dragok = ((GdkCursorPrivate *)goahead_cursor)->xcursor;
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
if(gdk_dnd.dnd_grabbed)
|
|
|
|
{
|
|
|
|
if(gdk_dnd.c->drag_pm_default)
|
|
|
|
/* We were displaying pixmaps for the drag */
|
|
|
|
{
|
|
|
|
gdk_window_hide(gdk_dnd.c->drag_pm_default);
|
|
|
|
gdk_window_unref(gdk_dnd.c->drag_pm_default);
|
|
|
|
if(gdk_dnd.c->drag_pm_ok)
|
|
|
|
{
|
|
|
|
gdk_window_hide(gdk_dnd.c->drag_pm_ok);
|
|
|
|
gdk_window_unref(gdk_dnd.c->drag_pm_ok);
|
|
|
|
}
|
|
|
|
gdk_dnd.c->drag_pm_default = gdk_dnd.c->drag_pm_ok = NULL;
|
1998-03-10 21:57:05 +00:00
|
|
|
g_list_free(gdk_dnd.c->xids);
|
|
|
|
gdk_dnd.c->xids = NULL;
|
1998-02-26 21:28:00 +00:00
|
|
|
}
|
|
|
|
gdk_dnd_display_drag_cursor(-1, -1,
|
|
|
|
gdk_dnd.dnd_drag_target?TRUE:FALSE,
|
|
|
|
TRUE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin,
|
|
|
|
GdkPoint *default_hotspot,
|
|
|
|
GdkWindow *goahead_pixmapwin,
|
|
|
|
GdkPoint *goahead_hotspot)
|
|
|
|
{
|
|
|
|
g_return_if_fail(default_pixmapwin != NULL);
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-03-10 21:57:05 +00:00
|
|
|
g_list_free(gdk_dnd.c->xids); gdk_dnd.c->xids = NULL;
|
1998-02-26 21:28:00 +00:00
|
|
|
if(gdk_dnd.c->drag_pm_default)
|
1998-04-09 03:33:24 +00:00
|
|
|
{
|
|
|
|
gdk_window_hide(gdk_dnd.c->drag_pm_default);
|
|
|
|
gdk_window_unref(gdk_dnd.c->drag_pm_default);
|
|
|
|
}
|
1998-02-26 21:28:00 +00:00
|
|
|
if(gdk_dnd.c->drag_pm_ok)
|
1998-04-09 03:33:24 +00:00
|
|
|
{
|
|
|
|
gdk_window_hide(gdk_dnd.c->drag_pm_ok);
|
|
|
|
gdk_window_unref(gdk_dnd.c->drag_pm_ok);
|
|
|
|
}
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
gdk_dnd.c->drag_pm_ok = NULL;
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
gdk_window_ref(default_pixmapwin);
|
|
|
|
gdk_dnd.c->drag_pm_default = default_pixmapwin;
|
|
|
|
gdk_dnd.c->default_hotspot = *default_hotspot;
|
1998-05-13 05:23:26 +00:00
|
|
|
gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, GUINT_TO_POINTER (((GdkWindowPrivate *)default_pixmapwin)->xwindow));
|
1998-02-26 21:28:00 +00:00
|
|
|
if(goahead_pixmapwin)
|
|
|
|
{
|
|
|
|
gdk_window_ref(goahead_pixmapwin);
|
1998-05-13 05:23:26 +00:00
|
|
|
gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, GUINT_TO_POINTER (((GdkWindowPrivate *)goahead_pixmapwin)->xwindow));
|
1998-02-26 21:28:00 +00:00
|
|
|
gdk_dnd.c->drag_pm_ok = goahead_pixmapwin;
|
|
|
|
gdk_dnd.c->ok_hotspot = *goahead_hotspot;
|
|
|
|
}
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
if(gdk_dnd.dnd_grabbed)
|
|
|
|
{
|
|
|
|
gdk_dnd_display_drag_cursor(-1, -1,
|
|
|
|
gdk_dnd.dnd_drag_target?TRUE:FALSE,
|
|
|
|
TRUE);
|
|
|
|
XChangeActivePointerGrab (gdk_display,
|
|
|
|
ButtonMotionMask |
|
|
|
|
ButtonPressMask |
|
|
|
|
ButtonReleaseMask |
|
|
|
|
EnterWindowMask | LeaveWindowMask,
|
|
|
|
None,
|
|
|
|
CurrentTime);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gdk_dnd_display_drag_cursor(gint x, gint y, gboolean drag_ok,
|
|
|
|
gboolean change_made)
|
|
|
|
{
|
|
|
|
if(!gdk_dnd.dnd_grabbed)
|
|
|
|
return;
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
if(gdk_dnd.c->drag_pm_default)
|
|
|
|
{
|
|
|
|
/* We're doing pixmaps here... */
|
|
|
|
GdkWindow *mypix, *opix;
|
|
|
|
GdkPoint *myhotspot;
|
|
|
|
gint itmp;
|
1998-03-02 23:16:39 +00:00
|
|
|
guint masktmp;
|
1998-02-26 21:28:00 +00:00
|
|
|
Window wtmp;
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
if(x == -2 && y == -2) /* Hide the cursors */
|
|
|
|
{
|
|
|
|
gdk_window_hide(gdk_dnd.c->drag_pm_ok);
|
|
|
|
gdk_window_hide(gdk_dnd.c->drag_pm_default);
|
1998-08-18 03:59:41 +00:00
|
|
|
GDK_NOTE(DND, g_message("Hiding both drag cursors\n"));
|
1998-02-26 21:28:00 +00:00
|
|
|
return;
|
|
|
|
}
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
if(x == -1 && y == -1) /* We're supposed to find it out for ourselves */
|
|
|
|
XQueryPointer(gdk_display, gdk_root_window,
|
1998-03-02 23:16:39 +00:00
|
|
|
&wtmp, &wtmp, &x, &y, &itmp, &itmp, &masktmp);
|
1998-08-18 03:59:41 +00:00
|
|
|
|
1998-02-26 21:28:00 +00:00
|
|
|
if(drag_ok)
|
|
|
|
{
|
1998-08-18 03:59:41 +00:00
|
|
|
GDK_NOTE(DND, g_message("Switching to drag_ok cursor\n"));
|
1998-02-26 21:28:00 +00:00
|
|
|
mypix = gdk_dnd.c->drag_pm_ok;
|
|
|
|
opix = gdk_dnd.c->drag_pm_default;
|
|
|
|
myhotspot = &gdk_dnd.c->ok_hotspot;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
1998-08-18 03:59:41 +00:00
|
|
|
GDK_NOTE(DND, g_message("Switching to drag_default cursor\n"));
|
1998-02-26 21:28:00 +00:00
|
|
|
mypix = gdk_dnd.c->drag_pm_default;
|
|
|
|
opix = gdk_dnd.c->drag_pm_ok;
|
|
|
|
myhotspot = &gdk_dnd.c->default_hotspot;
|
|
|
|
}
|
1998-04-01 19:46:06 +00:00
|
|
|
gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
|
1998-02-26 21:28:00 +00:00
|
|
|
if(change_made)
|
|
|
|
{
|
1998-08-18 03:59:41 +00:00
|
|
|
GDK_NOTE(DND, g_message("Cursors switched, hide & show\n"));
|
1998-02-26 21:28:00 +00:00
|
|
|
gdk_window_hide(opix);
|
|
|
|
}
|
|
|
|
gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
|
1998-03-31 03:16:09 +00:00
|
|
|
if (change_made)
|
|
|
|
{
|
|
|
|
gdk_window_show(mypix); /* There ought to be a way to know if
|
|
|
|
a window is already mapped etc. */
|
|
|
|
}
|
1998-02-26 21:28:00 +00:00
|
|
|
}
|
|
|
|
else if(change_made)
|
|
|
|
{
|
|
|
|
Cursor c;
|
|
|
|
/* Move cursors around */
|
|
|
|
if(drag_ok)
|
|
|
|
c = gdk_dnd.c->gdk_cursor_dragok;
|
|
|
|
else
|
|
|
|
c = gdk_dnd.c->gdk_cursor_dragdefault;
|
|
|
|
XChangeActivePointerGrab (gdk_display,
|
|
|
|
ButtonMotionMask |
|
|
|
|
ButtonPressMask |
|
|
|
|
ButtonReleaseMask |
|
|
|
|
EnterWindowMask | LeaveWindowMask,
|
|
|
|
c,
|
|
|
|
CurrentTime);
|
|
|
|
}
|
|
|
|
}
|