Code generator: Add support for XGE events

This also pretends that XKB has XGE events since that extension has its own
event multiplexing.

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2015-04-04 17:14:24 +02:00
parent 5cf2876228
commit a66bb6b232
2 changed files with 22 additions and 6 deletions

View file

@ -30,9 +30,11 @@
struct static_extension_info_t { struct static_extension_info_t {
uint16_t num_minor; uint16_t num_minor;
uint16_t num_xge_events;
uint8_t num_events; uint8_t num_events;
uint8_t num_errors; uint8_t num_errors;
const char *strings_minor; const char *strings_minor;
const char *strings_xge_events;
const char *strings_events; const char *strings_events;
const char *strings_errors; const char *strings_errors;
const char *name; const char *name;

View file

@ -7,6 +7,7 @@ class Module(object):
self.errors = {} self.errors = {}
self.requests = {} self.requests = {}
self.events = {} self.events = {}
self.xge_events = {}
root = parse(filename).getroot() root = parse(filename).getroot()
if root.get("header") == "xproto": if root.get("header") == "xproto":
@ -26,20 +27,32 @@ class Module(object):
if tag == "error" or tag == "errorcopy": if tag == "error" or tag == "errorcopy":
self.errors[number] = name self.errors[number] = name
else: else:
if elt.get("xge") == "true": is_xge = elt.get("xge") == "true"
print("%s: XGE event %s not handled correctly" % (self.name, name)) if tag == "eventcopy" and elt.get("ref") in self.xge_events.values():
is_xge = True
if is_xge:
self.xge_events[number] = name
else:
self.events[number] = name self.events[number] = name
elif tag == "request": elif tag == "request":
name = elt.get("name") name = elt.get("name")
opcode = int(elt.get("opcode")) opcode = int(elt.get("opcode"))
self.requests[opcode] = name self.requests[opcode] = name
# Special case for XKB: It does its own event multiplexing, but this
# library internally pretends it uses XGE.
if self.name == "xkb":
self.xge_events = self.events
self.events = { 0: "XKB base event" }
if not self.is_ext:
self.events[35] = "GeGeneric"
self.xge_events = {}
self.errors_table = self.handle_type("error", self.errors) self.errors_table = self.handle_type("error", self.errors)
self.requests_table = self.handle_type("request", self.requests) self.requests_table = self.handle_type("request", self.requests)
self.events_table = self.handle_type("event", self.events) self.events_table = self.handle_type("event", self.events)
if self.name == "xkb": self.xge_events_table = self.handle_type("xge event", self.xge_events)
# FIXME: This should be fixed in the xml instead
self.events_table = [ "XKB base event" ]
def handle_type(self, kind, entries): def handle_type(self, kind, entries):
# Do we have any entries at all? # Do we have any entries at all?
@ -104,6 +117,7 @@ def emit_module(module):
output.write("%sconst struct static_extension_info_t %s%s_info = { // %s\n" % (t, prefix, module.name, module.xname)) output.write("%sconst struct static_extension_info_t %s%s_info = { // %s\n" % (t, prefix, module.name, module.xname))
format_strings("minor", module.requests_table) format_strings("minor", module.requests_table)
format_strings("events", module.events_table) format_strings("events", module.events_table)
format_strings("xge_events", module.xge_events_table)
format_strings("errors", module.errors_table) format_strings("errors", module.errors_table)
output.write("\t.name = \"%s\",\n" % module.name) output.write("\t.name = \"%s\",\n" % module.name)
output.write("};\n\n") output.write("};\n\n")