mirror of
https://github.com/golang/go
synced 2024-11-20 08:34:41 -07:00
598f3e284e
The python script needs a checkout of xcb/proto to generate an xproto.go file, which together with xgb.go provide functions to access all of the core X11 protocol requests. I have included the generated file. Extensions and authentication methods are not implemented. R=r, rsc, nigeltao_golang https://golang.org/cl/162053
4154 lines
91 KiB
Go
4154 lines
91 KiB
Go
// 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",
|
|
}
|