Plan 9 from Bell Labs’s /usr/web/sources/contrib/ericvh/go-plan9/src/pkg/xgb/xproto.go

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


// This file was generated automatically from xproto.xml.

package xgb

import "os"

type Char2b struct {
	Byte1	byte;
	Byte2	byte;
}

func getChar2b(b []byte, v *Char2b) int {
	v.Byte1 = b[0];
	v.Byte2 = b[1];
	return 2;
}

func (c *Conn) sendChar2bList(list []Char2b, count int) {
	b0 := make([]byte, 2*count);
	for k := 0; k < count; k++ {
		b := b0[k*2:];
		b[0] = list[k].Byte1;
		b[1] = list[k].Byte2;
	}
	c.sendBytes(b0);
}

type Point struct {
	X	int16;
	Y	int16;
}

func getPoint(b []byte, v *Point) int {
	v.X = int16(get16(b[0:]));
	v.Y = int16(get16(b[2:]));
	return 4;
}

func (c *Conn) sendPointList(list []Point, count int) {
	b0 := make([]byte, 4*count);
	for k := 0; k < count; k++ {
		b := b0[k*4:];
		put16(b[0:], uint16(list[k].X));
		put16(b[2:], uint16(list[k].Y));
	}
	c.sendBytes(b0);
}

type Rectangle struct {
	X	int16;
	Y	int16;
	Width	uint16;
	Height	uint16;
}

func getRectangle(b []byte, v *Rectangle) int {
	v.X = int16(get16(b[0:]));
	v.Y = int16(get16(b[2:]));
	v.Width = get16(b[4:]);
	v.Height = get16(b[6:]);
	return 8;
}

func (c *Conn) sendRectangleList(list []Rectangle, count int) {
	b0 := make([]byte, 8*count);
	for k := 0; k < count; k++ {
		b := b0[k*8:];
		put16(b[0:], uint16(list[k].X));
		put16(b[2:], uint16(list[k].Y));
		put16(b[4:], list[k].Width);
		put16(b[6:], list[k].Height);
	}
	c.sendBytes(b0);
}

type Arc struct {
	X	int16;
	Y	int16;
	Width	uint16;
	Height	uint16;
	Angle1	int16;
	Angle2	int16;
}

func getArc(b []byte, v *Arc) int {
	v.X = int16(get16(b[0:]));
	v.Y = int16(get16(b[2:]));
	v.Width = get16(b[4:]);
	v.Height = get16(b[6:]);
	v.Angle1 = int16(get16(b[8:]));
	v.Angle2 = int16(get16(b[10:]));
	return 12;
}

func (c *Conn) sendArcList(list []Arc, count int) {
	b0 := make([]byte, 12*count);
	for k := 0; k < count; k++ {
		b := b0[k*12:];
		put16(b[0:], uint16(list[k].X));
		put16(b[2:], uint16(list[k].Y));
		put16(b[4:], list[k].Width);
		put16(b[6:], list[k].Height);
		put16(b[8:], uint16(list[k].Angle1));
		put16(b[10:], uint16(list[k].Angle2));
	}
	c.sendBytes(b0);
}

type Format struct {
	Depth		byte;
	BitsPerPixel	byte;
	ScanlinePad	byte;
}

func getFormat(b []byte, v *Format) int {
	v.Depth = b[0];
	v.BitsPerPixel = b[1];
	v.ScanlinePad = b[2];
	return 8;
}

const (
	VisualClassStaticGray	= 0;
	VisualClassGrayScale	= 1;
	VisualClassStaticColor	= 2;
	VisualClassPseudoColor	= 3;
	VisualClassTrueColor	= 4;
	VisualClassDirectColor	= 5;
)

type VisualInfo struct {
	VisualId	Id;
	Class		byte;
	BitsPerRgbValue	byte;
	ColormapEntries	uint16;
	RedMask		uint32;
	GreenMask	uint32;
	BlueMask	uint32;
}

func getVisualInfo(b []byte, v *VisualInfo) int {
	v.VisualId = Id(get32(b[0:]));
	v.Class = b[4];
	v.BitsPerRgbValue = b[5];
	v.ColormapEntries = get16(b[6:]);
	v.RedMask = get32(b[8:]);
	v.GreenMask = get32(b[12:]);
	v.BlueMask = get32(b[16:]);
	return 24;
}

type DepthInfo struct {
	Depth		byte;
	VisualsLen	uint16;
	Visuals		[]VisualInfo;
}

func getDepthInfo(b []byte, v *DepthInfo) int {
	v.Depth = b[0];
	v.VisualsLen = get16(b[2:]);
	offset := 8;
	v.Visuals = make([]VisualInfo, int(v.VisualsLen));
	for i := 0; i < int(v.VisualsLen); i++ {
		offset += getVisualInfo(b[offset:], &v.Visuals[i])
	}
	return offset;
}

const (
	EventMaskNoEvent		= 0;
	EventMaskKeyPress		= 1;
	EventMaskKeyRelease		= 2;
	EventMaskButtonPress		= 4;
	EventMaskButtonRelease		= 8;
	EventMaskEnterWindow		= 16;
	EventMaskLeaveWindow		= 32;
	EventMaskPointerMotion		= 64;
	EventMaskPointerMotionHint	= 128;
	EventMaskButton1Motion		= 256;
	EventMaskButton2Motion		= 512;
	EventMaskButton3Motion		= 1024;
	EventMaskButton4Motion		= 2048;
	EventMaskButton5Motion		= 4096;
	EventMaskButtonMotion		= 8192;
	EventMaskKeymapState		= 16384;
	EventMaskExposure		= 32768;
	EventMaskVisibilityChange	= 65536;
	EventMaskStructureNotify	= 131072;
	EventMaskResizeRedirect		= 262144;
	EventMaskSubstructureNotify	= 524288;
	EventMaskSubstructureRedirect	= 1048576;
	EventMaskFocusChange		= 2097152;
	EventMaskPropertyChange		= 4194304;
	EventMaskColorMapChange		= 8388608;
	EventMaskOwnerGrabButton	= 16777216;
)

const (
	BackingStoreNotUseful	= 0;
	BackingStoreWhenMapped	= 1;
	BackingStoreAlways	= 2;
)

type ScreenInfo struct {
	Root			Id;
	DefaultColormap		Id;
	WhitePixel		uint32;
	BlackPixel		uint32;
	CurrentInputMasks	uint32;
	WidthInPixels		uint16;
	HeightInPixels		uint16;
	WidthInMillimeters	uint16;
	HeightInMillimeters	uint16;
	MinInstalledMaps	uint16;
	MaxInstalledMaps	uint16;
	RootVisual		Id;
	BackingStores		byte;
	SaveUnders		byte;
	RootDepth		byte;
	AllowedDepthsLen	byte;
	AllowedDepths		[]DepthInfo;
}

func getScreenInfo(b []byte, v *ScreenInfo) int {
	v.Root = Id(get32(b[0:]));
	v.DefaultColormap = Id(get32(b[4:]));
	v.WhitePixel = get32(b[8:]);
	v.BlackPixel = get32(b[12:]);
	v.CurrentInputMasks = get32(b[16:]);
	v.WidthInPixels = get16(b[20:]);
	v.HeightInPixels = get16(b[22:]);
	v.WidthInMillimeters = get16(b[24:]);
	v.HeightInMillimeters = get16(b[26:]);
	v.MinInstalledMaps = get16(b[28:]);
	v.MaxInstalledMaps = get16(b[30:]);
	v.RootVisual = Id(get32(b[32:]));
	v.BackingStores = b[36];
	v.SaveUnders = b[37];
	v.RootDepth = b[38];
	v.AllowedDepthsLen = b[39];
	offset := 40;
	v.AllowedDepths = make([]DepthInfo, int(v.AllowedDepthsLen));
	for i := 0; i < int(v.AllowedDepthsLen); i++ {
		offset += getDepthInfo(b[offset:], &v.AllowedDepths[i])
	}
	return offset;
}

const (
	ImageOrderLSBFirst	= 0;
	ImageOrderMSBFirst	= 1;
)

type SetupInfo struct {
	Status				byte;
	ProtocolMajorVersion		uint16;
	ProtocolMinorVersion		uint16;
	Length				uint16;
	ReleaseNumber			uint32;
	ResourceIdBase			uint32;
	ResourceIdMask			uint32;
	MotionBufferSize		uint32;
	VendorLen			uint16;
	MaximumRequestLength		uint16;
	RootsLen			byte;
	PixmapFormatsLen		byte;
	ImageByteOrder			byte;
	BitmapFormatBitOrder		byte;
	BitmapFormatScanlineUnit	byte;
	BitmapFormatScanlinePad		byte;
	MinKeycode			byte;
	MaxKeycode			byte;
	Vendor				[]byte;
	PixmapFormats			[]Format;
	Roots				[]ScreenInfo;
}

func getSetupInfo(b []byte, v *SetupInfo) int {
	v.Status = b[0];
	v.ProtocolMajorVersion = get16(b[2:]);
	v.ProtocolMinorVersion = get16(b[4:]);
	v.Length = get16(b[6:]);
	v.ReleaseNumber = get32(b[8:]);
	v.ResourceIdBase = get32(b[12:]);
	v.ResourceIdMask = get32(b[16:]);
	v.MotionBufferSize = get32(b[20:]);
	v.VendorLen = get16(b[24:]);
	v.MaximumRequestLength = get16(b[26:]);
	v.RootsLen = b[28];
	v.PixmapFormatsLen = b[29];
	v.ImageByteOrder = b[30];
	v.BitmapFormatBitOrder = b[31];
	v.BitmapFormatScanlineUnit = b[32];
	v.BitmapFormatScanlinePad = b[33];
	v.MinKeycode = b[34];
	v.MaxKeycode = b[35];
	offset := 40;
	v.Vendor = make([]byte, int(v.VendorLen));
	copy(v.Vendor[0:len(v.Vendor)], b[offset:]);
	offset += len(v.Vendor) * 1;
	offset = pad(offset);
	v.PixmapFormats = make([]Format, int(v.PixmapFormatsLen));
	for i := 0; i < int(v.PixmapFormatsLen); i++ {
		offset += getFormat(b[offset:], &v.PixmapFormats[i])
	}
	offset = pad(offset);
	v.Roots = make([]ScreenInfo, int(v.RootsLen));
	for i := 0; i < int(v.RootsLen); i++ {
		offset += getScreenInfo(b[offset:], &v.Roots[i])
	}
	return offset;
}

const (
	ModMaskShift	= 1;
	ModMaskLock	= 2;
	ModMaskControl	= 4;
	ModMask1	= 8;
	ModMask2	= 16;
	ModMask3	= 32;
	ModMask4	= 64;
	ModMask5	= 128;
	ModMaskAny	= 32768;
)

const (
	KeyButMaskShift		= 1;
	KeyButMaskLock		= 2;
	KeyButMaskControl	= 4;
	KeyButMaskMod1		= 8;
	KeyButMaskMod2		= 16;
	KeyButMaskMod3		= 32;
	KeyButMaskMod4		= 64;
	KeyButMaskMod5		= 128;
	KeyButMaskButton1	= 256;
	KeyButMaskButton2	= 512;
	KeyButMaskButton3	= 1024;
	KeyButMaskButton4	= 2048;
	KeyButMaskButton5	= 4096;
)

const (
	WindowNone = 0;
)

const KeyPress = 2

type KeyPressEvent struct {
	Detail		byte;
	Time		Timestamp;
	Root		Id;
	Event		Id;
	Child		Id;
	RootX		int16;
	RootY		int16;
	EventX		int16;
	EventY		int16;
	State		uint16;
	SameScreen	byte;
}

func getKeyPressEvent(b []byte) KeyPressEvent {
	var v KeyPressEvent;
	v.Detail = b[1];
	v.Time = Timestamp(get32(b[4:]));
	v.Root = Id(get32(b[8:]));
	v.Event = Id(get32(b[12:]));
	v.Child = Id(get32(b[16:]));
	v.RootX = int16(get16(b[20:]));
	v.RootY = int16(get16(b[22:]));
	v.EventX = int16(get16(b[24:]));
	v.EventY = int16(get16(b[26:]));
	v.State = get16(b[28:]);
	v.SameScreen = b[30];
	return v;
}

const KeyRelease = 3

type KeyReleaseEvent KeyPressEvent

func getKeyReleaseEvent(b []byte) KeyReleaseEvent {
	return (KeyReleaseEvent)(getKeyPressEvent(b))
}

const (
	ButtonMask1	= 256;
	ButtonMask2	= 512;
	ButtonMask3	= 1024;
	ButtonMask4	= 2048;
	ButtonMask5	= 4096;
	ButtonMaskAny	= 32768;
)

const ButtonPress = 4

type ButtonPressEvent struct {
	Detail		byte;
	Time		Timestamp;
	Root		Id;
	Event		Id;
	Child		Id;
	RootX		int16;
	RootY		int16;
	EventX		int16;
	EventY		int16;
	State		uint16;
	SameScreen	byte;
}

func getButtonPressEvent(b []byte) ButtonPressEvent {
	var v ButtonPressEvent;
	v.Detail = b[1];
	v.Time = Timestamp(get32(b[4:]));
	v.Root = Id(get32(b[8:]));
	v.Event = Id(get32(b[12:]));
	v.Child = Id(get32(b[16:]));
	v.RootX = int16(get16(b[20:]));
	v.RootY = int16(get16(b[22:]));
	v.EventX = int16(get16(b[24:]));
	v.EventY = int16(get16(b[26:]));
	v.State = get16(b[28:]);
	v.SameScreen = b[30];
	return v;
}

const ButtonRelease = 5

type ButtonReleaseEvent ButtonPressEvent

func getButtonReleaseEvent(b []byte) ButtonReleaseEvent {
	return (ButtonReleaseEvent)(getButtonPressEvent(b))
}

const (
	MotionNormal	= 0;
	MotionHint	= 1;
)

const MotionNotify = 6

type MotionNotifyEvent struct {
	Detail		byte;
	Time		Timestamp;
	Root		Id;
	Event		Id;
	Child		Id;
	RootX		int16;
	RootY		int16;
	EventX		int16;
	EventY		int16;
	State		uint16;
	SameScreen	byte;
}

