summaryrefslogtreecommitdiff
path: root/gtk/gtkeditable.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkeditable.c')
-rw-r--r--gtk/gtkeditable.c87
1 files changed, 40 insertions, 47 deletions
diff --git a/gtk/gtkeditable.c b/gtk/gtkeditable.c
index 09d28a9ab3..e720395676 100644
--- a/gtk/gtkeditable.c
+++ b/gtk/gtkeditable.c
@@ -58,7 +58,14 @@ enum {
ARG_TEXT_POSITION,
ARG_EDITABLE
};
-
+
+/* values for selection info */
+
+enum {
+ TARGET_STRING,
+ TARGET_TEXT,
+ TARGET_COMPOUND_TEXT,
+};
static void gtk_editable_class_init (GtkEditableClass *klass);
static void gtk_editable_init (GtkEditable *editable);
@@ -71,11 +78,13 @@ static void gtk_editable_get_arg (GtkObject *object,
static void gtk_editable_finalize (GtkObject *object);
static gint gtk_editable_selection_clear (GtkWidget *widget,
GdkEventSelection *event);
-static void gtk_editable_selection_handler (GtkWidget *widget,
- GtkSelectionData *selection_data,
- gpointer data);
+static void gtk_editable_selection_get (GtkWidget *widget,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time);
static void gtk_editable_selection_received (GtkWidget *widget,
- GtkSelectionData *selection_data);
+ GtkSelectionData *selection_data,
+ guint time);
static void gtk_editable_set_selection (GtkEditable *editable,
gint start,
@@ -90,8 +99,7 @@ static void gtk_editable_real_set_editable (GtkEditable *editable,
static GtkWidgetClass *parent_class = NULL;
static guint editable_signals[LAST_SIGNAL] = { 0 };
-static GdkAtom ctext_atom = GDK_NONE;
-static GdkAtom text_atom = GDK_NONE;
+
static GdkAtom clipboard_atom = GDK_NONE;
GtkType
@@ -287,6 +295,7 @@ gtk_editable_class_init (GtkEditableClass *class)
widget_class->selection_clear_event = gtk_editable_selection_clear;
widget_class->selection_received = gtk_editable_selection_received;
+ widget_class->selection_get = gtk_editable_selection_get;
class->insert_text = NULL;
class->delete_text = NULL;
@@ -362,6 +371,13 @@ gtk_editable_get_arg (GtkObject *object,
static void
gtk_editable_init (GtkEditable *editable)
{
+ static GtkTargetEntry targets[] = {
+ { "STRING", TARGET_STRING },
+ { "TEXT", TARGET_TEXT },
+ { "COMPOUND_TEXT", TARGET_COMPOUND_TEXT }
+ };
+ static gint n_targets = sizeof(targets) / sizeof(targets[0]);
+
GTK_WIDGET_SET_FLAGS (editable, GTK_CAN_FOCUS);
editable->selection_start_pos = 0;
@@ -377,36 +393,10 @@ gtk_editable_init (GtkEditable *editable)
if (!clipboard_atom)
clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
- gtk_selection_add_handler (GTK_WIDGET(editable), GDK_SELECTION_PRIMARY,
- GDK_TARGET_STRING, gtk_editable_selection_handler,
- NULL);
- gtk_selection_add_handler (GTK_WIDGET(editable), clipboard_atom,
- GDK_TARGET_STRING, gtk_editable_selection_handler,
- NULL);
-
- if (!text_atom)
- text_atom = gdk_atom_intern ("TEXT", FALSE);
-
- gtk_selection_add_handler (GTK_WIDGET(editable), GDK_SELECTION_PRIMARY,
- text_atom,
- gtk_editable_selection_handler,
- NULL);
- gtk_selection_add_handler (GTK_WIDGET(editable), clipboard_atom,
- text_atom,
- gtk_editable_selection_handler,
- NULL);
-
- if (!ctext_atom)
- ctext_atom = gdk_atom_intern ("COMPOUND_TEXT", FALSE);
-
- gtk_selection_add_handler (GTK_WIDGET(editable), GDK_SELECTION_PRIMARY,
- ctext_atom,
- gtk_editable_selection_handler,
- NULL);
- gtk_selection_add_handler (GTK_WIDGET(editable), clipboard_atom,
- ctext_atom,
- gtk_editable_selection_handler,
- NULL);
+ gtk_selection_add_targets (GTK_WIDGET (editable), GDK_SELECTION_PRIMARY,
+ targets, n_targets);
+ gtk_selection_add_targets (GTK_WIDGET (editable), clipboard_atom,
+ targets, n_targets);
}
static void
@@ -580,9 +570,10 @@ gtk_editable_selection_clear (GtkWidget *widget,
}
static void
-gtk_editable_selection_handler (GtkWidget *widget,
- GtkSelectionData *selection_data,
- gpointer data)
+gtk_editable_selection_get (GtkWidget *widget,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time)
{
GtkEditable *editable;
gint selection_start_pos;
@@ -614,14 +605,13 @@ gtk_editable_selection_handler (GtkWidget *widget,
length = strlen (editable->clipboard_text);
}
- if (selection_data->target == GDK_SELECTION_TYPE_STRING)
+ if (info == TARGET_STRING)
{
gtk_selection_data_set (selection_data,
GDK_SELECTION_TYPE_STRING,
8*sizeof(gchar), (guchar *)str, length);
}
- else if (selection_data->target == text_atom ||
- selection_data->target == ctext_atom)
+ else if ((info == TARGET_TEXT) || (info == TARGET_COMPOUND_TEXT))
{
guchar *text;
gchar c;
@@ -643,7 +633,8 @@ gtk_editable_selection_handler (GtkWidget *widget,
static void
gtk_editable_selection_received (GtkWidget *widget,
- GtkSelectionData *selection_data)
+ GtkSelectionData *selection_data,
+ guint time)
{
GtkEditable *editable;
gint reselect;
@@ -658,7 +649,8 @@ gtk_editable_selection_received (GtkWidget *widget,
if (selection_data->type == GDK_TARGET_STRING)
type = STRING;
- else if (selection_data->type == ctext_atom)
+ else if ((selection_data->type == gdk_atom_intern ("COMPOUND_TEXT", FALSE)) ||
+ (selection_data->type == gdk_atom_intern ("TEXT", FALSE)))
type = CTEXT;
else
type = INVALID;
@@ -668,7 +660,7 @@ gtk_editable_selection_received (GtkWidget *widget,
/* avoid infinite loop */
if (selection_data->target != GDK_TARGET_STRING)
gtk_selection_convert (widget, selection_data->selection,
- GDK_TARGET_STRING, GDK_CURRENT_TIME);
+ GDK_TARGET_STRING, time);
return;
}
@@ -934,7 +926,8 @@ gtk_editable_real_paste_clipboard (GtkEditable *editable)
time = gtk_editable_get_event_time (editable);
if (editable->editable)
gtk_selection_convert (GTK_WIDGET(editable),
- clipboard_atom, ctext_atom, time);
+ clipboard_atom,
+ gdk_atom_intern ("COMPOUND_TEXT", FALSE), time);
}
void