Move window-related fields to dedicated struct
The first step in allowing dunst to have multiple windows.
This commit is contained in:
parent
ce5c49f0e8
commit
a2863d5312
10
src/dunst.c
10
src/dunst.c
@ -59,19 +59,19 @@ static gboolean run(void *data)
|
||||
|
||||
static gint64 next_timeout = 0;
|
||||
|
||||
if (!xctx.visible && queues_length_displayed() > 0) {
|
||||
if (!xctx.win.visible && queues_length_displayed() > 0) {
|
||||
x_win_show();
|
||||
}
|
||||
|
||||
if (xctx.visible && queues_length_displayed() == 0) {
|
||||
if (xctx.win.visible && queues_length_displayed() == 0) {
|
||||
x_win_hide();
|
||||
}
|
||||
|
||||
if (xctx.visible) {
|
||||
if (xctx.win.visible) {
|
||||
draw();
|
||||
}
|
||||
|
||||
if (xctx.visible) {
|
||||
if (xctx.win.visible) {
|
||||
gint64 now = time_monotonic_now();
|
||||
gint64 sleep = queues_get_next_datachange(now);
|
||||
gint64 timeout_at = now + sleep;
|
||||
@ -190,7 +190,7 @@ int dunst_main(int argc, char *argv[])
|
||||
GSource *x11_source =
|
||||
g_source_new(&x11_source_funcs, sizeof(x11_source_t));
|
||||
((x11_source_t *) x11_source)->dpy = xctx.dpy;
|
||||
((x11_source_t *) x11_source)->w = xctx.win;
|
||||
((x11_source_t *) x11_source)->w = xctx.win.xwin;
|
||||
g_source_add_poll(x11_source, &dpy_pollfd);
|
||||
|
||||
g_source_attach(x11_source, NULL);
|
||||
|
36
src/x11/x.c
36
src/x11/x.c
@ -48,7 +48,7 @@ static void x_win_setup(void);
|
||||
cairo_surface_t *x_create_cairo_surface(void)
|
||||
{
|
||||
return cairo_xlib_surface_create(xctx.dpy,
|
||||
xctx.win, DefaultVisual(xctx.dpy, 0), WIDTH, HEIGHT);
|
||||
xctx.win.xwin, DefaultVisual(xctx.dpy, 0), WIDTH, HEIGHT);
|
||||
}
|
||||
|
||||
void x_win_move(int width, int height)
|
||||
@ -59,7 +59,7 @@ void x_win_move(int width, int height)
|
||||
|
||||
int x, y;
|
||||
screen_info *scr = get_active_screen();
|
||||
xctx.cur_screen = scr->id;
|
||||
xctx.win.cur_screen = scr->id;
|
||||
|
||||
/* calculate window position */
|
||||
if (settings.geometry.negative_x) {
|
||||
@ -76,10 +76,10 @@ void x_win_move(int width, int height)
|
||||
|
||||
/* move and resize */
|
||||
if (x != window_dim.x || y != window_dim.y) {
|
||||
XMoveWindow(xctx.dpy, xctx.win, x, y);
|
||||
XMoveWindow(xctx.dpy, xctx.win.xwin, x, y);
|
||||
}
|
||||
if (width != window_dim.w || height != window_dim.h) {
|
||||
XResizeWindow(xctx.dpy, xctx.win, width, height);
|
||||
XResizeWindow(xctx.dpy, xctx.win.xwin, width, height);
|
||||
}
|
||||
|
||||
window_dim.x = x;
|
||||
@ -189,12 +189,12 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer
|
||||
|
||||
switch (ev.type) {
|
||||
case Expose:
|
||||
if (ev.xexpose.count == 0 && xctx.visible) {
|
||||
if (ev.xexpose.count == 0 && xctx.win.visible) {
|
||||
draw();
|
||||
}
|
||||
break;
|
||||
case ButtonRelease:
|
||||
if (ev.xbutton.window == xctx.win) {
|
||||
if (ev.xbutton.window == xctx.win.xwin) {
|
||||
x_handle_click(ev);
|
||||
wake_up();
|
||||
}
|
||||
@ -250,8 +250,8 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer
|
||||
* same screen. PropertyNotify is only neccessary
|
||||
* to detect a focus change to another screen
|
||||
*/
|
||||
&& xctx.visible
|
||||
&& get_active_screen()->id != xctx.cur_screen) {
|
||||
&& xctx.win.visible
|
||||
&& get_active_screen()->id != xctx.win.cur_screen) {
|
||||
draw();
|
||||
}
|
||||
break;
|
||||
@ -477,7 +477,7 @@ static void x_win_setup(void)
|
||||
ButtonReleaseMask | FocusChangeMask| StructureNotifyMask;
|
||||
|
||||
screen_info *scr = get_active_screen();
|
||||
xctx.win = XCreateWindow(xctx.dpy,
|
||||
xctx.win.xwin = XCreateWindow(xctx.dpy,
|
||||
root,
|
||||
scr->x,
|
||||
scr->y,
|
||||
@ -490,10 +490,10 @@ static void x_win_setup(void)
|
||||
CWOverrideRedirect | CWBackPixmap | CWEventMask,
|
||||
&wa);
|
||||
|
||||
x_set_wm(xctx.win);
|
||||
x_set_wm(xctx.win.xwin);
|
||||
settings.transparency =
|
||||
settings.transparency > 100 ? 100 : settings.transparency;
|
||||
setopacity(xctx.win,
|
||||
setopacity(xctx.win.xwin,
|
||||
(unsigned long)((100 - settings.transparency) *
|
||||
(0xffffffff / 100)));
|
||||
|
||||
@ -509,7 +509,7 @@ static void x_win_setup(void)
|
||||
void x_win_show(void)
|
||||
{
|
||||
/* window is already mapped or there's nothing to show */
|
||||
if (xctx.visible || queues_length_displayed() == 0) {
|
||||
if (xctx.win.visible || queues_length_displayed() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -521,7 +521,7 @@ void x_win_show(void)
|
||||
XGrabButton(xctx.dpy,
|
||||
AnyButton,
|
||||
AnyModifier,
|
||||
xctx.win,
|
||||
xctx.win.xwin,
|
||||
false,
|
||||
BUTTONMASK,
|
||||
GrabModeAsync,
|
||||
@ -532,8 +532,8 @@ void x_win_show(void)
|
||||
LOG_W("Unable to grab mouse button(s).");
|
||||
}
|
||||
|
||||
XMapRaised(xctx.dpy, xctx.win);
|
||||
xctx.visible = true;
|
||||
XMapRaised(xctx.dpy, xctx.win.xwin);
|
||||
xctx.win.visible = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -545,10 +545,10 @@ void x_win_hide(void)
|
||||
x_shortcut_ungrab(&settings.close_all_ks);
|
||||
x_shortcut_ungrab(&settings.context_ks);
|
||||
|
||||
XUngrabButton(xctx.dpy, AnyButton, AnyModifier, xctx.win);
|
||||
XUnmapWindow(xctx.dpy, xctx.win);
|
||||
XUngrabButton(xctx.dpy, AnyButton, AnyModifier, xctx.win.xwin);
|
||||
XUnmapWindow(xctx.dpy, xctx.win.xwin);
|
||||
XFlush(xctx.dpy);
|
||||
xctx.visible = false;
|
||||
xctx.win.visible = false;
|
||||
}
|
||||
|
||||
/*
|
||||
|
12
src/x11/x.h
12
src/x11/x.h
@ -33,11 +33,17 @@ struct dimensions {
|
||||
int h;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
Window xwin;
|
||||
cairo_surface_t *root_surface;
|
||||
int cur_screen;
|
||||
bool visible;
|
||||
struct dimensions dim;
|
||||
} window_x11;
|
||||
|
||||
typedef struct _xctx {
|
||||
Display *dpy;
|
||||
int cur_screen;
|
||||
Window win;
|
||||
bool visible;
|
||||
window_x11 win;
|
||||
const char *colors[3][3];
|
||||
XScreenSaverInfo *screensaver_info;
|
||||
} xctx_t;
|
||||
|
Loading…
x
Reference in New Issue
Block a user