wm/vend/xgbutil/scripts/write-events

126 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python2.7
import sys
events = [
('xproto', 'KeyPressEvent'),
('xproto', 'KeyReleaseEvent'),
('xproto', 'ButtonPressEvent'),
('xproto', 'ButtonReleaseEvent'),
('xproto', 'MotionNotifyEvent'),
('xproto', 'EnterNotifyEvent'),
('xproto', 'LeaveNotifyEvent'),
('xproto', 'FocusInEvent'),
('xproto', 'FocusOutEvent'),
('xproto', 'KeymapNotifyEvent'),
('xproto', 'ExposeEvent'),
('xproto', 'GraphicsExposureEvent'),
('xproto', 'NoExposureEvent'),
('xproto', 'VisibilityNotifyEvent'),
('xproto', 'CreateNotifyEvent'),
('xproto', 'DestroyNotifyEvent'),
('xproto', 'UnmapNotifyEvent'),
('xproto', 'MapNotifyEvent'),
('xproto', 'MapRequestEvent'),
('xproto', 'ReparentNotifyEvent'),
('xproto', 'ConfigureNotifyEvent'),
('xproto', 'ConfigureRequestEvent'),
('xproto', 'GravityNotifyEvent'),
('xproto', 'ResizeRequestEvent'),
('xproto', 'CirculateNotifyEvent'),
('xproto', 'CirculateRequestEvent'),
('xproto', 'PropertyNotifyEvent'),
('xproto', 'SelectionClearEvent'),
('xproto', 'SelectionRequestEvent'),
('xproto', 'SelectionNotifyEvent'),
('xproto', 'ColormapNotifyEvent'),
('xproto', 'ClientMessageEvent'),
('xproto', 'MappingNotifyEvent'),
# X Shape extension events
('shape', 'NotifyEvent'),
]
assert len(sys.argv) == 2
if sys.argv[1] == 'evtypes':
print 'package xevent'
print '''/*
Defines event types and their associated methods automatically.
This file is automatically generated using `scripts/write-events evtypes`.
Edit it at your peril.
*/'''
print
print 'import ('
print '\t"fmt"'
print
print '\t"github.com/jezek/xgb/shape"'
print '\t"github.com/jezek/xgb/xproto"'
print ')'
print
for ext, e in events:
# Skip ClientMessageEvent and ConfigureNotifyEvent
# We define these manually in xevents/types_manual.go
if e in ('ClientMessageEvent', 'ConfigureNotifyEvent'):
continue
if ext == 'xproto':
print 'type %s struct {' % e
print ' *%s.%s' % (ext, e)
print '}'
print
print 'const %s = %s.%s' % (e[:-5], ext, e[:-5])
print
print 'func (ev %s) String() string {' % e
print ' return fmt.Sprintf("%%v", ev.%s)' % e
print '}'
print
else:
print 'type %s%s struct {' % (ext.title(), e)
print ' *%s.%s' % (ext, e)
print '}'
print
print 'const %s%s = %s.%s' % (ext.title(), e[:-5], ext, e[:-5])
print
print 'func (ev %s%s) String() string {' % (ext.title(), e)
print ' return fmt.Sprintf("%%v", ev.%s)' % e
print '}'
print
elif sys.argv[1] == 'callbacks':
print 'package xevent'
print '''/*
Does all the plumbing to allow a simple callback interface for users.
This file is automatically generated using `scripts/write-events callbacks`.
Edit it at your peril.
*/'''
print
print 'import ('
print '\t"github.com/jezek/xgb/xproto"'
print
print '\t"github.com/jezek/xgbutil"'
print ')'
print
for ext, e in events:
e = e[:-5]
if ext != 'xproto':
e = '%s%s' % (ext.title(), e)
print 'type %sFun func(xu *xgbutil.XUtil, event %sEvent)' % (e, e)
print
print 'func (callback %sFun) '\
'Connect(xu *xgbutil.XUtil,\nwin xproto.Window) {' % e
print ' attachCallback(xu, %s, win, callback)' % e
print '}'
print
print 'func (callback %sFun) ' \
'Run(xu *xgbutil.XUtil, event interface{}) {' % e
print ' callback(xu, event.(%sEvent))' % e
print '}'
print