#!/usr/bin/python3

import pykms
import selectors
import sys

def readdrm(fileobj, mask):
    for ev in card.read_events():
        ev.data(ev)

def waitevent(sel):
    events = sel.select(1)
    if not events:
        print("Error: timeout receiving event")
    else:
        for key, mask in events:
            key.data(key.fileobj, mask)

def eventhandler(event):
    print("Received %s event successfully (seq %d time %f)" %
          (event.type, event.seq, event.time))

card = pykms.Card()
sel = selectors.DefaultSelector()
sel.register(card.fd, selectors.EVENT_READ, readdrm)

res = pykms.ResourceManager(card)
conn = res.reserve_connector()
crtc = res.reserve_crtc(conn)
pplane = res.reserve_primary_plane(crtc)

mode = conn.get_default_mode()
modeb = mode.to_blob(card)

for format in pplane.formats:
    if format == pykms.PixelFormat.XRGB8888:
        break
    if format == pykms.PixelFormat.RGB565:
        break

fb = pykms.DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, format);
pykms.draw_test_pattern(fb);

# Disable request
card.disable_planes()

print("Setting %s to %s using %s" % (conn.fullname, mode.name, format))

req = pykms.AtomicReq(card)

req.add(conn, "CRTC_ID", crtc.id)
req.add(crtc, {"ACTIVE": 1,
               "MODE_ID": modeb.id})
req.add(pplane, {"FB_ID": fb.id,
                 "CRTC_ID": crtc.id,
                 "SRC_X": 0 << 16,
                 "SRC_Y": 0 << 16,
                 "SRC_W": mode.hdisplay << 16,
                 "SRC_H": mode.vdisplay << 16,
                 "CRTC_X": 0,
                 "CRTC_Y": 0,
                 "CRTC_W": mode.hdisplay,
                 "CRTC_H": mode.vdisplay})

ret = req.test(True)
if ret != 0:
    print("Atomic test failed: %d" % ret)
    sys.exit()

req.commit(eventhandler, allow_modeset = True)
waitevent(sel)

input("press enter to exit\n")

Add modeset_event.py