Mercurial > mplayer.hg
changeset 6977:7242f1840f8d
kde3 dnd fix from Gregory Kovriga and file name handling fix in dnd callback
author | pontscho |
---|---|
date | Sun, 11 Aug 2002 19:12:09 +0000 |
parents | 23c3cd12abe5 |
children | 085a5bb2b5cf |
files | Gui/mplayer/mw.h Gui/wm/wsxdnd.c |
diffstat | 2 files changed, 59 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/Gui/mplayer/mw.h Sun Aug 11 18:52:55 2002 +0000 +++ b/Gui/mplayer/mw.h Sun Aug 11 19:12:09 2002 +0000 @@ -665,26 +665,42 @@ /* now fill it with new items */ for(f=0; f < num; f++){ - char* str = files[f]; + char* str = strdup( files[f] ); plItem* item; + + if ( strchr( str,'%' ) ) + { + char * t = calloc( 1,strlen( str ) ); + int i,c = 0; + for ( i=0;i < strlen( str );i++ ) + if ( str[i] != '%' ) t[c++]=str[i]; + else + { + char tmp[4] = "0xXX"; +// if ( str[++i] == '%' ) { t[c++]='%'; continue; }; + tmp[2]=str[++i]; tmp[3]=str[++i]; t[c++]=(char)strtol( tmp,(char **)NULL,16 ); + } + free( str ); str=t; + } + if(stat(str,&buf) == 0 && S_ISDIR(buf.st_mode) == 0) { /* this is not a directory so try to play it */ printf("Received D&D %s\n",str); item = calloc(1,sizeof(plItem)); + /* FIXME: decompose file name ? */ /* yes -- Pontscho */ if ( strrchr( str,'/' ) ) { - char * t = strdup( str ); - char * s = strrchr( t,'/' ); *s=0; s++; + char * s = strrchr( str,'/' ); *s=0; s++; item->name = gstrdup( s ); - item->path = gstrdup( t ); - free( t ); + item->path = gstrdup( str ); } else { item->name = strdup(str); item->path = strdup(""); } gtkSet(gtkAddPlItem,0,(void*)item); } else { printf("Received not a file: %s !\n",str); } + free( str ); } mplSetFileName( NULL,files[0] );
--- a/Gui/wm/wsxdnd.c Sun Aug 11 18:52:55 2002 +0000 +++ b/Gui/wm/wsxdnd.c Sun Aug 11 19:12:09 2002 +0000 @@ -22,6 +22,7 @@ Atom _XA_XdndActionCopy; Atom _XA_XdndSelection; Atom _XA_XdndFinished; +Atom _XA_XdndTypeList; Atom atom_support; @@ -37,6 +38,7 @@ _XA_XdndActionCopy = XInternAtom(wsDisplay, "XdndActionCopy", False); _XA_XdndSelection = XInternAtom(wsDisplay, "XdndSelection", False); _XA_XdndFinished = XInternAtom(wsDisplay, "XdndFinished", False); + _XA_XdndTypeList = XInternAtom(wsDisplay, "XdndTypeList", False); } void wsXDNDMakeAwareness(wsTWindow* window) { @@ -87,9 +89,7 @@ char * retain = delme; char * files[MAX_DND_FILES]; int num = 0; - /* - printf("Got: %s\n",delme); - */ + while(retain < delme + ret_items) { if (!strncmp(retain,"file:",5)) { /* add more 2 chars while removing 5 is harmless */ @@ -152,7 +152,40 @@ printf("This doesn't seem as a file...\n"); } } else { - /* FIXME: need something else here */ + /* need to check the whole list here */ + int ret_left = 1; + int offset = 0; + Atom* ret_buff; + int ret_type,ret_format,ret_items; + /* while there is data left...*/ + while(ret_left){ + XGetWindowProperty(wsDisplay,event->data.l[0],_XA_XdndTypeList, + offset,256,False,XA_ATOM,&ret_type, + &ret_format,&ret_items,&ret_left, + (unsigned char**)&ret_buff); + + /* sanity checks...*/ + if(ret_buff == NULL || ret_type != XA_ATOM || ret_format != 8*sizeof(Atom)){ + XFree(ret_buff); + break; + } + /* now chek what we've got */ + { + int i; + for(i=0; i<ret_items; i++){ + if(ret_buff[i] == ok){ + atom_support = ok; + break; + } + } + /* found it ! */ + if (atom_support != None) + break; + } + /* maybe next time ... */ + XFree(ret_buff); + offset += 256; + } } return True; } @@ -163,7 +196,7 @@ if (event->message_type == _XA_XdndDrop) { if (event->data.l[0] != XGetSelectionOwner(wsDisplay, _XA_XdndSelection)){ - puts("wierd selection owner? QT?"); + puts("Wierd selection owner... QT?"); } if (atom_support != None) { XConvertSelection(wsDisplay, _XA_XdndSelection, atom_support,