com.jcraft.weirdx.DummySHAPEExtension.java Source code

Java tutorial

Introduction

Here is the source code for com.jcraft.weirdx.DummySHAPEExtension.java

Source

/* -*-mode:java; c-basic-offset:2; -*- */
/* WeirdX - Guess.
 *
 * Copyright (C) 1999-2004 JCraft, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

package com.jcraft.weirdx;

import java.awt.Rectangle;
import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.jcraft.weirdx.res.XResource;

final class DummySHAPEExtension extends Extension {
    private static Log LOG = LogFactory.getLog(DummySHAPEExtension.class);

    static final int ShapeSet = 0;
    static final int ShapeUnion = 1;
    static final int ShapeIntersect = 2;
    static final int ShapeSubtract = 3;
    static final int ShapeInvert = 4;

    static final int ShapeBounding = 0;
    static final int ShapeClip = 1;

    //  static final int ShapeNotifyMask=(1 << 0);
    //  static final int ShapeNotify=0;

    static int ctyp;
    static int etyp;

    DummySHAPEExtension() {
        eventcount = 1;
        errorcount = 0;
        ctyp = XResource.newType();
        etyp = XResource.newType();
        name = "SHAPE";
    }

    @SuppressWarnings("unused")
    void dispatch(Client c) throws IOException {
        XWindow window;
        int kind, x, y, w, h, shaped, op;
        Rectangle[] rect;
        int foo;
        InputOutput io = c.client;

        switch (c.data) {
        case 0:
            synchronized (io) {
                io.writeByte(1);
                io.writePad(1);
                io.writeShort(c.seq);
                io.writeInt(0);
                io.writeShort(1);
                io.writeShort(0);
                io.writePad(20);
                io.flush();
            }
            break;
        case 1:
            op = io.readByte();
            kind = io.readByte();
            int oder = io.readByte();
            io.readPad(1);
            foo = io.readInt();
            c.length -= 3;
            window = c.lookupWindow(foo);
            if (window == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }
            x = (short) io.readShort();
            y = (short) io.readShort();
            c.length--;
            int len = (c.length) / 2;
            rect = new Rectangle[len]; {
            int xx, yy, ww, hh;
            while (len > 0) {
                xx = (short) io.readShort();
                yy = (short) io.readShort();
                ww = (short) io.readShort();
                hh = (short) io.readShort();
                rect[rect.length - len] = new Rectangle(xx, yy, ww, hh);
                len--;
            }
        }
            //   synchronized(DummySHAPEExtension.class){                    
            //     window.ddxwindow.setShapeRectangles(op, kind, oder, x, y, rect);
            //   }                                                      
            break;
        case 2:
            op = io.readByte();
            kind = io.readByte();
            io.readPad(2);
            foo = io.readInt();
            c.length -= 3;
            window = c.lookupWindow(foo);
            if (window == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }
            x = (short) io.readShort();
            y = (short) io.readShort();
            foo = io.readInt();
            c.length -= 2;
            if (foo == 0) {
                sendShapeNotify(kind, window, x, y, window.width, window.height, 0);
                return;
            }

            XDrawable d = c.lookupDrawable(foo);
            if (d == null || !(d instanceof XPixmap)) {
                c.errorValue = foo;
                c.errorReason = 4; // BadPixmap;
                return;
            }
            XPixmap pixmap = (XPixmap) d;
            if (pixmap.depth != 1) {
                c.errorValue = foo;
                c.errorReason = 8; // BadMatch
                return;
            }

            //   synchronized(DummySHAPEExtension.class){                        
            //     if(kind==1){                                             
            //       window.ddxwindow.setShapeMask(op, kind, x, y, pixmap); 
            //        }                                                   
            //   }
            w = pixmap.width;
            h = pixmap.height;
            shaped = 1;
            sendShapeNotify(kind, window, x, y, w, h, shaped);
            break;
        case 3:
            int dk, sk;
            op = io.readByte();
            dk = io.readByte();
            sk = io.readByte();
            io.readPad(1);
            foo = io.readInt();
            c.length -= 3;
            XWindow dwindow = c.lookupWindow(foo);
            if (dwindow == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }
            x = (short) io.readShort();
            y = (short) io.readShort();
            foo = io.readInt();
            c.length -= 2;
            XWindow swindow = c.lookupWindow(foo);
            if (swindow == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }
            //   synchronized(DummySHAPEExtension.class){                
            //     dwindow.ddxwindow.setCombineMask(op, sk, dk, x, y, swindow); 
            //   }                                                  
            break;
        case 4:
            foo = io.readByte();
            io.readPad(3);
            foo = io.readInt();
            foo = io.readShort();
            foo = io.readShort();
            break;
        case 5:
            foo = io.readInt();
            c.length -= 2;
            window = c.lookupWindow(foo);
            if (window == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }
            synchronized (io) {
                io.writeByte(1);
                io.writePad(1);
                io.writeShort(c.seq);
                io.writeInt(0);
                io.writeByte(0); // bouding shaped
                io.writeByte(0); // clip shaped
                io.writePad(2);
                io.writeShort(-window.borderWidth); // bounding x
                io.writeShort(-window.borderWidth);
                io.writeShort(window.width + 2 * window.borderWidth);
                io.writeShort(window.height + 2 * window.borderWidth);
                io.writeShort(0); // clip x
                io.writeShort(0);
                io.writeShort(window.width);
                io.writeShort(window.height);
                io.writePad(4);
                io.flush();
            }
            break;
        case 6:
            foo = io.readInt();
            c.length -= 2;
            window = c.lookupWindow(foo);
            if (window == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }
            foo = io.readByte();
            io.readPad(3);
            c.length--;
            if (foo != 0 && foo != 1) {
                c.errorValue = foo;
                c.errorReason = 2; // BadWindow
                return;
            }

        {
            Head head = (Head) XResource.lookupIDByType(window.id, DummySHAPEExtension.etyp);
            if (foo == 1) {
                if (head != null) {
                    for (ShapeEvent se = head.next; se != null; se = se.next) {
                        if (se.client == c) {
                            return;
                        }
                    }
                }
                ShapeEvent se = new ShapeEvent(XResource.fakeClientId(c), DummySHAPEExtension.ctyp, c, window);
                XResource.add(se);
                if (head == null) {
                    head = new Head(window.id, DummySHAPEExtension.etyp);
                    XResource.add(head);
                } else {
                    se.next = head.next;
                }
                head.next = se;
                return;
            }
            // foo==0
            if (head != null) {
                ShapeEvent nse = null;
                ShapeEvent se = null;
                for (se = head.next; se != null; se = se.next) {
                    if (se.client == c)
                        break;
                    nse = se;
                }
                if (se != null) {
                    XResource.freeResource(se.id, DummySHAPEExtension.ctyp);
                    if (nse != null) {
                        nse.next = se.next;
                    } else {
                        head.next = se.next;
                    }
                }
            }
        }
            break;
        case 7:
            foo = io.readInt();
            c.length -= 2;
            window = c.lookupWindow(foo);
            if (window == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }
            byte result = 0; {
            Head head = (Head) XResource.lookupIDByType(window.id, DummySHAPEExtension.etyp);
            if (head != null) {
                for (ShapeEvent se = head.next; se != null; se = se.next) {
                    if (se.client == c) {
                        result = 1;
                        break;
                    }
                }
            }
        }

            synchronized (io) {
                io.writeByte(1);
                io.writeByte(result);
                io.writeShort(c.seq);
                io.writeInt(0);
                io.writePad(24);
                io.flush();
            }
            break;
        case 8:
            foo = io.readInt();
            c.length -= 2;
            window = c.lookupWindow(foo);
            if (window == null) {
                c.errorValue = foo;
                c.errorReason = 3; // BadWindow
                return;
            }

            kind = io.readByte();
            io.readPad(3);

            synchronized (io) {
                io.writeByte(1);
                io.writeByte(0);
                io.writeShort(c.seq);
                io.writeInt(2 * 1);
                io.writeInt(1);
                io.writePad(20);
                io.writeShort(0);
                io.writeShort(0);
                io.writeShort(window.width);
                io.writeShort(window.height);
                io.flush();
            }
            break;
        default:
            LOG.error("Shape: unknown code=" + c.data);
        }
    }

    void sendShapeNotify(int kind, XWindow window, int x, int y, int w, int h, int shaped) throws IOException {
        Head head = (Head) XResource.lookupIDByType(window.id, DummySHAPEExtension.etyp);
        if (head == null)
            return;
        for (ShapeEvent se = head.next; se != null; se = se.next) {
            Client c = se.client;
            if (c == Client.clients[0] || c.clientGone) {
                continue;
            }
            mkShapeNotify(c.cevent, kind, window.id, x, y, w, h, shaped);
            c.cevent.putSequence(c.seq);
            c.sendEvent(1, c.cevent);
        }
    }

    void mkShapeNotify(Event e, int kind, int window, int x, int y, int w, int h, int shaped) {
        e.clear();
        e.writeByte((byte) eventbase);
        e.writeByte((byte) kind);
        e.writePad(2);
        e.writeInt(window);
        e.writeShort(x);
        e.writeShort(y);
        e.writeShort(w);
        e.writeShort(h);
        int time = (int) System.currentTimeMillis();
        e.writeInt(time);
        e.writeByte((byte) shaped);
    }

    void swap(Event e) {
        e.index = 4;
        e.swapInt();
        e.swapShort();
        e.swapShort();
        e.swapShort();
        e.swapShort();
        e.swapInt();
    }

    class Head extends XResource {
        ShapeEvent next;

        Head(int id, int typ) {
            super(id, typ);
            this.next = null;
        }

        void delete() throws IOException {
            ShapeEvent pNext;
            for (ShapeEvent pCur = next; pCur != null; pCur = pNext) {
                pNext = pCur.next;
                XResource.freeResource(pCur.id, DummySHAPEExtension.ctyp);
            }
            next = null;
            return;
        }
    }

    class ShapeEvent extends XResource {
        ShapeEvent next;
        Client client;
        XWindow window;

        ShapeEvent(int id, int typ, Client client, XWindow window) {
            super(id, typ);
            this.client = client;
            this.window = window;
            this.next = null;
        }

        void delete() throws IOException {
            Head head = (Head) lookupIDByType(window.id, DummySHAPEExtension.etyp);
            if (head != null) {
                ShapeEvent pCur, pPrev = null;
                for (pCur = head.next; pCur != null && pCur != this; pCur = pCur.next) {
                    pPrev = pCur;
                }
                if (pCur != null) {
                    if (pPrev != null) {
                        pPrev.next = next;
                    } else {
                        head.next = next;
                    }
                }
            }
        }
    }
}