|
Packit Service |
fb6fa5 |
/* GTK - The GIMP Toolkit
|
|
Packit Service |
fb6fa5 |
* Copyright (C) 1995-1999 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
fb6fa5 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
fb6fa5 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
fb6fa5 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
fb6fa5 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
fb6fa5 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
fb6fa5 |
* Lesser General Public License for more details.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
fb6fa5 |
* License along with this library; if not, write to the
|
|
Packit Service |
fb6fa5 |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit Service |
fb6fa5 |
* Boston, MA 02111-1307, USA.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/*
|
|
Packit Service |
fb6fa5 |
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
|
Packit Service |
fb6fa5 |
* file for a list of people on the GTK+ Team. See the ChangeLog
|
|
Packit Service |
fb6fa5 |
* files for a list of changes. These files are distributed with
|
|
Packit Service |
fb6fa5 |
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#include "config.h"
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#include <stdlib.h>
|
|
Packit Service |
fb6fa5 |
#include <string.h>
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#include "gdkconfig.h"
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#include "gdk/gdkkeysyms.h"
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#include "gtkdnd.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkiconfactory.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkicontheme.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkimage.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkinvisible.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkmain.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkplug.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkstock.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkwindow.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkintl.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkquartz.h"
|
|
Packit Service |
fb6fa5 |
#include "gtkalias.h"
|
|
Packit Service |
fb6fa5 |
#include "gdk/quartz/gdkquartz.h"
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
typedef struct _GtkDragSourceSite GtkDragSourceSite;
|
|
Packit Service |
fb6fa5 |
typedef struct _GtkDragSourceInfo GtkDragSourceInfo;
|
|
Packit Service |
fb6fa5 |
typedef struct _GtkDragDestSite GtkDragDestSite;
|
|
Packit Service |
fb6fa5 |
typedef struct _GtkDragDestInfo GtkDragDestInfo;
|
|
Packit Service |
fb6fa5 |
typedef struct _GtkDragFindData GtkDragFindData;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void gtk_drag_find_widget (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkDragFindData *data);
|
|
Packit Service |
fb6fa5 |
static void gtk_drag_dest_site_destroy (gpointer data);
|
|
Packit Service |
fb6fa5 |
static void gtk_drag_dest_leave (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
guint time);
|
|
Packit Service |
fb6fa5 |
static GtkDragDestInfo *gtk_drag_get_dest_info (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gboolean create);
|
|
Packit Service |
fb6fa5 |
static void gtk_drag_source_site_destroy (gpointer data);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static GtkDragSourceInfo *gtk_drag_get_source_info (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gboolean create);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
extern GdkDragContext *gdk_quartz_drag_source_context (); /* gdk/quartz/gdkdnd-quartz.c */
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
struct _GtkDragSourceSite
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GdkModifierType start_button_mask;
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list; /* Targets for drag data */
|
|
Packit Service |
fb6fa5 |
GdkDragAction actions; /* Possible actions */
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Drag icon */
|
|
Packit Service |
fb6fa5 |
GtkImageType icon_type;
|
|
Packit Service |
fb6fa5 |
union
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkImagePixmapData pixmap;
|
|
Packit Service |
fb6fa5 |
GtkImagePixbufData pixbuf;
|
|
Packit Service |
fb6fa5 |
GtkImageStockData stock;
|
|
Packit Service |
fb6fa5 |
GtkImageIconNameData name;
|
|
Packit Service |
fb6fa5 |
} icon_data;
|
|
Packit Service |
fb6fa5 |
GdkBitmap *icon_mask;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
GdkColormap *colormap; /* Colormap for drag icon */
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Stored button press information to detect drag beginning */
|
|
Packit Service |
fb6fa5 |
gint state;
|
|
Packit Service |
fb6fa5 |
gint x, y;
|
|
Packit Service |
fb6fa5 |
};
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
struct _GtkDragSourceInfo
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkWidget *source_widget;
|
|
Packit Service |
fb6fa5 |
GtkWidget *widget;
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list; /* Targets for drag data */
|
|
Packit Service |
fb6fa5 |
GdkDragAction possible_actions; /* Actions allowed by source */
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context; /* drag context */
|
|
Packit Service |
fb6fa5 |
NSEvent *nsevent; /* what started it */
|
|
Packit Service |
fb6fa5 |
gint hot_x, hot_y; /* Hot spot for drag */
|
|
Packit Service |
fb6fa5 |
GdkPixbuf *icon_pixbuf;
|
|
Packit Service |
fb6fa5 |
gboolean success;
|
|
Packit Service |
fb6fa5 |
gboolean delete;
|
|
Packit Service |
fb6fa5 |
};
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
struct _GtkDragDestSite
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDestDefaults flags;
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list;
|
|
Packit Service |
fb6fa5 |
GdkDragAction actions;
|
|
Packit Service |
fb6fa5 |
guint have_drag : 1;
|
|
Packit Service |
fb6fa5 |
guint track_motion : 1;
|
|
Packit Service |
fb6fa5 |
};
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
struct _GtkDragDestInfo
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkWidget *widget; /* Widget in which drag is in */
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context; /* Drag context */
|
|
Packit Service |
fb6fa5 |
guint dropped : 1; /* Set after we receive a drop */
|
|
Packit Service |
fb6fa5 |
gint drop_x, drop_y; /* Position of drop */
|
|
Packit Service |
fb6fa5 |
};
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
struct _GtkDragFindData
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gint x;
|
|
Packit Service |
fb6fa5 |
gint y;
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context;
|
|
Packit Service |
fb6fa5 |
GtkDragDestInfo *info;
|
|
Packit Service |
fb6fa5 |
gboolean found;
|
|
Packit Service |
fb6fa5 |
gboolean toplevel;
|
|
Packit Service |
fb6fa5 |
gboolean (*callback) (GtkWidget *widget, GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gint x, gint y, guint32 time);
|
|
Packit Service |
fb6fa5 |
guint32 time;
|
|
Packit Service |
fb6fa5 |
};
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
@interface GtkDragSourceOwner : NSObject {
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo *info;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
@end
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
@implementation GtkDragSourceOwner
|
|
Packit Service |
fb6fa5 |
-(void)pasteboard:(NSPasteboard *)sender provideDataForType:(NSString *)type
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
guint target_info;
|
|
Packit Service |
fb6fa5 |
GtkSelectionData selection_data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
selection_data.selection = GDK_NONE;
|
|
Packit Service |
fb6fa5 |
selection_data.data = NULL;
|
|
Packit Service |
fb6fa5 |
selection_data.length = -1;
|
|
Packit Service |
fb6fa5 |
selection_data.target = gdk_quartz_pasteboard_type_to_atom_libgtk_only (type);
|
|
Packit Service |
fb6fa5 |
selection_data.display = gdk_display_get_default ();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (gtk_target_list_find (info->target_list,
|
|
Packit Service |
fb6fa5 |
selection_data.target,
|
|
Packit Service |
fb6fa5 |
&target_info))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (info->widget, "drag-data-get",
|
|
Packit Service |
fb6fa5 |
info->context,
|
|
Packit Service |
fb6fa5 |
&selection_data,
|
|
Packit Service |
fb6fa5 |
target_info,
|
|
Packit Service |
fb6fa5 |
time);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (selection_data.length >= 0)
|
|
Packit Service |
fb6fa5 |
_gtk_quartz_set_selection_data_for_pasteboard (sender, &selection_data);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_free (selection_data.data);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
- (id)initWithInfo:(GtkDragSourceInfo *)anInfo
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
self = [super init];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (self)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
info = anInfo;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return self;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
@end
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_get_data (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
GdkAtom target,
|
|
Packit Service |
fb6fa5 |
guint32 time)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
id <NSDraggingInfo> dragging_info;
|
|
Packit Service |
fb6fa5 |
NSPasteboard *pasteboard;
|
|
Packit Service |
fb6fa5 |
GtkSelectionData *selection_data;
|
|
Packit Service |
fb6fa5 |
GtkDragDestInfo *info;
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
dragging_info = gdk_quartz_drag_context_get_dragging_info_libgtk_only (context);
|
|
Packit Service |
fb6fa5 |
pasteboard = [dragging_info draggingPasteboard];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_dest_info (context, FALSE);
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
selection_data = _gtk_quartz_get_selection_data_from_pasteboard (pasteboard,
|
|
Packit Service |
fb6fa5 |
target, 0);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site && site->target_list)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
guint target_info;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (gtk_target_list_find (site->target_list,
|
|
Packit Service |
fb6fa5 |
selection_data->target,
|
|
Packit Service |
fb6fa5 |
&target_info))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (!(site->flags & GTK_DEST_DEFAULT_DROP) ||
|
|
Packit Service |
fb6fa5 |
selection_data->length >= 0)
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (widget,
|
|
Packit Service |
fb6fa5 |
"drag-data-received",
|
|
Packit Service |
fb6fa5 |
context, info->drop_x, info->drop_y,
|
|
Packit Service |
fb6fa5 |
selection_data,
|
|
Packit Service |
fb6fa5 |
target_info, time);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (widget,
|
|
Packit Service |
fb6fa5 |
"drag-data-received",
|
|
Packit Service |
fb6fa5 |
context, info->drop_x, info->drop_y,
|
|
Packit Service |
fb6fa5 |
selection_data,
|
|
Packit Service |
fb6fa5 |
0, time);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site && site->flags & GTK_DEST_DEFAULT_DROP)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_drag_finish (context,
|
|
Packit Service |
fb6fa5 |
(selection_data->length >= 0),
|
|
Packit Service |
fb6fa5 |
(context->action == GDK_ACTION_MOVE),
|
|
Packit Service |
fb6fa5 |
time);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_finish (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gboolean success,
|
|
Packit Service |
fb6fa5 |
gboolean del,
|
|
Packit Service |
fb6fa5 |
guint32 time)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo *info;
|
|
Packit Service |
fb6fa5 |
GdkDragContext* source_context = gdk_quartz_drag_source_context ();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (source_context)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_source_info (source_context, FALSE);
|
|
Packit Service |
fb6fa5 |
if (info)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
info->success = success;
|
|
Packit Service |
fb6fa5 |
info->delete = del;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_info_destroy (gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestInfo *info = data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_free (info);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static GtkDragDestInfo *
|
|
Packit Service |
fb6fa5 |
gtk_drag_get_dest_info (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gboolean create)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestInfo *info;
|
|
Packit Service |
fb6fa5 |
static GQuark info_quark = 0;
|
|
Packit Service |
fb6fa5 |
if (!info_quark)
|
|
Packit Service |
fb6fa5 |
info_quark = g_quark_from_static_string ("gtk-dest-info");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = g_object_get_qdata (G_OBJECT (context), info_quark);
|
|
Packit Service |
fb6fa5 |
if (!info && create)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
info = g_new (GtkDragDestInfo, 1);
|
|
Packit Service |
fb6fa5 |
info->widget = NULL;
|
|
Packit Service |
fb6fa5 |
info->context = context;
|
|
Packit Service |
fb6fa5 |
info->dropped = FALSE;
|
|
Packit Service |
fb6fa5 |
g_object_set_qdata_full (G_OBJECT (context), info_quark,
|
|
Packit Service |
fb6fa5 |
info, gtk_drag_dest_info_destroy);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return info;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static GQuark dest_info_quark = 0;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static GtkDragSourceInfo *
|
|
Packit Service |
fb6fa5 |
gtk_drag_get_source_info (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gboolean create)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo *info;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!dest_info_quark)
|
|
Packit Service |
fb6fa5 |
dest_info_quark = g_quark_from_static_string ("gtk-source-info");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = g_object_get_qdata (G_OBJECT (context), dest_info_quark);
|
|
Packit Service |
fb6fa5 |
if (!info && create)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
info = g_new0 (GtkDragSourceInfo, 1);
|
|
Packit Service |
fb6fa5 |
info->context = context;
|
|
Packit Service |
fb6fa5 |
g_object_set_qdata (G_OBJECT (context), dest_info_quark, info);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return info;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_clear_source_info (GdkDragContext *context)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_object_set_qdata (G_OBJECT (context), dest_info_quark, NULL);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
GtkWidget *
|
|
Packit Service |
fb6fa5 |
gtk_drag_get_source_widget (GdkDragContext *context)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo *info;
|
|
Packit Service |
fb6fa5 |
GdkDragContext* real_source_context = gdk_quartz_drag_source_context();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!real_source_context)
|
|
Packit Service |
fb6fa5 |
return NULL;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_source_info (real_source_context, FALSE);
|
|
Packit Service |
fb6fa5 |
if (!info)
|
|
Packit Service |
fb6fa5 |
return NULL;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return info->source_widget;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/*************************************************************
|
|
Packit Service |
fb6fa5 |
* gtk_drag_highlight_expose:
|
|
Packit Service |
fb6fa5 |
* Callback for expose_event for highlighted widgets.
|
|
Packit Service |
fb6fa5 |
* arguments:
|
|
Packit Service |
fb6fa5 |
* widget:
|
|
Packit Service |
fb6fa5 |
* event:
|
|
Packit Service |
fb6fa5 |
* data:
|
|
Packit Service |
fb6fa5 |
* results:
|
|
Packit Service |
fb6fa5 |
*************************************************************/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static gboolean
|
|
Packit Service |
fb6fa5 |
gtk_drag_highlight_expose (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkEventExpose *event,
|
|
Packit Service |
fb6fa5 |
gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gint x, y, width, height;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (gtk_widget_is_drawable (widget))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
cairo_t *cr;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!gtk_widget_get_has_window (widget))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
x = widget->allocation.x;
|
|
Packit Service |
fb6fa5 |
y = widget->allocation.y;
|
|
Packit Service |
fb6fa5 |
width = widget->allocation.width;
|
|
Packit Service |
fb6fa5 |
height = widget->allocation.height;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
x = 0;
|
|
Packit Service |
fb6fa5 |
y = 0;
|
|
Packit Service |
fb6fa5 |
width = gdk_window_get_width (widget->window);
|
|
Packit Service |
fb6fa5 |
height = gdk_window_get_height (widget->window);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_paint_shadow (widget->style, widget->window,
|
|
Packit Service |
fb6fa5 |
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
|
|
Packit Service |
fb6fa5 |
NULL, widget, "dnd",
|
|
Packit Service |
fb6fa5 |
x, y, width, height);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
cr = gdk_cairo_create (widget->window);
|
|
Packit Service |
fb6fa5 |
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
|
|
Packit Service |
fb6fa5 |
cairo_set_line_width (cr, 1.0);
|
|
Packit Service |
fb6fa5 |
cairo_rectangle (cr,
|
|
Packit Service |
fb6fa5 |
x + 0.5, y + 0.5,
|
|
Packit Service |
fb6fa5 |
width - 1, height - 1);
|
|
Packit Service |
fb6fa5 |
cairo_stroke (cr);
|
|
Packit Service |
fb6fa5 |
cairo_destroy (cr);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return FALSE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/*************************************************************
|
|
Packit Service |
fb6fa5 |
* gtk_drag_highlight:
|
|
Packit Service |
fb6fa5 |
* Highlight the given widget in the default manner.
|
|
Packit Service |
fb6fa5 |
* arguments:
|
|
Packit Service |
fb6fa5 |
* widget:
|
|
Packit Service |
fb6fa5 |
* results:
|
|
Packit Service |
fb6fa5 |
*************************************************************/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_highlight (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_connect_after (widget, "expose-event",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK (gtk_drag_highlight_expose),
|
|
Packit Service |
fb6fa5 |
NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_widget_queue_draw (widget);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/*************************************************************
|
|
Packit Service |
fb6fa5 |
* gtk_drag_unhighlight:
|
|
Packit Service |
fb6fa5 |
* Refresh the given widget to remove the highlight.
|
|
Packit Service |
fb6fa5 |
* arguments:
|
|
Packit Service |
fb6fa5 |
* widget:
|
|
Packit Service |
fb6fa5 |
* results:
|
|
Packit Service |
fb6fa5 |
*************************************************************/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_unhighlight (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_handlers_disconnect_by_func (widget,
|
|
Packit Service |
fb6fa5 |
gtk_drag_highlight_expose,
|
|
Packit Service |
fb6fa5 |
NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_widget_queue_draw (widget);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static NSWindow *
|
|
Packit Service |
fb6fa5 |
get_toplevel_nswindow (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (gtk_widget_is_toplevel (toplevel) && toplevel->window)
|
|
Packit Service |
fb6fa5 |
return [gdk_quartz_window_get_nsview (toplevel->window) window];
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
return NULL;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
register_types (GtkWidget *widget, GtkDragDestSite *site)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (site->target_list)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
NSWindow *nswindow = get_toplevel_nswindow (widget);
|
|
Packit Service |
fb6fa5 |
NSSet *types;
|
|
Packit Service |
fb6fa5 |
NSAutoreleasePool *pool;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!nswindow)
|
|
Packit Service |
fb6fa5 |
return;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pool = [[NSAutoreleasePool alloc] init];
|
|
Packit Service |
fb6fa5 |
types = _gtk_quartz_target_list_to_pasteboard_types (site->target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[nswindow registerForDraggedTypes:[types allObjects]];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[types release];
|
|
Packit Service |
fb6fa5 |
[pool release];
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_realized (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
gpointer user_data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site = user_data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
register_types (widget, site);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_hierarchy_changed (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkWidget *previous_toplevel,
|
|
Packit Service |
fb6fa5 |
gpointer user_data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site = user_data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
register_types (widget, site);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_site_destroy (gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site = data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site->target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (site->target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_free (site);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_set (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkDestDefaults flags,
|
|
Packit Service |
fb6fa5 |
const GtkTargetEntry *targets,
|
|
Packit Service |
fb6fa5 |
gint n_targets,
|
|
Packit Service |
fb6fa5 |
GdkDragAction actions)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *old_site, *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
old_site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_new (GtkDragDestSite, 1);
|
|
Packit Service |
fb6fa5 |
site->flags = flags;
|
|
Packit Service |
fb6fa5 |
site->have_drag = FALSE;
|
|
Packit Service |
fb6fa5 |
if (targets)
|
|
Packit Service |
fb6fa5 |
site->target_list = gtk_target_list_new (targets, n_targets);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
site->target_list = NULL;
|
|
Packit Service |
fb6fa5 |
site->actions = actions;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (old_site)
|
|
Packit Service |
fb6fa5 |
site->track_motion = old_site->track_motion;
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
site->track_motion = FALSE;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_unset (widget);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (gtk_widget_get_realized (widget))
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_realized (widget, site);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_connect (widget, "realize",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK (gtk_drag_dest_realized), site);
|
|
Packit Service |
fb6fa5 |
g_signal_connect (widget, "hierarchy-changed",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK (gtk_drag_dest_hierarchy_changed), site);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_set_data_full (G_OBJECT (widget), I_("gtk-drag-dest"),
|
|
Packit Service |
fb6fa5 |
site, gtk_drag_dest_site_destroy);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_set_proxy (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkWindow *proxy_window,
|
|
Packit Service |
fb6fa5 |
GdkDragProtocol protocol,
|
|
Packit Service |
fb6fa5 |
gboolean use_coordinates)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_warning ("gtk_drag_dest_set_proxy is not supported on Mac OS X.");
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_unset (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *old_site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
old_site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
if (old_site)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_signal_handlers_disconnect_by_func (widget,
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_realized,
|
|
Packit Service |
fb6fa5 |
old_site);
|
|
Packit Service |
fb6fa5 |
g_signal_handlers_disconnect_by_func (widget,
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_hierarchy_changed,
|
|
Packit Service |
fb6fa5 |
old_site);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_set_data (G_OBJECT (widget), I_("gtk-drag-dest"), NULL);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
GtkTargetList*
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_get_target_list (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return site ? site->target_list : NULL;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_set_target_list (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!site)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_warning ("Can't set a target list on a widget until you've called gtk_drag_dest_set() "
|
|
Packit Service |
fb6fa5 |
"to make the widget into a drag destination");
|
|
Packit Service |
fb6fa5 |
return;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site->target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (site->target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->target_list = target_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
register_types (widget, site);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_add_text_targets (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
target_list = gtk_drag_dest_get_target_list (widget);
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
target_list = gtk_target_list_new (NULL, 0);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_add_text_targets (target_list, 0);
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_set_target_list (widget, target_list);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (target_list);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_add_image_targets (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
target_list = gtk_drag_dest_get_target_list (widget);
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
target_list = gtk_target_list_new (NULL, 0);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_add_image_targets (target_list, 0, FALSE);
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_set_target_list (widget, target_list);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (target_list);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_add_uri_targets (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
target_list = gtk_drag_dest_get_target_list (widget);
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
target_list = gtk_target_list_new (NULL, 0);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_add_uri_targets (target_list, 0);
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_set_target_list (widget, target_list);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (target_list);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
prepend_and_ref_widget (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GSList **slist_p = data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
*slist_p = g_slist_prepend (*slist_p, g_object_ref (widget));
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_find_widget (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkDragFindData *data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkAllocation new_allocation;
|
|
Packit Service |
fb6fa5 |
gint allocation_to_window_x = 0;
|
|
Packit Service |
fb6fa5 |
gint allocation_to_window_y = 0;
|
|
Packit Service |
fb6fa5 |
gint x_offset = 0;
|
|
Packit Service |
fb6fa5 |
gint y_offset = 0;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (data->found || !gtk_widget_get_mapped (widget) || !gtk_widget_get_sensitive (widget))
|
|
Packit Service |
fb6fa5 |
return;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Note that in the following code, we only count the
|
|
Packit Service |
fb6fa5 |
* position as being inside a WINDOW widget if it is inside
|
|
Packit Service |
fb6fa5 |
* widget->window; points that are outside of widget->window
|
|
Packit Service |
fb6fa5 |
* but within the allocation are not counted. This is consistent
|
|
Packit Service |
fb6fa5 |
* with the way we highlight drag targets.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* data->x,y are relative to widget->parent->window (if
|
|
Packit Service |
fb6fa5 |
* widget is not a toplevel, widget->window otherwise).
|
|
Packit Service |
fb6fa5 |
* We compute the allocation of widget in the same coordinates,
|
|
Packit Service |
fb6fa5 |
* clipping to widget->window, and all intermediate
|
|
Packit Service |
fb6fa5 |
* windows. If data->x,y is inside that, then we translate
|
|
Packit Service |
fb6fa5 |
* our coordinates to be relative to widget->window and
|
|
Packit Service |
fb6fa5 |
* recurse.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
new_allocation = widget->allocation;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (widget->parent)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gint tx, ty;
|
|
Packit Service |
fb6fa5 |
GdkWindow *window = widget->window;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Compute the offset from allocation-relative to
|
|
Packit Service |
fb6fa5 |
* window-relative coordinates.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
allocation_to_window_x = widget->allocation.x;
|
|
Packit Service |
fb6fa5 |
allocation_to_window_y = widget->allocation.y;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (gtk_widget_get_has_window (widget))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
/* The allocation is relative to the parent window for
|
|
Packit Service |
fb6fa5 |
* window widgets, not to widget->window.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
gdk_window_get_position (window, &tx, &ty;;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
allocation_to_window_x -= tx;
|
|
Packit Service |
fb6fa5 |
allocation_to_window_y -= ty;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
new_allocation.x = 0 + allocation_to_window_x;
|
|
Packit Service |
fb6fa5 |
new_allocation.y = 0 + allocation_to_window_y;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
while (window && window != widget->parent->window)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GdkRectangle window_rect = { 0, 0, 0, 0 };
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
window_rect.width = gdk_window_get_width (window);
|
|
Packit Service |
fb6fa5 |
window_rect.height = gdk_window_get_height (window);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gdk_rectangle_intersect (&new_allocation, &window_rect, &new_allocation);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gdk_window_get_position (window, &tx, &ty;;
|
|
Packit Service |
fb6fa5 |
new_allocation.x += tx;
|
|
Packit Service |
fb6fa5 |
x_offset += tx;
|
|
Packit Service |
fb6fa5 |
new_allocation.y += ty;
|
|
Packit Service |
fb6fa5 |
y_offset += ty;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
window = gdk_window_get_parent (window);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!window) /* Window and widget heirarchies didn't match. */
|
|
Packit Service |
fb6fa5 |
return;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (data->toplevel ||
|
|
Packit Service |
fb6fa5 |
((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
|
|
Packit Service |
fb6fa5 |
(data->x < new_allocation.x + new_allocation.width) &&
|
|
Packit Service |
fb6fa5 |
(data->y < new_allocation.y + new_allocation.height)))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
/* First, check if the drag is in a valid drop site in
|
|
Packit Service |
fb6fa5 |
* one of our children
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
if (GTK_IS_CONTAINER (widget))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragFindData new_data = *data;
|
|
Packit Service |
fb6fa5 |
GSList *children = NULL;
|
|
Packit Service |
fb6fa5 |
GSList *tmp_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
new_data.x -= x_offset;
|
|
Packit Service |
fb6fa5 |
new_data.y -= y_offset;
|
|
Packit Service |
fb6fa5 |
new_data.found = FALSE;
|
|
Packit Service |
fb6fa5 |
new_data.toplevel = FALSE;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* need to reference children temporarily in case the
|
|
Packit Service |
fb6fa5 |
* ::drag-motion/::drag-drop callbacks change the widget hierarchy.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
gtk_container_forall (GTK_CONTAINER (widget), prepend_and_ref_widget, &children);
|
|
Packit Service |
fb6fa5 |
for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (!new_data.found && gtk_widget_is_drawable (tmp_list->data))
|
|
Packit Service |
fb6fa5 |
gtk_drag_find_widget (tmp_list->data, &new_data);
|
|
Packit Service |
fb6fa5 |
g_object_unref (tmp_list->data);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
g_slist_free (children);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
data->found = new_data.found;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* If not, and this widget is registered as a drop site, check to
|
|
Packit Service |
fb6fa5 |
* emit "drag-motion" to check if we are actually in
|
|
Packit Service |
fb6fa5 |
* a drop site.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
if (!data->found &&
|
|
Packit Service |
fb6fa5 |
g_object_get_data (G_OBJECT (widget), "gtk-drag-dest"))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
data->found = data->callback (widget,
|
|
Packit Service |
fb6fa5 |
data->context,
|
|
Packit Service |
fb6fa5 |
data->x - x_offset - allocation_to_window_x,
|
|
Packit Service |
fb6fa5 |
data->y - y_offset - allocation_to_window_y,
|
|
Packit Service |
fb6fa5 |
data->time);
|
|
Packit Service |
fb6fa5 |
/* If so, send a "drag-leave" to the last widget */
|
|
Packit Service |
fb6fa5 |
if (data->found)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (data->info->widget && data->info->widget != widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_leave (data->info->widget, data->context, data->time);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
data->info->widget = widget;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_leave (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
guint time)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (site != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if ((site->flags & GTK_DEST_DEFAULT_HIGHLIGHT) && site->have_drag)
|
|
Packit Service |
fb6fa5 |
gtk_drag_unhighlight (widget);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!(site->flags & GTK_DEST_DEFAULT_MOTION) || site->have_drag ||
|
|
Packit Service |
fb6fa5 |
site->track_motion)
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (widget, "drag-leave", context, time);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->have_drag = FALSE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static gboolean
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_motion (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gint x,
|
|
Packit Service |
fb6fa5 |
gint y,
|
|
Packit Service |
fb6fa5 |
guint time)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
GdkDragAction action = 0;
|
|
Packit Service |
fb6fa5 |
gboolean retval;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (site != NULL, FALSE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site->track_motion || site->flags & GTK_DEST_DEFAULT_MOTION)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (context->suggested_action & site->actions)
|
|
Packit Service |
fb6fa5 |
action = context->suggested_action;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (action && gtk_drag_dest_find_target (widget, context, NULL))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (!site->have_drag)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
site->have_drag = TRUE;
|
|
Packit Service |
fb6fa5 |
if (site->flags & GTK_DEST_DEFAULT_HIGHLIGHT)
|
|
Packit Service |
fb6fa5 |
gtk_drag_highlight (widget);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gdk_drag_status (context, action, time);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gdk_drag_status (context, 0, time);
|
|
Packit Service |
fb6fa5 |
if (!site->track_motion)
|
|
Packit Service |
fb6fa5 |
return TRUE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (widget, "drag-motion",
|
|
Packit Service |
fb6fa5 |
context, x, y, time, &retval);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return (site->flags & GTK_DEST_DEFAULT_MOTION) ? TRUE : retval;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static gboolean
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_drop (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
gint x,
|
|
Packit Service |
fb6fa5 |
gint y,
|
|
Packit Service |
fb6fa5 |
guint time)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
GtkDragDestInfo *info;
|
|
Packit Service |
fb6fa5 |
gboolean retval;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (site != NULL, FALSE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_dest_info (context, FALSE);
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (info != NULL, FALSE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info->drop_x = x;
|
|
Packit Service |
fb6fa5 |
info->drop_y = y;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site->flags & GTK_DEST_DEFAULT_DROP)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GdkAtom target = gtk_drag_dest_find_target (widget, context, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (target == GDK_NONE)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_drag_finish (context, FALSE, FALSE, time);
|
|
Packit Service |
fb6fa5 |
return TRUE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
gtk_drag_get_data (widget, context, target, time);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (widget, "drag-drop",
|
|
Packit Service |
fb6fa5 |
context, x, y, time, &retval);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return (site->flags & GTK_DEST_DEFAULT_DROP) ? TRUE : retval;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_set_track_motion (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
gboolean track_motion)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (site != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->track_motion = track_motion != FALSE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gboolean
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_get_track_motion (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-drag-dest");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site)
|
|
Packit Service |
fb6fa5 |
return site->track_motion;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return FALSE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
_gtk_drag_dest_handle_event (GtkWidget *toplevel,
|
|
Packit Service |
fb6fa5 |
GdkEvent *event)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragDestInfo *info;
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (toplevel != NULL);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (event != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
context = event->dnd.context;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_dest_info (context, TRUE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Find the widget for the event */
|
|
Packit Service |
fb6fa5 |
switch (event->type)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
case GDK_DRAG_ENTER:
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
case GDK_DRAG_LEAVE:
|
|
Packit Service |
fb6fa5 |
if (info->widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_leave (info->widget, context, event->dnd.time);
|
|
Packit Service |
fb6fa5 |
info->widget = NULL;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
case GDK_DRAG_MOTION:
|
|
Packit Service |
fb6fa5 |
case GDK_DROP_START:
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragFindData data;
|
|
Packit Service |
fb6fa5 |
gint tx, ty;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (event->type == GDK_DROP_START)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
info->dropped = TRUE;
|
|
Packit Service |
fb6fa5 |
/* We send a leave here so that the widget unhighlights
|
|
Packit Service |
fb6fa5 |
* properly.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
if (info->widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_leave (info->widget, context, event->dnd.time);
|
|
Packit Service |
fb6fa5 |
info->widget = NULL;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gdk_window_get_position (toplevel->window, &tx, &ty;;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
data.x = event->dnd.x_root - tx;
|
|
Packit Service |
fb6fa5 |
data.y = event->dnd.y_root - ty;
|
|
Packit Service |
fb6fa5 |
data.context = context;
|
|
Packit Service |
fb6fa5 |
data.info = info;
|
|
Packit Service |
fb6fa5 |
data.found = FALSE;
|
|
Packit Service |
fb6fa5 |
data.toplevel = TRUE;
|
|
Packit Service |
fb6fa5 |
data.callback = (event->type == GDK_DRAG_MOTION) ?
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_motion : gtk_drag_dest_drop;
|
|
Packit Service |
fb6fa5 |
data.time = event->dnd.time;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_find_widget (toplevel, &data);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (info->widget && !data.found)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_leave (info->widget, context, event->dnd.time);
|
|
Packit Service |
fb6fa5 |
info->widget = NULL;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Send a reply.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
if (event->type == GDK_DRAG_MOTION)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (!data.found)
|
|
Packit Service |
fb6fa5 |
gdk_drag_status (context, 0, event->dnd.time);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
default:
|
|
Packit Service |
fb6fa5 |
g_assert_not_reached ();
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
GdkAtom
|
|
Packit Service |
fb6fa5 |
gtk_drag_dest_find_target (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
id <NSDraggingInfo> dragging_info;
|
|
Packit Service |
fb6fa5 |
NSPasteboard *pasteboard;
|
|
Packit Service |
fb6fa5 |
GtkWidget *source_widget;
|
|
Packit Service |
fb6fa5 |
GList *tmp_target;
|
|
Packit Service |
fb6fa5 |
GList *tmp_source = NULL;
|
|
Packit Service |
fb6fa5 |
GList *source_targets;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (GTK_IS_WIDGET (widget), GDK_NONE);
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), GDK_NONE);
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (!context->is_source, GDK_NONE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
dragging_info = gdk_quartz_drag_context_get_dragging_info_libgtk_only (context);
|
|
Packit Service |
fb6fa5 |
pasteboard = [dragging_info draggingPasteboard];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
source_widget = gtk_drag_get_source_widget (context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (target_list == NULL)
|
|
Packit Service |
fb6fa5 |
target_list = gtk_drag_dest_get_target_list (widget);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (target_list == NULL)
|
|
Packit Service |
fb6fa5 |
return GDK_NONE;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
source_targets = _gtk_quartz_pasteboard_types_to_atom_list ([pasteboard types]);
|
|
Packit Service |
fb6fa5 |
tmp_target = target_list->list;
|
|
Packit Service |
fb6fa5 |
while (tmp_target)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkTargetPair *pair = tmp_target->data;
|
|
Packit Service |
fb6fa5 |
tmp_source = source_targets;
|
|
Packit Service |
fb6fa5 |
while (tmp_source)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (tmp_source->data == GUINT_TO_POINTER (pair->target))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if ((!(pair->flags & GTK_TARGET_SAME_APP) || source_widget) &&
|
|
Packit Service |
fb6fa5 |
(!(pair->flags & GTK_TARGET_SAME_WIDGET) || (source_widget == widget)))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_list_free (source_targets);
|
|
Packit Service |
fb6fa5 |
return pair->target;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
tmp_source = tmp_source->next;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
tmp_target = tmp_target->next;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_list_free (source_targets);
|
|
Packit Service |
fb6fa5 |
return GDK_NONE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static gboolean
|
|
Packit Service |
fb6fa5 |
gtk_drag_begin_idle (gpointer arg)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
|
Packit Service |
fb6fa5 |
GdkDragContext* context = (GdkDragContext*) arg;
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo* info = gtk_drag_get_source_info (context, FALSE);
|
|
Packit Service |
fb6fa5 |
NSWindow *nswindow;
|
|
Packit Service |
fb6fa5 |
NSPasteboard *pasteboard;
|
|
Packit Service |
fb6fa5 |
GtkDragSourceOwner *owner;
|
|
Packit Service |
fb6fa5 |
NSPoint point;
|
|
Packit Service |
fb6fa5 |
NSSet *types;
|
|
Packit Service |
fb6fa5 |
NSImage *drag_image;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_assert (info != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
|
|
Packit Service |
fb6fa5 |
owner = [[GtkDragSourceOwner alloc] initWithInfo:info];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
types = _gtk_quartz_target_list_to_pasteboard_types (info->target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[pasteboard declareTypes:[types allObjects] owner:owner];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[owner release];
|
|
Packit Service |
fb6fa5 |
[types release];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if ((nswindow = get_toplevel_nswindow (info->source_widget)) == NULL)
|
|
Packit Service |
fb6fa5 |
return FALSE;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Ref the context. It's unreffed when the drag has been aborted */
|
|
Packit Service |
fb6fa5 |
g_object_ref (info->context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* FIXME: If the event isn't a mouse event, use the global cursor position instead */
|
|
Packit Service |
fb6fa5 |
point = [info->nsevent locationInWindow];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Account for the given hotspot position. The y position must be
|
|
Packit Service |
fb6fa5 |
* corrected to the NSWindow coordinate system.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
point.x -= info->hot_x;
|
|
Packit Service |
fb6fa5 |
point.y += -(gdk_pixbuf_get_height (info->icon_pixbuf) - info->hot_y);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
drag_image = _gtk_quartz_create_image_from_pixbuf (info->icon_pixbuf);
|
|
Packit Service |
fb6fa5 |
if (drag_image == NULL)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_object_unref (info->context);
|
|
Packit Service |
fb6fa5 |
return FALSE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[nswindow dragImage:drag_image
|
|
Packit Service |
fb6fa5 |
at:point
|
|
Packit Service |
fb6fa5 |
offset:NSZeroSize
|
|
Packit Service |
fb6fa5 |
event:info->nsevent
|
|
Packit Service |
fb6fa5 |
pasteboard:pasteboard
|
|
Packit Service |
fb6fa5 |
source:nswindow
|
|
Packit Service |
fb6fa5 |
slideBack:YES];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[info->nsevent release];
|
|
Packit Service |
fb6fa5 |
[drag_image release];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[pool release];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return FALSE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static GdkDragContext *
|
|
Packit Service |
fb6fa5 |
gtk_drag_begin_internal (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site,
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list,
|
|
Packit Service |
fb6fa5 |
GdkDragAction actions,
|
|
Packit Service |
fb6fa5 |
gint button,
|
|
Packit Service |
fb6fa5 |
GdkEvent *event)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo *info;
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context;
|
|
Packit Service |
fb6fa5 |
NSWindow *nswindow = get_toplevel_nswindow (widget);
|
|
Packit Service |
fb6fa5 |
NSPoint point = {0, 0};
|
|
Packit Service |
fb6fa5 |
gdouble x, y;
|
|
Packit Service |
fb6fa5 |
double time = (double)g_get_real_time ();
|
|
Packit Service |
fb6fa5 |
NSEvent *nsevent;
|
|
Packit Service |
fb6fa5 |
NSTimeInterval nstime;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (event)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (gdk_event_get_coords (event, &x, &y))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
/* We need to translate (x, y) to coordinates relative to the
|
|
Packit Service |
fb6fa5 |
* toplevel GdkWindow, which should be the GdkWindow backing
|
|
Packit Service |
fb6fa5 |
* nswindow. Then, we convert to the NSWindow coordinate system.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
GdkWindow *window = event->any.window;
|
|
Packit Service |
fb6fa5 |
GdkWindow *toplevel = gdk_window_get_effective_toplevel (window);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
while (window != toplevel)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
double old_x = x;
|
|
Packit Service |
fb6fa5 |
double old_y = y;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gdk_window_coords_to_parent (window, old_x, old_y,
|
|
Packit Service |
fb6fa5 |
&x, &y);
|
|
Packit Service |
fb6fa5 |
window = gdk_window_get_effective_parent (window);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
point.x = x;
|
|
Packit Service |
fb6fa5 |
point.y = gdk_window_get_height (window) - y;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
time = (double)gdk_event_get_time (event);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
nstime = [[NSDate dateWithTimeIntervalSince1970: time / 1000] timeIntervalSinceReferenceDate];
|
|
Packit Service |
fb6fa5 |
nsevent = [NSEvent mouseEventWithType: NSLeftMouseDown
|
|
Packit Service |
fb6fa5 |
location: point
|
|
Packit Service |
fb6fa5 |
modifierFlags: 0
|
|
Packit Service |
fb6fa5 |
timestamp: nstime
|
|
Packit Service |
fb6fa5 |
windowNumber: [nswindow windowNumber]
|
|
Packit Service |
fb6fa5 |
context: [nswindow graphicsContext]
|
|
Packit Service |
fb6fa5 |
eventNumber: 0
|
|
Packit Service |
fb6fa5 |
clickCount: 1
|
|
Packit Service |
fb6fa5 |
pressure: 0.0 ];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
GdkWindow *window = [[nswindow contentView] gdkWindow];
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail(nsevent != NULL, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
context = gdk_drag_begin (window, NULL);
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail( context != NULL, NULL);
|
|
Packit Service |
fb6fa5 |
context->is_source = TRUE;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_source_info (context, TRUE);
|
|
Packit Service |
fb6fa5 |
info->nsevent = nsevent;
|
|
Packit Service |
fb6fa5 |
[info->nsevent retain];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info->source_widget = g_object_ref (widget);
|
|
Packit Service |
fb6fa5 |
info->widget = g_object_ref (widget);
|
|
Packit Service |
fb6fa5 |
info->target_list = target_list;
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info->possible_actions = actions;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (widget, "drag-begin", info->context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Ensure that we have an icon before we start the drag; the
|
|
Packit Service |
fb6fa5 |
* application may have set one in ::drag_begin, or it may
|
|
Packit Service |
fb6fa5 |
* not have set one.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
if (!info->icon_pixbuf)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (!site || site->icon_type == GTK_IMAGE_EMPTY)
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_default (context);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
switch (site->icon_type)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_PIXMAP:
|
|
Packit Service |
fb6fa5 |
/* This is not supported, so just set a small transparent pixbuf
|
|
Packit Service |
fb6fa5 |
* since we need to have something.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
if (0)
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_pixmap (context,
|
|
Packit Service |
fb6fa5 |
site->colormap,
|
|
Packit Service |
fb6fa5 |
site->icon_data.pixmap.pixmap,
|
|
Packit Service |
fb6fa5 |
site->icon_mask,
|
|
Packit Service |
fb6fa5 |
-2, -2);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GdkPixbuf *pixbuf;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 1, 1);
|
|
Packit Service |
fb6fa5 |
gdk_pixbuf_fill (pixbuf, 0xffffff);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_pixbuf (context,
|
|
Packit Service |
fb6fa5 |
pixbuf,
|
|
Packit Service |
fb6fa5 |
0, 0);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_unref (pixbuf);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_PIXBUF:
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_pixbuf (context,
|
|
Packit Service |
fb6fa5 |
site->icon_data.pixbuf.pixbuf,
|
|
Packit Service |
fb6fa5 |
-2, -2);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_STOCK:
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_stock (context,
|
|
Packit Service |
fb6fa5 |
site->icon_data.stock.stock_id,
|
|
Packit Service |
fb6fa5 |
-2, -2);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_ICON_NAME:
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_name (context,
|
|
Packit Service |
fb6fa5 |
site->icon_data.name.icon_name,
|
|
Packit Service |
fb6fa5 |
-2, -2);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_EMPTY:
|
|
Packit Service |
fb6fa5 |
default:
|
|
Packit Service |
fb6fa5 |
g_assert_not_reached();
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* drag will begin in an idle handler to avoid nested run loops */
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_idle_add_full (G_PRIORITY_HIGH_IDLE, gtk_drag_begin_idle, context, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gdk_pointer_ungrab (0);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return context;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
GdkDragContext *
|
|
Packit Service |
fb6fa5 |
gtk_drag_begin (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkTargetList *targets,
|
|
Packit Service |
fb6fa5 |
GdkDragAction actions,
|
|
Packit Service |
fb6fa5 |
gint button,
|
|
Packit Service |
fb6fa5 |
GdkEvent *event)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (gtk_widget_get_realized (widget), NULL);
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (targets != NULL, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return gtk_drag_begin_internal (widget, NULL, targets,
|
|
Packit Service |
fb6fa5 |
actions, button, event);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static gboolean
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_event_cb (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkEvent *event,
|
|
Packit Service |
fb6fa5 |
gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
gboolean retval = FALSE;
|
|
Packit Service |
fb6fa5 |
site = (GtkDragSourceSite *)data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
switch (event->type)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
case GDK_BUTTON_PRESS:
|
|
Packit Service |
fb6fa5 |
if ((GDK_BUTTON1_MASK << (event->button.button - 1)) & site->start_button_mask)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
site->state |= (GDK_BUTTON1_MASK << (event->button.button - 1));
|
|
Packit Service |
fb6fa5 |
site->x = event->button.x;
|
|
Packit Service |
fb6fa5 |
site->y = event->button.y;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
case GDK_BUTTON_RELEASE:
|
|
Packit Service |
fb6fa5 |
if ((GDK_BUTTON1_MASK << (event->button.button - 1)) & site->start_button_mask)
|
|
Packit Service |
fb6fa5 |
site->state &= ~(GDK_BUTTON1_MASK << (event->button.button - 1));
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
case GDK_MOTION_NOTIFY:
|
|
Packit Service |
fb6fa5 |
if (site->state & event->motion.state & site->start_button_mask)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
/* FIXME: This is really broken and can leave us
|
|
Packit Service |
fb6fa5 |
* with a stuck grab
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
int i;
|
|
Packit Service |
fb6fa5 |
for (i=1; i<6; i++)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (site->state & event->motion.state &
|
|
Packit Service |
fb6fa5 |
GDK_BUTTON1_MASK << (i - 1))
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (gtk_drag_check_threshold (widget, site->x, site->y,
|
|
Packit Service |
fb6fa5 |
event->motion.x, event->motion.y))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
site->state = 0;
|
|
Packit Service |
fb6fa5 |
gtk_drag_begin_internal (widget, site, site->target_list,
|
|
Packit Service |
fb6fa5 |
site->actions,
|
|
Packit Service |
fb6fa5 |
i, event);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
retval = TRUE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
default: /* hit for 2/3BUTTON_PRESS */
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return retval;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkModifierType start_button_mask,
|
|
Packit Service |
fb6fa5 |
const GtkTargetEntry *targets,
|
|
Packit Service |
fb6fa5 |
gint n_targets,
|
|
Packit Service |
fb6fa5 |
GdkDragAction actions)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_widget_add_events (widget,
|
|
Packit Service |
fb6fa5 |
gtk_widget_get_events (widget) |
|
|
Packit Service |
fb6fa5 |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
|
|
Packit Service |
fb6fa5 |
GDK_BUTTON_MOTION_MASK);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if (site->target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (site->target_list);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
site = g_new0 (GtkDragSourceSite, 1);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->icon_type = GTK_IMAGE_EMPTY;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_connect (widget, "button-press-event",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK (gtk_drag_source_event_cb),
|
|
Packit Service |
fb6fa5 |
site);
|
|
Packit Service |
fb6fa5 |
g_signal_connect (widget, "button-release-event",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK (gtk_drag_source_event_cb),
|
|
Packit Service |
fb6fa5 |
site);
|
|
Packit Service |
fb6fa5 |
g_signal_connect (widget, "motion-notify-event",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK (gtk_drag_source_event_cb),
|
|
Packit Service |
fb6fa5 |
site);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_set_data_full (G_OBJECT (widget),
|
|
Packit Service |
fb6fa5 |
I_("gtk-site-data"),
|
|
Packit Service |
fb6fa5 |
site, gtk_drag_source_site_destroy);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->start_button_mask = start_button_mask;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->target_list = gtk_target_list_new (targets, n_targets);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->actions = actions;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/*************************************************************
|
|
Packit Service |
fb6fa5 |
* gtk_drag_source_unset
|
|
Packit Service |
fb6fa5 |
* Unregister this widget as a drag source.
|
|
Packit Service |
fb6fa5 |
* arguments:
|
|
Packit Service |
fb6fa5 |
* widget:
|
|
Packit Service |
fb6fa5 |
* results:
|
|
Packit Service |
fb6fa5 |
*************************************************************/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_unset (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_signal_handlers_disconnect_by_func (widget,
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_event_cb,
|
|
Packit Service |
fb6fa5 |
site);
|
|
Packit Service |
fb6fa5 |
g_object_set_data (G_OBJECT (widget), I_("gtk-site-data"), NULL);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
GtkTargetList *
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_get_target_list (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return site ? site->target_list : NULL;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_target_list (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
if (site == NULL)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_warning ("gtk_drag_source_set_target_list() requires the widget "
|
|
Packit Service |
fb6fa5 |
"to already be a drag source.");
|
|
Packit Service |
fb6fa5 |
return;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site->target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (site->target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->target_list = target_list;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_source_add_text_targets:
|
|
Packit Service |
fb6fa5 |
* @widget: a #GtkWidget that's is a drag source
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Add the text targets supported by #GtkSelection to
|
|
Packit Service |
fb6fa5 |
* the target list of the drag source. The targets
|
|
Packit Service |
fb6fa5 |
* are added with @info = 0. If you need another value,
|
|
Packit Service |
fb6fa5 |
* use gtk_target_list_add_text_targets() and
|
|
Packit Service |
fb6fa5 |
* gtk_drag_source_set_target_list().
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Since: 2.6
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_add_text_targets (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
target_list = gtk_drag_source_get_target_list (widget);
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
target_list = gtk_target_list_new (NULL, 0);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_add_text_targets (target_list, 0);
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_target_list (widget, target_list);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (target_list);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_add_image_targets (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
target_list = gtk_drag_source_get_target_list (widget);
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
target_list = gtk_target_list_new (NULL, 0);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_add_image_targets (target_list, 0, TRUE);
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_target_list (widget, target_list);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (target_list);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_add_uri_targets (GtkWidget *widget)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkTargetList *target_list;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
target_list = gtk_drag_source_get_target_list (widget);
|
|
Packit Service |
fb6fa5 |
if (target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_ref (target_list);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
target_list = gtk_target_list_new (NULL, 0);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_add_uri_targets (target_list, 0);
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_target_list (widget, target_list);
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (target_list);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_unset_icon (GtkDragSourceSite *site)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
switch (site->icon_type)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_EMPTY:
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_PIXMAP:
|
|
Packit Service |
fb6fa5 |
if (site->icon_data.pixmap.pixmap)
|
|
Packit Service |
fb6fa5 |
g_object_unref (site->icon_data.pixmap.pixmap);
|
|
Packit Service |
fb6fa5 |
if (site->icon_mask)
|
|
Packit Service |
fb6fa5 |
g_object_unref (site->icon_mask);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_PIXBUF:
|
|
Packit Service |
fb6fa5 |
g_object_unref (site->icon_data.pixbuf.pixbuf);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_STOCK:
|
|
Packit Service |
fb6fa5 |
g_free (site->icon_data.stock.stock_id);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
case GTK_IMAGE_ICON_NAME:
|
|
Packit Service |
fb6fa5 |
g_free (site->icon_data.name.icon_name);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
default:
|
|
Packit Service |
fb6fa5 |
g_assert_not_reached();
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
site->icon_type = GTK_IMAGE_EMPTY;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site->colormap)
|
|
Packit Service |
fb6fa5 |
g_object_unref (site->colormap);
|
|
Packit Service |
fb6fa5 |
site->colormap = NULL;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_site_destroy (gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site = data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (site->target_list)
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (site->target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_unset_icon (site);
|
|
Packit Service |
fb6fa5 |
g_free (site);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_icon (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkColormap *colormap,
|
|
Packit Service |
fb6fa5 |
GdkPixmap *pixmap,
|
|
Packit Service |
fb6fa5 |
GdkBitmap *mask)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_COLORMAP (colormap));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_PIXMAP (pixmap));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (!mask || GDK_IS_PIXMAP (mask));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (site != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_ref (colormap);
|
|
Packit Service |
fb6fa5 |
g_object_ref (pixmap);
|
|
Packit Service |
fb6fa5 |
if (mask)
|
|
Packit Service |
fb6fa5 |
g_object_ref (mask);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_unset_icon (site);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->icon_type = GTK_IMAGE_PIXMAP;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->icon_data.pixmap.pixmap = pixmap;
|
|
Packit Service |
fb6fa5 |
site->icon_mask = mask;
|
|
Packit Service |
fb6fa5 |
site->colormap = colormap;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_icon_pixbuf (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkPixbuf *pixbuf)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (site != NULL);
|
|
Packit Service |
fb6fa5 |
g_object_ref (pixbuf);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_unset_icon (site);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->icon_type = GTK_IMAGE_PIXBUF;
|
|
Packit Service |
fb6fa5 |
site->icon_data.pixbuf.pixbuf = pixbuf;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_source_set_icon_stock:
|
|
Packit Service |
fb6fa5 |
* @widget: a #GtkWidget
|
|
Packit Service |
fb6fa5 |
* @stock_id: the ID of the stock icon to use
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Sets the icon that will be used for drags from a particular source
|
|
Packit Service |
fb6fa5 |
* to a stock icon.
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_icon_stock (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
const gchar *stock_id)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (stock_id != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (site != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_unset_icon (site);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->icon_type = GTK_IMAGE_STOCK;
|
|
Packit Service |
fb6fa5 |
site->icon_data.stock.stock_id = g_strdup (stock_id);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_source_set_icon_name:
|
|
Packit Service |
fb6fa5 |
* @widget: a #GtkWidget
|
|
Packit Service |
fb6fa5 |
* @icon_name: name of icon to use
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Sets the icon that will be used for drags from a particular source
|
|
Packit Service |
fb6fa5 |
* to a themed icon. See the docs for #GtkIconTheme for more details.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Since: 2.8
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_set_icon_name (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
const gchar *icon_name)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceSite *site;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (icon_name != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site = g_object_get_data (G_OBJECT (widget), "gtk-site-data");
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (site != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_unset_icon (site);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
site->icon_type = GTK_IMAGE_ICON_NAME;
|
|
Packit Service |
fb6fa5 |
site->icon_data.name.icon_name = g_strdup (icon_name);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_set_icon_widget:
|
|
Packit Service |
fb6fa5 |
* @context: the context for a drag. (This must be called
|
|
Packit Service |
fb6fa5 |
with a context for the source side of a drag)
|
|
Packit Service |
fb6fa5 |
* @widget: a toplevel window to use as an icon.
|
|
Packit Service |
fb6fa5 |
* @hot_x: the X offset within @widget of the hotspot.
|
|
Packit Service |
fb6fa5 |
* @hot_y: the Y offset within @widget of the hotspot.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Changes the icon for a widget to a given widget. GTK+
|
|
Packit Service |
fb6fa5 |
* will not destroy the icon, so if you don't want
|
|
Packit Service |
fb6fa5 |
* it to persist, you should connect to the "drag-end"
|
|
Packit Service |
fb6fa5 |
* signal and destroy it yourself.
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_widget (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
gint hot_x,
|
|
Packit Service |
fb6fa5 |
gint hot_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (context->is_source);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GTK_IS_WIDGET (widget));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_warning ("gtk_drag_set_icon_widget is not supported on Mac OS X");
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
set_icon_stock_pixbuf (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
const gchar *stock_id,
|
|
Packit Service |
fb6fa5 |
GdkPixbuf *pixbuf,
|
|
Packit Service |
fb6fa5 |
gint hot_x,
|
|
Packit Service |
fb6fa5 |
gint hot_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo *info;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_source_info (context, FALSE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (stock_id)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
pixbuf = gtk_widget_render_icon (info->widget, stock_id,
|
|
Packit Service |
fb6fa5 |
GTK_ICON_SIZE_DND, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!pixbuf)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_warning ("Cannot load drag icon from stock_id %s", stock_id);
|
|
Packit Service |
fb6fa5 |
return;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
g_object_ref (pixbuf);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (info->icon_pixbuf)
|
|
Packit Service |
fb6fa5 |
g_object_unref (info->icon_pixbuf);
|
|
Packit Service |
fb6fa5 |
info->icon_pixbuf = pixbuf;
|
|
Packit Service |
fb6fa5 |
info->hot_x = hot_x;
|
|
Packit Service |
fb6fa5 |
info->hot_y = hot_y;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_set_icon_pixbuf:
|
|
Packit Service |
fb6fa5 |
* @context: the context for a drag. (This must be called
|
|
Packit Service |
fb6fa5 |
* with a context for the source side of a drag)
|
|
Packit Service |
fb6fa5 |
* @pixbuf: the #GdkPixbuf to use as the drag icon.
|
|
Packit Service |
fb6fa5 |
* @hot_x: the X offset within @widget of the hotspot.
|
|
Packit Service |
fb6fa5 |
* @hot_y: the Y offset within @widget of the hotspot.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Sets @pixbuf as the icon for a given drag.
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_pixbuf (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
GdkPixbuf *pixbuf,
|
|
Packit Service |
fb6fa5 |
gint hot_x,
|
|
Packit Service |
fb6fa5 |
gint hot_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (context->is_source);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
set_icon_stock_pixbuf (context, NULL, pixbuf, hot_x, hot_y);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_set_icon_stock:
|
|
Packit Service |
fb6fa5 |
* @context: the context for a drag. (This must be called
|
|
Packit Service |
fb6fa5 |
* with a context for the source side of a drag)
|
|
Packit Service |
fb6fa5 |
* @stock_id: the ID of the stock icon to use for the drag.
|
|
Packit Service |
fb6fa5 |
* @hot_x: the X offset within the icon of the hotspot.
|
|
Packit Service |
fb6fa5 |
* @hot_y: the Y offset within the icon of the hotspot.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Sets the icon for a given drag from a stock ID.
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_stock (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
const gchar *stock_id,
|
|
Packit Service |
fb6fa5 |
gint hot_x,
|
|
Packit Service |
fb6fa5 |
gint hot_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (context->is_source);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (stock_id != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
set_icon_stock_pixbuf (context, stock_id, NULL, hot_x, hot_y);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_set_icon_pixmap:
|
|
Packit Service |
fb6fa5 |
* @context: the context for a drag. (This must be called
|
|
Packit Service |
fb6fa5 |
* with a context for the source side of a drag)
|
|
Packit Service |
fb6fa5 |
* @colormap: the colormap of the icon
|
|
Packit Service |
fb6fa5 |
* @pixmap: the image data for the icon
|
|
Packit Service |
fb6fa5 |
* @mask: the transparency mask for the icon
|
|
Packit Service |
fb6fa5 |
* @hot_x: the X offset within @pixmap of the hotspot.
|
|
Packit Service |
fb6fa5 |
* @hot_y: the Y offset within @pixmap of the hotspot.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Sets @pixmap as the icon for a given drag. GTK+ retains
|
|
Packit Service |
fb6fa5 |
* references for the arguments, and will release them when
|
|
Packit Service |
fb6fa5 |
* they are no longer needed. In general, gtk_drag_set_icon_pixbuf()
|
|
Packit Service |
fb6fa5 |
* will be more convenient to use.
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_pixmap (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
GdkColormap *colormap,
|
|
Packit Service |
fb6fa5 |
GdkPixmap *pixmap,
|
|
Packit Service |
fb6fa5 |
GdkBitmap *mask,
|
|
Packit Service |
fb6fa5 |
gint hot_x,
|
|
Packit Service |
fb6fa5 |
gint hot_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GdkPixbuf *pixbuf;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (context->is_source);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_COLORMAP (colormap));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_PIXMAP (pixmap));
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, colormap,
|
|
Packit Service |
fb6fa5 |
0, 0, /* src */
|
|
Packit Service |
fb6fa5 |
0, 0, /* dst */
|
|
Packit Service |
fb6fa5 |
-1, -1);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_pixbuf (context, pixbuf, hot_x, hot_y);
|
|
Packit Service |
fb6fa5 |
g_object_unref (pixbuf);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_set_icon_name:
|
|
Packit Service |
fb6fa5 |
* @context: the context for a drag. (This must be called
|
|
Packit Service |
fb6fa5 |
* with a context for the source side of a drag)
|
|
Packit Service |
fb6fa5 |
* @icon_name: name of icon to use
|
|
Packit Service |
fb6fa5 |
* @hot_x: the X offset of the hotspot within the icon
|
|
Packit Service |
fb6fa5 |
* @hot_y: the Y offset of the hotspot within the icon
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Sets the icon for a given drag from a named themed icon. See
|
|
Packit Service |
fb6fa5 |
* the docs for #GtkIconTheme for more details. Note that the
|
|
Packit Service |
fb6fa5 |
* size of the icon depends on the icon theme (the icon is
|
|
Packit Service |
fb6fa5 |
* loaded at the symbolic size #GTK_ICON_SIZE_DND), thus
|
|
Packit Service |
fb6fa5 |
* @hot_x and @hot_y have to be used with care.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Since: 2.8
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_name (GdkDragContext *context,
|
|
Packit Service |
fb6fa5 |
const gchar *icon_name,
|
|
Packit Service |
fb6fa5 |
gint hot_x,
|
|
Packit Service |
fb6fa5 |
gint hot_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GdkScreen *screen;
|
|
Packit Service |
fb6fa5 |
GtkSettings *settings;
|
|
Packit Service |
fb6fa5 |
GtkIconTheme *icon_theme;
|
|
Packit Service |
fb6fa5 |
GdkPixbuf *pixbuf;
|
|
Packit Service |
fb6fa5 |
gint width, height, icon_size;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (context->is_source);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (icon_name != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
screen = gdk_window_get_screen (context->source_window);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (screen != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
settings = gtk_settings_get_for_screen (screen);
|
|
Packit Service |
fb6fa5 |
if (gtk_icon_size_lookup_for_settings (settings,
|
|
Packit Service |
fb6fa5 |
GTK_ICON_SIZE_DND,
|
|
Packit Service |
fb6fa5 |
&width, &height))
|
|
Packit Service |
fb6fa5 |
icon_size = MAX (width, height);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
icon_size = 32; /* default value for GTK_ICON_SIZE_DND */
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
icon_theme = gtk_icon_theme_get_for_screen (screen);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name,
|
|
Packit Service |
fb6fa5 |
icon_size, 0, NULL);
|
|
Packit Service |
fb6fa5 |
if (pixbuf)
|
|
Packit Service |
fb6fa5 |
set_icon_stock_pixbuf (context, NULL, pixbuf, hot_x, hot_y);
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
g_warning ("Cannot load drag icon from icon name %s", icon_name);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/**
|
|
Packit Service |
fb6fa5 |
* gtk_drag_set_icon_default:
|
|
Packit Service |
fb6fa5 |
* @context: the context for a drag. (This must be called
|
|
Packit Service |
fb6fa5 |
with a context for the source side of a drag)
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* Sets the icon for a particular drag to the default
|
|
Packit Service |
fb6fa5 |
* icon.
|
|
Packit Service |
fb6fa5 |
**/
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_default (GdkDragContext *context)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (context->is_source);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_icon_stock (context, GTK_STOCK_DND, -2, -2);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
gtk_drag_set_default_icon (GdkColormap *colormap,
|
|
Packit Service |
fb6fa5 |
GdkPixmap *pixmap,
|
|
Packit Service |
fb6fa5 |
GdkBitmap *mask,
|
|
Packit Service |
fb6fa5 |
gint hot_x,
|
|
Packit Service |
fb6fa5 |
gint hot_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_warning ("gtk_drag_set_default_icon is not supported on Mac OS X.");
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_info_destroy (GtkDragSourceInfo *info)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
NSPasteboard *pasteboard;
|
|
Packit Service |
fb6fa5 |
NSAutoreleasePool *pool;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (info->icon_pixbuf)
|
|
Packit Service |
fb6fa5 |
g_object_unref (info->icon_pixbuf);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (info->widget, "drag-end",
|
|
Packit Service |
fb6fa5 |
info->context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (info->source_widget)
|
|
Packit Service |
fb6fa5 |
g_object_unref (info->source_widget);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (info->widget)
|
|
Packit Service |
fb6fa5 |
g_object_unref (info->widget);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_target_list_unref (info->target_list);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pool = [[NSAutoreleasePool alloc] init];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Empty the pasteboard, so that it will not accidentally access
|
|
Packit Service |
fb6fa5 |
* info->context after it has been destroyed.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard];
|
|
Packit Service |
fb6fa5 |
[pasteboard declareTypes: nil owner: nil];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
[pool release];
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_drag_clear_source_info (info->context);
|
|
Packit Service |
fb6fa5 |
g_object_unref (info->context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_free (info);
|
|
Packit Service |
fb6fa5 |
info = NULL;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static gboolean
|
|
Packit Service |
fb6fa5 |
drag_drop_finished_idle_cb (gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo* info = (GtkDragSourceInfo*) data;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (info->success)
|
|
Packit Service |
fb6fa5 |
gtk_drag_source_info_destroy (data);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return FALSE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static void
|
|
Packit Service |
fb6fa5 |
gtk_drag_drop_finished (GtkDragSourceInfo *info,
|
|
Packit Service |
fb6fa5 |
GtkDragResult result)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gboolean success = (result == GTK_DRAG_RESULT_SUCCESS);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (!success)
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (info->source_widget, "drag-failed",
|
|
Packit Service |
fb6fa5 |
info->context, GTK_DRAG_RESULT_NO_TARGET, &success);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if (success && info->delete)
|
|
Packit Service |
fb6fa5 |
g_signal_emit_by_name (info->source_widget, "drag-data-delete",
|
|
Packit Service |
fb6fa5 |
info->context);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Workaround for the fact that the NS API blocks until the drag is
|
|
Packit Service |
fb6fa5 |
* over. This way the context is still valid when returning from
|
|
Packit Service |
fb6fa5 |
* drag_begin, even if it will still be quite useless. See bug #501588.
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
g_idle_add (drag_drop_finished_idle_cb, info);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/*************************************************************
|
|
Packit Service |
fb6fa5 |
* _gtk_drag_source_handle_event:
|
|
Packit Service |
fb6fa5 |
* Called from widget event handling code on Drag events
|
|
Packit Service |
fb6fa5 |
* for drag sources.
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* arguments:
|
|
Packit Service |
fb6fa5 |
* toplevel: Toplevel widget that received the event
|
|
Packit Service |
fb6fa5 |
* event:
|
|
Packit Service |
fb6fa5 |
* results:
|
|
Packit Service |
fb6fa5 |
*************************************************************/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void
|
|
Packit Service |
fb6fa5 |
_gtk_drag_source_handle_event (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkEvent *event)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkDragSourceInfo *info;
|
|
Packit Service |
fb6fa5 |
GdkDragContext *context;
|
|
Packit Service |
fb6fa5 |
GtkDragResult result;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (widget != NULL);
|
|
Packit Service |
fb6fa5 |
g_return_if_fail (event != NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
context = event->dnd.context;
|
|
Packit Service |
fb6fa5 |
info = gtk_drag_get_source_info (context, FALSE);
|
|
Packit Service |
fb6fa5 |
if (!info)
|
|
Packit Service |
fb6fa5 |
return;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
switch (event->type)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
case GDK_DROP_FINISHED:
|
|
Packit Service |
fb6fa5 |
result = (gdk_drag_context_get_dest_window (context) != NULL) ? GTK_DRAG_RESULT_SUCCESS : GTK_DRAG_RESULT_NO_TARGET;
|
|
Packit Service |
fb6fa5 |
gtk_drag_drop_finished (info, result);
|
|
Packit Service |
fb6fa5 |
break;
|
|
Packit Service |
fb6fa5 |
default:
|
|
Packit Service |
fb6fa5 |
g_assert_not_reached ();
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gboolean
|
|
Packit Service |
fb6fa5 |
gtk_drag_check_threshold (GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
gint start_x,
|
|
Packit Service |
fb6fa5 |
gint start_y,
|
|
Packit Service |
fb6fa5 |
gint current_x,
|
|
Packit Service |
fb6fa5 |
gint current_y)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gint drag_threshold;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_object_get (gtk_widget_get_settings (widget),
|
|
Packit Service |
fb6fa5 |
"gtk-dnd-drag-threshold", &drag_threshold,
|
|
Packit Service |
fb6fa5 |
NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return (ABS (current_x - start_x) > drag_threshold ||
|
|
Packit Service |
fb6fa5 |
ABS (current_y - start_y) > drag_threshold);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#define __GTK_DND_C__
|
|
Packit Service |
fb6fa5 |
#include "gtkaliasdef.c"
|