func getMotionNotifyEvent(b []byte) MotionNotifyEvent {
	var v MotionNotifyEvent;
	v.Detail = b[1];
	v.Time = Timestamp(get32(b[4:]));
	v.Root = Id(get32(b[8:]));
	v.Event = Id(get32(b[12:]));
	v.Child = Id(get32(b[16:]));
	v.RootX = int16(get16(b[20:]));
	v.RootY = int16(get16(b[22:]));
	v.EventX = int16(get16(b[24:]));
	v.EventY = int16(get16(b[26:]));
	v.State = get16(b[28:]);
	v.SameScreen = b[30];
	return v;
}

const (
	NotifyDetailAncestor		= 0;
	NotifyDetailVirtual		= 1;
	NotifyDetailInferior		= 2;
	NotifyDetailNonlinear		= 3;
	NotifyDetailNonlinearVirtual	= 4;
	NotifyDetailPointer		= 5;
	NotifyDetailPointerRoot		= 6;
	NotifyDetailNone		= 7;
)

const (
	NotifyModeNormal	= 0;
	NotifyModeGrab		= 1;
	NotifyModeUngrab	= 2;
	NotifyModeWhileGrabbed	= 3;
)

const EnterNotify = 7

type EnterNotifyEvent struct {
	Detail		byte;
	Time		Timestamp;
	Root		Id;
	Event		Id;
	Child		Id;
	RootX		int16;
	RootY		int16;
	EventX		int16;
	EventY		int16;
	State		uint16;
	Mode		byte;
	SameScreenFocus	byte;
}

func getEnterNotifyEvent(b []byte) EnterNotifyEvent {
	var v EnterNotifyEvent;
	v.Detail = b[1];
	v.Time = Timestamp(get32(b[4:]));
	v.Root = Id(get32(b[8:]));
	v.Event = Id(get32(b[12:]));
	v.Child = Id(get32(b[16:]));
	v.RootX = int16(get16(b[20:]));
	v.RootY = int16(get16(b[22:]));
	v.EventX = int16(get16(b[24:]));
	v.EventY = int16(get16(b[26:]));
	v.State = get16(b[28:]);
	v.Mode = b[30];
	v.SameScreenFocus = b[31];
	return v;
}

const LeaveNotify = 8

type LeaveNotifyEvent EnterNotifyEvent

func getLeaveNotifyEvent(b []byte) LeaveNotifyEvent {
	return (LeaveNotifyEvent)(getEnterNotifyEvent(b))
}

const FocusIn = 9

type FocusInEvent struct {
	Detail	byte;
	Event	Id;
	Mode	byte;
}

func getFocusInEvent(b []byte) FocusInEvent {
	var v FocusInEvent;
	v.Detail = b[1];
	v.Event = Id(get32(b[4:]));
	v.Mode = b[8];
	return v;
}

const FocusOut = 10

type FocusOutEvent FocusInEvent

func getFocusOutEvent(b []byte) FocusOutEvent	{ return (FocusOutEvent)(getFocusInEvent(b)) }

const KeymapNotify = 11

type KeymapNotifyEvent struct {
	Keys [31]byte;
}

func getKeymapNotifyEvent(b []byte) KeymapNotifyEvent {
	var v KeymapNotifyEvent;
	copy(v.Keys[0:31], b[1:]);
	return v;
}

const Expose = 12

type ExposeEvent struct {
	Window	Id;
	X	uint16;
	Y	uint16;
	Width	uint16;
	Height	uint16;
	Count	uint16;
}

func getExposeEvent(b []byte) ExposeEvent {
	var v ExposeEvent;
	v.Window = Id(get32(b[4:]));
	v.X = get16(b[8:]);
	v.Y = get16(b[10:]);
	v.Width = get16(b[12:]);
	v.Height = get16(b[14:]);
	v.Count = get16(b[16:]);
	return v;
}

const GraphicsExposure = 13

type GraphicsExposureEvent struct {
	Drawable	Id;
	X		uint16;
	Y		uint16;
	Width		uint16;
	Height		uint16;
	MinorOpcode	uint16;
	Count		uint16;
	MajorOpcode	byte;
}

func getGraphicsExposureEvent(b []byte) GraphicsExposureEvent {
	var v GraphicsExposureEvent;
	v.Drawable = Id(get32(b[4:]));
	v.X = get16(b[8:]);
	v.Y = get16(b[10:]);
	v.Width = get16(b[12:]);
	v.Height = get16(b[14:]);
	v.MinorOpcode = get16(b[16:]);
	v.Count = get16(b[18:]);
	v.MajorOpcode = b[20];
	return v;
}

const NoExposure = 14

type NoExposureEvent struct {
	Drawable	Id;
	MinorOpcode	uint16;
	MajorOpcode	byte;
}

func getNoExposureEvent(b []byte) NoExposureEvent {
	var v NoExposureEvent;
	v.Drawable = Id(get32(b[4:]));
	v.MinorOpcode = get16(b[8:]);
	v.MajorOpcode = b[10];
	return v;
}

const (
	VisibilityUnobscured		= 0;
	VisibilityPartiallyObscured	= 1;
	VisibilityFullyObscured		= 2;
)

const VisibilityNotify = 15

type VisibilityNotifyEvent struct {
	Window	Id;
	State	byte;
}

func getVisibilityNotifyEvent(b []byte) VisibilityNotifyEvent {
	var v VisibilityNotifyEvent;
	v.Window = Id(get32(b[4:]));
	v.State = b[8];
	return v;
}

const CreateNotify = 16

type CreateNotifyEvent struct {
	Parent			Id;
	Window			Id;
	X			int16;
	Y			int16;
	Width			uint16;
	Height			uint16;
	BorderWidth		uint16;
	OverrideRedirect	byte;
}

func getCreateNotifyEvent(b []byte) CreateNotifyEvent {
	var v CreateNotifyEvent;
	v.Parent = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.X = int16(get16(b[12:]));
	v.Y = int16(get16(b[14:]));
	v.Width = get16(b[16:]);
	v.Height = get16(b[18:]);
	v.BorderWidth = get16(b[20:]);
	v.OverrideRedirect = b[22];
	return v;
}

const DestroyNotify = 17

type DestroyNotifyEvent struct {
	Event	Id;
	Window	Id;
}

func getDestroyNotifyEvent(b []byte) DestroyNotifyEvent {
	var v DestroyNotifyEvent;
	v.Event = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	return v;
}

const UnmapNotify = 18

type UnmapNotifyEvent struct {
	Event		Id;
	Window		Id;
	FromConfigure	byte;
}

func getUnmapNotifyEvent(b []byte) UnmapNotifyEvent {
	var v UnmapNotifyEvent;
	v.Event = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.FromConfigure = b[12];
	return v;
}

const MapNotify = 19

type MapNotifyEvent struct {
	Event			Id;
	Window			Id;
	OverrideRedirect	byte;
}

func getMapNotifyEvent(b []byte) MapNotifyEvent {
	var v MapNotifyEvent;
	v.Event = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.OverrideRedirect = b[12];
	return v;
}

const MapRequest = 20

type MapRequestEvent struct {
	Parent	Id;
	Window	Id;
}

func getMapRequestEvent(b []byte) MapRequestEvent {
	var v MapRequestEvent;
	v.Parent = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	return v;
}

const ReparentNotify = 21

type ReparentNotifyEvent struct {
	Event			Id;
	Window			Id;
	Parent			Id;
	X			int16;
	Y			int16;
	OverrideRedirect	byte;
}

func getReparentNotifyEvent(b []byte) ReparentNotifyEvent {
	var v ReparentNotifyEvent;
	v.Event = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.Parent = Id(get32(b[12:]));
	v.X = int16(get16(b[16:]));
	v.Y = int16(get16(b[18:]));
	v.OverrideRedirect = b[20];
	return v;
}

const ConfigureNotify = 22

type ConfigureNotifyEvent struct {
	Event			Id;
	Window			Id;
	AboveSibling		Id;
	X			int16;
	Y			int16;
	Width			uint16;
	Height			uint16;
	BorderWidth		uint16;
	OverrideRedirect	byte;
}

func getConfigureNotifyEvent(b []byte) ConfigureNotifyEvent {
	var v ConfigureNotifyEvent;
	v.Event = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.AboveSibling = Id(get32(b[12:]));
	v.X = int16(get16(b[16:]));
	v.Y = int16(get16(b[18:]));
	v.Width = get16(b[20:]);
	v.Height = get16(b[22:]);
	v.BorderWidth = get16(b[24:]);
	v.OverrideRedirect = b[26];
	return v;
}

const ConfigureRequest = 23

type ConfigureRequestEvent struct {
	StackMode	byte;
	Parent		Id;
	Window		Id;
	Sibling		Id;
	X		int16;
	Y		int16;
	Width		uint16;
	Height		uint16;
	BorderWidth	uint16;
	ValueMask	uint16;
}

func getConfigureRequestEvent(b []byte) ConfigureRequestEvent {
	var v ConfigureRequestEvent;
	v.StackMode = b[1];
	v.Parent = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.Sibling = Id(get32(b[12:]));
	v.X = int16(get16(b[16:]));
	v.Y = int16(get16(b[18:]));
	v.Width = get16(b[20:]);
	v.Height = get16(b[22:]);
	v.BorderWidth = get16(b[24:]);
	v.ValueMask = get16(b[26:]);
	return v;
}

const GravityNotify = 24

type GravityNotifyEvent struct {
	Event	Id;
	Window	Id;
	X	int16;
	Y	int16;
}

func getGravityNotifyEvent(b []byte) GravityNotifyEvent {
	var v GravityNotifyEvent;
	v.Event = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.X = int16(get16(b[12:]));
	v.Y = int16(get16(b[14:]));
	return v;
}

const ResizeRequest = 25

type ResizeRequestEvent struct {
	Window	Id;
	Width	uint16;
	Height	uint16;
}

func getResizeRequestEvent(b []byte) ResizeRequestEvent {
	var v ResizeRequestEvent;
	v.Window = Id(get32(b[4:]));
	v.Width = get16(b[8:]);
	v.Height = get16(b[10:]);
	return v;
}

const (
	PlaceOnTop	= 0;
	PlaceOnBottom	= 1;
)

const CirculateNotify = 26

type CirculateNotifyEvent struct {
	Event	Id;
	Window	Id;
	Place	byte;
}

func getCirculateNotifyEvent(b []byte) CirculateNotifyEvent {
	var v CirculateNotifyEvent;
	v.Event = Id(get32(b[4:]));
	v.Window = Id(get32(b[8:]));
	v.Place = b[16];
	return v;
}

const CirculateRequest = 27

type CirculateRequestEvent CirculateNotifyEvent

func getCirculateRequestEvent(b []byte) CirculateRequestEvent {
	return (CirculateRequestEvent)(getCirculateNotifyEvent(b))
}

const (
	PropertyNewValue	= 0;
	PropertyDelete		= 1;
)

const PropertyNotify = 28

type PropertyNotifyEvent struct {
	Window	Id;
	Atom	Id;
	Time	Timestamp;
	State	byte;
}

func getPropertyNotifyEvent(b []byte) PropertyNotifyEvent {
	var v PropertyNotifyEvent;
	v.Window = Id(get32(b[4:]));
	v.Atom = Id(get32(b[8:]));
	v.Time = Timestamp(get32(b[12:]));
	v.State = b[16];
	return v;
}

const SelectionClear = 29

type SelectionClearEvent struct {
	Time		Timestamp;
	Owner		Id;
	Selection	Id;
}

func getSelectionClearEvent(b []byte) SelectionClearEvent {
	var v SelectionClearEvent;
	v.Time = Timestamp(get32(b[4:]));
	v.Owner = Id(get32(b[8:]));
	v.Selection = Id(get32(b[12:]));
	return v;
}

const (
	TimeCurrentTime = 0;
)

const (
	AtomNone		= 0;
	AtomAny			= 0;
	AtomPrimary		= 1;
	AtomSecondary		= 2;
	AtomArc			= 3;
	AtomAtom		= 4;
	AtomBitmap		= 5;
	AtomCardinal		= 6;
	AtomColormap		= 7;
	AtomCursor		= 8;
	AtomCutBuffer0		= 9;
	AtomCutBuffer1		= 10;
	AtomCutBuffer2		= 11;
	AtomCutBuffer3		= 12;
	AtomCutBuffer4		= 13;
	AtomCutBuffer5		= 14;
	AtomCutBuffer6		= 15;
	AtomCutBuffer7		= 16;
	AtomDrawable		= 17;
	AtomFont		= 18;
	AtomInteger		= 19;
	AtomPixmap		= 20;
	AtomPoint		= 21;
	AtomRectangle		= 22;
	AtomResourceManager	= 23;
	AtomRgbColorMap		= 24;
	AtomRgbBestMap		= 25;
	AtomRgbBlueMap		= 26;
	AtomRgbDefaultMap	= 27;
	AtomRgbGrayMap		= 28;
	AtomRgbGreenMap		= 29;
	AtomRgbRedMap		= 30;
	AtomString		= 31;
	AtomVisualid		= 32;
	AtomWindow		= 33;
	AtomWmCommand		= 34;
	AtomWmHints		= 35;
	AtomWmClientMachine	= 36;
	AtomWmIconName		= 37;
	AtomWmIconSize		= 38;
	AtomWmName		= 39;
	AtomWmNormalHints	= 40;
	AtomWmSizeHints		= 41;
	AtomWmZoomHints		= 42;
	AtomMinSpace		= 43;
	AtomNormSpace		= 44;
	AtomMaxSpace		= 45;
	AtomEndSpace		= 46;
	AtomSuperscriptX	= 47;
	AtomSuperscriptY	= 48;
	AtomSubscriptX		= 49;
	AtomSubscriptY		= 50;
	AtomUnderlinePosition	= 51;
	AtomUnderlineThickness	= 52;
	AtomStrikeoutAscent	= 53;
	AtomStrikeoutDescent	= 54;
	AtomItalicAngle		= 55;
	AtomXHeight		= 56;
	AtomQuadWidth		= 57;
	AtomWeight		= 58;
	AtomPointSize		= 59;
	AtomResolution		= 60;
	AtomCopyright		= 61;
	AtomNotice		= 62;
	AtomFontName		= 63;
	AtomFamilyName		= 64;
	AtomFullName		= 65;
	AtomCapHeight		= 66;
	AtomWmClass		= 67;
	AtomWmTransientFor	= 68;
)

const SelectionRequest = 30

type SelectionRequestEvent struct {
	Time		Timestamp;
	Owner		Id;
	Requestor	Id;
	Selection	Id;
	Target		Id;
	Property	Id;
}

