2005-02-10 04:27:13 -08:00
/*
* vim : ts = 8 : sw = 3 : sts = 8 : noexpandtab : cino = > 5 n - 3f 0 ^ - 2 { 2
*/
2009-01-31 10:33:39 -08:00
# ifdef HAVE_CONFIG_H
# include <config.h>
# endif
# include <stdlib.h>
2009-02-19 14:25:07 -08:00
# include <string.h>
2009-01-31 10:33:39 -08:00
2004-11-23 07:17:56 -08:00
# include "Ecore.h"
2009-12-22 13:15:12 -08:00
# include "ecore_private.h"
2003-11-23 22:41:43 -08:00
# include "ecore_x_private.h"
2004-11-23 07:17:56 -08:00
# include "Ecore_X.h"
2004-12-04 02:10:29 -08:00
# include "Ecore_X_Atoms.h"
2003-11-23 22:41:43 -08:00
2005-04-10 03:20:18 -07:00
static Ecore_X_Selection_Intern selections [ 4 ] ;
2004-02-04 09:43:41 -08:00
static Ecore_X_Selection_Converter * converters = NULL ;
2005-04-10 03:20:18 -07:00
static Ecore_X_Selection_Parser * parsers = NULL ;
2004-01-16 12:41:45 -08:00
2010-06-09 02:40:37 -07:00
static int _ecore_x_selection_converter_text ( char * target , void * data , int size , void * * data_ret , int * size_ret , Ecore_X_Atom * tprop , int * ) ;
2005-04-10 03:20:18 -07:00
static int _ecore_x_selection_data_default_free ( void * data ) ;
2006-11-05 07:14:49 -08:00
static void * _ecore_x_selection_parser_files ( const char * target , void * data , int size , int format ) ;
2005-04-10 03:20:18 -07:00
static int _ecore_x_selection_data_files_free ( void * data ) ;
2006-11-05 07:14:49 -08:00
static void * _ecore_x_selection_parser_text ( const char * target , void * data , int size , int format ) ;
2005-04-10 03:20:18 -07:00
static int _ecore_x_selection_data_text_free ( void * data ) ;
2006-11-05 07:14:49 -08:00
static void * _ecore_x_selection_parser_targets ( const char * target , void * data , int size , int format ) ;
2005-04-10 03:20:18 -07:00
static int _ecore_x_selection_data_targets_free ( void * data ) ;
# define ECORE_X_SELECTION_DATA(x) ((Ecore_X_Selection_Data *)(x))
2004-01-16 14:34:02 -08:00
2004-01-16 12:41:45 -08:00
void
2004-02-04 23:14:56 -08:00
_ecore_x_selection_data_init ( void )
2004-01-16 12:41:45 -08:00
{
2005-03-01 23:06:44 -08:00
/* Initialize global data */
memset ( selections , 0 , sizeof ( selections ) ) ;
2004-01-16 14:34:02 -08:00
/* Initialize converters */
2010-06-09 02:40:37 -07:00
ecore_x_selection_converter_atom_add ( ECORE_X_ATOM_TEXT ,
2005-02-10 04:27:13 -08:00
_ecore_x_selection_converter_text ) ;
2004-02-07 23:49:16 -08:00
# ifdef X_HAVE_UTF8_STRING
2010-06-09 02:40:37 -07:00
ecore_x_selection_converter_atom_add ( ECORE_X_ATOM_UTF8_STRING ,
2005-02-10 04:27:13 -08:00
_ecore_x_selection_converter_text ) ;
2004-02-07 23:49:16 -08:00
# endif
2004-12-04 02:10:29 -08:00
ecore_x_selection_converter_atom_add ( ECORE_X_ATOM_COMPOUND_TEXT ,
2005-02-10 04:27:13 -08:00
_ecore_x_selection_converter_text ) ;
2004-12-04 02:10:29 -08:00
ecore_x_selection_converter_atom_add ( ECORE_X_ATOM_STRING ,
2005-02-10 04:27:13 -08:00
_ecore_x_selection_converter_text ) ;
2005-04-10 03:20:18 -07:00
/* Initialize parsers */
ecore_x_selection_parser_add ( " text/plain " ,
_ecore_x_selection_parser_text ) ;
ecore_x_selection_parser_add ( ECORE_X_SELECTION_TARGET_UTF8_STRING ,
_ecore_x_selection_parser_text ) ;
ecore_x_selection_parser_add ( " text/uri-list " ,
_ecore_x_selection_parser_files ) ;
ecore_x_selection_parser_add ( " _NETSCAPE_URL " ,
_ecore_x_selection_parser_files ) ;
ecore_x_selection_parser_add ( ECORE_X_SELECTION_TARGET_TARGETS ,
_ecore_x_selection_parser_targets ) ;
2004-02-04 09:43:41 -08:00
}
void
_ecore_x_selection_shutdown ( void )
{
2005-04-10 03:20:18 -07:00
Ecore_X_Selection_Converter * cnv ;
Ecore_X_Selection_Parser * prs ;
2004-02-04 09:43:41 -08:00
2005-02-10 04:27:13 -08:00
/* free the selection converters */
2005-04-10 03:20:18 -07:00
cnv = converters ;
2005-03-23 02:53:34 -08:00
while ( cnv )
2005-04-10 03:20:18 -07:00
{
Ecore_X_Selection_Converter * tmp ;
2005-02-10 04:27:13 -08:00
tmp = cnv - > next ;
free ( cnv ) ;
cnv = tmp ;
2005-03-23 02:53:34 -08:00
}
2005-02-10 04:27:13 -08:00
converters = NULL ;
2004-01-10 13:01:18 -08:00
2005-04-10 03:20:18 -07:00
/* free the selection parsers */
prs = parsers ;
while ( prs )
2005-03-23 02:53:34 -08:00
{
2005-04-10 03:20:18 -07:00
Ecore_X_Selection_Parser * tmp ;
2004-01-10 13:01:18 -08:00
2005-04-10 03:20:18 -07:00
tmp = prs ;
prs = prs - > next ;
free ( tmp - > target ) ;
free ( tmp ) ;
}
parsers = NULL ;
2004-01-10 13:01:18 -08:00
}
2005-04-10 03:20:18 -07:00
Ecore_X_Selection_Intern *
_ecore_x_selection_get ( Ecore_X_Atom selection )
2004-01-10 13:01:18 -08:00
{
2004-12-04 02:10:29 -08:00
if ( selection = = ECORE_X_ATOM_SELECTION_PRIMARY )
2005-03-23 02:53:34 -08:00
return & selections [ 0 ] ;
2004-12-04 02:10:29 -08:00
else if ( selection = = ECORE_X_ATOM_SELECTION_SECONDARY )
2005-03-23 02:53:34 -08:00
return & selections [ 1 ] ;
else if ( selection = = ECORE_X_ATOM_SELECTION_XDND )
return & selections [ 2 ] ;
2004-12-04 02:10:29 -08:00
else if ( selection = = ECORE_X_ATOM_SELECTION_CLIPBOARD )
2005-03-23 02:53:34 -08:00
return & selections [ 3 ] ;
2004-01-10 13:01:18 -08:00
else
2005-03-23 02:53:34 -08:00
return NULL ;
2004-01-10 13:01:18 -08:00
}
2010-06-09 02:40:37 -07:00
int
2006-11-05 07:14:49 -08:00
_ecore_x_selection_set ( Window w , const void * data , int size , Ecore_X_Atom selection )
2003-11-23 22:41:43 -08:00
{
2004-01-10 13:01:18 -08:00
int in ;
2004-02-04 23:14:56 -08:00
unsigned char * buf = NULL ;
2010-06-09 02:40:37 -07:00
2003-11-23 22:41:43 -08:00
XSetSelectionOwner ( _ecore_x_disp , selection , w , _ecore_x_event_last_time ) ;
if ( XGetSelectionOwner ( _ecore_x_disp , selection ) ! = w )
2005-03-23 02:53:34 -08:00
return 0 ;
2010-06-09 02:40:37 -07:00
2004-12-04 02:10:29 -08:00
if ( selection = = ECORE_X_ATOM_SELECTION_PRIMARY )
2005-03-23 02:53:34 -08:00
in = 0 ;
2004-12-04 02:10:29 -08:00
else if ( selection = = ECORE_X_ATOM_SELECTION_SECONDARY )
2005-03-23 02:53:34 -08:00
in = 1 ;
else if ( selection = = ECORE_X_ATOM_SELECTION_XDND )
in = 2 ;
2005-04-10 03:20:18 -07:00
else if ( selection = = ECORE_X_ATOM_SELECTION_CLIPBOARD )
2005-03-23 02:53:34 -08:00
in = 3 ;
2005-04-10 03:20:18 -07:00
else
return 0 ;
2005-03-23 02:53:34 -08:00
2004-01-10 13:01:18 -08:00
if ( data )
2005-03-23 02:53:34 -08:00
{
selections [ in ] . win = w ;
selections [ in ] . selection = selection ;
selections [ in ] . length = size ;
selections [ in ] . time = _ecore_x_event_last_time ;
buf = malloc ( size ) ;
memcpy ( buf , data , size ) ;
selections [ in ] . data = buf ;
}
2004-01-10 13:01:18 -08:00
else
2005-03-23 02:53:34 -08:00
{
if ( selections [ in ] . data )
{
free ( selections [ in ] . data ) ;
memset ( & selections [ in ] , 0 , sizeof ( Ecore_X_Selection_Data ) ) ;
}
}
2003-11-23 22:41:43 -08:00
return 1 ;
}
2004-01-16 16:52:22 -08:00
/**
* Claim ownership of the PRIMARY selection and set its data .
* @ param w The window to which this selection belongs
* @ param data The data associated with the selection
* @ param size The size of the data buffer in bytes
* @ return Returns 1 if the ownership of the selection was successfully
* claimed , or 0 if unsuccessful .
*/
2010-06-09 02:40:37 -07:00
EAPI int
2006-11-05 07:14:49 -08:00
ecore_x_selection_primary_set ( Ecore_X_Window w , const void * data , int size )
2003-11-23 22:41:43 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
return _ecore_x_selection_set ( w , data , size , ECORE_X_ATOM_SELECTION_PRIMARY ) ;
2003-11-23 22:41:43 -08:00
}
2004-01-16 16:52:22 -08:00
/**
* Release ownership of the primary selection
* @ return Returns 1 if the selection was successfully cleared ,
* or 0 if unsuccessful .
*
*/
2010-06-09 02:40:37 -07:00
EAPI int
2004-01-10 13:01:18 -08:00
ecore_x_selection_primary_clear ( void )
2003-11-23 22:41:43 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
return _ecore_x_selection_set ( None , NULL , 0 , ECORE_X_ATOM_SELECTION_PRIMARY ) ;
2003-11-23 22:41:43 -08:00
}
2004-01-16 16:52:22 -08:00
/**
* Claim ownership of the SECONDARY selection and set its data .
* @ param w The window to which this selection belongs
* @ param data The data associated with the selection
* @ param size The size of the data buffer in bytes
* @ return Returns 1 if the ownership of the selection was successfully
* claimed , or 0 if unsuccessful .
*/
2010-06-09 02:40:37 -07:00
EAPI int
2006-11-05 07:14:49 -08:00
ecore_x_selection_secondary_set ( Ecore_X_Window w , const void * data , int size )
2003-11-23 22:41:43 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
return _ecore_x_selection_set ( w , data , size , ECORE_X_ATOM_SELECTION_SECONDARY ) ;
2003-11-23 22:41:43 -08:00
}
2004-01-16 16:52:22 -08:00
/**
* Release ownership of the secondary selection
* @ return Returns 1 if the selection was successfully cleared ,
* or 0 if unsuccessful .
*
*/
2010-06-09 02:40:37 -07:00
EAPI int
2004-01-10 13:01:18 -08:00
ecore_x_selection_secondary_clear ( void )
2003-11-23 22:41:43 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
return _ecore_x_selection_set ( None , NULL , 0 , ECORE_X_ATOM_SELECTION_SECONDARY ) ;
2003-11-23 22:41:43 -08:00
}
2005-03-23 02:53:34 -08:00
/**
* Claim ownership of the XDND selection and set its data .
* @ param w The window to which this selection belongs
* @ param data The data associated with the selection
* @ param size The size of the data buffer in bytes
* @ return Returns 1 if the ownership of the selection was successfully
* claimed , or 0 if unsuccessful .
*/
2010-06-09 02:40:37 -07:00
EAPI int
2006-11-05 07:14:49 -08:00
ecore_x_selection_xdnd_set ( Ecore_X_Window w , const void * data , int size )
2005-03-23 02:53:34 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2005-03-23 02:53:34 -08:00
return _ecore_x_selection_set ( w , data , size , ECORE_X_ATOM_SELECTION_XDND ) ;
}
/**
* Release ownership of the XDND selection
* @ return Returns 1 if the selection was successfully cleared ,
* or 0 if unsuccessful .
*
*/
2010-06-09 02:40:37 -07:00
EAPI int
2005-03-23 02:53:34 -08:00
ecore_x_selection_xdnd_clear ( void )
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2005-03-23 02:53:34 -08:00
return _ecore_x_selection_set ( None , NULL , 0 , ECORE_X_ATOM_SELECTION_XDND ) ;
}
2004-01-16 16:52:22 -08:00
/**
* Claim ownership of the CLIPBOARD selection and set its data .
* @ param w The window to which this selection belongs
* @ param data The data associated with the selection
* @ param size The size of the data buffer in bytes
* @ return Returns 1 if the ownership of the selection was successfully
* claimed , or 0 if unsuccessful .
*
* Get the converted data from a previous CLIPBOARD selection
* request . The buffer must be freed when done with .
*/
2010-06-09 02:40:37 -07:00
EAPI int
2006-11-05 07:14:49 -08:00
ecore_x_selection_clipboard_set ( Ecore_X_Window w , const void * data , int size )
2003-11-23 22:41:43 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
return _ecore_x_selection_set ( w , data , size , ECORE_X_ATOM_SELECTION_CLIPBOARD ) ;
2003-11-23 22:41:43 -08:00
}
2004-01-16 16:52:22 -08:00
/**
* Release ownership of the clipboard selection
* @ return Returns 1 if the selection was successfully cleared ,
* or 0 if unsuccessful .
*
*/
2010-06-09 02:40:37 -07:00
EAPI int
2004-01-10 13:01:18 -08:00
ecore_x_selection_clipboard_clear ( void )
2003-11-23 22:41:43 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
return _ecore_x_selection_set ( None , NULL , 0 , ECORE_X_ATOM_SELECTION_CLIPBOARD ) ;
2003-11-23 22:41:43 -08:00
}
2005-04-10 03:20:18 -07:00
Ecore_X_Atom
_ecore_x_selection_target_atom_get ( const char * target )
2004-01-16 16:14:37 -08:00
{
2005-04-10 03:20:18 -07:00
Ecore_X_Atom x_target ;
2005-03-23 02:53:34 -08:00
2004-01-16 16:14:37 -08:00
if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_TEXT ) )
2005-03-23 02:53:34 -08:00
x_target = ECORE_X_ATOM_TEXT ;
2004-01-16 16:14:37 -08:00
else if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_COMPOUND_TEXT ) )
2005-03-23 02:53:34 -08:00
x_target = ECORE_X_ATOM_COMPOUND_TEXT ;
2004-01-16 16:14:37 -08:00
else if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_STRING ) )
2005-03-23 02:53:34 -08:00
x_target = ECORE_X_ATOM_STRING ;
2004-01-16 16:14:37 -08:00
else if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_UTF8_STRING ) )
2005-03-23 02:53:34 -08:00
x_target = ECORE_X_ATOM_UTF8_STRING ;
2004-01-16 16:14:37 -08:00
else if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_FILENAME ) )
2005-03-23 02:53:34 -08:00
x_target = ECORE_X_ATOM_FILE_NAME ;
2004-01-16 16:14:37 -08:00
else
2005-03-23 02:53:34 -08:00
{
2005-03-24 07:45:33 -08:00
x_target = ecore_x_atom_get ( target ) ;
2005-03-23 02:53:34 -08:00
}
2004-01-16 16:14:37 -08:00
return x_target ;
}
char *
2005-04-10 03:20:18 -07:00
_ecore_x_selection_target_get ( Ecore_X_Atom target )
2004-01-16 16:14:37 -08:00
{
2006-12-18 22:40:30 -08:00
/* FIXME: Should not return mem allocated with strdup or X mixed,
* one should use free to free , the other XFree */
2004-12-04 02:10:29 -08:00
if ( target = = ECORE_X_ATOM_FILE_NAME )
2005-03-23 02:53:34 -08:00
return strdup ( ECORE_X_SELECTION_TARGET_FILENAME ) ;
2004-12-04 02:10:29 -08:00
else if ( target = = ECORE_X_ATOM_STRING )
2005-03-23 02:53:34 -08:00
return strdup ( ECORE_X_SELECTION_TARGET_STRING ) ;
2004-12-04 02:10:29 -08:00
else if ( target = = ECORE_X_ATOM_UTF8_STRING )
2005-03-23 02:53:34 -08:00
return strdup ( ECORE_X_SELECTION_TARGET_UTF8_STRING ) ;
2004-12-04 02:10:29 -08:00
else if ( target = = ECORE_X_ATOM_TEXT )
2005-03-23 02:53:34 -08:00
return strdup ( ECORE_X_SELECTION_TARGET_TEXT ) ;
2004-01-16 16:14:37 -08:00
else
2005-03-24 07:45:33 -08:00
return XGetAtomName ( _ecore_x_disp , target ) ;
2004-01-16 16:14:37 -08:00
}
2004-01-10 13:01:18 -08:00
static void
2006-11-05 07:14:49 -08:00
_ecore_x_selection_request ( Ecore_X_Window w , Ecore_X_Atom selection , const char * target_str )
2003-11-24 22:10:18 -08:00
{
Ecore_X_Atom target , prop ;
2004-01-16 16:14:37 -08:00
target = _ecore_x_selection_target_atom_get ( target_str ) ;
2005-03-23 02:53:34 -08:00
2004-12-04 02:10:29 -08:00
if ( selection = = ECORE_X_ATOM_SELECTION_PRIMARY )
2005-03-23 02:53:34 -08:00
prop = ECORE_X_ATOM_SELECTION_PROP_PRIMARY ;
2004-12-04 02:10:29 -08:00
else if ( selection = = ECORE_X_ATOM_SELECTION_SECONDARY )
2005-03-23 02:53:34 -08:00
prop = ECORE_X_ATOM_SELECTION_PROP_SECONDARY ;
2005-04-10 03:20:18 -07:00
else if ( selection = = ECORE_X_ATOM_SELECTION_CLIPBOARD )
2005-03-23 02:53:34 -08:00
prop = ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD ;
2005-04-10 03:20:18 -07:00
else
return ;
2003-11-24 22:10:18 -08:00
XConvertSelection ( _ecore_x_disp , selection , target , prop ,
2005-04-10 03:20:18 -07:00
w , CurrentTime ) ;
2003-11-24 22:10:18 -08:00
}
2006-01-06 12:22:09 -08:00
EAPI void
2006-11-05 07:14:49 -08:00
ecore_x_selection_primary_request ( Ecore_X_Window w , const char * target )
2003-11-24 22:10:18 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
_ecore_x_selection_request ( w , ECORE_X_ATOM_SELECTION_PRIMARY , target ) ;
2003-11-24 22:10:18 -08:00
}
2006-01-06 12:22:09 -08:00
EAPI void
2006-11-05 07:14:49 -08:00
ecore_x_selection_secondary_request ( Ecore_X_Window w , const char * target )
2003-11-24 22:10:18 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
_ecore_x_selection_request ( w , ECORE_X_ATOM_SELECTION_SECONDARY , target ) ;
2003-11-24 22:10:18 -08:00
}
2006-01-06 12:22:09 -08:00
EAPI void
2006-11-05 07:14:49 -08:00
ecore_x_selection_xdnd_request ( Ecore_X_Window w , const char * target )
2005-03-23 02:53:34 -08:00
{
Ecore_X_Atom atom ;
2005-03-24 07:45:33 -08:00
Ecore_X_DND_Target * _target ;
2005-03-23 02:53:34 -08:00
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2005-03-24 07:45:33 -08:00
_target = _ecore_x_dnd_target_get ( ) ;
atom = _ecore_x_selection_target_atom_get ( target ) ;
2005-03-23 02:53:34 -08:00
XConvertSelection ( _ecore_x_disp , ECORE_X_ATOM_SELECTION_XDND , atom ,
ECORE_X_ATOM_SELECTION_PROP_XDND , w ,
2005-03-24 07:45:33 -08:00
_target - > time ) ;
2005-03-23 02:53:34 -08:00
}
2006-01-06 12:22:09 -08:00
EAPI void
2006-11-05 07:14:49 -08:00
ecore_x_selection_clipboard_request ( Ecore_X_Window w , const char * target )
2004-01-10 13:01:18 -08:00
{
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-12-04 02:10:29 -08:00
_ecore_x_selection_request ( w , ECORE_X_ATOM_SELECTION_CLIPBOARD , target ) ;
2004-01-10 13:01:18 -08:00
}
2006-01-06 12:22:09 -08:00
EAPI void
2004-01-16 14:34:02 -08:00
ecore_x_selection_converter_atom_add ( Ecore_X_Atom target ,
2010-06-09 02:40:37 -07:00
int ( * func ) ( char * target , void * data , int size , void * * data_ret , int * size_ret , Ecore_X_Atom * ttype , int * tsize ) )
2004-01-16 12:41:45 -08:00
{
Ecore_X_Selection_Converter * cnv ;
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-01-16 12:41:45 -08:00
cnv = converters ;
2010-06-09 02:40:37 -07:00
if ( converters )
2005-02-10 04:27:13 -08:00
{
while ( 1 )
{
if ( cnv - > target = = target )
{
cnv - > convert = func ;
return ;
}
if ( cnv - > next )
cnv = cnv - > next ;
else
break ;
}
cnv - > next = calloc ( 1 , sizeof ( Ecore_X_Selection_Converter ) ) ;
cnv = cnv - > next ;
2005-03-23 02:53:34 -08:00
}
else
{
converters = calloc ( 1 , sizeof ( Ecore_X_Selection_Converter ) ) ;
cnv = converters ;
2005-02-10 04:27:13 -08:00
}
2004-01-16 14:34:02 -08:00
cnv - > target = target ;
2004-01-16 12:41:45 -08:00
cnv - > convert = func ;
}
2006-01-06 12:22:09 -08:00
EAPI void
2010-06-09 02:40:37 -07:00
ecore_x_selection_converter_add ( char * target ,
int ( * func ) ( char * target , void * data , int size , void * * data_ret , int * size_ret , Ecore_X_Atom * , int * ) )
2004-01-16 12:41:45 -08:00
{
Ecore_X_Atom x_target ;
2005-03-23 02:53:34 -08:00
2004-01-16 14:34:02 -08:00
if ( ! func | | ! target )
2005-03-23 02:53:34 -08:00
return ;
2004-01-16 12:41:45 -08:00
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-01-16 16:14:37 -08:00
x_target = _ecore_x_selection_target_atom_get ( target ) ;
2005-03-23 02:53:34 -08:00
2004-01-16 12:41:45 -08:00
ecore_x_selection_converter_atom_add ( x_target , func ) ;
}
2006-01-06 12:22:09 -08:00
EAPI void
2004-01-16 14:34:02 -08:00
ecore_x_selection_converter_atom_del ( Ecore_X_Atom target )
2004-01-16 12:41:45 -08:00
{
Ecore_X_Selection_Converter * cnv , * prev_cnv ;
2005-03-23 02:53:34 -08:00
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-01-16 12:41:45 -08:00
prev_cnv = NULL ;
cnv = converters ;
2005-03-23 02:53:34 -08:00
2004-01-16 12:41:45 -08:00
while ( cnv )
2005-02-10 04:27:13 -08:00
{
if ( cnv - > target = = target )
{
2005-04-10 03:20:18 -07:00
if ( prev_cnv )
prev_cnv - > next = cnv - > next ;
2005-02-10 04:27:13 -08:00
else
2005-04-10 03:20:18 -07:00
converters = cnv - > next ; /* This was the first converter */
free ( cnv ) ;
2005-02-10 04:27:13 -08:00
return ;
}
prev_cnv = cnv ;
cnv = cnv - > next ;
}
2004-01-16 12:41:45 -08:00
}
2006-01-06 12:22:09 -08:00
EAPI void
2004-01-16 14:34:02 -08:00
ecore_x_selection_converter_del ( char * target )
{
Ecore_X_Atom x_target ;
2005-03-23 02:53:34 -08:00
2004-01-16 14:34:02 -08:00
if ( ! target )
2005-03-23 02:53:34 -08:00
return ;
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-01-16 16:14:37 -08:00
x_target = _ecore_x_selection_target_atom_get ( target ) ;
2004-01-16 14:34:02 -08:00
ecore_x_selection_converter_atom_del ( x_target ) ;
}
2006-12-11 15:05:48 -08:00
EAPI int
2006-12-13 11:47:17 -08:00
ecore_x_selection_notify_send ( Ecore_X_Window requestor , Ecore_X_Atom selection , Ecore_X_Atom target , Ecore_X_Atom property , Ecore_X_Time time )
2006-12-11 15:05:48 -08:00
{
XEvent xev ;
XSelectionEvent xnotify ;
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2006-12-11 15:05:48 -08:00
xnotify . type = SelectionNotify ;
xnotify . display = _ecore_x_disp ;
xnotify . requestor = requestor ;
xnotify . selection = selection ;
xnotify . target = target ;
xnotify . property = property ;
2006-12-13 11:47:17 -08:00
xnotify . time = time ;
2006-12-11 15:05:48 -08:00
xnotify . send_event = True ;
xnotify . serial = 0 ;
xev . xselection = xnotify ;
return ( ( XSendEvent ( _ecore_x_disp , requestor , False , 0 , & xev ) > 0 ) ? 1 : 0 ) ;
}
2004-01-16 14:34:02 -08:00
/* Locate and run conversion callback for specified selection target */
2006-12-11 15:05:48 -08:00
EAPI int
2010-06-09 02:40:37 -07:00
ecore_x_selection_convert ( Ecore_X_Atom selection , Ecore_X_Atom target ,
void * * data_ret , int * size , Ecore_X_Atom * targtype , int * typesize )
2004-01-16 12:41:45 -08:00
{
2005-04-10 03:20:18 -07:00
Ecore_X_Selection_Intern * sel ;
2004-01-16 12:41:45 -08:00
Ecore_X_Selection_Converter * cnv ;
void * data ;
char * tgt_str ;
2010-06-09 02:40:37 -07:00
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-01-16 12:41:45 -08:00
sel = _ecore_x_selection_get ( selection ) ;
2004-01-16 16:14:37 -08:00
tgt_str = _ecore_x_selection_target_get ( target ) ;
2005-03-23 02:53:34 -08:00
2005-03-24 07:45:33 -08:00
for ( cnv = converters ; cnv ; cnv = cnv - > next )
2005-02-10 04:27:13 -08:00
{
2005-03-24 07:45:33 -08:00
if ( cnv - > target = = target )
2005-02-10 04:27:13 -08:00
{
2005-03-24 07:45:33 -08:00
int r ;
2010-06-09 02:40:37 -07:00
r = cnv - > convert ( tgt_str , sel - > data , sel - > length , & data , size ,
targtype , typesize ) ;
2005-03-24 07:45:33 -08:00
free ( tgt_str ) ;
if ( r )
2005-02-10 04:27:13 -08:00
{
2005-03-24 07:45:33 -08:00
* data_ret = data ;
return r ;
2005-02-10 04:27:13 -08:00
}
2005-03-24 07:45:33 -08:00
else
return 0 ;
2005-02-10 04:27:13 -08:00
}
2005-03-23 10:33:50 -08:00
}
2004-01-16 16:14:37 -08:00
2007-04-20 19:57:51 -07:00
/* ICCCM says "If the selection cannot be converted into a form based on the target (and parameters, if any), the owner should refuse the SelectionRequest as previously described." */
return 0 ;
/* Default, just return the data
2005-03-24 07:45:33 -08:00
* data_ret = malloc ( sel - > length ) ;
memcpy ( * data_ret , sel - > data , sel - > length ) ;
free ( tgt_str ) ;
return 1 ;
2007-04-20 19:57:51 -07:00
*/
2004-01-16 12:41:45 -08:00
}
2004-01-24 19:17:09 -08:00
/* TODO: We need to work out a mechanism for automatic conversion to any requested
* locale using Ecore_Txt functions */
2004-01-16 14:34:02 -08:00
/* Converter for standard non-utf8 text targets */
2005-03-23 02:53:34 -08:00
static int
2010-06-09 02:40:37 -07:00
_ecore_x_selection_converter_text ( char * target , void * data , int size , void * * data_ret , int * size_ret , Ecore_X_Atom * targprop , int * s )
2004-01-16 14:34:02 -08:00
{
XTextProperty text_prop ;
char * mystr ;
XICCEncodingStyle style ;
2005-03-23 02:53:34 -08:00
2004-01-16 14:34:02 -08:00
if ( ! data | | ! size )
2005-03-23 02:53:34 -08:00
return 0 ;
2004-01-16 14:34:02 -08:00
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2004-01-16 16:14:37 -08:00
if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_TEXT ) )
2005-03-23 02:53:34 -08:00
style = XTextStyle ;
2004-01-16 16:14:37 -08:00
else if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_COMPOUND_TEXT ) )
2005-03-23 02:53:34 -08:00
style = XCompoundTextStyle ;
2004-01-16 16:14:37 -08:00
else if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_STRING ) )
2005-03-23 02:53:34 -08:00
style = XStringStyle ;
2004-01-21 21:56:14 -08:00
# ifdef X_HAVE_UTF8_STRING
else if ( ! strcmp ( target , ECORE_X_SELECTION_TARGET_UTF8_STRING ) )
2005-03-23 02:53:34 -08:00
style = XUTF8StringStyle ;
2004-01-21 21:56:14 -08:00
# endif
2004-01-16 14:34:02 -08:00
else
2005-03-23 02:53:34 -08:00
return 0 ;
2005-02-10 04:27:13 -08:00
if ( ! ( mystr = strdup ( data ) ) )
2005-03-23 02:53:34 -08:00
return 0 ;
2005-04-10 03:20:18 -07:00
# ifdef X_HAVE_UTF8_STRING
if ( Xutf8TextListToTextProperty ( _ecore_x_disp , & mystr , 1 , style , & text_prop ) = = Success )
{
2005-05-16 05:59:26 -07:00
int bufsize = strlen ( ( char * ) text_prop . value ) + 1 ;
2005-04-10 03:20:18 -07:00
* data_ret = malloc ( bufsize ) ;
memcpy ( * data_ret , text_prop . value , bufsize ) ;
* size_ret = bufsize ;
XFree ( text_prop . value ) ;
free ( mystr ) ;
return 1 ;
}
# else
2004-01-16 14:34:02 -08:00
if ( XmbTextListToTextProperty ( _ecore_x_disp , & mystr , 1 , style , & text_prop ) = = Success )
2005-02-10 04:27:13 -08:00
{
int bufsize = strlen ( text_prop . value ) + 1 ;
* data_ret = malloc ( bufsize ) ;
memcpy ( * data_ret , text_prop . value , bufsize ) ;
* size_ret = bufsize ;
XFree ( text_prop . value ) ;
free ( mystr ) ;
return 1 ;
}
2005-04-10 03:20:18 -07:00
# endif
2004-01-16 14:34:02 -08:00
else
2005-02-10 04:27:13 -08:00
{
free ( mystr ) ;
return 0 ;
}
2004-01-16 14:34:02 -08:00
}
2006-01-06 12:22:09 -08:00
EAPI void
2005-04-10 03:20:18 -07:00
ecore_x_selection_parser_add ( const char * target ,
2006-11-05 07:14:49 -08:00
void * ( * func ) ( const char * target , void * data , int size , int format ) )
2005-04-10 03:20:18 -07:00
{
Ecore_X_Selection_Parser * prs ;
if ( ! target )
return ;
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2005-04-10 03:20:18 -07:00
prs = parsers ;
2010-06-09 02:40:37 -07:00
if ( parsers )
2005-04-10 03:20:18 -07:00
{
while ( prs - > next )
{
if ( ! strcmp ( prs - > target , target ) )
{
prs - > parse = func ;
return ;
}
prs = prs - > next ;
}
prs - > next = calloc ( 1 , sizeof ( Ecore_X_Selection_Parser ) ) ;
prs = prs - > next ;
}
else
{
parsers = calloc ( 1 , sizeof ( Ecore_X_Selection_Parser ) ) ;
prs = parsers ;
}
prs - > target = strdup ( target ) ;
prs - > parse = func ;
}
2006-01-06 12:22:09 -08:00
EAPI void
2005-04-10 03:20:18 -07:00
ecore_x_selection_parser_del ( const char * target )
{
Ecore_X_Selection_Parser * prs , * prev_prs ;
if ( ! target )
return ;
2010-02-25 04:19:02 -08:00
LOGFN ( __FILE__ , __LINE__ , __FUNCTION__ ) ;
2005-04-10 03:20:18 -07:00
prev_prs = NULL ;
prs = parsers ;
while ( prs )
{
if ( ! strcmp ( prs - > target , target ) )
{
if ( prev_prs )
prev_prs - > next = prs - > next ;
else
parsers = prs - > next ; /* This was the first parser */
free ( prs - > target ) ;
free ( prs ) ;
return ;
}
prev_prs = prs ;
prs = prs - > next ;
}
}
/* Locate and run conversion callback for specified selection target */
void *
2006-11-05 07:14:49 -08:00
_ecore_x_selection_parse ( const char * target , void * data , int size , int format )
2005-04-10 03:20:18 -07:00
{
Ecore_X_Selection_Parser * prs ;
Ecore_X_Selection_Data * sel ;
2010-06-09 02:40:37 -07:00
2005-04-10 03:20:18 -07:00
for ( prs = parsers ; prs ; prs = prs - > next )
{
if ( ! strcmp ( prs - > target , target ) )
{
2006-09-28 22:49:14 -07:00
sel = prs - > parse ( target , data , size , format ) ;
2005-04-10 03:20:18 -07:00
return sel ;
}
}
/* Default, just return the data */
sel = calloc ( 1 , sizeof ( Ecore_X_Selection_Data ) ) ;
sel - > free = _ecore_x_selection_data_default_free ;
sel - > length = size ;
2006-09-28 22:49:14 -07:00
sel - > format = format ;
2005-04-10 03:20:18 -07:00
sel - > data = data ;
return sel ;
}
static int
_ecore_x_selection_data_default_free ( void * data )
{
Ecore_X_Selection_Data * sel ;
sel = data ;
free ( sel - > data ) ;
free ( sel ) ;
return 1 ;
}
static void *
2006-11-05 07:14:49 -08:00
_ecore_x_selection_parser_files ( const char * target , void * _data , int size , int format __UNUSED__ )
2005-04-10 03:20:18 -07:00
{
Ecore_X_Selection_Data_Files * sel ;
2006-11-05 07:14:49 -08:00
char * data = _data ;
2005-04-10 03:20:18 -07:00
int i , is ;
char * tmp ;
2005-10-07 11:18:17 -07:00
if ( strcmp ( target , " text/uri-list " ) & &
strcmp ( target , " _NETSCAPE_URL " ) )
2005-04-10 03:20:18 -07:00
return NULL ;
sel = calloc ( 1 , sizeof ( Ecore_X_Selection_Data_Files ) ) ;
ECORE_X_SELECTION_DATA ( sel ) - > free = _ecore_x_selection_data_files_free ;
if ( data [ size - 1 ] )
{
/* Isn't nul terminated */
size + + ;
data = realloc ( data , size ) ;
data [ size - 1 ] = 0 ;
}
tmp = malloc ( size ) ;
i = 0 ;
is = 0 ;
while ( ( is < size ) & & ( data [ is ] ) )
{
if ( ( i = = 0 ) & & ( data [ is ] = = ' # ' ) )
{
for ( ; ( ( data [ is ] ) & & ( data [ is ] ! = ' \n ' ) ) ; is + + ) ;
}
else
{
2005-10-07 11:18:17 -07:00
if ( ( data [ is ] ! = ' \r ' ) & &
( data [ is ] ! = ' \n ' ) )
2005-04-10 03:20:18 -07:00
{
tmp [ i + + ] = data [ is + + ] ;
}
else
{
2005-10-07 11:18:17 -07:00
while ( ( data [ is ] = = ' \r ' ) | | ( data [ is ] = = ' \n ' ) ) is + + ;
2005-04-10 03:20:18 -07:00
tmp [ i ] = 0 ;
sel - > num_files + + ;
sel - > files = realloc ( sel - > files , sel - > num_files * sizeof ( char * ) ) ;
sel - > files [ sel - > num_files - 1 ] = strdup ( tmp ) ;
tmp [ 0 ] = 0 ;
i = 0 ;
}
}
}
if ( i > 0 )
{
tmp [ i ] = 0 ;
sel - > num_files + + ;
sel - > files = realloc ( sel - > files , sel - > num_files * sizeof ( char * ) ) ;
sel - > files [ sel - > num_files - 1 ] = strdup ( tmp ) ;
}
free ( tmp ) ;
free ( data ) ;
2006-07-14 02:37:11 -07:00
ECORE_X_SELECTION_DATA ( sel ) - > content = ECORE_X_SELECTION_CONTENT_FILES ;
ECORE_X_SELECTION_DATA ( sel ) - > length = sel - > num_files ;
2005-04-10 03:20:18 -07:00
return ECORE_X_SELECTION_DATA ( sel ) ;
}
static int
_ecore_x_selection_data_files_free ( void * data )
{
Ecore_X_Selection_Data_Files * sel ;
int i ;
2004-10-23 20:58:11 -07:00
2005-04-10 03:20:18 -07:00
sel = data ;
if ( sel - > files )
{
for ( i = 0 ; i < sel - > num_files ; i + + )
free ( sel - > files [ i ] ) ;
free ( sel - > files ) ;
}
free ( sel ) ;
return 0 ;
}
static void *
2006-11-05 07:14:49 -08:00
_ecore_x_selection_parser_text ( const char * target __UNUSED__ , void * _data , int size , int format __UNUSED__ )
2005-04-10 03:20:18 -07:00
{
Ecore_X_Selection_Data_Text * sel ;
2006-11-05 07:14:49 -08:00
char * data = _data ;
2005-04-10 03:20:18 -07:00
sel = calloc ( 1 , sizeof ( Ecore_X_Selection_Data_Text ) ) ;
if ( data [ size - 1 ] )
{
/* Isn't nul terminated */
size + + ;
data = realloc ( data , size ) ;
data [ size - 1 ] = 0 ;
}
2005-05-16 05:59:26 -07:00
sel - > text = ( char * ) data ;
2006-07-14 02:37:11 -07:00
ECORE_X_SELECTION_DATA ( sel ) - > length = size ;
ECORE_X_SELECTION_DATA ( sel ) - > content = ECORE_X_SELECTION_CONTENT_TEXT ;
2005-04-10 03:20:18 -07:00
ECORE_X_SELECTION_DATA ( sel ) - > free = _ecore_x_selection_data_text_free ;
return sel ;
}
static int
_ecore_x_selection_data_text_free ( void * data )
{
Ecore_X_Selection_Data_Text * sel ;
sel = data ;
free ( sel - > text ) ;
free ( sel ) ;
return 1 ;
}
static void *
2006-11-05 07:14:49 -08:00
_ecore_x_selection_parser_targets ( const char * target __UNUSED__ , void * data , int size , int format __UNUSED__ )
2005-04-10 03:20:18 -07:00
{
Ecore_X_Selection_Data_Targets * sel ;
unsigned long * targets ;
int i ;
sel = calloc ( 1 , sizeof ( Ecore_X_Selection_Data_Targets ) ) ;
targets = ( unsigned long * ) data ;
sel - > num_targets = size - 2 ;
sel - > targets = malloc ( ( size - 2 ) * sizeof ( char * ) ) ;
for ( i = 2 ; i < size ; i + + )
sel - > targets [ i - 2 ] = XGetAtomName ( _ecore_x_disp , targets [ i ] ) ;
2010-06-09 02:40:37 -07:00
2005-04-10 03:20:18 -07:00
free ( data ) ;
ECORE_X_SELECTION_DATA ( sel ) - > free = _ecore_x_selection_data_targets_free ;
2006-07-14 02:37:11 -07:00
ECORE_X_SELECTION_DATA ( sel ) - > content = ECORE_X_SELECTION_CONTENT_TARGETS ;
ECORE_X_SELECTION_DATA ( sel ) - > length = size ;
2005-04-10 03:20:18 -07:00
return sel ;
}
static int
_ecore_x_selection_data_targets_free ( void * data )
{
Ecore_X_Selection_Data_Targets * sel ;
int i ;
sel = data ;
if ( sel - > targets )
{
for ( i = 0 ; i < sel - > num_targets ; i + + )
XFree ( sel - > targets [ i ] ) ;
free ( sel - > targets ) ;
}
free ( sel ) ;
return 1 ;
}