Blame gdk/x11/gdkselection-x11.c

Packit Service fb6fa5
/* GDK - The GIMP Drawing Kit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 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
#include <X11/Xlib.h>
Packit Service fb6fa5
#include <X11/Xatom.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkx.h"
Packit Service fb6fa5
#include "gdkproperty.h"
Packit Service fb6fa5
#include "gdkselection.h"
Packit Service fb6fa5
#include "gdkprivate.h"
Packit Service fb6fa5
#include "gdkprivate-x11.h"
Packit Service fb6fa5
#include "gdkdisplay-x11.h"
Packit Service fb6fa5
#include "gdkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct _OwnerInfo OwnerInfo;
Packit Service fb6fa5
Packit Service fb6fa5
struct _OwnerInfo
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkAtom    selection;
Packit Service fb6fa5
  GdkWindow *owner;
Packit Service fb6fa5
  gulong     serial;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static GSList *owner_list;
Packit Service fb6fa5
Packit Service fb6fa5
/* When a window is destroyed we check if it is the owner
Packit Service fb6fa5
 * of any selections. This is somewhat inefficient, but
Packit Service fb6fa5
 * owner_list is typically short, and it is a low memory,
Packit Service fb6fa5
 * low code solution
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_selection_window_destroyed (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *tmp_list = owner_list;
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      OwnerInfo *info = tmp_list->data;
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (info->owner == window)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  owner_list = g_slist_remove (owner_list, info);
Packit Service fb6fa5
	  g_free (info);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* We only pass through those SelectionClear events that actually
Packit Service fb6fa5
 * reflect changes to the selection owner that we didn't make ourself.
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gdk_selection_filter_clear_event (XSelectionClearEvent *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *tmp_list = owner_list;
Packit Service fb6fa5
  GdkDisplay *display = gdk_x11_lookup_xdisplay (event->display);
Packit Service fb6fa5
  
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      OwnerInfo *info = tmp_list->data;
Packit Service fb6fa5
Packit Service fb6fa5
      if (gdk_drawable_get_display (info->owner) == display &&
Packit Service fb6fa5
	  info->selection == gdk_x11_xatom_to_atom_for_display (display, event->selection))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if ((GDK_DRAWABLE_XID (info->owner) == event->window &&
Packit Service fb6fa5
	       event->serial >= info->serial))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      owner_list = g_slist_remove (owner_list, info);
Packit Service fb6fa5
	      g_free (info);
Packit Service fb6fa5
	      return TRUE;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    return FALSE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_selection_owner_set_for_display:
Packit Service fb6fa5
 * @display: the #GdkDisplay.
Packit Service fb6fa5
 * @owner: a #GdkWindow or %NULL to indicate that the owner for
Packit Service fb6fa5
 *         the given should be unset.
Packit Service fb6fa5
 * @selection: an atom identifying a selection.
Packit Service fb6fa5
 * @time_: timestamp to use when setting the selection. 
Packit Service fb6fa5
 *         If this is older than the timestamp given last time the owner was 
Packit Service fb6fa5
 *         set for the given selection, the request will be ignored.
Packit Service fb6fa5
 * @send_event: if %TRUE, and the new owner is different from the current
Packit Service fb6fa5
 *              owner, the current owner will be sent a SelectionClear event.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the #GdkWindow @owner as the current owner of the selection @selection.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns: %TRUE if the selection owner was successfully changed to owner,
Packit Service fb6fa5
 *	    otherwise %FALSE. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_selection_owner_set_for_display (GdkDisplay *display,
Packit Service fb6fa5
				     GdkWindow  *owner,
Packit Service fb6fa5
				     GdkAtom     selection,
Packit Service fb6fa5
				     guint32     time, 
Packit Service fb6fa5
				     gboolean    send_event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Display *xdisplay;
Packit Service fb6fa5
  Window xwindow;
Packit Service fb6fa5
  Atom xselection;
Packit Service fb6fa5
  GSList *tmp_list;
Packit Service fb6fa5
  OwnerInfo *info;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
  g_return_val_if_fail (selection != GDK_NONE, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  if (display->closed)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (owner) 
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (GDK_WINDOW_DESTROYED (owner) || !GDK_WINDOW_IS_X11 (owner))
Packit Service fb6fa5
	return FALSE;
Packit Service fb6fa5
      
Packit Service fb6fa5
      gdk_window_ensure_native (owner);
Packit Service fb6fa5
      xdisplay = GDK_WINDOW_XDISPLAY (owner);
Packit Service fb6fa5
      xwindow = GDK_WINDOW_XID (owner);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else 
Packit Service fb6fa5
    {
Packit Service fb6fa5
      xdisplay = GDK_DISPLAY_XDISPLAY (display);
Packit Service fb6fa5
      xwindow = None;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  xselection = gdk_x11_atom_to_xatom_for_display (display, selection);
Packit Service fb6fa5
Packit Service fb6fa5
  tmp_list = owner_list;
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      info = tmp_list->data;
Packit Service fb6fa5
      if (info->selection == selection) 
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  owner_list = g_slist_remove (owner_list, info);
Packit Service fb6fa5
	  g_free (info);
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (owner)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      info = g_new (OwnerInfo, 1);
Packit Service fb6fa5
      info->owner = owner;
Packit Service fb6fa5
      info->serial = NextRequest (GDK_WINDOW_XDISPLAY (owner));
Packit Service fb6fa5
      info->selection = selection;
Packit Service fb6fa5
Packit Service fb6fa5
      owner_list = g_slist_prepend (owner_list, info);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  XSetSelectionOwner (xdisplay, xselection, xwindow, time);
Packit Service fb6fa5
Packit Service fb6fa5
  return (XGetSelectionOwner (xdisplay, xselection) == xwindow);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_selection_owner_get_for_display:
Packit Service fb6fa5
 * @display: a #GdkDisplay.
Packit Service fb6fa5
 * @selection: an atom indentifying a selection.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Determine the owner of the given selection.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that the return value may be owned by a different 
Packit Service fb6fa5
 * process if a foreign window was previously created for that
Packit Service fb6fa5
 * window, but a new foreign window will never be created by this call. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: if there is a selection owner for this window, and it is a 
Packit Service fb6fa5
 *    window known to the current process, the #GdkWindow that owns the 
Packit Service fb6fa5
 *    selection, otherwise %NULL.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 */ 