func getSelectionRequestEvent(b []byte) SelectionRequestEvent {
	var v SelectionRequestEvent;
	v.Time = Timestamp(get32(b[4:]));
	v.Owner = Id(get32(b[8:]));
	v.Requestor = Id(get32(b[12:]));
	v.Selection = Id(get32(b[16:]));
	v.Target = Id(get32(b[20:]));
	v.Property = Id(get32(b[24:]));
	return v;
}

const SelectionNotify = 31

type SelectionNotifyEvent struct {
	Time		Timestamp;
	Requestor	Id;
	Selection	Id;
	Target		Id;
	Property	Id;
}

func getSelectionNotifyEvent(b []byte) SelectionNotifyEvent {
	var v SelectionNotifyEvent;
	v.Time = Timestamp(get32(b[4:]));
	v.Requestor = Id(get32(b[8:]));
	v.Selection = Id(get32(b[12:]));
	v.Target = Id(get32(b[16:]));
	v.Property = Id(get32(b[20:]));
	return v;
}

const (
	ColormapStateUninstalled	= 0;
	ColormapStateInstalled		= 1;
)

const (
	ColormapNone = 0;
)

const ColormapNotify = 32

type ColormapNotifyEvent struct {
	Window		Id;
	Colormap	Id;
	New		byte;
	State		byte;
}

func getColormapNotifyEvent(b []byte) ColormapNotifyEvent {
	var v ColormapNotifyEvent;
	v.Window = Id(get32(b[4:]));
	v.Colormap = Id(get32(b[8:]));
	v.New = b[12];
	v.State = b[13];
	return v;
}

const ClientMessage = 33

type ClientMessageEvent struct {
	Format	byte;
	Window	Id;
	Type	Id;
	Data	ClientMessageData;
}

func getClientMessageEvent(b []byte) ClientMessageEvent {
	var v ClientMessageEvent;
	v.Format = b[1];
	v.Window = Id(get32(b[4:]));
	v.Type = Id(get32(b[8:]));
	getClientMessageData(b[12:], &v.Data);
	return v;
}

const (
	MappingModifier	= 0;
	MappingKeyboard	= 1;
	MappingPointer	= 2;
)

const MappingNotify = 34

type MappingNotifyEvent struct {
	Request		byte;
	FirstKeycode	byte;
	Count		byte;
}

func getMappingNotifyEvent(b []byte) MappingNotifyEvent {
	var v MappingNotifyEvent;
	v.Request = b[4];
	v.FirstKeycode = b[5];
	v.Count = b[6];
	return v;
}

const BadRequest = 1

const BadValue = 2

const BadWindow = 3

const BadPixmap = 4

const BadAtom = 5

const BadCursor = 6

const BadFont = 7

const BadMatch = 8

const BadDrawable = 9

const BadAccess = 10

const BadAlloc = 11

const BadColormap = 12

const BadGContext = 13

const BadIDChoice = 14

const BadName = 15

const BadLength = 16

const BadImplementation = 17

const (
	WindowClassCopyFromParent	= 0;
	WindowClassInputOutput		= 1;
	WindowClassInputOnly		= 2;
)

const (
	CWBackPixmap		= 1;
	CWBackPixel		= 2;
	CWBorderPixmap		= 4;
	CWBorderPixel		= 8;
	CWBitGravity		= 16;
	CWWinGravity		= 32;
	CWBackingStore		= 64;
	CWBackingPlanes		= 128;
	CWBackingPixel		= 256;
	CWOverrideRedirect	= 512;
	CWSaveUnder		= 1024;
	CWEventMask		= 2048;
	CWDontPropagate		= 4096;
	CWColormap		= 8192;
	CWCursor		= 16384;
)

const (
	BackPixmapNone			= 0;
	BackPixmapParentRelative	= 1;
)

const (
	GravityBitForget	= 0;
	GravityWinUnmap		= 0;
	GravityNorthWest	= 1;
	GravityNorth		= 2;
	GravityNorthEast	= 3;
	GravityWest		= 4;
	GravityCenter		= 5;
	GravityEast		= 6;
	GravitySouthWest	= 7;
	GravitySouth		= 8;
	GravitySouthEast	= 9;
	GravityStatic		= 10;
)

func (c *Conn) CreateWindow(Depth byte, Wid Id, Parent Id, X int16, Y int16, Width uint16, Height uint16, BorderWidth uint16, Class uint16, Visual Id, ValueMask uint32, ValueList []uint32) {
	b := c.scratch[0:32];
	n := 32;
	n += pad(popCount(int(ValueMask)) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 1;
	b[1] = Depth;
	put32(b[4:], uint32(Wid));
	put32(b[8:], uint32(Parent));
	put16(b[12:], uint16(X));
	put16(b[14:], uint16(Y));
	put16(b[16:], Width);
	put16(b[18:], Height);
	put16(b[20:], BorderWidth);
	put16(b[22:], Class);
	put32(b[24:], uint32(Visual));
	put32(b[28:], ValueMask);
	c.sendRequest(b);
	c.sendUInt32List(ValueList[0:popCount(int(ValueMask))]);
}

func (c *Conn) ChangeWindowAttributes(Window Id, ValueMask uint32, ValueList []uint32) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(popCount(int(ValueMask)) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 2;
	put32(b[4:], uint32(Window));
	put32(b[8:], ValueMask);
	c.sendRequest(b);
	c.sendUInt32List(ValueList[0:popCount(int(ValueMask))]);
}

const (
	MapStateUnmapped	= 0;
	MapStateUnviewable	= 1;
	MapStateViewable	= 2;
)

func (c *Conn) GetWindowAttributesRequest(Window Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 3;
	put32(b[4:], uint32(Window));
	return c.sendRequest(b);
}

func (c *Conn) GetWindowAttributes(Window Id) (*GetWindowAttributesReply, os.Error) {
	return c.GetWindowAttributesReply(c.GetWindowAttributesRequest(Window))
}

type GetWindowAttributesReply struct {
	BackingStore		byte;
	Visual			Id;
	Class			uint16;
	BitGravity		byte;
	WinGravity		byte;
	BackingPlanes		uint32;
	BackingPixel		uint32;
	SaveUnder		byte;
	MapIsInstalled		byte;
	MapState		byte;
	OverrideRedirect	byte;
	Colormap		Id;
	AllEventMasks		uint32;
	YourEventMask		uint32;
	DoNotPropagateMask	uint16;
}

func (c *Conn) GetWindowAttributesReply(cookie Cookie) (*GetWindowAttributesReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetWindowAttributesReply);
	v.BackingStore = b[1];
	v.Visual = Id(get32(b[8:]));
	v.Class = get16(b[12:]);
	v.BitGravity = b[14];
	v.WinGravity = b[15];
	v.BackingPlanes = get32(b[16:]);
	v.BackingPixel = get32(b[20:]);
	v.SaveUnder = b[24];
	v.MapIsInstalled = b[25];
	v.MapState = b[26];
	v.OverrideRedirect = b[27];
	v.Colormap = Id(get32(b[28:]));
	v.AllEventMasks = get32(b[32:]);
	v.YourEventMask = get32(b[36:]);
	v.DoNotPropagateMask = get16(b[40:]);
	return v, nil;
}

func (c *Conn) DestroyWindow(Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 4;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

func (c *Conn) DestroySubwindows(Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 5;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

const (
	SetModeInsert	= 0;
	SetModeDelete	= 1;
)

func (c *Conn) ChangeSaveSet(Mode byte, Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 6;
	b[1] = Mode;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

func (c *Conn) ReparentWindow(Window Id, Parent Id, X int16, Y int16) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 7;
	put32(b[4:], uint32(Window));
	put32(b[8:], uint32(Parent));
	put16(b[12:], uint16(X));
	put16(b[14:], uint16(Y));
	c.sendRequest(b);
}

func (c *Conn) MapWindow(Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 8;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

func (c *Conn) MapSubwindows(Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 9;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

func (c *Conn) UnmapWindow(Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 10;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

func (c *Conn) UnmapSubwindows(Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 11;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

const (
	ConfigWindowX		= 1;
	ConfigWindowY		= 2;
	ConfigWindowWidth	= 4;
	ConfigWindowHeight	= 8;
	ConfigWindowBorderWidth	= 16;
	ConfigWindowSibling	= 32;
	ConfigWindowStackMode	= 64;
)

const (
	StackModeAbove		= 0;
	StackModeBelow		= 1;
	StackModeTopIf		= 2;
	StackModeBottomIf	= 3;
	StackModeOpposite	= 4;
)

func (c *Conn) ConfigureWindow(Window Id, ValueMask uint16, ValueList []uint32) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(popCount(int(ValueMask)) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 12;
	put32(b[4:], uint32(Window));
	put16(b[8:], ValueMask);
	c.sendRequest(b);
	c.sendUInt32List(ValueList[0:popCount(int(ValueMask))]);
}

const (
	CirculateRaiseLowest	= 0;
	CirculateLowerHighest	= 1;
)

func (c *Conn) CirculateWindow(Direction byte, Window Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 13;
	b[1] = Direction;
	put32(b[4:], uint32(Window));
	c.sendRequest(b);
}

func (c *Conn) GetGeometryRequest(Drawable Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 14;
	put32(b[4:], uint32(Drawable));
	return c.sendRequest(b);
}

func (c *Conn) GetGeometry(Drawable Id) (*GetGeometryReply, os.Error) {
	return c.GetGeometryReply(c.GetGeometryRequest(Drawable))
}

type GetGeometryReply struct {
	Depth		byte;
	Root		Id;
	X		int16;
	Y		int16;
	Width		uint16;
	Height		uint16;
	BorderWidth	uint16;
}

func (c *Conn) GetGeometryReply(cookie Cookie) (*GetGeometryReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetGeometryReply);
	v.Depth = b[1];
	v.Root = Id(get32(b[8:]));
	v.X = int16(get16(b[12:]));
	v.Y = int16(get16(b[14:]));
	v.Width = get16(b[16:]);
	v.Height = get16(b[18:]);
	v.BorderWidth = get16(b[20:]);
	return v, nil;
}

func (c *Conn) QueryTreeRequest(Window Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 15;
	put32(b[4:], uint32(Window));
	return c.sendRequest(b);
}

func (c *Conn) QueryTree(Window Id) (*QueryTreeReply, os.Error) {
	return c.QueryTreeReply(c.QueryTreeRequest(Window))
}

type QueryTreeReply struct {
	Root		Id;
	Parent		Id;
	ChildrenLen	uint16;
	Children	[]Id;
}

func (c *Conn) QueryTreeReply(cookie Cookie) (*QueryTreeReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryTreeReply);
	v.Root = Id(get32(b[8:]));
	v.Parent = Id(get32(b[12:]));
	v.ChildrenLen = get16(b[16:]);
	offset := 32;
	v.Children = make([]Id, int(v.ChildrenLen));
	for i := 0; i < len(v.Children); i++ {
		v.Children[i] = Id(get32(b[offset+i*4:]))
	}
	offset += len(v.Children) * 4;
	return v, nil;
}

func (c *Conn) InternAtomRequest(OnlyIfExists byte, Name string) Cookie {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(Name) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 16;
	b[1] = OnlyIfExists;
	put16(b[4:], uint16(len(Name)));
	cookie := c.sendRequest(b);
	c.sendString(Name);
	return cookie;
}

func (c *Conn) InternAtom(OnlyIfExists byte, Name string) (*InternAtomReply, os.Error) {
	return c.InternAtomReply(c.InternAtomRequest(OnlyIfExists, Name))
}

type InternAtomReply struct {
	Atom Id;
}

func (c *Conn) InternAtomReply(cookie Cookie) (*InternAtomReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(InternAtomReply);
	v.Atom = Id(get32(b[8:]));
	return v, nil;
}

func (c *Conn) GetAtomNameRequest(Atom Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 17;
	put32(b[4:], uint32(Atom));
	return c.sendRequest(b);
}

func (c *Conn) GetAtomName(Atom Id) (*GetAtomNameReply, os.Error) {
	return c.GetAtomNameReply(c.GetAtomNameRequest(Atom))
}

type GetAtomNameReply struct {
	NameLen	uint16;
	Name	[]byte;
}

func (c *Conn) GetAtomNameReply(cookie Cookie) (*GetAtomNameReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetAtomNameReply);
	v.NameLen = get16(b[8:]);
	offset := 32;
	v.Name = make([]byte, int(v.NameLen));
	copy(v.Name[0:len(v.Name)], b[offset:]);
	offset += len(v.Name) * 1;
	return v, nil;
}

const (
	PropModeReplace	= 0;
	PropModePrepend	= 1;
	PropModeAppend	= 2;
)

func (c *Conn) ChangeProperty(Mode byte, Window Id, Property Id, Type Id, Format byte, Data []byte) {
	b := c.scratch[0:24];
	n := 24;
	n += pad(((len(Data) * int(Format)) / 8) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 18;
	b[1] = Mode;
	put32(b[4:], uint32(Window));
	put32(b[8:], uint32(Property));
	put32(b[12:], uint32(Type));
	b[16] = Format;
	put32(b[20:], uint32(len(Data)));
	c.sendRequest(b);
	c.sendBytes(Data[0:((len(Data) * int(Format)) / 8)]);
}

func (c *Conn) DeleteProperty(Window Id, Property Id) {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 19;
	put32(b[4:], uint32(Window));
	put32(b[8:], uint32(Property));
	c.sendRequest(b);
}

const (
	GetPropertyTypeAny = 0;
)

func (c *Conn) GetPropertyRequest(Delete byte, Window Id, Property Id, Type Id, LongOffset uint32, LongLength uint32) Cookie {
	b := c.scratch[0:24];
	put16(b[2:], 6);
	b[0] = 20;
	b[1] = Delete;
	put32(b[4:], uint32(Window));
	put32(b[8:], uint32(Property));
	put32(b[12:], uint32(Type));
	put32(b[16:], LongOffset);
	put32(b[20:], LongLength);
	return c.sendRequest(b);
}

func (c *Conn) GetProperty(Delete byte, Window Id, Property Id, Type Id, LongOffset uint32, LongLength uint32) (*GetPropertyReply, os.Error) {
	return c.GetPropertyReply(c.GetPropertyRequest(Delete, Window, Property, Type, LongOffset, LongLength))
}

type GetPropertyReply struct {
	Format		byte;
	Type		Id;
	BytesAfter	uint32;
	ValueLen	uint32;
	Value		[]byte;
}

func (c *Conn) GetPropertyReply(cookie Cookie) (*GetPropertyReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetPropertyReply);
	v.Format = b[1];
	v.Type = Id(get32(b[8:]));
	v.BytesAfter = get32(b[12:]);
	v.ValueLen = get32(b[16:]);
	offset := 32;
	v.Value = make([]byte, (int(v.ValueLen) * (int(v.Format) / 8)));
	copy(v.Value[0:len(v.Value)], b[offset:]);
	offset += len(v.Value) * 1;
	return v, nil;
}

func (c *Conn) ListPropertiesRequest(Window Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 21;
	put32(b[4:], uint32(Window));
	return c.sendRequest(b);
}

func (c *Conn) ListProperties(Window Id) (*ListPropertiesReply, os.Error) {
	return c.ListPropertiesReply(c.ListPropertiesRequest(Window))
}

type ListPropertiesReply struct {
	AtomsLen	uint16;
	Atoms		[]Id;
}

func (c *Conn) ListPropertiesReply(cookie Cookie) (*ListPropertiesReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(ListPropertiesReply);
	v.AtomsLen = get16(b[8:]);
	offset := 32;
	v.Atoms = make([]Id, int(v.AtomsLen));
	for i := 0; i < len(v.Atoms); i++ {
		v.Atoms[i] = Id(get32(b[offset+i*4:]))
	}
	offset += len(v.Atoms) * 4;
	return v, nil;
}

func (c *Conn) SetSelectionOwner(Owner Id, Selection Id, Time Timestamp) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 22;
	put32(b[4:], uint32(Owner));
	put32(b[8:], uint32(Selection));
	put32(b[12:], uint32(Time));
	c.sendRequest(b);
}

func (c *Conn) GetSelectionOwnerRequest(Selection Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 23;
	put32(b[4:], uint32(Selection));
	return c.sendRequest(b);
}

func (c *Conn) GetSelectionOwner(Selection Id) (*GetSelectionOwnerReply, os.Error) {
	return c.GetSelectionOwnerReply(c.GetSelectionOwnerRequest(Selection))
}

type GetSelectionOwnerReply struct {
	Owner Id;
}

func (c *Conn) GetSelectionOwnerReply(cookie Cookie) (*GetSelectionOwnerReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetSelectionOwnerReply);
	v.Owner = Id(get32(b[8:]));
	return v, nil;
}

func (c *Conn) ConvertSelection(Requestor Id, Selection Id, Target Id, Property Id, Time Timestamp) {
	b := c.scratch[0:24];
	put16(b[2:], 6);
	b[0] = 24;
	put32(b[4:], uint32(Requestor));
	put32(b[8:], uint32(Selection));
	put32(b[12:], uint32(Target));
	put32(b[16:], uint32(Property));
	put32(b[20:], uint32(Time));
	c.sendRequest(b);
}

const (
	SendEventDestPointerWindow	= 0;
	SendEventDestItemFocus		= 1;
)

func (c *Conn) SendEvent(Propagate byte, Destination Id, EventMask uint32, Event []byte) {
	b := make([]byte, 44);
	put16(b[2:], 11);
	b[0] = 25;
	b[1] = Propagate;
	put32(b[4:], uint32(Destination));
	put32(b[8:], EventMask);
	copy(b[12:44], Event);
	c.sendRequest(b);
}

const (
	GrabModeSync	= 0;
	GrabModeAsync	= 1;
)

const (
	GrabStatusSuccess		= 0;
	GrabStatusAlreadyGrabbed	= 1;
	GrabStatusInvalidTime		= 2;
	GrabStatusNotViewable		= 3;
	GrabStatusFrozen		= 4;
)

const (
	CursorNone = 0;
)

func (c *Conn) GrabPointerRequest(OwnerEvents byte, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Time Timestamp) Cookie {
	b := c.scratch[0:24];
	put16(b[2:], 6);
	b[0] = 26;
	b[1] = OwnerEvents;
	put32(b[4:], uint32(GrabWindow));
	put16(b[8:], EventMask);
	b[10] = PointerMode;
	b[11] = KeyboardMode;
	put32(b[12:], uint32(ConfineTo));
	put32(b[16:], uint32(Cursor));
	put32(b[20:], uint32(Time));
	return c.sendRequest(b);
}

func (c *Conn) GrabPointer(OwnerEvents byte, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Time Timestamp) (*GrabPointerReply, os.Error) {
	return c.GrabPointerReply(c.GrabPointerRequest(OwnerEvents, GrabWindow, EventMask, PointerMode, KeyboardMode, ConfineTo, Cursor, Time))
}

type GrabPointerReply struct {
	Status byte;
}

func (c *Conn) GrabPointerReply(cookie Cookie) (*GrabPointerReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GrabPointerReply);
	v.Status = b[1];
	return v, nil;
}

