diff --git a/events.c b/events.c index 8e7b9e2..fbd6706 100644 --- a/events.c +++ b/events.c @@ -28,8 +28,6 @@ void on_keypress(app_t*, XEvent*); void on_configurenotify(app_t*, XEvent*); void on_expose(app_t*, XEvent*); -extern Display *dpy; - static void (*handler[LASTEvent])(app_t*, XEvent*) = { [Expose] = on_expose, [ConfigureNotify] = on_configurenotify, @@ -39,7 +37,7 @@ static void (*handler[LASTEvent])(app_t*, XEvent*) = { void event_loop(app_t *app) { XEvent ev; - while (!XNextEvent(dpy, &ev)) { + while (!XNextEvent(app->win.env.dpy, &ev)) { if (handler[ev.type]) handler[ev.type](app, &ev); } @@ -53,7 +51,7 @@ void on_keypress(app_t *app, XEvent *ev) { return; kev = &ev->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode) kev->keycode, 0); + keysym = XKeycodeToKeysym(app->win.env.dpy, (KeyCode) kev->keycode, 0); switch (keysym) { case XK_Escape: diff --git a/window.c b/window.c index 649a60d..34c81aa 100644 --- a/window.c +++ b/window.c @@ -24,78 +24,71 @@ #include "sxiv.h" #include "window.h" -Display *dpy; -int scr; -int scrw, scrh; -Visual *vis; -Colormap cmap; -int depth; -GC gc; -XColor bgcol; - void win_open(win_t *win) { + win_env_t *e; XClassHint *classhint; + XColor bgcol; XSetWindowAttributes attr; unsigned long mask; if (!win) return; + + e = &win->env; - if (!(dpy = XOpenDisplay(NULL))) + if (!(e->dpy = XOpenDisplay(NULL))) FATAL("could not open display"); - scr = DefaultScreen(dpy); - scrw = DisplayWidth(dpy, scr); - scrh = DisplayHeight(dpy, scr); + e->scr = DefaultScreen(e->dpy); + e->scrw = DisplayWidth(e->dpy, e->scr); + e->scrh = DisplayHeight(e->dpy, e->scr); - vis = DefaultVisual(dpy, scr); - cmap = DefaultColormap(dpy, scr); - depth = DefaultDepth(dpy, scr); + e->vis = DefaultVisual(e->dpy, e->scr); + e->cmap = DefaultColormap(e->dpy, e->scr); + e->depth = DefaultDepth(e->dpy, e->scr); - if (!XAllocNamedColor(dpy, DefaultColormap(dpy, scr), BG_COLOR, - &bgcol, &bgcol)) + if (!XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR, + &bgcol, &bgcol)) FATAL("could not allocate color: %s", BG_COLOR); - if (win->w > scrw) - win->w = scrw; - if (win->h > scrh) - win->h = scrh; - win->x = (scrw - win->w) / 2; - win->y = (scrh - win->h) / 2; + if (win->w > e->scrw) + win->w = e->scrw; + if (win->h > e->scrh) + win->h = e->scrh; + win->x = (e->scrw - win->w) / 2; + win->y = (e->scrh - win->h) / 2; attr.backing_store = NotUseful; attr.background_pixel = bgcol.pixel; attr.save_under = False; mask = CWBackingStore | CWBackPixel | CWSaveUnder; - win->xwin = XCreateWindow(dpy, RootWindow(dpy, scr), win->x, win->y, - win->w, win->h, 0, depth, InputOutput, vis, mask, &attr); + win->xwin = XCreateWindow(e->dpy, RootWindow(e->dpy, e->scr), + win->x, win->y, win->w, win->h, 0, + e->depth, InputOutput, e->vis, mask, &attr); if (win->xwin == None) FATAL("could not create window"); - XSelectInput(dpy, win->xwin, - StructureNotifyMask | ExposureMask | KeyPressMask); - - gc = XCreateGC(dpy, win->xwin, 0, NULL); + XSelectInput(e->dpy, win->xwin, + StructureNotifyMask | ExposureMask | KeyPressMask); if ((classhint = XAllocClassHint())) { classhint->res_name = "sxvi"; classhint->res_class = "sxvi"; - XSetClassHint(dpy, win->xwin, classhint); + XSetClassHint(e->dpy, win->xwin, classhint); XFree(classhint); } - XMapWindow(dpy, win->xwin); - XFlush(dpy); + XMapWindow(e->dpy, win->xwin); + XFlush(e->dpy); } void win_close(win_t *win) { if (!win) return; - XDestroyWindow(dpy, win->xwin); - XFreeGC(dpy, gc); - XCloseDisplay(dpy); + XDestroyWindow(win->env.dpy, win->xwin); + XCloseDisplay(win->env.dpy); } int win_configure(win_t *win, XConfigureEvent *cev) { @@ -105,7 +98,7 @@ int win_configure(win_t *win, XConfigureEvent *cev) { return 0; changed = win->x != cev->x || win->y != cev->y || - win->w != cev->width || win->h != cev->height; + win->w != cev->width || win->h != cev->height; win->x = cev->x; win->y = cev->y; win->w = cev->width; diff --git a/window.h b/window.h index 5e00256..3a080f0 100644 --- a/window.h +++ b/window.h @@ -21,8 +21,18 @@ #include +typedef struct win_env_s { + Display *dpy; + int scr; + int scrw, scrh; + Visual *vis; + Colormap cmap; + int depth; +} win_env_t; + typedef struct win_s { Window xwin; + win_env_t env; int w; int h;