Packit Service fb6fa5
GdkWindow *
Packit Service fb6fa5
gdk_selection_owner_get_for_display (GdkDisplay *display,
Packit Service fb6fa5
				     GdkAtom     selection)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Window xwindow;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
  g_return_val_if_fail (selection != GDK_NONE, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (display->closed)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  xwindow = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display),
Packit Service fb6fa5
				gdk_x11_atom_to_xatom_for_display (display, 
Packit Service fb6fa5
								   selection));
Packit Service fb6fa5
  if (xwindow == None)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  return gdk_window_lookup_for_display (display, xwindow);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_selection_convert (GdkWindow *requestor,
Packit Service fb6fa5
		       GdkAtom    selection,
Packit Service fb6fa5
		       GdkAtom    target,
Packit Service fb6fa5
		       guint32    time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (selection != GDK_NONE);
Packit Service fb6fa5
Packit Service fb6fa5
  if (GDK_WINDOW_DESTROYED (requestor) || !GDK_WINDOW_IS_X11 (requestor))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_window_ensure_native (requestor);
Packit Service fb6fa5
  display = GDK_WINDOW_DISPLAY (requestor);
Packit Service fb6fa5
Packit Service fb6fa5
  XConvertSelection (GDK_WINDOW_XDISPLAY (requestor),
Packit Service fb6fa5
		     gdk_x11_atom_to_xatom_for_display (display, selection),
Packit Service fb6fa5
		     gdk_x11_atom_to_xatom_for_display (display, target),
Packit Service fb6fa5
		     gdk_x11_atom_to_xatom_for_display (display, _gdk_selection_property), 
Packit Service fb6fa5
		     GDK_WINDOW_XID (requestor), time);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_selection_property_get:
Packit Service fb6fa5
 * @requestor: the window on which the data is stored
Packit Service fb6fa5
 * @data: location to store a pointer to the retrieved data.
Packit Service fb6fa5
       If the retrieval failed, %NULL we be stored here, otherwise, it
Packit Service fb6fa5
       will be non-%NULL and the returned data should be freed with g_free()
Packit Service fb6fa5
       when you are finished using it. The length of the
Packit Service fb6fa5
       allocated memory is one more than the length
Packit Service fb6fa5
       of the returned data, and the final byte will always
Packit Service fb6fa5
       be zero, to ensure nul-termination of strings.
Packit Service fb6fa5
 * @prop_type: location to store the type of the property.
Packit Service fb6fa5
 * @prop_format: location to store the format of the property.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Retrieves selection data that was stored by the selection
Packit Service fb6fa5
 * data in response to a call to gdk_selection_convert(). This function
Packit Service fb6fa5
 * will not be used by applications, who should use the #GtkClipboard
Packit Service fb6fa5
 * API instead.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the length of the retrieved data.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_selection_property_get (GdkWindow  *requestor,
Packit Service fb6fa5
			    guchar    **data,
Packit Service fb6fa5
			    GdkAtom    *ret_type,
Packit Service fb6fa5
			    gint       *ret_format)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gulong nitems;
Packit Service fb6fa5
  gulong nbytes;
Packit Service fb6fa5
  gulong length = 0;		/* Quiet GCC */
Packit Service fb6fa5
  Atom prop_type;
Packit Service fb6fa5
  gint prop_format;
Packit Service fb6fa5
  guchar *t = NULL;
Packit Service fb6fa5
  GdkDisplay *display; 
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (requestor != NULL, 0);
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_WINDOW (requestor), 0);
Packit Service fb6fa5
  g_return_val_if_fail (GDK_WINDOW_IS_X11 (requestor), 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  display = GDK_WINDOW_DISPLAY (requestor);
Packit Service fb6fa5
Packit Service fb6fa5
  if (GDK_WINDOW_DESTROYED (requestor) || !GDK_WINDOW_IS_X11 (requestor))
Packit Service fb6fa5
    goto err;
Packit Service fb6fa5
Packit Service fb6fa5
  t = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  /* We can't delete the selection here, because it might be the INCR
Packit Service fb6fa5
     protocol, in which case the client has to make sure they'll be
Packit Service fb6fa5
     notified of PropertyChange events _before_ the property is deleted.
Packit Service fb6fa5
     Otherwise there's no guarantee we'll win the race ... */
Packit Service fb6fa5
  if (XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (requestor),
Packit Service fb6fa5
			  GDK_DRAWABLE_XID (requestor),
Packit Service fb6fa5
			  gdk_x11_atom_to_xatom_for_display (display, _gdk_selection_property),
Packit Service fb6fa5
			  0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, 
Packit Service fb6fa5
			  AnyPropertyType, &prop_type, &prop_format,
Packit Service fb6fa5
			  &nitems, &nbytes, &t) != Success)
