# Xlib.protocol.event -- definitions of core events
#
#    Copyright (C) 2000-2002 Peter Liljenberg <petli@ctrl-c.liu.se>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public License
# as published by the Free Software Foundation; either version 2.1
# of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
#    Free Software Foundation, Inc.,
#    59 Temple Place,
#    Suite 330,
#    Boston, MA 02111-1307 USA


# Xlib modules
from .. import X

# Xlib.protocol modules
from . import rq


class AnyEvent(rq.Event):
    _code = None
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Card8('detail'),
                         rq.Card16('sequence_number'),
                         rq.FixedBinary('data', 28),
                         )

class KeyButtonPointer(rq.Event):
    _code = None
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Card8('detail'),
                         rq.Card16('sequence_number'),
                         rq.Card32('time'),
                         rq.Window('root'),
                         rq.Window('window'),
                         rq.Window('child', (X.NONE, )),
                         rq.Int16('root_x'),
                         rq.Int16('root_y'),
                         rq.Int16('event_x'),
                         rq.Int16('event_y'),
                         rq.Card16('state'),
                         rq.Card8('same_screen'),
                         rq.Pad(1),
                         )

class KeyPress(KeyButtonPointer):
    _code = X.KeyPress

class KeyRelease(KeyButtonPointer):
    _code = X.KeyRelease

class ButtonPress(KeyButtonPointer):
    _code = X.ButtonPress

class ButtonRelease(KeyButtonPointer):
    _code = X.ButtonRelease

class MotionNotify(KeyButtonPointer):
    _code = X.MotionNotify

class EnterLeave(rq.Event):
    _code = None
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Card8('detail'),
                         rq.Card16('sequence_number'),
                         rq.Card32('time'),
                         rq.Window('root'),
                         rq.Window('window'),
                         rq.Window('child', (X.NONE, )),
                         rq.Int16('root_x'),
                         rq.Int16('root_y'),
                         rq.Int16('event_x'),
                         rq.Int16('event_y'),
                         rq.Card16('state'),
                         rq.Card8('mode'),
                         rq.Card8('flags'),
                         )

class EnterNotify(EnterLeave):
    _code = X.EnterNotify

class LeaveNotify(EnterLeave):
    _code = X.LeaveNotify


class Focus(rq.Event):
    _code = None
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Card8('detail'),
                         rq.Card16('sequence_number'),
                         rq.Window('window'),
                         rq.Card8('mode'),
                         rq.Pad(23),
                         )

class FocusIn(Focus):
    _code = X.FocusIn

class FocusOut(Focus):
    _code = X.FocusOut

class Expose(rq.Event):
    _code = X.Expose
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('window'),
                         rq.Card16('x'),
                         rq.Card16('y'),
                         rq.Card16('width'),
                         rq.Card16('height'),
                         rq.Card16('count'),
                         rq.Pad(14),
                         )

class GraphicsExpose(rq.Event):
    _code = X.GraphicsExpose
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Drawable('drawable'),
                         rq.Card16('x'),
                         rq.Card16('y'),
                         rq.Card16('width'),
                         rq.Card16('height'),
                         rq.Card16('minor_event'),
                         rq.Card16('count'),
                         rq.Card8('major_event'),
                         rq.Pad(11),
                         )

class NoExpose(rq.Event):
    _code = X.NoExpose
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Drawable('window'),
                         rq.Card16('minor_event'),
                         rq.Card8('major_event'),
                         rq.Pad(21),
                         )

class VisibilityNotify(rq.Event):
    _code = X.VisibilityNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('window'),
                         rq.Card8('state'),
                         rq.Pad(23),
                         )

class CreateNotify(rq.Event):
    _code = X.CreateNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('parent'),
                         rq.Window('window'),
                         rq.Int16('x'),
                         rq.Int16('y'),
                         rq.Card16('width'),
                         rq.Card16('height'),
                         rq.Card16('border_width'),
                         rq.Card8('override'),
                         rq.Pad(9),
                         )

class DestroyNotify(rq.Event):
    _code = X.DestroyNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('event'),
                         rq.Window('window'),
                         rq.Pad(20),
                         )

class UnmapNotify(rq.Event):
    _code = X.UnmapNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('event'),
                         rq.Window('window'),
                         rq.Card8('from_configure'),
                         rq.Pad(19),
                         )

class MapNotify(rq.Event):
    _code = X.MapNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('event'),
                         rq.Window('window'),
                         rq.Card8('override'),
                         rq.Pad(19),
                         )

class MapRequest(rq.Event):
    _code = X.MapRequest
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('parent'),
                         rq.Window('window'),
                         rq.Pad(20),
                         )

class ReparentNotify(rq.Event):
    _code = X.ReparentNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('event'),
                         rq.Window('window'),
                         rq.Window('parent'),
                         rq.Int16('x'),
                         rq.Int16('y'),
                         rq.Card8('override'),
                         rq.Pad(11),
                         )

class ConfigureNotify(rq.Event):
    _code = X.ConfigureNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('event'),
                         rq.Window('window'),
                         rq.Window('above_sibling', (X.NONE, )),
                         rq.Int16('x'),
                         rq.Int16('y'),
                         rq.Card16('width'),
                         rq.Card16('height'),
                         rq.Card16('border_width'),
                         rq.Card8('override'),
                         rq.Pad(5),
                         )

