#include "gtkclipboard.h"
#include "gtkinvisible.h"
#include "gtkmain.h"
-#include "gtksignal.h"
#ifdef GDK_WINDOWING_X11
#include "x11/gdkx.h"
#include "win32/gdkwin32.h"
#endif
+typedef struct _GtkClipboardClass GtkClipboardClass;
+
typedef struct _RequestContentsInfo RequestContentsInfo;
typedef struct _RequestTextInfo RequestTextInfo;
struct _GtkClipboard
{
+ GObject parent_instance;
+
GdkAtom selection;
GtkClipboardGetFunc get_func;
GdkDisplay *display;
};
+struct _GtkClipboardClass
+{
+ GObjectClass parent_class;
+};
+
struct _RequestContentsInfo
{
GtkClipboardReceivedFunc callback;
gpointer user_data;
};
+static void gtk_clipboard_class_init (GtkClipboardClass *class);
+static void gtk_clipboard_finalize (GObject *object);
+
static void clipboard_unset (GtkClipboard *clipboard);
static void selection_received (GtkWidget *widget,
GtkSelectionData *selection_data,
static const gchar *clipboards_owned_key = "gtk-clipboards-owned";
static GQuark clipboards_owned_key_id = 0;
+
+static GObjectClass *parent_class;
+
+GType
+gtk_clipboard_get_type (void)
+{
+ static GType clipboard_type = 0;
+ if (!clipboard_type)
+ {
+ static const GTypeInfo clipboard_info =
+ {
+ sizeof (GtkClipboardClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gtk_clipboard_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GtkClipboard),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL,
+ };
+
+ clipboard_type = g_type_register_static (G_TYPE_OBJECT, "GtkClipboard",
+ &clipboard_info, 0);
+ }
+
+ return clipboard_type;
+}
+
+static void
+gtk_clipboard_class_init (GtkClipboardClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+ parent_class = g_type_class_peek_parent (class);
+
+ gobject_class->finalize = gtk_clipboard_finalize;
+}
+
+static void
+gtk_clipboard_finalize (GObject *object)
+{
+ clipboard_unset (GTK_CLIPBOARD (object));
+}
+
+static void
+clipboard_display_closed (GdkDisplay *display,
+ gboolean is_error,
+ GtkClipboard *clipboard)
+{
+ GSList *clipboards;
+
+ clipboards = g_object_get_data (G_OBJECT (display), "gtk-clipboard-list");
+ g_object_run_dispose (G_OBJECT (clipboard));
+ g_object_unref (clipboard);
+ clipboards = g_slist_remove (clipboards, clipboard);
+
+ g_object_set_data (G_OBJECT (display), "gtk-clipboard-list", clipboards);
+}
+
/**
* gtk_clipboard_get_for_display:
* @display: the display for which the clipboard is to be retrieved or created
* be created. Once a clipboard object has
* been created, it is persistent for all time and
* cannot be freed.
+ *
+ * Since: 2.2
**/
GtkClipboard *
gtk_clipboard_get_for_display (GdkDisplay *display, GdkAtom selection)
GSList *tmp_list;
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+ g_return_val_if_fail (!display->closed, NULL);
if (selection == GDK_NONE)
selection = GDK_SELECTION_CLIPBOARD;
if (!tmp_list)
{
- clipboard = g_new0 (GtkClipboard, 1);
+ clipboard = g_object_new (GTK_TYPE_CLIPBOARD, NULL);
clipboard->selection = selection;
clipboard->display = display;
clipboards = g_slist_prepend (clipboards, clipboard);
g_object_set_data (G_OBJECT (display), "gtk-clipboard-list", clipboards);
+ g_signal_connect (display, "closed",
+ G_CALLBACK (clipboard_display_closed), clipboard);
}
return clipboard;
GtkClipboard *
gtk_clipboard_get (GdkAtom selection)
{
- return gtk_clipboard_get_for_display (gdk_get_default_display (), selection);
+ return gtk_clipboard_get_for_display (gdk_display_get_default (), selection);
}
static void
selection_get_cb (GtkWidget *widget,
GtkSelectionData *selection_data,
- guint time,
- guint info)
+ guint info,
+ guint time)
{
GtkClipboard *clipboard = gtk_widget_get_clipboard (widget, selection_data->selection);
{
GtkWidget *widget = gtk_invisible_new_for_screen (gdk_display_get_default_screen (display));
- gtk_signal_connect (GTK_OBJECT (widget), "selection_received",
- GTK_SIGNAL_FUNC (selection_received), NULL);
+ g_signal_connect (widget, "selection_received",
+ G_CALLBACK (selection_received), NULL);
if (provider)
{
/* We need this for gdk_x11_get_server_time() */
gtk_widget_add_events (widget, GDK_PROPERTY_CHANGE_MASK);
- gtk_signal_connect (GTK_OBJECT (widget), "selection_get",
- GTK_SIGNAL_FUNC (selection_get_cb), NULL);
- gtk_signal_connect (GTK_OBJECT (widget), "selection_clear_event",
- GTK_SIGNAL_FUNC (selection_clear_event_cb), NULL);
+ g_signal_connect (widget, "selection_get",
+ G_CALLBACK (selection_get_cb), NULL);
+ g_signal_connect (widget, "selection_clear_event",
+ G_CALLBACK (selection_clear_event_cb), NULL);
}
return widget;
if (!request_contents_key_id)
request_contents_key_id = g_quark_from_static_string (request_contents_key);
- gtk_object_set_data_by_id (GTK_OBJECT (widget),
- request_contents_key_id,
- info);
+ g_object_set_qdata (G_OBJECT (widget), request_contents_key_id, info);
}
static RequestContentsInfo *
if (!request_contents_key_id)
return NULL;
else
- return gtk_object_get_data_by_id (GTK_OBJECT (widget),
- request_contents_key_id);
+ return g_object_get_qdata (G_OBJECT (widget), request_contents_key_id);
}
static void
if (selection_data->length >= 0)
results->data = gtk_selection_data_copy (selection_data);
- g_main_quit (results->loop);
+ g_main_loop_quit (results->loop);
}
/**
g_return_val_if_fail (target != GDK_NONE, NULL);
results.data = NULL;
- results.loop = g_main_new (TRUE);
+ results.loop = g_main_loop_new (NULL, TRUE);
gtk_clipboard_request_contents (clipboard, target,
clipboard_received_func,
&results);
- if (g_main_is_running (results.loop))
+ if (g_main_loop_is_running (results.loop))
{
GDK_THREADS_LEAVE ();
- g_main_run (results.loop);
+ g_main_loop_run (results.loop);
GDK_THREADS_ENTER ();
}
- g_main_destroy (results.loop);
+ g_main_loop_unref (results.loop);
return results.data;
}
WaitResults *results = data;
results->data = g_strdup (text);
- g_main_quit (results->loop);
+ g_main_loop_quit (results->loop);
}
g_return_val_if_fail (clipboard != NULL, NULL);
results.data = NULL;
- results.loop = g_main_new (TRUE);
+ results.loop = g_main_loop_new (NULL, TRUE);
gtk_clipboard_request_text (clipboard,
clipboard_text_received_func,
&results);
- if (g_main_is_running (results.loop))
+ if (g_main_loop_is_running (results.loop))
{
GDK_THREADS_LEAVE ();
- g_main_run (results.loop);
+ g_main_loop_run (results.loop);
GDK_THREADS_ENTER ();
}
- g_main_destroy (results.loop);
+ g_main_loop_unref (results.loop);
return results.data;
}
* Gets the #GdkDisplay associated with @clipboard
*
* Return value: the #GdkDisplay associated with @clipboard
+ *
+ * Since: 2.2
**/
GdkDisplay *
gtk_clipboard_get_display (GtkClipboard *clipboard)