func (c *Conn) UngrabPointer(Time Timestamp) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 27;
	put32(b[4:], uint32(Time));
	c.sendRequest(b);
}

const (
	ButtonIndexAny	= 0;
	ButtonIndex1	= 1;
	ButtonIndex2	= 2;
	ButtonIndex3	= 3;
	ButtonIndex4	= 4;
	ButtonIndex5	= 5;
)

func (c *Conn) GrabButton(OwnerEvents byte, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Button byte, Modifiers uint16) {
	b := c.scratch[0:24];
	put16(b[2:], 6);
	b[0] = 28;
	b[1] = OwnerEvents;
	put32(b[4:], uint32(GrabWindow));
	put16(b[8:], EventMask);
	b[10] = PointerMode;
	b[11] = KeyboardMode;
	put32(b[12:], uint32(ConfineTo));
	put32(b[16:], uint32(Cursor));
	b[20] = Button;
	put16(b[22:], Modifiers);
	c.sendRequest(b);
}

func (c *Conn) UngrabButton(Button byte, GrabWindow Id, Modifiers uint16) {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 29;
	b[1] = Button;
	put32(b[4:], uint32(GrabWindow));
	put16(b[8:], Modifiers);
	c.sendRequest(b);
}

func (c *Conn) ChangeActivePointerGrab(Cursor Id, Time Timestamp, EventMask uint16) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 30;
	put32(b[4:], uint32(Cursor));
	put32(b[8:], uint32(Time));
	put16(b[12:], EventMask);
	c.sendRequest(b);
}

func (c *Conn) GrabKeyboardRequest(OwnerEvents byte, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) Cookie {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 31;
	b[1] = OwnerEvents;
	put32(b[4:], uint32(GrabWindow));
	put32(b[8:], uint32(Time));
	b[12] = PointerMode;
	b[13] = KeyboardMode;
	return c.sendRequest(b);
}

func (c *Conn) GrabKeyboard(OwnerEvents byte, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) (*GrabKeyboardReply, os.Error) {
	return c.GrabKeyboardReply(c.GrabKeyboardRequest(OwnerEvents, GrabWindow, Time, PointerMode, KeyboardMode))
}

type GrabKeyboardReply struct {
	Status byte;
}

func (c *Conn) GrabKeyboardReply(cookie Cookie) (*GrabKeyboardReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GrabKeyboardReply);
	v.Status = b[1];
	return v, nil;
}

func (c *Conn) UngrabKeyboard(Time Timestamp) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 32;
	put32(b[4:], uint32(Time));
	c.sendRequest(b);
}

const (
	GrabAny = 0;
)

func (c *Conn) GrabKey(OwnerEvents byte, GrabWindow Id, Modifiers uint16, Key byte, PointerMode byte, KeyboardMode byte) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 33;
	b[1] = OwnerEvents;
	put32(b[4:], uint32(GrabWindow));
	put16(b[8:], Modifiers);
	b[10] = Key;
	b[11] = PointerMode;
	b[12] = KeyboardMode;
	c.sendRequest(b);
}

func (c *Conn) UngrabKey(Key byte, GrabWindow Id, Modifiers uint16) {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 34;
	b[1] = Key;
	put32(b[4:], uint32(GrabWindow));
	put16(b[8:], Modifiers);
	c.sendRequest(b);
}

const (
	AllowAsyncPointer	= 0;
	AllowSyncPointer	= 1;
	AllowReplayPointer	= 2;
	AllowAsyncKeyboard	= 3;
	AllowSyncKeyboard	= 4;
	AllowReplayKeyboard	= 5;
	AllowAsyncBoth		= 6;
	AllowSyncBoth		= 7;
)

func (c *Conn) AllowEvents(Mode byte, Time Timestamp) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 35;
	b[1] = Mode;
	put32(b[4:], uint32(Time));
	c.sendRequest(b);
}

func (c *Conn) GrabServer() {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 36;
	c.sendRequest(b);
}

func (c *Conn) UngrabServer() {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 37;
	c.sendRequest(b);
}

func (c *Conn) QueryPointerRequest(Window Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 38;
	put32(b[4:], uint32(Window));
	return c.sendRequest(b);
}

func (c *Conn) QueryPointer(Window Id) (*QueryPointerReply, os.Error) {
	return c.QueryPointerReply(c.QueryPointerRequest(Window))
}

type QueryPointerReply struct {
	SameScreen	byte;
	Root		Id;
	Child		Id;
	RootX		int16;
	RootY		int16;
	WinX		int16;
	WinY		int16;
	Mask		uint16;
}

func (c *Conn) QueryPointerReply(cookie Cookie) (*QueryPointerReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryPointerReply);
	v.SameScreen = b[1];
	v.Root = Id(get32(b[8:]));
	v.Child = Id(get32(b[12:]));
	v.RootX = int16(get16(b[16:]));
	v.RootY = int16(get16(b[18:]));
	v.WinX = int16(get16(b[20:]));
	v.WinY = int16(get16(b[22:]));
	v.Mask = get16(b[24:]);
	return v, nil;
}

type Timecoord struct {
	Time	Timestamp;
	X	int16;
	Y	int16;
}

func getTimecoord(b []byte, v *Timecoord) int {
	v.Time = Timestamp(get32(b[0:]));
	v.X = int16(get16(b[4:]));
	v.Y = int16(get16(b[6:]));
	return 8;
}

func (c *Conn) sendTimecoordList(list []Timecoord, count int) {
	b0 := make([]byte, 8*count);
	for k := 0; k < count; k++ {
		b := b0[k*8:];
		put32(b[0:], uint32(list[k].Time));
		put16(b[4:], uint16(list[k].X));
		put16(b[6:], uint16(list[k].Y));
	}
	c.sendBytes(b0);
}

func (c *Conn) GetMotionEventsRequest(Window Id, Start Timestamp, Stop Timestamp) Cookie {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 39;
	put32(b[4:], uint32(Window));
	put32(b[8:], uint32(Start));
	put32(b[12:], uint32(Stop));
	return c.sendRequest(b);
}

func (c *Conn) GetMotionEvents(Window Id, Start Timestamp, Stop Timestamp) (*GetMotionEventsReply, os.Error) {
	return c.GetMotionEventsReply(c.GetMotionEventsRequest(Window, Start, Stop))
}

type GetMotionEventsReply struct {
	EventsLen	uint32;
	Events		[]Timecoord;
}

func (c *Conn) GetMotionEventsReply(cookie Cookie) (*GetMotionEventsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetMotionEventsReply);
	v.EventsLen = get32(b[8:]);
	offset := 32;
	v.Events = make([]Timecoord, int(v.EventsLen));
	for i := 0; i < int(v.EventsLen); i++ {
		offset += getTimecoord(b[offset:], &v.Events[i])
	}
	return v, nil;
}

func (c *Conn) TranslateCoordinatesRequest(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) Cookie {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 40;
	put32(b[4:], uint32(SrcWindow));
	put32(b[8:], uint32(DstWindow));
	put16(b[12:], uint16(SrcX));
	put16(b[14:], uint16(SrcY));
	return c.sendRequest(b);
}

func (c *Conn) TranslateCoordinates(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) (*TranslateCoordinatesReply, os.Error) {
	return c.TranslateCoordinatesReply(c.TranslateCoordinatesRequest(SrcWindow, DstWindow, SrcX, SrcY))
}

type TranslateCoordinatesReply struct {
	SameScreen	byte;
	Child		Id;
	DstX		uint16;
	DstY		uint16;
}

func (c *Conn) TranslateCoordinatesReply(cookie Cookie) (*TranslateCoordinatesReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(TranslateCoordinatesReply);
	v.SameScreen = b[1];
	v.Child = Id(get32(b[8:]));
	v.DstX = get16(b[12:]);
	v.DstY = get16(b[14:]);
	return v, nil;
}

func (c *Conn) WarpPointer(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16, SrcWidth uint16, SrcHeight uint16, DstX int16, DstY int16) {
	b := c.scratch[0:24];
	put16(b[2:], 6);
	b[0] = 41;
	put32(b[4:], uint32(SrcWindow));
	put32(b[8:], uint32(DstWindow));
	put16(b[12:], uint16(SrcX));
	put16(b[14:], uint16(SrcY));
	put16(b[16:], SrcWidth);
	put16(b[18:], SrcHeight);
	put16(b[20:], uint16(DstX));
	put16(b[22:], uint16(DstY));
	c.sendRequest(b);
}

const (
	InputFocusNone			= 0;
	InputFocusPointerRoot		= 1;
	InputFocusParent		= 2;
	InputFocusFollowKeyboard	= 3;
)

func (c *Conn) SetInputFocus(RevertTo byte, Focus Id, Time Timestamp) {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 42;
	b[1] = RevertTo;
	put32(b[4:], uint32(Focus));
	put32(b[8:], uint32(Time));
	c.sendRequest(b);
}

func (c *Conn) GetInputFocusRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 43;
	return c.sendRequest(b);
}

func (c *Conn) GetInputFocus() (*GetInputFocusReply, os.Error) {
	return c.GetInputFocusReply(c.GetInputFocusRequest())
}

type GetInputFocusReply struct {
	RevertTo	byte;
	Focus		Id;
}

func (c *Conn) GetInputFocusReply(cookie Cookie) (*GetInputFocusReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetInputFocusReply);
	v.RevertTo = b[1];
	v.Focus = Id(get32(b[8:]));
	return v, nil;
}

func (c *Conn) QueryKeymapRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 44;
	return c.sendRequest(b);
}

func (c *Conn) QueryKeymap() (*QueryKeymapReply, os.Error) {
	return c.QueryKeymapReply(c.QueryKeymapRequest())
}

type QueryKeymapReply struct {
	Keys [32]byte;
}

func (c *Conn) QueryKeymapReply(cookie Cookie) (*QueryKeymapReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryKeymapReply);
	copy(v.Keys[0:32], b[8:]);
	return v, nil;
}