Packit Service fb6fa5
    goto err;
Packit Service fb6fa5
    
Packit Service fb6fa5
  if (prop_type != None)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (ret_type)
Packit Service fb6fa5
	*ret_type = gdk_x11_xatom_to_atom_for_display (display, prop_type);
Packit Service fb6fa5
      if (ret_format)
Packit Service fb6fa5
	*ret_format = prop_format;
Packit Service fb6fa5
Packit Service fb6fa5
      if (prop_type == XA_ATOM ||
Packit Service fb6fa5
	  prop_type == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR"))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  Atom* atoms = (Atom*) t;
Packit Service fb6fa5
	  GdkAtom* atoms_dest;
Packit Service fb6fa5
	  gint num_atom, i;
Packit Service fb6fa5
Packit Service fb6fa5
	  if (prop_format != 32)
Packit Service fb6fa5
	    goto err;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  num_atom = nitems;
Packit Service fb6fa5
	  length = sizeof (GdkAtom) * num_atom + 1;
Packit Service fb6fa5
Packit Service fb6fa5
	  if (data)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      *data = g_malloc (length);
Packit Service fb6fa5
	      (*data)[length - 1] = '\0';
Packit Service fb6fa5
	      atoms_dest = (GdkAtom *)(*data);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	      for (i=0; i < num_atom; i++)
Packit Service fb6fa5
		atoms_dest[i] = gdk_x11_xatom_to_atom_for_display (display, atoms[i]);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  switch (prop_format)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	    case 8:
Packit Service fb6fa5
	      length = nitems;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    case 16:
Packit Service fb6fa5
	      length = sizeof(short) * nitems;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    case 32:
Packit Service fb6fa5
	      length = sizeof(long) * nitems;
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
	  
Packit Service fb6fa5
	  /* Add on an extra byte to handle null termination.  X guarantees
Packit Service fb6fa5
	     that t will be 1 longer than nitems and null terminated */
Packit Service fb6fa5
	  length += 1;
Packit Service fb6fa5
Packit Service fb6fa5
	  if (data)
Packit Service fb6fa5
	    *data = g_memdup (t, length);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (t)
Packit Service fb6fa5
	XFree (t);
Packit Service fb6fa5
      
Packit Service fb6fa5
      return length - 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
 err:
Packit Service fb6fa5
  if (ret_type)
Packit Service fb6fa5
    *ret_type = GDK_NONE;
Packit Service fb6fa5
  if (ret_format)
Packit Service fb6fa5
    *ret_format = 0;
Packit Service fb6fa5
  if (data)
Packit Service fb6fa5
    *data = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_selection_send_notify_for_display:
Packit Service fb6fa5
 * @display: the #GdkDisplay where @requestor is realized
Packit Service fb6fa5
 * @requestor: window to which to deliver response.
Packit Service fb6fa5
 * @selection: selection that was requested.
Packit Service fb6fa5
 * @target: target that was selected.
Packit Service fb6fa5
 * @property: property in which the selection owner stored the data,
Packit Service fb6fa5
 *            or %GDK_NONE to indicate that the request was rejected.
Packit Service fb6fa5
 * @time_: timestamp. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Send a response to SelectionRequest event.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_selection_send_notify_for_display (GdkDisplay       *display,
Packit Service fb6fa5
				       GdkNativeWindow  requestor,
Packit Service fb6fa5
				       GdkAtom          selection,
Packit Service fb6fa5
				       GdkAtom          target,
Packit Service fb6fa5
				       GdkAtom          property, 
Packit Service fb6fa5
				       guint32          time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  XSelectionEvent xevent;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_DISPLAY (display));
Packit Service fb6fa5
  
Packit Service fb6fa5
  xevent.type = SelectionNotify;
Packit Service fb6fa5
  xevent.serial = 0;
Packit Service fb6fa5
  xevent.send_event = True;
Packit Service fb6fa5
  xevent.requestor = requestor;
Packit Service fb6fa5
  xevent.selection = gdk_x11_atom_to_xatom_for_display (display, selection);
Packit Service fb6fa5
  xevent.target = gdk_x11_atom_to_xatom_for_display (display, target);
Packit Service fb6fa5
  if (property == GDK_NONE)
Packit Service fb6fa5
    xevent.property = None;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    xevent.property = gdk_x11_atom_to_xatom_for_display (display, property);
Packit Service fb6fa5
  xevent.time = time;
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_send_xevent (display, requestor, False, NoEventMask, (XEvent*) & xevent);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_text_property_to_text_list_for_display:
Packit Service fb6fa5
 * @display: The #GdkDisplay where the encoding is defined.
Packit Service fb6fa5
 * @encoding: an atom representing the encoding. The most 
Packit Service fb6fa5
 *    common values for this are STRING, or COMPOUND_TEXT. 
Packit Service fb6fa5
 *    This is value used as the type for the property.
Packit Service fb6fa5
 * @format: the format of the property.
Packit Service fb6fa5
 * @text: The text data.
Packit Service fb6fa5
 * @length: The number of items to transform.
Packit Service fb6fa5
 * @list: location to store a terminated array of strings in 
Packit Service fb6fa5
 *    the encoding of the current locale. This array should be 
Packit Service fb6fa5
 *    freed using gdk_free_text_list().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Convert a text string from the encoding as it is stored 
Packit Service fb6fa5
 * in a property into an array of strings in the encoding of
Packit Service fb6fa5
 * the current locale. (The elements of the array represent the
Packit Service fb6fa5
 * nul-separated elements of the original text string.)
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: the number of strings stored in list, or 0, 
Packit Service fb6fa5
 * if the conversion failed. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated:2.24: Use gdk_x11_display_text_property_to_text_list()
Packit Service fb6fa5
 */
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_text_property_to_text_list_for_display (GdkDisplay   *display,
Packit Service fb6fa5
					    GdkAtom       encoding,
Packit Service fb6fa5
					    gint          format,
Packit Service fb6fa5
					    const guchar *text,
Packit Service fb6fa5
					    gint          length,
Packit Service fb6fa5
					    gchar      ***list)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_x11_display_text_property_to_text_list (display,
Packit Service fb6fa5
                                                     encoding,
Packit Service fb6fa5
                                                     format,
Packit Service fb6fa5
                                                     text,
Packit Service fb6fa5
                                                     length,
Packit Service fb6fa5
                                                     list);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_x11_display_text_property_to_text_list (GdkDisplay   *display,
Packit Service fb6fa5
					    GdkAtom       encoding,
Packit Service fb6fa5
					    gint          format, 
Packit Service fb6fa5
					    const guchar *text,
Packit Service fb6fa5
					    gint          length,
Packit Service fb6fa5
					    gchar      ***list)
Packit Service fb6fa5
{
Packit Service fb6fa5
  XTextProperty property;
Packit Service fb6fa5
  gint count = 0;
Packit Service fb6fa5
  gint res;
Packit Service fb6fa5
  gchar **local_list;
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
Packit Service fb6fa5
Packit Service fb6fa5
  if (list)
Packit Service fb6fa5
    *list = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (display->closed)
Packit Service fb6fa5
    return 0;
Packit Service fb6fa5
Packit Service fb6fa5
  property.value = (guchar *)text;
Packit Service fb6fa5
  property.encoding = gdk_x11_atom_to_xatom_for_display (display, encoding);
Packit Service fb6fa5
  property.format = format;
Packit Service fb6fa5
  property.nitems = length;
Packit Service fb6fa5
  res = XmbTextPropertyToTextList (GDK_DISPLAY_XDISPLAY (display), &property, 
Packit Service fb6fa5
				   &local_list, &count);
Packit Service fb6fa5
  if (res == XNoMemory || res == XLocaleNotSupported || res == XConverterNotFound)
Packit Service fb6fa5
    return 0;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (list)
Packit Service fb6fa5
	*list = local_list;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	XFreeStringList (local_list);
Packit Service fb6fa5
      
Packit Service fb6fa5
      return count;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_free_text_list (gchar **list)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_x11_free_text_list (list);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_x11_free_text_list (gchar **list)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (list != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  XFreeStringList (list);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
make_list (const gchar  *text,
Packit Service fb6fa5
	   gint          length,
Packit Service fb6fa5
	   gboolean      latin1,
Packit Service fb6fa5
	   gchar      ***list)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *strings = NULL;
Packit Service fb6fa5
  gint n_strings = 0;
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
  const gchar *p = text;
Packit Service fb6fa5
  const gchar *q;
Packit Service fb6fa5
  GSList *tmp_list;
Packit Service fb6fa5
  GError *error = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  while (p < text + length)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar *str;
Packit Service fb6fa5
      
Packit Service fb6fa5
      q = p;
Packit Service fb6fa5
      while (*q && q < text + length)
Packit Service fb6fa5
	q++;
Packit Service fb6fa5
Packit Service fb6fa5
      if (latin1)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  str = g_convert (p, q - p,
Packit Service fb6fa5
			   "UTF-8", "ISO-8859-1",
Packit Service fb6fa5
			   NULL, NULL, &error);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (!str)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      g_warning ("Error converting selection from STRING: %s",
Packit Service fb6fa5
			 error->message);
Packit Service fb6fa5
	      g_error_free (error);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  str = g_strndup (p, q - p);
Packit Service fb6fa5
	  if (!g_utf8_validate (str, -1, NULL))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      g_warning ("Error converting selection from UTF8_STRING");
Packit Service fb6fa5
	      g_free (str);
Packit Service fb6fa5
	      str = NULL;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (str)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  strings = g_slist_prepend (strings, str);
Packit Service fb6fa5
	  n_strings++;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      p = q + 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      *list = g_new (gchar *, n_strings + 1);
Packit Service fb6fa5
      (*list)[n_strings] = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
     
Packit Service fb6fa5
  i = n_strings;
Packit Service fb6fa5
  tmp_list = strings;
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (list)
Packit Service fb6fa5
	(*list)[--i] = tmp_list->data;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	g_free (tmp_list->data);
Packit Service fb6fa5
      
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_slist_free (strings);
Packit Service fb6fa5
Packit Service fb6fa5
  return n_strings;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_text_property_to_utf8_list_for_display:
Packit Service fb6fa5
 * @display:  a #GdkDisplay
Packit Service fb6fa5
 * @encoding: an atom representing the encoding of the text
Packit Service fb6fa5
 * @format:   the format of the property
Packit Service fb6fa5
 * @text:     the text to convert
Packit Service fb6fa5
 * @length:   the length of @text, in bytes
Packit Service fb6fa5
 * @list:     location to store the list of strings or %NULL. The
Packit Service fb6fa5
 *            list should be freed with g_strfreev().
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Converts a text property in the given encoding to
Packit Service fb6fa5
 * a list of UTF-8 strings. 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the number of strings in the resulting
Packit Service fb6fa5
 *               list.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gint 
Packit Service fb6fa5
gdk_text_property_to_utf8_list_for_display (GdkDisplay    *display,
Packit Service fb6fa5
					    GdkAtom        encoding,
Packit Service fb6fa5
					    gint           format,
Packit Service fb6fa5
					    const guchar  *text,
Packit Service fb6fa5
					    gint           length,
Packit Service fb6fa5
					    gchar       ***list)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (text != NULL, 0);
Packit Service fb6fa5
  g_return_val_if_fail (length >= 0, 0);
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (encoding == GDK_TARGET_STRING)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      return make_list ((gchar *)text, length, TRUE, list);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (encoding == gdk_atom_intern_static_string ("UTF8_STRING"))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      return make_list ((gchar *)text, length, FALSE, list);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gchar **local_list;
Packit Service fb6fa5
      gint local_count;
Packit Service fb6fa5
      gint i;
Packit Service fb6fa5
      const gchar *charset = NULL;
Packit Service fb6fa5
      gboolean need_conversion = !g_get_charset (&charset);
Packit Service fb6fa5
      gint count = 0;
Packit Service fb6fa5
      GError *error = NULL;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Probably COMPOUND text, we fall back to Xlib routines
Packit Service fb6fa5
       */
Packit Service fb6fa5
      local_count = gdk_text_property_to_text_list_for_display (display,
Packit Service fb6fa5
								encoding,
Packit Service fb6fa5
								format, 
Packit Service fb6fa5
								text,
Packit Service fb6fa5
								length,
Packit Service fb6fa5
								&local_list);
Packit Service fb6fa5
      if (list)
Packit Service fb6fa5
	*list = g_new (gchar *, local_count + 1);
Packit Service fb6fa5
      
Packit Service fb6fa5
      for (i=0; i
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* list contains stuff in our default encoding
Packit Service fb6fa5
	   */
Packit Service fb6fa5
	  if (need_conversion)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      gchar *utf = g_convert (local_list[i], -1,
Packit Service fb6fa5
				      "UTF-8", charset,
Packit Service fb6fa5
				      NULL, NULL, &error);
Packit Service fb6fa5
	      if (utf)
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  if (list)
Packit Service fb6fa5
		    (*list)[count++] = utf;
Packit Service fb6fa5
		  else
Packit Service fb6fa5
		    g_free (utf);
Packit Service fb6fa5
		}
Packit Service fb6fa5
	      else
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  g_warning ("Error converting to UTF-8 from '%s': %s",
Packit Service fb6fa5
			     charset, error->message);
Packit Service fb6fa5
		  g_error_free (error);
Packit Service fb6fa5
		  error = NULL;
Packit Service fb6fa5
		}
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      if (list)
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  if (g_utf8_validate (local_list[i], -1, NULL))
Packit Service fb6fa5
		    (*list)[count++] = g_strdup (local_list[i]);
Packit Service fb6fa5
		  else
Packit Service fb6fa5
		    g_warning ("Error converting selection");
Packit Service fb6fa5
		}
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (local_count)
Packit Service fb6fa5
	gdk_free_text_list (local_list);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (list)
Packit Service fb6fa5
	(*list)[count] = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
      return count;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_string_to_compound_text_for_display:
Packit Service fb6fa5
 * @display:  the #GdkDisplay where the encoding is defined.
Packit Service fb6fa5
 * @str:      a nul-terminated string.
Packit Service fb6fa5
 * @encoding: location to store the encoding atom 
Packit Service fb6fa5
 *	      (to be used as the type for the property).
Packit Service fb6fa5
 * @format:   location to store the format of the property
Packit Service fb6fa5
 * @ctext:    location to store newly allocated data for the property.
Packit Service fb6fa5
 * @length:   the length of @text, in bytes
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Convert a string from the encoding of the current 
Packit Service fb6fa5
 * locale into a form suitable for storing in a window property.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns: 0 upon success, non-zero upon failure. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated:2.24: Use gdk_x11_display_string_to_compound_text()
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_string_to_compound_text_for_display (GdkDisplay  *display,
Packit Service fb6fa5
					 const gchar *str,
Packit Service fb6fa5
					 GdkAtom     *encoding,
Packit Service fb6fa5
					 gint        *format,
Packit Service fb6fa5
					 guchar     **ctext,
Packit Service fb6fa5
					 gint        *length)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_x11_display_string_to_compound_text (display, str, encoding, format, ctext, length);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_x11_display_string_to_compound_text (GdkDisplay  *display,
Packit Service fb6fa5
					 const gchar *str,
Packit Service fb6fa5
					 GdkAtom     *encoding,
Packit Service fb6fa5
					 gint        *format,
Packit Service fb6fa5
					 guchar     **ctext,
Packit Service fb6fa5
					 gint        *length)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint res;
Packit Service fb6fa5
  XTextProperty property;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
Packit Service fb6fa5
Packit Service fb6fa5
  if (display->closed)
Packit Service fb6fa5
    res = XLocaleNotSupported;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    res = XmbTextListToTextProperty (GDK_DISPLAY_XDISPLAY (display), 
Packit Service fb6fa5
				     (char **)&str, 1, XCompoundTextStyle,
Packit Service fb6fa5
				     &property);
Packit Service fb6fa5
  if (res != Success)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      property.encoding = None;
Packit Service fb6fa5
      property.format = None;
Packit Service fb6fa5
      property.value = NULL;
Packit Service fb6fa5
      property.nitems = 0;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (encoding)
Packit Service fb6fa5
    *encoding = gdk_x11_xatom_to_atom_for_display (display, property.encoding);
Packit Service fb6fa5
  if (format)
Packit Service fb6fa5
    *format = property.format;
Packit Service fb6fa5
  if (ctext)
Packit Service fb6fa5
    *ctext = property.value;
Packit Service fb6fa5
  if (length)
Packit Service fb6fa5
    *length = property.nitems;
Packit Service fb6fa5
Packit Service fb6fa5
  return res;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* The specifications for COMPOUND_TEXT and STRING specify that C0 and
Packit Service fb6fa5
 * C1 are not allowed except for \n and \t, however the X conversions
Packit Service fb6fa5
 * routines for COMPOUND_TEXT only enforce this in one direction,
Packit Service fb6fa5
 * causing cut-and-paste of \r and \r\n separated text to fail.
Packit Service fb6fa5
 * This routine strips out all non-allowed C0 and C1 characters
Packit Service fb6fa5
 * from the input string and also canonicalizes \r, and \r\n to \n
Packit Service fb6fa5
 */
Packit Service fb6fa5
static gchar * 
Packit Service fb6fa5
sanitize_utf8 (const gchar *src,
Packit Service fb6fa5
	       gboolean return_latin1)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint len = strlen (src);
Packit Service fb6fa5
  GString *result = g_string_sized_new (len);
Packit Service fb6fa5
  const gchar *p = src;
Packit Service fb6fa5
Packit Service fb6fa5
  while (*p)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (*p == '\r')
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  p++;
Packit Service fb6fa5
	  if (*p == '\n')
Packit Service fb6fa5
	    p++;
Packit Service fb6fa5
Packit Service fb6fa5
	  g_string_append_c (result, '\n');
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gunichar ch = g_utf8_get_char (p);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (!((ch < 0x20 && ch != '\t' && ch != '\n') || (ch >= 0x7f && ch < 0xa0)))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      if (return_latin1)
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  if (ch <= 0xff)
Packit Service fb6fa5
		    g_string_append_c (result, ch);
Packit Service fb6fa5
		  else
Packit Service fb6fa5
		    g_string_append_printf (result,
Packit Service fb6fa5
					    ch < 0x10000 ? "\\u%04x" : "\\U%08x",
Packit Service fb6fa5
					    ch);
Packit Service fb6fa5
		}
