static void PaxWidgetEventProc(ClientData clientData, XEvent *event) { PaxWidget *paxwidget = (PaxWidget *) clientData; if (event->type == Expose || event->type == GraphicsExpose) { handle_expose_event(paxwidget, event); } else if (event->type == ConfigureNotify) { paxWidget_CallMethodArgs(paxwidget->obj, ResizedMethodIdx, Py_BuildValue("ii", event->xconfigure.width, event->xconfigure.height)); } else if (event->type == MapNotify) { paxWidget_CallMethod(paxwidget->obj, MapMethodIdx); } else if (event->type == DestroyNotify) { paxWidget_CallMethod(paxwidget->obj, DestroyMethodIdx); if (paxwidget->tkwin != NULL) { paxwidget->tkwin = NULL; Tcl_DeleteCommand(paxwidget->interp, Tcl_GetCommandName(paxwidget->interp, paxwidget->widget_cmd)); } if (paxwidget->update_pending) { Tk_CancelIdleCall(PaxWidgetDisplay, (ClientData) paxwidget); } Tk_EventuallyFree((ClientData) paxwidget, PaxWidgetDestroy); } else if (event->type > LASTEvent) { paxWidget_CallMethodArgs(paxwidget->obj, ExtensionEventIdx, Py_BuildValue("(i)", event->type)); } }
void main_loop() { XEvent event; XSetErrorHandler(handle_x_error); //Ignore X errors otherwise the WM would crash every other minute :) while(1){ XNextEvent(display, &event); switch(event.type){ case KeyPress: if ((XKeycodeToKeysym(display, event.xkey.keycode, 0) == KEY_PREFIX) && (event.xkey.state & MOD_MASK)) { LOG_DEBUG("Switching to command mode\n"); XDefineCursor(display, selected, (XCreateFontCursor(display, CMD_CURSOR))); handle_keypress_event(&event); } break; case MapRequest: handle_maprequest_event(&event); break; case DestroyNotify: handle_destroy_event(&event); break; case ConfigureNotify: handle_configure_event(&event); break; case Expose: handle_expose_event(&event); break; case PropertyNotify: handle_property_event(&event); break; default: LOG_DEBUG("Received an unhandled event: %d\n", event.type); break; } } }