func (c *Conn) OpenFont(Fid Id, Name string) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Name) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 45;
	put32(b[4:], uint32(Fid));
	put16(b[8:], uint16(len(Name)));
	c.sendRequest(b);
	c.sendString(Name);
}

func (c *Conn) CloseFont(Font Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 46;
	put32(b[4:], uint32(Font));
	c.sendRequest(b);
}

const (
	FontDrawLeftToRight	= 0;
	FontDrawRightToLeft	= 1;
)

type Fontprop struct {
	Name	Id;
	Value	uint32;
}

func getFontprop(b []byte, v *Fontprop) int {
	v.Name = Id(get32(b[0:]));
	v.Value = get32(b[4:]);
	return 8;
}

func (c *Conn) sendFontpropList(list []Fontprop, count int) {
	b0 := make([]byte, 8*count);
	for k := 0; k < count; k++ {
		b := b0[k*8:];
		put32(b[0:], uint32(list[k].Name));
		put32(b[4:], list[k].Value);
	}
	c.sendBytes(b0);
}

type Charinfo struct {
	LeftSideBearing		int16;
	RightSideBearing	int16;
	CharacterWidth		int16;
	Ascent			int16;
	Descent			int16;
	Attributes		uint16;
}

func getCharinfo(b []byte, v *Charinfo) int {
	v.LeftSideBearing = int16(get16(b[0:]));
	v.RightSideBearing = int16(get16(b[2:]));
	v.CharacterWidth = int16(get16(b[4:]));
	v.Ascent = int16(get16(b[6:]));
	v.Descent = int16(get16(b[8:]));
	v.Attributes = get16(b[10:]);
	return 12;
}

func (c *Conn) sendCharinfoList(list []Charinfo, count int) {
	b0 := make([]byte, 12*count);
	for k := 0; k < count; k++ {
		b := b0[k*12:];
		put16(b[0:], uint16(list[k].LeftSideBearing));
		put16(b[2:], uint16(list[k].RightSideBearing));
		put16(b[4:], uint16(list[k].CharacterWidth));
		put16(b[6:], uint16(list[k].Ascent));
		put16(b[8:], uint16(list[k].Descent));
		put16(b[10:], list[k].Attributes);
	}
	c.sendBytes(b0);
}

func (c *Conn) QueryFontRequest(Font Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 47;
	put32(b[4:], uint32(Font));
	return c.sendRequest(b);
}

func (c *Conn) QueryFont(Font Id) (*QueryFontReply, os.Error) {
	return c.QueryFontReply(c.QueryFontRequest(Font))
}

type QueryFontReply struct {
	MinBounds	Charinfo;
	MaxBounds	Charinfo;
	MinCharOrByte2	uint16;
	MaxCharOrByte2	uint16;
	DefaultChar	uint16;
	PropertiesLen	uint16;
	DrawDirection	byte;
	MinByte1	byte;
	MaxByte1	byte;
	AllCharsExist	byte;
	FontAscent	int16;
	FontDescent	int16;
	CharInfosLen	uint32;
	Properties	[]Fontprop;
	CharInfos	[]Charinfo;
}

func (c *Conn) QueryFontReply(cookie Cookie) (*QueryFontReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryFontReply);
	getCharinfo(b[8:], &v.MinBounds);
	getCharinfo(b[24:], &v.MaxBounds);
	v.MinCharOrByte2 = get16(b[40:]);
	v.MaxCharOrByte2 = get16(b[42:]);
	v.DefaultChar = get16(b[44:]);
	v.PropertiesLen = get16(b[46:]);
	v.DrawDirection = b[48];
	v.MinByte1 = b[49];
	v.MaxByte1 = b[50];
	v.AllCharsExist = b[51];
	v.FontAscent = int16(get16(b[52:]));
	v.FontDescent = int16(get16(b[54:]));
	v.CharInfosLen = get32(b[56:]);
	offset := 60;
	v.Properties = make([]Fontprop, int(v.PropertiesLen));
	for i := 0; i < int(v.PropertiesLen); i++ {
		offset += getFontprop(b[offset:], &v.Properties[i])
	}
	offset = pad(offset);
	v.CharInfos = make([]Charinfo, int(v.CharInfosLen));
	for i := 0; i < int(v.CharInfosLen); i++ {
		offset += getCharinfo(b[offset:], &v.CharInfos[i])
	}
	return v, nil;
}

func (c *Conn) QueryTextExtentsRequest(Font Id, String []Char2b) Cookie {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(String) * 2);
	put16(b[2:], uint16(n/4));
	b[0] = 48;
	b[1] = byte((len(String) & 1));
	put32(b[4:], uint32(Font));
	cookie := c.sendRequest(b);
	c.sendChar2bList(String, len(String));
	return cookie;
}

func (c *Conn) QueryTextExtents(Font Id, String []Char2b) (*QueryTextExtentsReply, os.Error) {
	return c.QueryTextExtentsReply(c.QueryTextExtentsRequest(Font, String))
}

type QueryTextExtentsReply struct {
	DrawDirection	byte;
	FontAscent	int16;
	FontDescent	int16;
	OverallAscent	int16;
	OverallDescent	int16;
	OverallWidth	int32;
	OverallLeft	int32;
	OverallRight	int32;
}

func (c *Conn) QueryTextExtentsReply(cookie Cookie) (*QueryTextExtentsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryTextExtentsReply);
	v.DrawDirection = b[1];
	v.FontAscent = int16(get16(b[8:]));
	v.FontDescent = int16(get16(b[10:]));
	v.OverallAscent = int16(get16(b[12:]));
	v.OverallDescent = int16(get16(b[14:]));
	v.OverallWidth = int32(get32(b[16:]));
	v.OverallLeft = int32(get32(b[20:]));
	v.OverallRight = int32(get32(b[24:]));
	return v, nil;
}

type Str struct {
	NameLen	byte;
	Name	[]byte;
}

func getStr(b []byte, v *Str) int {
	v.NameLen = b[0];
	offset := 1;
	v.Name = make([]byte, int(v.NameLen));
	copy(v.Name[0:len(v.Name)], b[offset:]);
	offset += len(v.Name) * 1;
	return offset;
}

// omitting variable length sendStr

func (c *Conn) ListFontsRequest(MaxNames uint16, Pattern []byte) Cookie {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(Pattern) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 49;
	put16(b[4:], MaxNames);
	put16(b[6:], uint16(len(Pattern)));
	cookie := c.sendRequest(b);
	c.sendBytes(Pattern[0:len(Pattern)]);
	return cookie;
}

func (c *Conn) ListFonts(MaxNames uint16, Pattern []byte) (*ListFontsReply, os.Error) {
	return c.ListFontsReply(c.ListFontsRequest(MaxNames, Pattern))
}

type ListFontsReply struct {
	NamesLen	uint16;
	Names		[]Str;
}

func (c *Conn) ListFontsReply(cookie Cookie) (*ListFontsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(ListFontsReply);
	v.NamesLen = get16(b[8:]);
	offset := 32;
	v.Names = make([]Str, int(v.NamesLen));
	for i := 0; i < int(v.NamesLen); i++ {
		offset += getStr(b[offset:], &v.Names[i])
	}
	return v, nil;
}

func (c *Conn) ListFontsWithInfoRequest(MaxNames uint16, Pattern []byte) Cookie {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(Pattern) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 50;
	put16(b[4:], MaxNames);
	put16(b[6:], uint16(len(Pattern)));
	cookie := c.sendRequest(b);
	c.sendBytes(Pattern[0:len(Pattern)]);
	return cookie;
}

func (c *Conn) ListFontsWithInfo(MaxNames uint16, Pattern []byte) (*ListFontsWithInfoReply, os.Error) {
	return c.ListFontsWithInfoReply(c.ListFontsWithInfoRequest(MaxNames, Pattern))
}

type ListFontsWithInfoReply struct {
	NameLen		byte;
	MinBounds	Charinfo;
	MaxBounds	Charinfo;
	MinCharOrByte2	uint16;
	MaxCharOrByte2	uint16;
	DefaultChar	uint16;
	PropertiesLen	uint16;
	DrawDirection	byte;
	MinByte1	byte;
	MaxByte1	byte;
	AllCharsExist	byte;
	FontAscent	int16;
	FontDescent	int16;
	RepliesHint	uint32;
	Properties	[]Fontprop;
	Name		[]byte;
}

func (c *Conn) ListFontsWithInfoReply(cookie Cookie) (*ListFontsWithInfoReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(ListFontsWithInfoReply);
	v.NameLen = b[1];
	getCharinfo(b[8:], &v.MinBounds);
	getCharinfo(b[24:], &v.MaxBounds);
	v.MinCharOrByte2 = get16(b[40:]);
	v.MaxCharOrByte2 = get16(b[42:]);
	v.DefaultChar = get16(b[44:]);
	v.PropertiesLen = get16(b[46:]);
	v.DrawDirection = b[48];
	v.MinByte1 = b[49];
	v.MaxByte1 = b[50];
	v.AllCharsExist = b[51];
	v.FontAscent = int16(get16(b[52:]));
	v.FontDescent = int16(get16(b[54:]));
	v.RepliesHint = get32(b[56:]);
	offset := 60;
	v.Properties = make([]Fontprop, int(v.PropertiesLen));
	for i := 0; i < int(v.PropertiesLen); i++ {
		offset += getFontprop(b[offset:], &v.Properties[i])
	}
	offset = pad(offset);
	v.Name = make([]byte, int(v.NameLen));
	copy(v.Name[0:len(v.Name)], b[offset:]);
	offset += len(v.Name) * 1;
	return v, nil;
}

func (c *Conn) SetFontPath(FontQty uint16, Path []byte) {
	b := c.scratch[0:6];
	n := 6;
	n += pad(len(Path) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 51;
	put16(b[4:], FontQty);
	c.sendRequest(b);
	c.sendBytes(Path[0:len(Path)]);
}

func (c *Conn) GetFontPathRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 52;
	return c.sendRequest(b);
}

func (c *Conn) GetFontPath() (*GetFontPathReply, os.Error) {
	return c.GetFontPathReply(c.GetFontPathRequest())
}

type GetFontPathReply struct {
	PathLen	uint16;
	Path	[]Str;
}

func (c *Conn) GetFontPathReply(cookie Cookie) (*GetFontPathReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetFontPathReply);
	v.PathLen = get16(b[8:]);
	offset := 32;
	v.Path = make([]Str, int(v.PathLen));
	for i := 0; i < int(v.PathLen); i++ {
		offset += getStr(b[offset:], &v.Path[i])
	}
	return v, nil;
}

func (c *Conn) CreatePixmap(Depth byte, Pid Id, Drawable Id, Width uint16, Height uint16) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 53;
	b[1] = Depth;
	put32(b[4:], uint32(Pid));
	put32(b[8:], uint32(Drawable));
	put16(b[12:], Width);
	put16(b[14:], Height);
	c.sendRequest(b);
}

func (c *Conn) FreePixmap(Pixmap Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 54;
	put32(b[4:], uint32(Pixmap));
	c.sendRequest(b);
}

const (
	GCFunction		= 1;
	GCPlaneMask		= 2;
	GCForeground		= 4;
	GCBackground		= 8;
	GCLineWidth		= 16;
	GCLineStyle		= 32;
	GCCapStyle		= 64;
	GCJoinStyle		= 128;
	GCFillStyle		= 256;
	GCFillRule		= 512;
	GCTile			= 1024;
	GCStipple		= 2048;
	GCTileStippleOriginX	= 4096;
	GCTileStippleOriginY	= 8192;
	GCFont			= 16384;
	GCSubwindowMode		= 32768;
	GCGraphicsExposures	= 65536;
	GCClipOriginX		= 131072;
	GCClipOriginY		= 262144;
	GCClipMask		= 524288;
	GCDashOffset		= 1048576;
	GCDashList		= 2097152;
	GCArcMode		= 4194304;
)

const (
	GXClear		= 0;
	GXAnd		= 1;
	GXAndReverse	= 2;
	GXCopy		= 3;
	GXAndInverted	= 4;
	GXNoop		= 5;
	GXXor		= 6;
	GXOr		= 7;
	GXNor		= 8;
	GXEquiv		= 9;
	GXInvert	= 10;
	GXOrReverse	= 11;
	GXCopyInverted	= 12;
	GXOrInverted	= 13;
	GXNand		= 14;
	GXSet		= 15;
)

const (
	LineStyleSolid		= 0;
	LineStyleOnOffDash	= 1;
	LineStyleDoubleDash	= 2;
)

const (
	CapStyleNotLast		= 0;
	CapStyleButt		= 1;
	CapStyleRound		= 2;
	CapStyleProjecting	= 3;
)

const (
	JoinStyleMiter	= 0;
	JoinStyleRound	= 1;
	JoinStyleBevel	= 2;
)

const (
	FillStyleSolid		= 0;
	FillStyleTiled		= 1;
	FillStyleStippled	= 2;
	FillStyleOpaqueStippled	= 3;
)

const (
	FillRuleEvenOdd	= 0;
	FillRuleWinding	= 1;
)

const (
	SubwindowModeClipByChildren	= 0;
	SubwindowModeIncludeInferiors	= 1;
)

const (
	ArcModeChord	= 0;
	ArcModePieSlice	= 1;
)

func (c *Conn) CreateGC(Cid Id, Drawable Id, ValueMask uint32, ValueList []uint32) {
	b := c.scratch[0:16];
	n := 16;
	n += pad(popCount(int(ValueMask)) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 55;
	put32(b[4:], uint32(Cid));
	put32(b[8:], uint32(Drawable));
	put32(b[12:], ValueMask);
	c.sendRequest(b);
	c.sendUInt32List(ValueList[0:popCount(int(ValueMask))]);
}

func (c *Conn) ChangeGC(Gc Id, ValueMask uint32, ValueList []uint32) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(popCount(int(ValueMask)) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 56;
	put32(b[4:], uint32(Gc));
	put32(b[8:], ValueMask);
	c.sendRequest(b);
	c.sendUInt32List(ValueList[0:popCount(int(ValueMask))]);
}

func (c *Conn) CopyGC(SrcGc Id, DstGc Id, ValueMask uint32) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 57;
	put32(b[4:], uint32(SrcGc));
	put32(b[8:], uint32(DstGc));
	put32(b[12:], ValueMask);
	c.sendRequest(b);
}