Packit Service fb6fa5
	      else
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  char buf[7];
Packit Service fb6fa5
		  gint buflen;
Packit Service fb6fa5
		  
Packit Service fb6fa5
		  buflen = g_unichar_to_utf8 (ch, buf);
Packit Service fb6fa5
		  g_string_append_len (result, buf, buflen);
Packit Service fb6fa5
		}
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  p = g_utf8_next_char (p);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return g_string_free (result, FALSE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_utf8_to_string_target:
Packit Service fb6fa5
 * @str: a UTF-8 string
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Converts an UTF-8 string into the best possible representation
Packit Service fb6fa5
 * as a STRING. The representation of characters not in STRING
Packit Service fb6fa5
 * is not specified; it may be as pseudo-escape sequences
Packit Service fb6fa5
 * \x{ABCD}, or it may be in some other form of approximation.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the newly-allocated string, or %NULL if the
Packit Service fb6fa5
 *               conversion failed. (It should not fail for
Packit Service fb6fa5
 *               any properly formed UTF-8 string unless system
Packit Service fb6fa5
 *               limits like memory or file descriptors are exceeded.)
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gchar *
Packit Service fb6fa5
gdk_utf8_to_string_target (const gchar *str)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return sanitize_utf8 (str, TRUE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_utf8_to_compound_text_for_display:
Packit Service fb6fa5
 * @display:  a #GdkDisplay
Packit Service fb6fa5
 * @str:      a UTF-8 string
Packit Service fb6fa5
 * @encoding: location to store resulting encoding
Packit Service fb6fa5
 * @format:   location to store format of the result
Packit Service fb6fa5
 * @ctext:    location to store the data of the result
Packit Service fb6fa5
 * @length:   location to store the length of the data
Packit Service fb6fa5
 *            stored in @ctext
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Converts from UTF-8 to compound text. 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if the conversion succeeded, otherwise
Packit Service fb6fa5
 *               %FALSE.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated:2.24: Use gdk_x11_display_utf8_to_compound_text()
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_utf8_to_compound_text_for_display (GdkDisplay  *display,
Packit Service fb6fa5
				       const gchar *str,
Packit Service fb6fa5
				       GdkAtom     *encoding,
Packit Service fb6fa5
				       gint        *format,
Packit Service fb6fa5
				       guchar     **ctext,
Packit Service fb6fa5
				       gint        *length)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_x11_display_utf8_to_compound_text (display, str, encoding, format, ctext, length);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_x11_display_utf8_to_compound_text (GdkDisplay  *display,
Packit Service fb6fa5
				       const gchar *str,
Packit Service fb6fa5
				       GdkAtom     *encoding,
Packit Service fb6fa5
				       gint        *format,
Packit Service fb6fa5
				       guchar     **ctext,
Packit Service fb6fa5
				       gint        *length)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean need_conversion;
Packit Service fb6fa5
  const gchar *charset;
Packit Service fb6fa5
  gchar *locale_str, *tmp_str;
Packit Service fb6fa5
  GError *error = NULL;
Packit Service fb6fa5
  gboolean result;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (str != NULL, FALSE);
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  need_conversion = !g_get_charset (&charset);
Packit Service fb6fa5
Packit Service fb6fa5
  tmp_str = sanitize_utf8 (str, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  if (need_conversion)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      locale_str = g_convert (tmp_str, -1,
Packit Service fb6fa5
			      charset, "UTF-8",
Packit Service fb6fa5
			      NULL, NULL, &error);
Packit Service fb6fa5
      g_free (tmp_str);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!locale_str)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if (!(error->domain = G_CONVERT_ERROR &&
Packit Service fb6fa5
		error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      g_warning ("Error converting from UTF-8 to '%s': %s",
Packit Service fb6fa5
			 charset, error->message);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  g_error_free (error);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (encoding)
Packit Service fb6fa5
	    *encoding = None;
Packit Service fb6fa5
	  if (format)
Packit Service fb6fa5
	    *format = None;
Packit Service fb6fa5
	  if (ctext)
Packit Service fb6fa5
	    *ctext = NULL;
Packit Service fb6fa5
	  if (length)
Packit Service fb6fa5
	    *length = 0;
Packit Service fb6fa5
Packit Service fb6fa5
	  return FALSE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    locale_str = tmp_str;
Packit Service fb6fa5
    
Packit Service fb6fa5
  result = gdk_string_to_compound_text_for_display (display, locale_str,
Packit Service fb6fa5
						    encoding, format, 
Packit Service fb6fa5
						    ctext, length);
Packit Service fb6fa5
  result = (result == Success? TRUE : FALSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_free (locale_str);
Packit Service fb6fa5
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void gdk_free_compound_text (guchar *ctext)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_x11_free_compound_text (ctext);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void gdk_x11_free_compound_text (guchar *ctext)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (ctext)
Packit Service fb6fa5
    XFree (ctext);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GDK_SELECTION_X11_C__
Packit Service fb6fa5
#include "gdkaliasdef.c"