]> Pileus Git - ~andy/gtk/blobdiff - gdk/gdkdnd.c
Updated Bulgarian translation
[~andy/gtk] / gdk / gdkdnd.c
index bfad16018bdcfb61d21f12fb9716d21381deef67..2d114faf49a5003d881fc2dfb0c300acfa0fde44 100644 (file)
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#include <string.h>
-#include "gdkx.h"
-#include "gdk.h"
+/* GDK - The GIMP Drawing Kit
+ * Copyright (C) 1995-1999 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 Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ */
 
-/* Nothing much here now, but we have to make a start some time ;-) */
+/*
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
 
-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;
-         g_list_free(gdk_dnd.c->xids);
-         gdk_dnd.c->xids = NULL;
-       }
-      gdk_dnd_display_drag_cursor(-1, -1,
-                                 gdk_dnd.dnd_drag_target?TRUE:FALSE,
-                                 TRUE);
-    }
-}
+#include "config.h"
+#include <gdkdnd.h>
+#include <gdkdrawable.h>
+#include <gdkdisplay.h>
+#include "gdkalias.h"
 
+/**
+ * gdk_drag_find_window:
+ * @context: a #GdkDragContext.
+ * @drag_window: a window which may be at the pointer position, but
+ *      should be ignored, since it is put up by the drag source as an icon.
+ * @x_root: the x position of the pointer in root coordinates.
+ * @y_root: the y position of the pointer in root coordinates.
+ * @dest_window: (out): location to store the destination window in.
+ * @protocol: (out): location to store the DND protocol in.
+ *
+ * Finds the destination window and DND protocol to use at the
+ * given pointer position.
+ *
+ * This function is called by the drag source to obtain the 
+ * @dest_window and @protocol parameters for gdk_drag_motion().
+ **/
 void
-gdk_dnd_set_drag_shape(GdkWindow *default_pixmapwin,
-                      GdkPoint *default_hotspot,
-                      GdkWindow *goahead_pixmapwin,
-                      GdkPoint *goahead_hotspot)
+gdk_drag_find_window (GdkDragContext  *context,
+                     GdkWindow       *drag_window,
+                     gint             x_root,
+                     gint             y_root,
+                     GdkWindow      **dest_window,
+                     GdkDragProtocol *protocol)
 {
-  g_return_if_fail(default_pixmapwin != NULL);
-
-  g_list_free(gdk_dnd.c->xids); gdk_dnd.c->xids = NULL;
-  if(gdk_dnd.c->drag_pm_default)
-    {
-      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_ok = NULL;
-
-  gdk_window_ref(default_pixmapwin);
-  gdk_dnd.c->drag_pm_default = default_pixmapwin;
-  gdk_dnd.c->default_hotspot = *default_hotspot;
-  gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, GUINT_TO_GPOINTER (((GdkWindowPrivate *)default_pixmapwin)->xwindow));
-  if(goahead_pixmapwin)
-    {
-      gdk_window_ref(goahead_pixmapwin);
-      gdk_dnd.c->xids = g_list_append(gdk_dnd.c->xids, GUINT_TO_GPOINTER (((GdkWindowPrivate *)goahead_pixmapwin)->xwindow));
-      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);      
-    }
+  gdk_drag_find_window_for_screen (context, drag_window,
+                                  gdk_drawable_get_screen (context->source_window),
+                                  x_root, y_root, dest_window, protocol);
 }
 
-void
-gdk_dnd_display_drag_cursor(gint x, gint y, gboolean drag_ok,
-                           gboolean change_made)
+/**
+ * gdk_drag_get_protocol:
+ * @xid: the windowing system id of the destination window.
+ * @protocol: location where the supported DND protocol is returned.
+ * 
+ * Finds out the DND protocol supported by a window.
+ * 
+ * Return value: the windowing system specific id for the window where
+ *    the drop should happen. This may be @xid or the id of a proxy
+ *    window, or zero if @xid doesn't support Drag and Drop.
+ **/
+GdkNativeWindow
+gdk_drag_get_protocol (GdkNativeWindow  xid,
+                      GdkDragProtocol *protocol)
 {
-  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;
-      guint masktmp;
-      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);
-         GDK_NOTE(DND, g_print("Hiding both drag cursors\n"));
-         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, &masktmp);
-      if(drag_ok)
-       {
-         GDK_NOTE(DND, g_print("Switching to drag_ok cursor\n"));
-         mypix = gdk_dnd.c->drag_pm_ok;
-         opix = gdk_dnd.c->drag_pm_default;
-         myhotspot = &gdk_dnd.c->ok_hotspot;
-       }
-      else
-       {
-         GDK_NOTE(DND, g_print("Switching to drag_default cursor\n"));
-         mypix = gdk_dnd.c->drag_pm_default;
-         opix = gdk_dnd.c->drag_pm_ok;
-         myhotspot = &gdk_dnd.c->default_hotspot;
-       }
-      gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
-      if(change_made)
-       {
-         GDK_NOTE(DND, g_print("Cursors switched, hide & show\n"));
-         gdk_window_hide(opix);
-       }
-      gdk_window_move(mypix, x - myhotspot->x, y - myhotspot->y);
-      if (change_made)
-        {
-         gdk_window_show(mypix); /* There ought to be a way to know if
-                                    a window is already mapped etc. */
-       }      
-    }
-  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);
-    }
+  return gdk_drag_get_protocol_for_display (gdk_display_get_default (), xid, protocol);
 }
+
+#define __GDK_DND_C__
+#include "gdkaliasdef.c"