func (c *Conn) SetDashes(Gc Id, DashOffset uint16, Dashes []byte) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Dashes) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 58;
	put32(b[4:], uint32(Gc));
	put16(b[8:], DashOffset);
	put16(b[10:], uint16(len(Dashes)));
	c.sendRequest(b);
	c.sendBytes(Dashes[0:len(Dashes)]);
}

const (
	ClipOrderingUnsorted	= 0;
	ClipOrderingYSorted	= 1;
	ClipOrderingYXSorted	= 2;
	ClipOrderingYXBanded	= 3;
)

func (c *Conn) SetClipRectangles(Ordering byte, Gc Id, ClipXOrigin int16, ClipYOrigin int16, Rectangles []Rectangle) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Rectangles) * 8);
	put16(b[2:], uint16(n/4));
	b[0] = 59;
	b[1] = Ordering;
	put32(b[4:], uint32(Gc));
	put16(b[8:], uint16(ClipXOrigin));
	put16(b[10:], uint16(ClipYOrigin));
	c.sendRequest(b);
	c.sendRectangleList(Rectangles, len(Rectangles));
}

func (c *Conn) FreeGC(Gc Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 60;
	put32(b[4:], uint32(Gc));
	c.sendRequest(b);
}

func (c *Conn) ClearArea(Exposures byte, Window Id, X int16, Y int16, Width uint16, Height uint16) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 61;
	b[1] = Exposures;
	put32(b[4:], uint32(Window));
	put16(b[8:], uint16(X));
	put16(b[10:], uint16(Y));
	put16(b[12:], Width);
	put16(b[14:], Height);
	c.sendRequest(b);
}

func (c *Conn) CopyArea(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16) {
	b := c.scratch[0:28];
	put16(b[2:], 7);
	b[0] = 62;
	put32(b[4:], uint32(SrcDrawable));
	put32(b[8:], uint32(DstDrawable));
	put32(b[12:], uint32(Gc));
	put16(b[16:], uint16(SrcX));
	put16(b[18:], uint16(SrcY));
	put16(b[20:], uint16(DstX));
	put16(b[22:], uint16(DstY));
	put16(b[24:], Width);
	put16(b[26:], Height);
	c.sendRequest(b);
}

func (c *Conn) CopyPlane(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16, BitPlane uint32) {
	b := c.scratch[0:32];
	put16(b[2:], 8);
	b[0] = 63;
	put32(b[4:], uint32(SrcDrawable));
	put32(b[8:], uint32(DstDrawable));
	put32(b[12:], uint32(Gc));
	put16(b[16:], uint16(SrcX));
	put16(b[18:], uint16(SrcY));
	put16(b[20:], uint16(DstX));
	put16(b[22:], uint16(DstY));
	put16(b[24:], Width);
	put16(b[26:], Height);
	put32(b[28:], BitPlane);
	c.sendRequest(b);
}

const (
	CoordModeOrigin		= 0;
	CoordModePrevious	= 1;
)

func (c *Conn) PolyPoint(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Points) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 64;
	b[1] = CoordinateMode;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	c.sendRequest(b);
	c.sendPointList(Points, len(Points));
}

func (c *Conn) PolyLine(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Points) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 65;
	b[1] = CoordinateMode;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	c.sendRequest(b);
	c.sendPointList(Points, len(Points));
}

type Segment struct {
	X1	int16;
	Y1	int16;
	X2	int16;
	Y2	int16;
}

func getSegment(b []byte, v *Segment) int {
	v.X1 = int16(get16(b[0:]));
	v.Y1 = int16(get16(b[2:]));
	v.X2 = int16(get16(b[4:]));
	v.Y2 = int16(get16(b[6:]));
	return 8;
}

func (c *Conn) sendSegmentList(list []Segment, count int) {
	b0 := make([]byte, 8*count);
	for k := 0; k < count; k++ {
		b := b0[k*8:];
		put16(b[0:], uint16(list[k].X1));
		put16(b[2:], uint16(list[k].Y1));
		put16(b[4:], uint16(list[k].X2));
		put16(b[6:], uint16(list[k].Y2));
	}
	c.sendBytes(b0);
}

func (c *Conn) PolySegment(Drawable Id, Gc Id, Segments []Segment) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Segments) * 8);
	put16(b[2:], uint16(n/4));
	b[0] = 66;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	c.sendRequest(b);
	c.sendSegmentList(Segments, len(Segments));
}

func (c *Conn) PolyRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Rectangles) * 8);
	put16(b[2:], uint16(n/4));
	b[0] = 67;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	c.sendRequest(b);
	c.sendRectangleList(Rectangles, len(Rectangles));
}

func (c *Conn) PolyArc(Drawable Id, Gc Id, Arcs []Arc) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Arcs) * 12);
	put16(b[2:], uint16(n/4));
	b[0] = 68;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	c.sendRequest(b);
	c.sendArcList(Arcs, len(Arcs));
}

const (
	PolyShapeComplex	= 0;
	PolyShapeNonconvex	= 1;
	PolyShapeConvex		= 2;
)

func (c *Conn) FillPoly(Drawable Id, Gc Id, Shape byte, CoordinateMode byte, Points []Point) {
	b := c.scratch[0:16];
	n := 16;
	n += pad(len(Points) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 69;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	b[12] = Shape;
	b[13] = CoordinateMode;
	c.sendRequest(b);
	c.sendPointList(Points, len(Points));
}

func (c *Conn) PolyFillRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Rectangles) * 8);
	put16(b[2:], uint16(n/4));
	b[0] = 70;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	c.sendRequest(b);
	c.sendRectangleList(Rectangles, len(Rectangles));
}

func (c *Conn) PolyFillArc(Drawable Id, Gc Id, Arcs []Arc) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Arcs) * 12);
	put16(b[2:], uint16(n/4));
	b[0] = 71;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	c.sendRequest(b);
	c.sendArcList(Arcs, len(Arcs));
}

const (
	ImageFormatXYBitmap	= 0;
	ImageFormatXYPixmap	= 1;
	ImageFormatZPixmap	= 2;
)

func (c *Conn) PutImage(Format byte, Drawable Id, Gc Id, Width uint16, Height uint16, DstX int16, DstY int16, LeftPad byte, Depth byte, Data []byte) {
	b := c.scratch[0:24];
	n := 24;
	n += pad(len(Data) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 72;
	b[1] = Format;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	put16(b[12:], Width);
	put16(b[14:], Height);
	put16(b[16:], uint16(DstX));
	put16(b[18:], uint16(DstY));
	b[20] = LeftPad;
	b[21] = Depth;
	c.sendRequest(b);
	c.sendBytes(Data[0:len(Data)]);
}

func (c *Conn) GetImageRequest(Format byte, Drawable Id, X int16, Y int16, Width uint16, Height uint16, PlaneMask uint32) Cookie {
	b := c.scratch[0:20];
	put16(b[2:], 5);
	b[0] = 73;
	b[1] = Format;
	put32(b[4:], uint32(Drawable));
	put16(b[8:], uint16(X));
	put16(b[10:], uint16(Y));
	put16(b[12:], Width);
	put16(b[14:], Height);
	put32(b[16:], PlaneMask);
	return c.sendRequest(b);
}

func (c *Conn) GetImage(Format byte, Drawable Id, X int16, Y int16, Width uint16, Height uint16, PlaneMask uint32) (*GetImageReply, os.Error) {
	return c.GetImageReply(c.GetImageRequest(Format, Drawable, X, Y, Width, Height, PlaneMask))
}

type GetImageReply struct {
	Depth	byte;
	Length	uint32;
	Visual	Id;
	Data	[]byte;
}

func (c *Conn) GetImageReply(cookie Cookie) (*GetImageReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetImageReply);
	v.Depth = b[1];
	v.Length = get32(b[4:]);
	v.Visual = Id(get32(b[8:]));
	offset := 32;
	v.Data = make([]byte, (int(v.Length) * 4));
	copy(v.Data[0:len(v.Data)], b[offset:]);
	offset += len(v.Data) * 1;
	return v, nil;
}

func (c *Conn) PolyText8(Drawable Id, Gc Id, X int16, Y int16, Items []byte) {
	b := c.scratch[0:16];
	n := 16;
	n += pad(len(Items) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 74;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	put16(b[12:], uint16(X));
	put16(b[14:], uint16(Y));
	c.sendRequest(b);
	c.sendBytes(Items[0:len(Items)]);
}

func (c *Conn) PolyText16(Drawable Id, Gc Id, X int16, Y int16, Items []byte) {
	b := c.scratch[0:16];
	n := 16;
	n += pad(len(Items) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 75;
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	put16(b[12:], uint16(X));
	put16(b[14:], uint16(Y));
	c.sendRequest(b);
	c.sendBytes(Items[0:len(Items)]);
}

func (c *Conn) ImageText8(Drawable Id, Gc Id, X int16, Y int16, String []byte) {
	b := c.scratch[0:16];
	n := 16;
	n += pad(len(String) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 76;
	b[1] = byte(len(String));
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	put16(b[12:], uint16(X));
	put16(b[14:], uint16(Y));
	c.sendRequest(b);
	c.sendBytes(String[0:len(String)]);
}

func (c *Conn) ImageText16(Drawable Id, Gc Id, X int16, Y int16, String []Char2b) {
	b := c.scratch[0:16];
	n := 16;
	n += pad(len(String) * 2);
	put16(b[2:], uint16(n/4));
	b[0] = 77;
	b[1] = byte(len(String));
	put32(b[4:], uint32(Drawable));
	put32(b[8:], uint32(Gc));
	put16(b[12:], uint16(X));
	put16(b[14:], uint16(Y));
	c.sendRequest(b);
	c.sendChar2bList(String, len(String));
}

const (
	ColormapAllocNone	= 0;
	ColormapAllocAll	= 1;
)

func (c *Conn) CreateColormap(Alloc byte, Mid Id, Window Id, Visual Id) {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 78;
	b[1] = Alloc;
	put32(b[4:], uint32(Mid));
	put32(b[8:], uint32(Window));
	put32(b[12:], uint32(Visual));
	c.sendRequest(b);
}

func (c *Conn) FreeColormap(Cmap Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 79;
	put32(b[4:], uint32(Cmap));
	c.sendRequest(b);
}

func (c *Conn) CopyColormapAndFree(Mid Id, SrcCmap Id) {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 80;
	put32(b[4:], uint32(Mid));
	put32(b[8:], uint32(SrcCmap));
	c.sendRequest(b);
}

func (c *Conn) InstallColormap(Cmap Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 81;
	put32(b[4:], uint32(Cmap));
	c.sendRequest(b);
}

func (c *Conn) UninstallColormap(Cmap Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 82;
	put32(b[4:], uint32(Cmap));
	c.sendRequest(b);
}

func (c *Conn) ListInstalledColormapsRequest(Window Id) Cookie {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 83;
	put32(b[4:], uint32(Window));
	return c.sendRequest(b);
}

func (c *Conn) ListInstalledColormaps(Window Id) (*ListInstalledColormapsReply, os.Error) {
	return c.ListInstalledColormapsReply(c.ListInstalledColormapsRequest(Window))
}

type ListInstalledColormapsReply struct {
	CmapsLen	uint16;
	Cmaps		[]Id;
}

func (c *Conn) ListInstalledColormapsReply(cookie Cookie) (*ListInstalledColormapsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(ListInstalledColormapsReply);
	v.CmapsLen = get16(b[8:]);
	offset := 32;
	v.Cmaps = make([]Id, int(v.CmapsLen));
	for i := 0; i < len(v.Cmaps); i++ {
		v.Cmaps[i] = Id(get32(b[offset+i*4:]))
	}
	offset += len(v.Cmaps) * 4;
	return v, nil;
}

func (c *Conn) AllocColorRequest(Cmap Id, Red uint16, Green uint16, Blue uint16) Cookie {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 84;
	put32(b[4:], uint32(Cmap));
	put16(b[8:], Red);
	put16(b[10:], Green);
	put16(b[12:], Blue);
	return c.sendRequest(b);
}

func (c *Conn) AllocColor(Cmap Id, Red uint16, Green uint16, Blue uint16) (*AllocColorReply, os.Error) {
	return c.AllocColorReply(c.AllocColorRequest(Cmap, Red, Green, Blue))
}

type AllocColorReply struct {
	Red	uint16;
	Green	uint16;
	Blue	uint16;
	Pixel	uint32;
}

func (c *Conn) AllocColorReply(cookie Cookie) (*AllocColorReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(AllocColorReply);
	v.Red = get16(b[8:]);
	v.Green = get16(b[10:]);
	v.Blue = get16(b[12:]);
	v.Pixel = get32(b[16:]);
	return v, nil;
}

func (c *Conn) AllocNamedColorRequest(Cmap Id, Name string) Cookie {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Name) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 85;
	put32(b[4:], uint32(Cmap));
	put16(b[8:], uint16(len(Name)));
	cookie := c.sendRequest(b);
	c.sendString(Name);
	return cookie;
}

func (c *Conn) AllocNamedColor(Cmap Id, Name string) (*AllocNamedColorReply, os.Error) {
	return c.AllocNamedColorReply(c.AllocNamedColorRequest(Cmap, Name))
}

type AllocNamedColorReply struct {
	Pixel		uint32;
	ExactRed	uint16;
	ExactGreen	uint16;
	ExactBlue	uint16;
	VisualRed	uint16;
	VisualGreen	uint16;
	VisualBlue	uint16;
}

func (c *Conn) AllocNamedColorReply(cookie Cookie) (*AllocNamedColorReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(AllocNamedColorReply);
	v.Pixel = get32(b[8:]);
	v.ExactRed = get16(b[12:]);
	v.ExactGreen = get16(b[14:]);
	v.ExactBlue = get16(b[16:]);
	v.VisualRed = get16(b[18:]);
	v.VisualGreen = get16(b[20:]);
	v.VisualBlue = get16(b[22:]);
	return v, nil;
}

func (c *Conn) AllocColorCellsRequest(Contiguous byte, Cmap Id, Colors uint16, Planes uint16) Cookie {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 86;
	b[1] = Contiguous;
	put32(b[4:], uint32(Cmap));
	put16(b[8:], Colors);
	put16(b[10:], Planes);
	return c.sendRequest(b);
}

func (c *Conn) AllocColorCells(Contiguous byte, Cmap Id, Colors uint16, Planes uint16) (*AllocColorCellsReply, os.Error) {
	return c.AllocColorCellsReply(c.AllocColorCellsRequest(Contiguous, Cmap, Colors, Planes))
}

type AllocColorCellsReply struct {
	PixelsLen	uint16;
	MasksLen	uint16;
	Pixels		[]uint32;
	Masks		[]uint32;
}

func (c *Conn) AllocColorCellsReply(cookie Cookie) (*AllocColorCellsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(AllocColorCellsReply);
	v.PixelsLen = get16(b[8:]);
	v.MasksLen = get16(b[10:]);
	offset := 32;
	v.Pixels = make([]uint32, int(v.PixelsLen));
	for i := 0; i < len(v.Pixels); i++ {
		v.Pixels[i] = get32(b[offset+i*4:])
	}
	offset += len(v.Pixels) * 4;
	offset = pad(offset);
	v.Masks = make([]uint32, int(v.MasksLen));
	for i := 0; i < len(v.Masks); i++ {
		v.Masks[i] = get32(b[offset+i*4:])
	}
	offset += len(v.Masks) * 4;
	return v, nil;
}

func (c *Conn) AllocColorPlanesRequest(Contiguous byte, Cmap Id, Colors uint16, Reds uint16, Greens uint16, Blues uint16) Cookie {
	b := c.scratch[0:16];
	put16(b[2:], 4);
	b[0] = 87;
	b[1] = Contiguous;
	put32(b[4:], uint32(Cmap));
	put16(b[8:], Colors);
	put16(b[10:], Reds);
	put16(b[12:], Greens);
	put16(b[14:], Blues);
	return c.sendRequest(b);
}

func (c *Conn) AllocColorPlanes(Contiguous byte, Cmap Id, Colors uint16, Reds uint16, Greens uint16, Blues uint16) (*AllocColorPlanesReply, os.Error) {
	return c.AllocColorPlanesReply(c.AllocColorPlanesRequest(Contiguous, Cmap, Colors, Reds, Greens, Blues))
}

type AllocColorPlanesReply struct {
	PixelsLen	uint16;
	RedMask		uint32;
	GreenMask	uint32;
	BlueMask	uint32;
	Pixels		[]uint32;
}

func (c *Conn) AllocColorPlanesReply(cookie Cookie) (*AllocColorPlanesReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(AllocColorPlanesReply);
	v.PixelsLen = get16(b[8:]);
	v.RedMask = get32(b[12:]);
	v.GreenMask = get32(b[16:]);
	v.BlueMask = get32(b[20:]);
	offset := 32;
	v.Pixels = make([]uint32, int(v.PixelsLen));
	for i := 0; i < len(v.Pixels); i++ {
		v.Pixels[i] = get32(b[offset+i*4:])
	}
	offset += len(v.Pixels) * 4;
	return v, nil;
}

func (c *Conn) FreeColors(Cmap Id, PlaneMask uint32, Pixels []uint32) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Pixels) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 88;
	put32(b[4:], uint32(Cmap));
	put32(b[8:], PlaneMask);
	c.sendRequest(b);
	c.sendUInt32List(Pixels[0:len(Pixels)]);
}

