From 041053cb97d1cc0d8f5ac370b63bc7dfd198ed4e Mon Sep 17 00:00:00 2001 From: Erwann Chenede Date: Tue, 26 Jun 2001 19:44:01 +0000 Subject: [PATCH] GtkSelection is fully working with virtual atoms. Motif drop is working with virtual atoms still reference count pb with Xdnd Dnd. --- gdk/x11/gdkdnd-x11.c | 8 +- gdk/x11/gdkevents-x11.c | 5 -- gdk/x11/gdkproperty-x11.c | 167 ++++++++++++++++++++++++++++---------- gtk/gtkselection.c | 1 - tests/simple.c | 9 +- 5 files changed, 132 insertions(+), 58 deletions(-) diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 979929a25e..7cab99f95b 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -1593,6 +1593,7 @@ motif_read_initiator_info_for_display (Window source_window, print_target_list (*targets, dpy); #endif /* G_ENABLE_DEBUG */ + /* need to X atom as this is an motif internal function */ *selection = initiator_info->selection_atom; XFree (initiator_info); @@ -2005,6 +2006,7 @@ xdnd_action_from_atom (GdkAtom atom) return 0; } +/* returns a X Atom */ static GdkAtom xdnd_action_to_atom (GdkDisplay *display, GdkDragAction action) { @@ -3404,9 +3406,11 @@ gdk_drag_get_selection (GdkDragContext *context) g_return_val_if_fail (context != NULL, GDK_NONE); if (context->protocol == GDK_DRAG_PROTO_MOTIF) - return (PRIVATE_DATA (context))->motif_selection; + return gdk_x11_get_virtual_atom(GDK_DRAWABLE_DISPLAY (context->source_window), + (PRIVATE_DATA (context))->motif_selection); else if (context->protocol == GDK_DRAG_PROTO_XDND) - return (PRIVATE_DATA (context))->xdnd_selection; + return gdk_x11_get_virtual_atom(GDK_DRAWABLE_DISPLAY (context->source_window), + (PRIVATE_DATA (context))->xdnd_selection); else return GDK_NONE; } diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index 0df0cf60d1..95061b9ac3 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -1390,11 +1390,6 @@ gdk_event_translate (GdkEvent *event, gdk_x11_get_virtual_atom (dpy, xevent->xselectionrequest.target); event->selection.property = gdk_x11_get_virtual_atom (dpy, xevent->xselectionrequest.property); - g_print ("x selection %ld %s, virtual_selection %ld %s\n", - xevent->xselectionrequest.property, - XGetAtomName (dpy_impl->xdisplay, xevent->xselectionrequest.property), - event->selection.property, - g_quark_to_string (event->selection.property)); event->selection.requestor = xevent->xselectionrequest.requestor; event->selection.time = xevent->xselectionrequest.time; diff --git a/gdk/x11/gdkproperty-x11.c b/gdk/x11/gdkproperty-x11.c index fcfef48999..601297dc86 100644 --- a/gdk/x11/gdkproperty-x11.c +++ b/gdk/x11/gdkproperty-x11.c @@ -52,36 +52,99 @@ GdkAtomMap; static GSList *display_atom_lists = NULL; +typedef struct { + GQuark virtual_atom; + Atom x_atom; +} PredefinedAtoms; + +typedef struct { + PredefinedAtoms list[67]; + GQuark min; + GQuark max; +} PredefinedAtomsCache; + +static PredefinedAtomsCache pac; +static gboolean predefined_atom_cache_initialised = FALSE; + +gchar *XAtomsStrings [] = { +"PRIMARY", +"SECONDARY", +"ARC", +"ATOM", +"BITMAP", +"CARDINAL", +"COLORMAP", +"CURSOR", +"CUT_BUFFER0", +"CUT_BUFFER1", +"CUT_BUFFER2", +"CUT_BUFFER3", +"CUT_BUFFER4", +"CUT_BUFFER5", +"CUT_BUFFER6", +"CUT_BUFFER7", +"DRAWABLE", +"FONT", +"INTEGER", +"PIXMAP", +"POINT", +"RECTANGLE", +"RESOURCE_MANAGER", +"RGB_COLOR_MAP", +"RGB_BEST_MAP", +"RGB_BLUE_MAP", +"RGB_DEFAULT_MAP", +"RGB_GRAY_MAP", +"RGB_GREEN_MAP", +"RGB_RED_MAP", +"STRING", +"VISUALID", +"WINDOW", +"WM_COMMAND", +"WM_HINTS", +"WM_CLIENT_MACHINE", +"WM_ICON_NAME", +"WM_ICON_SIZE", +"WM_NAME", +"WM_NORMAL_HINTS", +"WM_SIZE_HINTS", +"WM_ZOOM_HINTS", +"MIN_SPACE", +"NORM_SPACE", +"MAX_SPACE", +"END_SPACE", +"SUPERSCRIPT_X", +"SUPERSCRIPT_Y", +"SUBSCRIPT_X", +"SUBSCRIPT_Y", +"UNDERLINE_POSITION", +"UNDERLINE_THICKNESS", +"STRIKEOUT_ASCENT", +"STRIKEOUT_DESCENT", +"ITALIC_ANGLE", +"X_HEIGHT", +"QUAD_WIDTH", +"WEIGHT", +"POINT_SIZE", +"RESOLUTION", +"COPYRIGHT", +"NOTICE", +"FONT_NAME", +"FAMILY_NAME", +"FULL_NAME", +"CAP_HEIGHT", +"WM_CLASS", +"WM_TRANSIENT_FOR" +}; + static gboolean check_if_predefined_atom (atom) { - switch (atom) - { - case 0: - return TRUE; - case GDK_SELECTION_PRIMARY: - return TRUE; - case GDK_SELECTION_SECONDARY: - return TRUE; - case GDK_SELECTION_TYPE_ATOM: - return TRUE; - case GDK_SELECTION_TYPE_BITMAP: - return TRUE; - case GDK_SELECTION_TYPE_COLORMAP: - return TRUE; - case GDK_SELECTION_TYPE_DRAWABLE: - return TRUE; - case GDK_SELECTION_TYPE_INTEGER: - return TRUE; - case GDK_SELECTION_TYPE_PIXMAP: - return TRUE; - case GDK_SELECTION_TYPE_WINDOW: - return TRUE; - case GDK_SELECTION_TYPE_STRING: - return TRUE; - default: - return FALSE; - } + /* if the atom is a protocol atom then don't do + * the real - virtual or virtual real convertion */ + if (atom < XA_LAST_PREDEFINED) + return TRUE; + return FALSE; } @@ -96,7 +159,7 @@ gdk_x11_get_real_atom (GdkDisplay *display, GdkAtom virtual_atom, gboolean only_ if (check_if_predefined_atom (virtual_atom)) { - g_print ("We got a predefined atom %ld\n", virtual_atom); + /*g_print ("We got a predefined atom %ld\n", virtual_atom);*/ return virtual_atom; } @@ -192,7 +255,7 @@ gdk_x11_get_virtual_atom (GdkDisplay *display, GdkAtom xatom) if (check_if_predefined_atom (xatom)) { - g_print ("We got a predefined atom %ld\n", xatom); + /*g_print ("We got a predefined atom %ld\n", xatom);*/ return xatom; } @@ -201,10 +264,7 @@ gdk_x11_get_virtual_atom (GdkDisplay *display, GdkAtom xatom) atom_map = g_new0 (GdkAtomMap, 1); atom_map->x_atom = xatom; xatom_string = XGetAtomName (GDK_DISPLAY_XDISPLAY (display), xatom); - atom_map->virtual_atom = g_quark_from_string (xatom_string); - if (check_if_predefined_atom (atom_map->virtual_atom)) - g_warning ("gdk_x11_get_virtual_atom created a virtual atom which\ - is already used as a real Atom\n"); + atom_map->virtual_atom = gdk_atom_intern (xatom_string, FALSE); XFree (xatom_string); atom_display_list = g_new0 (GdkAtomDisplayList, 1); atom_display_list->display = display; @@ -239,10 +299,7 @@ gdk_x11_get_virtual_atom (GdkDisplay *display, GdkAtom xatom) atom_map = g_new0 (GdkAtomMap, 1); atom_map->x_atom = xatom; xatom_string = XGetAtomName (GDK_DISPLAY_XDISPLAY (display), xatom); - atom_map->virtual_atom = g_quark_from_string (xatom_string); - if (check_if_predefined_atom (atom_map->virtual_atom)) - g_warning ("gdk_x11_get_virtual_atom created a virtual atom which\ - is already used as a real Atom\n"); + atom_map->virtual_atom = gdk_atom_intern (xatom_string, FALSE); /* g_print ("\nGet VIRTUAL (%d) string (%s) return virtual = %d\n", xatom, xatom_string, atom_map->virtual_atom);*/ XFree (xatom_string); atom_display_list->atom_list = g_slist_append (atom_display_list->atom_list, @@ -253,10 +310,7 @@ gdk_x11_get_virtual_atom (GdkDisplay *display, GdkAtom xatom) atom_map = g_new0 (GdkAtomMap, 1); atom_map->x_atom = xatom; xatom_string = XGetAtomName (GDK_DISPLAY_XDISPLAY (display), xatom); - atom_map->virtual_atom = g_quark_from_string (xatom_string); - if (check_if_predefined_atom (atom_map->virtual_atom)) - g_warning ("gdk_x11_get_virtual_atom created a virtual atom which\ - is already used as a real Atom\n"); + atom_map->virtual_atom = gdk_atom_intern (xatom_string, FALSE); /*g_print ("\n!New Display! Get VIRTUAL (%d) string (%s) return virtual = %d\n", xatom, xatom_string, atom_map->virtual_atom);*/ XFree (xatom_string); atom_display_list = g_new0 (GdkAtomDisplayList, 1); @@ -290,10 +344,35 @@ gdk_atom_intern (const gchar *atom_name, gboolean only_if_exists) { GdkAtom virtual_atom; g_return_val_if_fail (atom_name != NULL, GDK_NONE); + if (!predefined_atom_cache_initialised) + { + int i; + for (i=0;i<68;i++) + { + pac.list[i].virtual_atom = g_quark_from_string (XAtomsStrings[i]); + pac.list[i].x_atom = i+1; + /*g_print ("i (%d), virtual (%ld), xatom (%ld), Name (%s)\n", + i,pac.list[i].virtual_atom, pac.list[i].x_atom, + XAtomsStrings[i]);*/ + } + pac.max = pac.list[67].virtual_atom; + pac.min = pac.list[0].virtual_atom; + /*g_print ("min is (%ld), max is (%ld)\n", + pac.min, + pac.max);*/ + predefined_atom_cache_initialised = TRUE; + } virtual_atom = g_quark_from_string (atom_name); - if (check_if_predefined_atom (virtual_atom)) - g_warning ("gdk_x11_get_virtual_atom created a virtual atom which\ - is already used as a real Atom\n"); + if (virtual_atom < pac.max && virtual_atom > pac.min) + { + /*g_print ("predefined atom (%s) virtual %ld, X %ld\n", + atom_name, + virtual_atom, + pac.list[virtual_atom - pac.min].x_atom);*/ + /* I assume the quarks in pac.list are consecutives */ + virtual_atom = pac.list[virtual_atom - pac.min].x_atom; + return virtual_atom; + } return virtual_atom; } diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index b2e0ab522c..afea7262a6 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -298,7 +298,6 @@ gtk_target_list_find (GtkTargetList *list, while (tmp_list) { GtkTargetPair *pair = tmp_list->data; - if (pair->target == target) { *info = pair->info; diff --git a/tests/simple.c b/tests/simple.c index ba3e4db68b..9e57e357ac 100644 --- a/tests/simple.c +++ b/tests/simple.c @@ -11,7 +11,7 @@ int main (int argc, char *argv[]) { GtkWidget *window; - GtkWidget *entry; + GtkWidget *button; /* FIXME: This is not allowable - what is this supposed to be? */ /* gdk_progclass = g_strdup ("XTerm"); */ @@ -27,16 +27,13 @@ main (int argc, char *argv[]) NULL), "signal::destroy", gtk_main_quit, NULL, NULL); -/* button = g_object_connect (gtk_widget_new (gtk_button_get_type (), + button = g_object_connect (gtk_widget_new (gtk_button_get_type (), "GtkButton::label", "hello world", "GtkWidget::parent", window, "GtkWidget::visible", TRUE, NULL), "signal::clicked", hello, NULL, - NULL);*/ - entry = gtk_entry_new (); - gtk_container_add (GTK_CONTAINER (window), entry); - gtk_widget_show (entry); + NULL); gtk_widget_show (window); gtk_main ();