class ConfigureRequest(rq.Event):
    _code = X.ConfigureRequest
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Card8('stack_mode'),
                         rq.Card16('sequence_number'),
                         rq.Window('parent'),
                         rq.Window('window'),
                         rq.Window('sibling', (X.NONE, )),
                         rq.Int16('x'),
                         rq.Int16('y'),
                         rq.Card16('width'),
                         rq.Card16('height'),
                         rq.Card16('border_width'),
                         rq.Card16('value_mask'),
                         rq.Pad(4),
                         )

class GravityNotify(rq.Event):
    _code = X.GravityNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('event'),
                         rq.Window('window'),
                         rq.Int16('x'),
                         rq.Int16('y'),
                         rq.Pad(16),
                         )

class ResizeRequest(rq.Event):
    _code = X.ResizeRequest
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('window'),
                         rq.Card16('width'),
                         rq.Card16('height'),
                         rq.Pad(20),
                         )

class Circulate(rq.Event):
    _code = None
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('event'),
                         rq.Window('window'),
                         rq.Pad(4),
                         rq.Card8('place'),
                         rq.Pad(15),
                         )

class CirculateNotify(Circulate):
    _code = X.CirculateNotify

class CirculateRequest(Circulate):
    _code = X.CirculateRequest

class PropertyNotify(rq.Event):
    _code = X.PropertyNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('window'),
                         rq.Card32('atom'),
                         rq.Card32('time'),
                         rq.Card8('state'),
                         rq.Pad(15),
                         )

class SelectionClear(rq.Event):
    _code = X.SelectionClear
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Card32('time'),
                         rq.Window('window'),
                         rq.Card32('atom'),
                         rq.Pad(16),
                         )

class SelectionRequest(rq.Event):
    _code = X.SelectionRequest
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Card32('time'),
                         rq.Window('owner'),
                         rq.Window('requestor'),
                         rq.Card32('selection'),
                         rq.Card32('target'),
                         rq.Card32('property'),
                         rq.Pad(4),
                         )

class SelectionNotify(rq.Event):
    _code = X.SelectionNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Card32('time'),
                         rq.Window('requestor'),
                         rq.Card32('selection'),
                         rq.Card32('target'),
                         rq.Card32('property'),
                         rq.Pad(8),
                         )

class ColormapNotify(rq.Event):
    _code = X.ColormapNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Window('window'),
                         rq.Colormap('colormap', (X.NONE, )),
                         rq.Card8('new'),
                         rq.Card8('state'),
                         rq.Pad(18),
                         )

class MappingNotify(rq.Event):
    _code = X.MappingNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Pad(1),
                         rq.Card16('sequence_number'),
                         rq.Card8('request'),
                         rq.Card8('first_keycode'),
                         rq.Card8('count'),
                         rq.Pad(25),
                         )

class ClientMessage(rq.Event):
    _code = X.ClientMessage
    _fields = rq.Struct( rq.Card8('type'),
                         rq.Format('data', 1),
                         rq.Card16('sequence_number'),
                         rq.Window('window'),
                         rq.Card32('client_type'),
                         rq.FixedPropertyData('data', 20),
                         )

class KeymapNotify(rq.Event):
    _code = X.KeymapNotify
    _fields = rq.Struct( rq.Card8('type'),
                         rq.FixedList('data', 31, rq.Card8Obj, pad = 0)
                         )


event_class = {
    X.KeyPress:         KeyPress,
    X.KeyRelease:       KeyRelease,
    X.ButtonPress:      ButtonPress,
    X.ButtonRelease:    ButtonRelease,
    X.MotionNotify:     MotionNotify,
    X.EnterNotify:      EnterNotify,
    X.LeaveNotify:      LeaveNotify,
    X.FocusIn:          FocusIn,
    X.FocusOut:         FocusOut,
    X.KeymapNotify:     KeymapNotify,
    X.Expose:           Expose,
    X.GraphicsExpose:   GraphicsExpose,
    X.NoExpose:         NoExpose,
    X.VisibilityNotify: VisibilityNotify,
    X.CreateNotify:     CreateNotify,
    X.DestroyNotify:    DestroyNotify,
    X.UnmapNotify:      UnmapNotify,
    X.MapNotify:        MapNotify,
    X.MapRequest:       MapRequest,
    X.ReparentNotify:   ReparentNotify,
    X.ConfigureNotify:  ConfigureNotify,
    X.ConfigureRequest: ConfigureRequest,
    X.GravityNotify:    GravityNotify,
    X.ResizeRequest:    ResizeRequest,
    X.CirculateNotify:  CirculateNotify,
    X.CirculateRequest: CirculateRequest,
    X.PropertyNotify:   PropertyNotify,
    X.SelectionClear:   SelectionClear,
    X.SelectionRequest: SelectionRequest,
    X.SelectionNotify:  SelectionNotify,
    X.ColormapNotify:   ColormapNotify,
    X.ClientMessage:    ClientMessage,
    X.MappingNotify:    MappingNotify,
    }