const (
	ColorFlagRed	= 1;
	ColorFlagGreen	= 2;
	ColorFlagBlue	= 4;
)

type Coloritem struct {
	Pixel	uint32;
	Red	uint16;
	Green	uint16;
	Blue	uint16;
	Flags	byte;
}

func getColoritem(b []byte, v *Coloritem) int {
	v.Pixel = get32(b[0:]);
	v.Red = get16(b[4:]);
	v.Green = get16(b[6:]);
	v.Blue = get16(b[8:]);
	v.Flags = b[10];
	return 12;
}

func (c *Conn) sendColoritemList(list []Coloritem, count int) {
	b0 := make([]byte, 12*count);
	for k := 0; k < count; k++ {
		b := b0[k*12:];
		put32(b[0:], list[k].Pixel);
		put16(b[4:], list[k].Red);
		put16(b[6:], list[k].Green);
		put16(b[8:], list[k].Blue);
		b[10] = list[k].Flags;
	}
	c.sendBytes(b0);
}

func (c *Conn) StoreColors(Cmap Id, Items []Coloritem) {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(Items) * 12);
	put16(b[2:], uint16(n/4));
	b[0] = 89;
	put32(b[4:], uint32(Cmap));
	c.sendRequest(b);
	c.sendColoritemList(Items, len(Items));
}

func (c *Conn) StoreNamedColor(Flags byte, Cmap Id, Pixel uint32, Name string) {
	b := c.scratch[0:16];
	n := 16;
	n += pad(len(Name) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 90;
	b[1] = Flags;
	put32(b[4:], uint32(Cmap));
	put32(b[8:], Pixel);
	put16(b[12:], uint16(len(Name)));
	c.sendRequest(b);
	c.sendString(Name);
}

type Rgb struct {
	Red	uint16;
	Green	uint16;
	Blue	uint16;
}

func getRgb(b []byte, v *Rgb) int {
	v.Red = get16(b[0:]);
	v.Green = get16(b[2:]);
	v.Blue = get16(b[4:]);
	return 8;
}

func (c *Conn) sendRgbList(list []Rgb, count int) {
	b0 := make([]byte, 8*count);
	for k := 0; k < count; k++ {
		b := b0[k*8:];
		put16(b[0:], list[k].Red);
		put16(b[2:], list[k].Green);
		put16(b[4:], list[k].Blue);
	}
	c.sendBytes(b0);
}

func (c *Conn) QueryColorsRequest(Cmap Id, Pixels []uint32) Cookie {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(Pixels) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 91;
	put32(b[4:], uint32(Cmap));
	cookie := c.sendRequest(b);
	c.sendUInt32List(Pixels[0:len(Pixels)]);
	return cookie;
}

func (c *Conn) QueryColors(Cmap Id, Pixels []uint32) (*QueryColorsReply, os.Error) {
	return c.QueryColorsReply(c.QueryColorsRequest(Cmap, Pixels))
}

type QueryColorsReply struct {
	ColorsLen	uint16;
	Colors		[]Rgb;
}

func (c *Conn) QueryColorsReply(cookie Cookie) (*QueryColorsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryColorsReply);
	v.ColorsLen = get16(b[8:]);
	offset := 32;
	v.Colors = make([]Rgb, int(v.ColorsLen));
	for i := 0; i < int(v.ColorsLen); i++ {
		offset += getRgb(b[offset:], &v.Colors[i])
	}
	return v, nil;
}

func (c *Conn) LookupColorRequest(Cmap Id, Name string) Cookie {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Name) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 92;
	put32(b[4:], uint32(Cmap));
	put16(b[8:], uint16(len(Name)));
	cookie := c.sendRequest(b);
	c.sendString(Name);
	return cookie;
}

func (c *Conn) LookupColor(Cmap Id, Name string) (*LookupColorReply, os.Error) {
	return c.LookupColorReply(c.LookupColorRequest(Cmap, Name))
}

type LookupColorReply struct {
	ExactRed	uint16;
	ExactGreen	uint16;
	ExactBlue	uint16;
	VisualRed	uint16;
	VisualGreen	uint16;
	VisualBlue	uint16;
}

func (c *Conn) LookupColorReply(cookie Cookie) (*LookupColorReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(LookupColorReply);
	v.ExactRed = get16(b[8:]);
	v.ExactGreen = get16(b[10:]);
	v.ExactBlue = get16(b[12:]);
	v.VisualRed = get16(b[14:]);
	v.VisualGreen = get16(b[16:]);
	v.VisualBlue = get16(b[18:]);
	return v, nil;
}

const (
	PixmapNone = 0;
)

func (c *Conn) CreateCursor(Cid Id, Source Id, Mask Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16, X uint16, Y uint16) {
	b := c.scratch[0:32];
	put16(b[2:], 8);
	b[0] = 93;
	put32(b[4:], uint32(Cid));
	put32(b[8:], uint32(Source));
	put32(b[12:], uint32(Mask));
	put16(b[16:], ForeRed);
	put16(b[18:], ForeGreen);
	put16(b[20:], ForeBlue);
	put16(b[22:], BackRed);
	put16(b[24:], BackGreen);
	put16(b[26:], BackBlue);
	put16(b[28:], X);
	put16(b[30:], Y);
	c.sendRequest(b);
}

const (
	FontNone = 0;
)

func (c *Conn) CreateGlyphCursor(Cid Id, SourceFont Id, MaskFont Id, SourceChar uint16, MaskChar uint16, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) {
	b := c.scratch[0:32];
	put16(b[2:], 8);
	b[0] = 94;
	put32(b[4:], uint32(Cid));
	put32(b[8:], uint32(SourceFont));
	put32(b[12:], uint32(MaskFont));
	put16(b[16:], SourceChar);
	put16(b[18:], MaskChar);
	put16(b[20:], ForeRed);
	put16(b[22:], ForeGreen);
	put16(b[24:], ForeBlue);
	put16(b[26:], BackRed);
	put16(b[28:], BackGreen);
	put16(b[30:], BackBlue);
	c.sendRequest(b);
}

func (c *Conn) FreeCursor(Cursor Id) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 95;
	put32(b[4:], uint32(Cursor));
	c.sendRequest(b);
}

func (c *Conn) RecolorCursor(Cursor Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) {
	b := c.scratch[0:20];
	put16(b[2:], 5);
	b[0] = 96;
	put32(b[4:], uint32(Cursor));
	put16(b[8:], ForeRed);
	put16(b[10:], ForeGreen);
	put16(b[12:], ForeBlue);
	put16(b[14:], BackRed);
	put16(b[16:], BackGreen);
	put16(b[18:], BackBlue);
	c.sendRequest(b);
}

const (
	QueryShapeOfLargestCursor	= 0;
	QueryShapeOfFastestTile		= 1;
	QueryShapeOfFastestStipple	= 2;
)

func (c *Conn) QueryBestSizeRequest(Class byte, Drawable Id, Width uint16, Height uint16) Cookie {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 97;
	b[1] = Class;
	put32(b[4:], uint32(Drawable));
	put16(b[8:], Width);
	put16(b[10:], Height);
	return c.sendRequest(b);
}

func (c *Conn) QueryBestSize(Class byte, Drawable Id, Width uint16, Height uint16) (*QueryBestSizeReply, os.Error) {
	return c.QueryBestSizeReply(c.QueryBestSizeRequest(Class, Drawable, Width, Height))
}

type QueryBestSizeReply struct {
	Width	uint16;
	Height	uint16;
}

func (c *Conn) QueryBestSizeReply(cookie Cookie) (*QueryBestSizeReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryBestSizeReply);
	v.Width = get16(b[8:]);
	v.Height = get16(b[10:]);
	return v, nil;
}

func (c *Conn) QueryExtensionRequest(Name string) Cookie {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(Name) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 98;
	put16(b[4:], uint16(len(Name)));
	cookie := c.sendRequest(b);
	c.sendString(Name);
	return cookie;
}

func (c *Conn) QueryExtension(Name string) (*QueryExtensionReply, os.Error) {
	return c.QueryExtensionReply(c.QueryExtensionRequest(Name))
}

type QueryExtensionReply struct {
	Present		byte;
	MajorOpcode	byte;
	FirstEvent	byte;
	FirstError	byte;
}

func (c *Conn) QueryExtensionReply(cookie Cookie) (*QueryExtensionReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(QueryExtensionReply);
	v.Present = b[8];
	v.MajorOpcode = b[9];
	v.FirstEvent = b[10];
	v.FirstError = b[11];
	return v, nil;
}

func (c *Conn) ListExtensionsRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 99;
	return c.sendRequest(b);
}

func (c *Conn) ListExtensions() (*ListExtensionsReply, os.Error) {
	return c.ListExtensionsReply(c.ListExtensionsRequest())
}

type ListExtensionsReply struct {
	NamesLen	byte;
	Names		[]Str;
}

func (c *Conn) ListExtensionsReply(cookie Cookie) (*ListExtensionsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(ListExtensionsReply);
	v.NamesLen = b[1];
	offset := 32;
	v.Names = make([]Str, int(v.NamesLen));
	for i := 0; i < int(v.NamesLen); i++ {
		offset += getStr(b[offset:], &v.Names[i])
	}
	return v, nil;
}

func (c *Conn) ChangeKeyboardMapping(KeycodeCount byte, FirstKeycode byte, KeysymsPerKeycode byte, Keysyms []Keysym) {
	b := c.scratch[0:6];
	n := 6;
	n += pad((int(KeycodeCount) * int(KeysymsPerKeycode)) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 100;
	b[1] = KeycodeCount;
	b[4] = FirstKeycode;
	b[5] = KeysymsPerKeycode;
	c.sendRequest(b);
	c.sendKeysymList(Keysyms, (int(KeycodeCount) * int(KeysymsPerKeycode)));
}

func (c *Conn) GetKeyboardMappingRequest(FirstKeycode byte, Count byte) Cookie {
	b := c.scratch[0:6];
	put16(b[2:], 1);
	b[0] = 101;
	b[4] = FirstKeycode;
	b[5] = Count;
	return c.sendRequest(b);
}

func (c *Conn) GetKeyboardMapping(FirstKeycode byte, Count byte) (*GetKeyboardMappingReply, os.Error) {
	return c.GetKeyboardMappingReply(c.GetKeyboardMappingRequest(FirstKeycode, Count))
}

type GetKeyboardMappingReply struct {
	KeysymsPerKeycode	byte;
	Length			uint32;
	Keysyms			[]Keysym;
}

func (c *Conn) GetKeyboardMappingReply(cookie Cookie) (*GetKeyboardMappingReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetKeyboardMappingReply);
	v.KeysymsPerKeycode = b[1];
	v.Length = get32(b[4:]);
	offset := 32;
	v.Keysyms = make([]Keysym, int(v.Length));
	for i := 0; i < len(v.Keysyms); i++ {
		v.Keysyms[i] = Keysym(get32(b[offset+i*4:]))
	}
	offset += len(v.Keysyms) * 4;
	return v, nil;
}

const (
	KBKeyClickPercent	= 1;
	KBBellPercent		= 2;
	KBBellPitch		= 4;
	KBBellDuration		= 8;
	KBLed			= 16;
	KBLedMode		= 32;
	KBKey			= 64;
	KBAutoRepeatMode	= 128;
)

const (
	LedModeOff	= 0;
	LedModeOn	= 1;
)

const (
	AutoRepeatModeOff	= 0;
	AutoRepeatModeOn	= 1;
	AutoRepeatModeDefault	= 2;
)

