+
+
+static void
+xlockmore_reshape (Display *dpy, Window window, void *closure,
+ unsigned int w, unsigned int h)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ if (mi && mi->xlmft->hack_reshape)
+ {
+ XGetWindowAttributes (dpy, window, &mi->xgwa);
+ mi->xlmft->hack_reshape (mi, mi->xgwa.width, mi->xgwa.height);
+ }
+}
+
+static Bool
+xlockmore_event (Display *dpy, Window window, void *closure, XEvent *event)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ if (mi && mi->xlmft->hack_handle_events)
+ return mi->xlmft->hack_handle_events (mi, event);
+ else
+ return False;
+}
+
+void
+xlockmore_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure)
+{
+ ModeInfo *mi = (ModeInfo *) closure;
+ fps_compute (fpst, 0, mi ? mi->recursion_depth : -1);
+ fps_draw (fpst);
+}
+
+
+static void
+xlockmore_free (Display *dpy, Window window, void *closure)
+{
+ /* Most of the xlockmore/GL hacks don't have `free' functions, and of
+ those that do have them, they're incomplete or buggy. So, fuck it.
+ Under X11, we're about to exit anyway, and it doesn't matter.
+ On OSX, we'll leak a little. Beats crashing.
+ */
+#if 0
+ ModeInfo *mi = (ModeInfo *) closure;
+ if (mi->xlmft->hack_free)
+ mi->xlmft->hack_free (mi);
+
+ XFreeGC (dpy, mi->gc);
+ free_colors (dpy, mi->xgwa.colormap, mi->colors, mi->npixels);
+ free (mi->colors);
+ free (mi->pixels);
+
+ free (mi);
+#endif
+}
+