summaryrefslogtreecommitdiff
path: root/gdk/gdkdnd.c
diff options
context:
space:
mode:
authorOwen Taylor <owt1@cornell.edu>1998-02-27 03:55:33 +0000
committerOwen Taylor <otaylor@src.gnome.org>1998-02-27 03:55:33 +0000
commit473c1d4d7bef3755102e527e061ff1274bba9ae5 (patch)
tree4f54ab5bf33025502d365b7a632af34bfd57805d /gdk/gdkdnd.c
parenta597dd94732403144c05c75a77383a3f541290f3 (diff)
downloadgdk-pixbuf-473c1d4d7bef3755102e527e061ff1274bba9ae5.tar.gz
new functions for setting WM hints
Thu Feb 26 22:36:46 1998 Owen Taylor <owt1@cornell.edu> * gdk/gdkwindow.c gdktypes.c gdk.h: new functions for setting WM hints gdk_window_set_icon() gdk_window_set_icon_name() gdk_window_set_group() gdk_window_set_decorations() gdk_window_set_functions() * gdk/MwmUtil.h: new uninstalled header file from lesstif distribution, used for setting MWM hints. * gdk/gdkdnd.c Makefile.am: renamed from gdk/gdk_dnd.c
Diffstat (limited to 'gdk/gdkdnd.c')
-rw-r--r--gdk/gdkdnd.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/gdk/gdkdnd.c b/gdk/gdkdnd.c
new file mode 100644
index 000000000..4f38fd94f
--- /dev/null
+++ b/gdk/gdkdnd.c
@@ -0,0 +1,138 @@
+#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;
+
+ 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;
+ }
+ 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);
+
+ if(gdk_dnd.c->drag_pm_default)
+ gdk_window_unref(gdk_dnd.c->drag_pm_default);
+ if(gdk_dnd.c->drag_pm_ok)
+ gdk_window_unref(gdk_dnd.c->drag_pm_ok);
+
+ gdk_dnd.c->drag_pm_ok = NULL;
+
+ gdk_window_ref(default_pixmapwin);
+ gdk_dnd.c->drag_pm_default = default_pixmapwin;
+ gdk_dnd.c->default_hotspot = *default_hotspot;
+ if(goahead_pixmapwin)
+ {
+ gdk_window_ref(goahead_pixmapwin);
+ gdk_dnd.c->drag_pm_ok = goahead_pixmapwin;
+ gdk_dnd.c->ok_hotspot = *goahead_hotspot;
+ }
+
+ 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;
+
+ if(gdk_dnd.c->drag_pm_default)
+ {
+ /* We're doing pixmaps here... */
+ GdkWindow *mypix, *opix;
+ GdkPoint *myhotspot;
+ gint itmp;
+ Window wtmp;
+
+ 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);
+ return;
+ }
+
+ if(x == -1 && y == -1) /* We're supposed to find it out for ourselves */
+ XQueryPointer(gdk_display, gdk_root_window,
+ &wtmp, &wtmp, &x, &y, &itmp, &itmp, &itmp);
+
+ if(drag_ok)
+ {
+ mypix = gdk_dnd.c->drag_pm_ok;
+ opix = gdk_dnd.c->drag_pm_default;
+ myhotspot = &gdk_dnd.c->ok_hotspot;
+ }
+ else
+ {
+ mypix = gdk_dnd.c->drag_pm_default;
+ opix = gdk_dnd.c->drag_pm_ok;
+ myhotspot = &gdk_dnd.c->default_hotspot;
+ }
+ if(change_made)
+ {
+ gdk_window_hide(opix);
+ gdk_window_show(mypix); /* There ought to be a way to know if
+ a window is already mapped etc. */
+ }
+ gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
+ }
+ 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);
+ }
+}