tMore X11 snarf tweaks. Will we ever finish? - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e39b8b19286e7c6054953a88935442ec29a68eec
 (DIR) parent 1555bd7aaad44bb26e0442a6798671be636df5b3
 (HTM) Author: rsc <devnull@localhost>
       Date:   Tue,  2 Dec 2003 03:42:46 +0000
       
       More X11 snarf tweaks.
       Will we ever finish?
       
       Diffstat:
         M plumb/basic                         |       8 +++++---
         M src/cmd/mkfile                      |       2 +-
         M src/libdraw/x11-init.c              |       4 ++++
         M src/libdraw/x11-itrans.c            |      31 ++++++++++++++++++++++++-------
         M src/libdraw/x11-memdraw.h           |       4 ++++
       
       5 files changed, 38 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/plumb/basic b/plumb/basic
       t@@ -57,7 +57,7 @@ data set        $file
        attr add        addr=$3
        plumb to edit
        plumb start /usr/local/plan9/bin/B $file
       -#plumb client window $editor
       +# plumb client window $editor
        
        # .h files are looked up in /sys/include and passed to edit
        type is text
       t@@ -66,7 +66,8 @@ arg isfile        /sys/include/$1
        data set        $file
        attr add        addr=$3
        plumb to edit
       -plumb client window $editor
       +plumb start /usr/local/plan9/bin/B $file
       +# plumb client window $editor
        
        # .m files are looked up in /sys/module and passed to edit
        type is text
       t@@ -75,7 +76,8 @@ arg isfile        /sys/module/$1
        data set        $file
        attr add        addr=$3
        plumb to edit
       -plumb client window $editor
       +plumb start /usr/local/plan9/bin/B $file
       +# plumb client window $editor
        
        # faces -> new mail window for message
        type        is        text
 (DIR) diff --git a/src/cmd/mkfile b/src/cmd/mkfile
       t@@ -6,7 +6,7 @@ LDFLAGS=$LDFLAGS -lsec -lregexp9 -l9 -lbio -lfmt -lutf
        
        <$PLAN9/src/mkmany
        
       -BUGGERED='CVS|oplumb|plumb|plumb2|mk|vac|9term|venti'
       +BUGGERED='CVS|oplumb|plumb|plumb2|mk|vac|9term|venti|htmlfmt'
        DIRS=`ls -l |sed -n 's/^d.* //p' |egrep -v "$BUGGERED"`
        
        <$PLAN9/src/mkdirs
 (DIR) diff --git a/src/libdraw/x11-init.c b/src/libdraw/x11-init.c
       t@@ -379,6 +379,10 @@ xattach(char *label)
                 * Look up clipboard atom.
                 */
                _x.clipboard = XInternAtom(_x.display, "CLIPBOARD", False);
       +        _x.utf8string = XInternAtom(_x.display, "UTF8_STRING", False);
       +        _x.targets = XInternAtom(_x.display, "TARGETS", False);
       +        _x.text = XInternAtom(_x.display, "TEXT", False);
       +        _x.compoundtext = XInternAtom(_x.display, "COMPOUND_TEXT", False);
        
                /*
                 * Lots of display connections for various procs.
 (DIR) diff --git a/src/libdraw/x11-itrans.c b/src/libdraw/x11-itrans.c
       t@@ -378,6 +378,9 @@ xgetsnarf(XDisplay *xd)
                 * come, and we have no way to time out.  Instead, we will clear
                 * local property #1, request our buddy to fill it in for us, and poll
                 * until he's done or we get tired of waiting.
       +         *
       +         * We should try to go for _x.utf8string instead of XA_STRING,
       +         * but that would add to the polling.
                 */
                prop = 1;
                XChangeProperty(xd, _x.drawable, prop, XA_STRING, 8, PropModeReplace, (uchar*)"", 0);
       t@@ -392,7 +395,7 @@ xgetsnarf(XDisplay *xd)
                                break;
                        lastlen = len;
                }
       -        if(i == 30){
       +        if(i == 10){
                        data = nil;
                        goto out;
                }
       t@@ -400,7 +403,7 @@ xgetsnarf(XDisplay *xd)
                data = nil;
                XGetWindowProperty(xd, _x.drawable, prop, 0, SnarfSize/sizeof(ulong), 0, 
                        AnyPropertyType, &type, &fmt, &len, &dummy, &xdata);
       -        if(type != XA_STRING || len == 0){
       +        if((type != XA_STRING && type != _x.utf8string) || len == 0){
                        if(xdata)
                                XFree(xdata);
                        data = nil;
       t@@ -444,19 +447,33 @@ xputsnarf(XDisplay *xd, char *data)
        int
        xselect(XEvent *e, XDisplay *xd)
        {
       +        char *name;
                XEvent r;
                XSelectionRequestEvent *xe;
       +        Atom a[4];
        
                memset(&r, 0, sizeof r);
                xe = (XSelectionRequestEvent*)e;
       -        if(1 || xe->target == XA_STRING){
       +if(0) fprint(2, "xselect target=%d requestor=%d property=%d selection=%d\n",
       +        xe->target, xe->requestor, xe->property, xe->selection);
       +        r.xselection.property = xe->property;
       +        if(xe->target == _x.targets){
       +                a[0] = XA_STRING;
       +                a[1] = _x.utf8string;
       +                a[2] = _x.text;
       +                a[3] = _x.compoundtext;
       +
       +                XChangeProperty(xd, xe->requestor, xe->property, xe->target,
       +                        8, PropModeReplace, (uchar*)a, sizeof a);
       +        }else if(xe->target == XA_STRING || xe->target == _x.utf8string || xe->target == _x.text || xe->target == _x.compoundtext){
       +                /* if the target is STRING we're supposed to reply with Latin1 XXX */
                        qlock(&clip.lk);
       -                XChangeProperty(xd, xe->requestor, xe->property, XA_STRING, 8,
       -                        PropModeReplace, (uchar*)clip.buf, strlen(clip.buf)+1);
       +                XChangeProperty(xd, xe->requestor, xe->property, xe->target,
       +                        8, PropModeReplace, (uchar*)clip.buf, strlen(clip.buf));
                        qunlock(&clip.lk);
       -                r.xselection.property = xe->property;
                }else{
       -                fprint(2, "asked for a %d\n", xe->target);
       +                name = XGetAtomName(xd, xe->target);
       +                fprint(2, "%s: cannot handle selection request for '%s' (%d)\n", argv0, name, (int)xe->target);
                        r.xselection.property = None;
                }
        
 (DIR) diff --git a/src/libdraw/x11-memdraw.h b/src/libdraw/x11-memdraw.h
       t@@ -65,6 +65,10 @@ struct Xprivate {
                XVisual                *vis;
                u32int                white;
                Atom                clipboard;
       +        Atom                utf8string;
       +        Atom                targets;
       +        Atom                text;
       +        Atom                compoundtext;
                uint                putsnarf;
                uint                assertsnarf;
                int                destroyed;