func (c *Conn) ChangeKeyboardControl(ValueMask uint32, ValueList []uint32) {
	b := c.scratch[0:8];
	n := 8;
	n += pad(popCount(int(ValueMask)) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 102;
	put32(b[4:], ValueMask);
	c.sendRequest(b);
	c.sendUInt32List(ValueList[0:popCount(int(ValueMask))]);
}

func (c *Conn) GetKeyboardControlRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 103;
	return c.sendRequest(b);
}

func (c *Conn) GetKeyboardControl() (*GetKeyboardControlReply, os.Error) {
	return c.GetKeyboardControlReply(c.GetKeyboardControlRequest())
}

type GetKeyboardControlReply struct {
	GlobalAutoRepeat	byte;
	LedMask			uint32;
	KeyClickPercent		byte;
	BellPercent		byte;
	BellPitch		uint16;
	BellDuration		uint16;
	AutoRepeats		[32]byte;
}

func (c *Conn) GetKeyboardControlReply(cookie Cookie) (*GetKeyboardControlReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetKeyboardControlReply);
	v.GlobalAutoRepeat = b[1];
	v.LedMask = get32(b[8:]);
	v.KeyClickPercent = b[12];
	v.BellPercent = b[13];
	v.BellPitch = get16(b[14:]);
	v.BellDuration = get16(b[16:]);
	copy(v.AutoRepeats[0:32], b[20:]);
	return v, nil;
}

func (c *Conn) Bell(Percent int8) {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 104;
	b[1] = byte(Percent);
	c.sendRequest(b);
}

func (c *Conn) ChangePointerControl(AccelerationNumerator int16, AccelerationDenominator int16, Threshold int16, DoAcceleration byte, DoThreshold byte) {
	b := c.scratch[0:12];
	put16(b[2:], 3);
	b[0] = 105;
	put16(b[4:], uint16(AccelerationNumerator));
	put16(b[6:], uint16(AccelerationDenominator));
	put16(b[8:], uint16(Threshold));
	b[10] = DoAcceleration;
	b[11] = DoThreshold;
	c.sendRequest(b);
}

func (c *Conn) GetPointerControlRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 106;
	return c.sendRequest(b);
}

func (c *Conn) GetPointerControl() (*GetPointerControlReply, os.Error) {
	return c.GetPointerControlReply(c.GetPointerControlRequest())
}

type GetPointerControlReply struct {
	AccelerationNumerator	uint16;
	AccelerationDenominator	uint16;
	Threshold		uint16;
}

func (c *Conn) GetPointerControlReply(cookie Cookie) (*GetPointerControlReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetPointerControlReply);
	v.AccelerationNumerator = get16(b[8:]);
	v.AccelerationDenominator = get16(b[10:]);
	v.Threshold = get16(b[12:]);
	return v, nil;
}

const (
	BlankingNotPreferred	= 0;
	BlankingPreferred	= 1;
	BlankingDefault		= 2;
)

const (
	ExposuresNotAllowed	= 0;
	ExposuresAllowed	= 1;
	ExposuresDefault	= 2;
)

func (c *Conn) SetScreenSaver(Timeout int16, Interval int16, PreferBlanking byte, AllowExposures byte) {
	b := c.scratch[0:10];
	put16(b[2:], 2);
	b[0] = 107;
	put16(b[4:], uint16(Timeout));
	put16(b[6:], uint16(Interval));
	b[8] = PreferBlanking;
	b[9] = AllowExposures;
	c.sendRequest(b);
}

func (c *Conn) GetScreenSaverRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 108;
	return c.sendRequest(b);
}

func (c *Conn) GetScreenSaver() (*GetScreenSaverReply, os.Error) {
	return c.GetScreenSaverReply(c.GetScreenSaverRequest())
}

type GetScreenSaverReply struct {
	Timeout		uint16;
	Interval	uint16;
	PreferBlanking	byte;
	AllowExposures	byte;
}

func (c *Conn) GetScreenSaverReply(cookie Cookie) (*GetScreenSaverReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetScreenSaverReply);
	v.Timeout = get16(b[8:]);
	v.Interval = get16(b[10:]);
	v.PreferBlanking = b[12];
	v.AllowExposures = b[13];
	return v, nil;
}

const (
	HostModeInsert	= 0;
	HostModeDelete	= 1;
)

const (
	FamilyInternet		= 0;
	FamilyDECnet		= 1;
	FamilyChaos		= 2;
	FamilyServerInterpreted	= 5;
	FamilyInternet6		= 6;
)

func (c *Conn) ChangeHosts(Mode byte, Family byte, Address []byte) {
	b := c.scratch[0:8];
	n := 8;
	n += pad(len(Address) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 109;
	b[1] = Mode;
	b[4] = Family;
	put16(b[6:], uint16(len(Address)));
	c.sendRequest(b);
	c.sendBytes(Address[0:len(Address)]);
}

type Host struct {
	Family		byte;
	AddressLen	uint16;
	Address		[]byte;
}

func getHost(b []byte, v *Host) int {
	v.Family = b[0];
	v.AddressLen = get16(b[2:]);
	offset := 4;
	v.Address = make([]byte, int(v.AddressLen));
	copy(v.Address[0:len(v.Address)], b[offset:]);
	offset += len(v.Address) * 1;
	return offset;
}

// omitting variable length sendHost

func (c *Conn) ListHostsRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 110;
	return c.sendRequest(b);
}

func (c *Conn) ListHosts() (*ListHostsReply, os.Error) {
	return c.ListHostsReply(c.ListHostsRequest())
}

type ListHostsReply struct {
	Mode		byte;
	HostsLen	uint16;
	Hosts		[]Host;
}

func (c *Conn) ListHostsReply(cookie Cookie) (*ListHostsReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(ListHostsReply);
	v.Mode = b[1];
	v.HostsLen = get16(b[8:]);
	offset := 32;
	v.Hosts = make([]Host, int(v.HostsLen));
	for i := 0; i < int(v.HostsLen); i++ {
		offset += getHost(b[offset:], &v.Hosts[i])
	}
	return v, nil;
}

const (
	AccessControlDisable	= 0;
	AccessControlEnable	= 1;
)

func (c *Conn) SetAccessControl(Mode byte) {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 111;
	b[1] = Mode;
	c.sendRequest(b);
}

const (
	CloseDownDestroyAll		= 0;
	CloseDownRetainPermanent	= 1;
	CloseDownRetainTemporary	= 2;
)

func (c *Conn) SetCloseDownMode(Mode byte) {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 112;
	b[1] = Mode;
	c.sendRequest(b);
}

const (
	KillAllTemporary = 0;
)

func (c *Conn) KillClient(Resource uint32) {
	b := c.scratch[0:8];
	put16(b[2:], 2);
	b[0] = 113;
	put32(b[4:], Resource);
	c.sendRequest(b);
}

func (c *Conn) RotateProperties(Window Id, Delta int16, Atoms []Id) {
	b := c.scratch[0:12];
	n := 12;
	n += pad(len(Atoms) * 4);
	put16(b[2:], uint16(n/4));
	b[0] = 114;
	put32(b[4:], uint32(Window));
	put16(b[8:], uint16(len(Atoms)));
	put16(b[10:], uint16(Delta));
	c.sendRequest(b);
	c.sendIdList(Atoms, len(Atoms));
}

const (
	ScreenSaverReset	= 0;
	ScreenSaverActive	= 1;
)

func (c *Conn) ForceScreenSaver(Mode byte) {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 115;
	b[1] = Mode;
	c.sendRequest(b);
}

const (
	MappingStatusSuccess	= 0;
	MappingStatusBusy	= 1;
	MappingStatusFailure	= 2;
)

func (c *Conn) SetPointerMappingRequest(Map []byte) Cookie {
	b := c.scratch[0:4];
	n := 4;
	n += pad(len(Map) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 116;
	b[1] = byte(len(Map));
	cookie := c.sendRequest(b);
	c.sendBytes(Map[0:len(Map)]);
	return cookie;
}

func (c *Conn) SetPointerMapping(Map []byte) (*SetPointerMappingReply, os.Error) {
	return c.SetPointerMappingReply(c.SetPointerMappingRequest(Map))
}

type SetPointerMappingReply struct {
	Status byte;
}

func (c *Conn) SetPointerMappingReply(cookie Cookie) (*SetPointerMappingReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(SetPointerMappingReply);
	v.Status = b[1];
	return v, nil;
}

func (c *Conn) GetPointerMappingRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 117;
	return c.sendRequest(b);
}

func (c *Conn) GetPointerMapping() (*GetPointerMappingReply, os.Error) {
	return c.GetPointerMappingReply(c.GetPointerMappingRequest())
}

type GetPointerMappingReply struct {
	MapLen	byte;
	Map	[]byte;
}

func (c *Conn) GetPointerMappingReply(cookie Cookie) (*GetPointerMappingReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetPointerMappingReply);
	v.MapLen = b[1];
	offset := 32;
	v.Map = make([]byte, int(v.MapLen));
	copy(v.Map[0:len(v.Map)], b[offset:]);
	offset += len(v.Map) * 1;
	return v, nil;
}

const (
	MapIndexShift	= 0;
	MapIndexLock	= 1;
	MapIndexControl	= 2;
	MapIndex1	= 3;
	MapIndex2	= 4;
	MapIndex3	= 5;
	MapIndex4	= 6;
	MapIndex5	= 7;
)

func (c *Conn) SetModifierMappingRequest(KeycodesPerModifier byte, Keycodes []byte) Cookie {
	b := c.scratch[0:4];
	n := 4;
	n += pad((int(KeycodesPerModifier) * 8) * 1);
	put16(b[2:], uint16(n/4));
	b[0] = 118;
	b[1] = KeycodesPerModifier;
	cookie := c.sendRequest(b);
	c.sendBytes(Keycodes[0:(int(KeycodesPerModifier) * 8)]);
	return cookie;
}

func (c *Conn) SetModifierMapping(KeycodesPerModifier byte, Keycodes []byte) (*SetModifierMappingReply, os.Error) {
	return c.SetModifierMappingReply(c.SetModifierMappingRequest(KeycodesPerModifier, Keycodes))
}

type SetModifierMappingReply struct {
	Status byte;
}

func (c *Conn) SetModifierMappingReply(cookie Cookie) (*SetModifierMappingReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(SetModifierMappingReply);
	v.Status = b[1];
	return v, nil;
}

func (c *Conn) GetModifierMappingRequest() Cookie {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 119;
	return c.sendRequest(b);
}

func (c *Conn) GetModifierMapping() (*GetModifierMappingReply, os.Error) {
	return c.GetModifierMappingReply(c.GetModifierMappingRequest())
}

type GetModifierMappingReply struct {
	KeycodesPerModifier	byte;
	Keycodes		[]byte;
}

func (c *Conn) GetModifierMappingReply(cookie Cookie) (*GetModifierMappingReply, os.Error) {
	b, error := c.waitForReply(cookie);
	if error != nil {
		return nil, error
	}
	v := new(GetModifierMappingReply);
	v.KeycodesPerModifier = b[1];
	offset := 32;
	v.Keycodes = make([]byte, (int(v.KeycodesPerModifier) * 8));
	copy(v.Keycodes[0:len(v.Keycodes)], b[offset:]);
	offset += len(v.Keycodes) * 1;
	return v, nil;
}

func (c *Conn) NoOperation() {
	b := c.scratch[0:4];
	put16(b[2:], 1);
	b[0] = 127;
	c.sendRequest(b);
}

func parseEvent(buf []byte) (Event, os.Error) {
	switch buf[0] {
	case KeyPress:
		return getKeyPressEvent(buf), nil
	case KeyRelease:
		return getKeyReleaseEvent(buf), nil
	case ButtonPress:
		return getButtonPressEvent(buf), nil
	case ButtonRelease:
		return getButtonReleaseEvent(buf), nil
	case MotionNotify:
		return getMotionNotifyEvent(buf), nil
	case EnterNotify:
		return getEnterNotifyEvent(buf), nil
	case LeaveNotify:
		return getLeaveNotifyEvent(buf), nil
	case FocusIn:
		return getFocusInEvent(buf), nil
	case FocusOut:
		return getFocusOutEvent(buf), nil
	case KeymapNotify:
		return getKeymapNotifyEvent(buf), nil
	case Expose:
		return getExposeEvent(buf), nil
	case GraphicsExposure:
		return getGraphicsExposureEvent(buf), nil
	case NoExposure:
		return getNoExposureEvent(buf), nil
	case VisibilityNotify:
		return getVisibilityNotifyEvent(buf), nil
	case CreateNotify:
		return getCreateNotifyEvent(buf), nil
	case DestroyNotify:
		return getDestroyNotifyEvent(buf), nil
	case UnmapNotify:
		return getUnmapNotifyEvent(buf), nil
	case MapNotify:
		return getMapNotifyEvent(buf), nil
	case MapRequest:
		return getMapRequestEvent(buf), nil
	case ReparentNotify:
		return getReparentNotifyEvent(buf), nil
	case ConfigureNotify:
		return getConfigureNotifyEvent(buf), nil
	case ConfigureRequest:
		return getConfigureRequestEvent(buf), nil
	case GravityNotify:
		return getGravityNotifyEvent(buf), nil
	case ResizeRequest:
		return getResizeRequestEvent(buf), nil
	case CirculateNotify:
		return getCirculateNotifyEvent(buf), nil
	case CirculateRequest:
		return getCirculateRequestEvent(buf), nil
	case PropertyNotify:
		return getPropertyNotifyEvent(buf), nil
	case SelectionClear:
		return getSelectionClearEvent(buf), nil
	case SelectionRequest:
		return getSelectionRequestEvent(buf), nil
	case SelectionNotify:
		return getSelectionNotifyEvent(buf), nil
	case ColormapNotify:
		return getColormapNotifyEvent(buf), nil
	case ClientMessage:
		return getClientMessageEvent(buf), nil
	case MappingNotify:
		return getMappingNotifyEvent(buf), nil
	}
	return nil, os.NewError("unknown event type");
}

var errorNames = map[byte]string{
	BadRequest: "Request",
	BadValue: "Value",
	BadWindow: "Window",
	BadPixmap: "Pixmap",
	BadAtom: "Atom",
	BadCursor: "Cursor",
	BadFont: "Font",
	BadMatch: "Match",
	BadDrawable: "Drawable",
	BadAccess: "Access",
	BadAlloc: "Alloc",
	BadColormap: "Colormap",
	BadGContext: "GContext",
	BadIDChoice: "IDChoice",
	BadName: "Name",
	BadLength: "Length",
	BadImplementation: "Implementation",
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.