summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2001-05-07 19:24:18 +0000
committerAlexander Larsson <alexl@src.gnome.org>2001-05-07 19:24:18 +0000
commit404d1a2d7e0caee4e7aa1808cd9d9e9c6410c877 (patch)
treed123115a1e22afb2715504aee4fb1adbce6e556e
parentb19d0812ef453af2e295871bd68cca5f5ec959d5 (diff)
downloadgdk-pixbuf-404d1a2d7e0caee4e7aa1808cd9d9e9c6410c877.tar.gz
New function for getting toplevel window at position.
2001-05-07 Alexander Larsson <alexl@redhat.com> * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at): New function for getting toplevel window at position. (gdk_drag_find_window): Use get_toplevel_window () instead of gdk_window_get_pointer(). (gdk_drag_status): Use correct context for getting window. * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name): g_strdup the atom name. * gdk/linux-fb/gdkwindow-fb.c: Costmetic fix. * gtk/gtkdnd.c (gtk_drag_source_handle_event): Add code for changing cursor on linux-fb backend (same as win32).
-rw-r--r--ChangeLog18
-rw-r--r--ChangeLog.pre-2-018
-rw-r--r--ChangeLog.pre-2-1018
-rw-r--r--ChangeLog.pre-2-218
-rw-r--r--ChangeLog.pre-2-418
-rw-r--r--ChangeLog.pre-2-618
-rw-r--r--ChangeLog.pre-2-818
-rw-r--r--gdk/linux-fb/gdkdnd-fb.c60
-rw-r--r--gdk/linux-fb/gdkproperty-fb.c2
-rw-r--r--gdk/linux-fb/gdkwindow-fb.c2
-rw-r--r--gtk/gtkdnd.c10
11 files changed, 188 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index c00d5e9d8..20aa691ec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2001-05-07 Alexander Larsson <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at):
+ New function for getting toplevel window at position.
+ (gdk_drag_find_window): Use get_toplevel_window () instead
+ of gdk_window_get_pointer(). (gdk_drag_status): Use
+ correct context for getting window.
+
+ * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name):
+ g_strdup the atom name.
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Costmetic fix.
+
+ * gtk/gtkdnd.c (gtk_drag_source_handle_event):
+ Add code for changing cursor on linux-fb backend (same as
+ win32).
+
2001-05-07 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkwindow.c (gtk_window_focus): Test for bin->child being
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index c00d5e9d8..20aa691ec 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,21 @@
+2001-05-07 Alexander Larsson <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at):
+ New function for getting toplevel window at position.
+ (gdk_drag_find_window): Use get_toplevel_window () instead
+ of gdk_window_get_pointer(). (gdk_drag_status): Use
+ correct context for getting window.
+
+ * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name):
+ g_strdup the atom name.
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Costmetic fix.
+
+ * gtk/gtkdnd.c (gtk_drag_source_handle_event):
+ Add code for changing cursor on linux-fb backend (same as
+ win32).
+
2001-05-07 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkwindow.c (gtk_window_focus): Test for bin->child being
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index c00d5e9d8..20aa691ec 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,21 @@
+2001-05-07 Alexander Larsson <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at):
+ New function for getting toplevel window at position.
+ (gdk_drag_find_window): Use get_toplevel_window () instead
+ of gdk_window_get_pointer(). (gdk_drag_status): Use
+ correct context for getting window.
+
+ * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name):
+ g_strdup the atom name.
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Costmetic fix.
+
+ * gtk/gtkdnd.c (gtk_drag_source_handle_event):
+ Add code for changing cursor on linux-fb backend (same as
+ win32).
+
2001-05-07 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkwindow.c (gtk_window_focus): Test for bin->child being
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index c00d5e9d8..20aa691ec 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,21 @@
+2001-05-07 Alexander Larsson <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at):
+ New function for getting toplevel window at position.
+ (gdk_drag_find_window): Use get_toplevel_window () instead
+ of gdk_window_get_pointer(). (gdk_drag_status): Use
+ correct context for getting window.
+
+ * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name):
+ g_strdup the atom name.
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Costmetic fix.
+
+ * gtk/gtkdnd.c (gtk_drag_source_handle_event):
+ Add code for changing cursor on linux-fb backend (same as
+ win32).
+
2001-05-07 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkwindow.c (gtk_window_focus): Test for bin->child being
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index c00d5e9d8..20aa691ec 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,21 @@
+2001-05-07 Alexander Larsson <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at):
+ New function for getting toplevel window at position.
+ (gdk_drag_find_window): Use get_toplevel_window () instead
+ of gdk_window_get_pointer(). (gdk_drag_status): Use
+ correct context for getting window.
+
+ * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name):
+ g_strdup the atom name.
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Costmetic fix.
+
+ * gtk/gtkdnd.c (gtk_drag_source_handle_event):
+ Add code for changing cursor on linux-fb backend (same as
+ win32).
+
2001-05-07 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkwindow.c (gtk_window_focus): Test for bin->child being
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index c00d5e9d8..20aa691ec 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,21 @@
+2001-05-07 Alexander Larsson <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at):
+ New function for getting toplevel window at position.
+ (gdk_drag_find_window): Use get_toplevel_window () instead
+ of gdk_window_get_pointer(). (gdk_drag_status): Use
+ correct context for getting window.
+
+ * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name):
+ g_strdup the atom name.
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Costmetic fix.
+
+ * gtk/gtkdnd.c (gtk_drag_source_handle_event):
+ Add code for changing cursor on linux-fb backend (same as
+ win32).
+
2001-05-07 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkwindow.c (gtk_window_focus): Test for bin->child being
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index c00d5e9d8..20aa691ec 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,21 @@
+2001-05-07 Alexander Larsson <alexl@redhat.com>
+
+ * gdk/linux-fb/gdkdnd-fb.c (get_toplevel_window_at):
+ New function for getting toplevel window at position.
+ (gdk_drag_find_window): Use get_toplevel_window () instead
+ of gdk_window_get_pointer(). (gdk_drag_status): Use
+ correct context for getting window.
+
+ * gdk/linux-fb/gdkproperty-fb.c (gdk_atom_name):
+ g_strdup the atom name.
+
+ * gdk/linux-fb/gdkwindow-fb.c:
+ Costmetic fix.
+
+ * gtk/gtkdnd.c (gtk_drag_source_handle_event):
+ Add code for changing cursor on linux-fb backend (same as
+ win32).
+
2001-05-07 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkwindow.c (gtk_window_focus): Test for bin->child being
diff --git a/gdk/linux-fb/gdkdnd-fb.c b/gdk/linux-fb/gdkdnd-fb.c
index 69ffaf3ad..659716d42 100644
--- a/gdk/linux-fb/gdkdnd-fb.c
+++ b/gdk/linux-fb/gdkdnd-fb.c
@@ -63,7 +63,7 @@ GdkDragContext *current_dest_drag = NULL;
static void
gdk_drag_context_init (GdkDragContext *dragcontext)
{
- dragcontext->windowing_data = g_new (GdkDragContextPrivate, 1);
+ dragcontext->windowing_data = g_new0 (GdkDragContextPrivate, 1);
contexts = g_list_prepend (contexts, dragcontext);
}
@@ -395,6 +395,54 @@ gdk_drag_get_protocol (guint32 xid,
return GDK_NONE;
}
+static GdkWindow *
+get_toplevel_window_at (GdkWindow *ignore,
+ gint x_root,
+ gint y_root)
+{
+
+ GdkWindowObject *private;
+ GdkWindowObject *sub;
+ GdkWindowObject *child;
+ GList *ltmp, *ltmp2;
+
+ private = (GdkWindowObject *)gdk_parent_root;
+
+ for (ltmp = private->children; ltmp; ltmp = ltmp->next)
+ {
+ sub = ltmp->data;
+
+ if ((GDK_WINDOW (sub) != ignore) &&
+ (GDK_WINDOW_IS_MAPPED (sub)) &&
+ (x_root >= sub->x) &&
+ (x_root < sub->x + GDK_DRAWABLE_IMPL_FBDATA (sub)->width) &&
+ (y_root >= sub->y) &&
+ (y_root < sub->y + GDK_DRAWABLE_IMPL_FBDATA (sub)->height))
+ {
+ if (g_object_get_data (G_OBJECT (sub), "gdk-window-child-handler"))
+ {
+ /* Managed window, check children */
+ for (ltmp2 = sub->children; ltmp2; ltmp2 = ltmp2->next)
+ {
+ child = ltmp2->data;
+
+ if ((GDK_WINDOW (child) != ignore) &&
+ (GDK_WINDOW_IS_MAPPED (child)) &&
+ (x_root >= sub->x + child->x) &&
+ (x_root < sub->x + child->x + GDK_DRAWABLE_IMPL_FBDATA (child)->width) &&
+ (y_root >= sub->y + child->y) &&
+ (y_root < sub->y + child->y + GDK_DRAWABLE_IMPL_FBDATA (child)->height))
+ return GDK_WINDOW (child);
+ }
+ }
+ else
+ return GDK_WINDOW (sub);
+ }
+ }
+ return NULL;
+}
+
+
void
gdk_drag_find_window (GdkDragContext *context,
GdkWindow *drag_window,
@@ -407,8 +455,10 @@ gdk_drag_find_window (GdkDragContext *context,
g_return_if_fail (context != NULL);
- dest = gdk_window_get_pointer (NULL, &x_root, &y_root, NULL);
-
+ dest = get_toplevel_window_at (drag_window, x_root, y_root);
+ if (dest == NULL)
+ dest = gdk_parent_root;
+
if (context->dest_window != dest)
{
guint32 recipient;
@@ -589,13 +639,13 @@ gdk_drag_status (GdkDragContext *context,
private->drag_status = GDK_DRAG_STATUS_DRAG;
tmp_event.dnd.type = GDK_DRAG_STATUS;
- tmp_event.dnd.window = src_context->source_window;
+ tmp_event.dnd.window = context->source_window;
tmp_event.dnd.send_event = FALSE;
tmp_event.dnd.context = src_context;
gdk_drag_context_ref (src_context);
tmp_event.dnd.time = GDK_CURRENT_TIME; /* FIXME? */
-
+
src_context->action = action;
gdk_event_put (&tmp_event);
diff --git a/gdk/linux-fb/gdkproperty-fb.c b/gdk/linux-fb/gdkproperty-fb.c
index 530622b15..e870f3543 100644
--- a/gdk/linux-fb/gdkproperty-fb.c
+++ b/gdk/linux-fb/gdkproperty-fb.c
@@ -44,7 +44,7 @@ gdk_atom_intern (const gchar *atom_name,
gchar*
gdk_atom_name (GdkAtom atom)
{
- return g_quark_to_string (atom);
+ return g_strdup (g_quark_to_string (atom));
}
static void
diff --git a/gdk/linux-fb/gdkwindow-fb.c b/gdk/linux-fb/gdkwindow-fb.c
index e78e11516..cd13b88d8 100644
--- a/gdk/linux-fb/gdkwindow-fb.c
+++ b/gdk/linux-fb/gdkwindow-fb.c
@@ -1586,7 +1586,7 @@ gdk_window_fb_get_visible_region (GdkDrawable *drawable)
return gdk_region_rectangle (&result_rect);
}
-GdkWindow*
+GdkWindow *
gdk_window_get_pointer (GdkWindow *window,
gint *x,
gint *y,
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 3b2a8b967..5d14a4e8d 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -509,7 +509,7 @@ gtk_drag_get_event_actions (GdkEvent *event,
default:
break;
}
-
+
if ((button == 2 || button == 3) && (actions & GDK_ACTION_ASK))
{
*suggested_action = GDK_ACTION_ASK;
@@ -1789,7 +1789,7 @@ gtk_drag_begin (GtkWidget *widget,
gtk_drag_get_event_actions (event, info->button, actions,
&suggested_action, &possible_actions);
-
+
info->cursor = gtk_drag_get_cursor (suggested_action);
/* Set cur_x, cur_y here so if the "drag_begin" signal shows
@@ -2242,13 +2242,13 @@ gtk_drag_source_handle_event (GtkWidget *widget,
PointerMotionMask | PointerMotionHintMask | ButtonReleaseMask,
((GdkCursorPrivate *)cursor)->xcursor,
event->dnd.time);
-#elif defined (GDK_WINDOWING_WIN32)
+#elif defined (GDK_WINDOWING_WIN32) || defined (GDK_WINDOWING_FB)
gdk_pointer_grab (widget->window, FALSE,
GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK |
GDK_BUTTON_RELEASE_MASK,
NULL,
- info->cursor, event->dnd.time);
+ cursor, event->dnd.time);
#endif
info->cursor = cursor;
}
@@ -2741,7 +2741,7 @@ gtk_drag_update (GtkDragSourceInfo *info,
gdk_drag_find_window (info->context,
window, x_root, y_root,
&dest_window, &protocol);
-
+
if (gdk_drag_motion (info->context, dest_window, protocol,
x_root, y_root, action,
possible_actions,