Move positioning logic out of x_win_move

This commit is contained in:
Nikos Tsipinakis 2018-03-25 20:08:37 +03:00
parent 4faa9cbaaa
commit f513d8417f
3 changed files with 43 additions and 28 deletions

View File

@ -479,6 +479,31 @@ static struct dimensions layout_render(cairo_t *c, colored_layout *cl, colored_l
return dim; return dim;
} }
/**
* Calculates the position the window should be placed at given its width and
* height and stores them in \p ret_x and \p ret_y.
*/
static void calc_window_pos(int width, int height, int *ret_x, int *ret_y)
{
screen_info *scr = get_active_screen();
if (ret_x) {
if (settings.geometry.negative_x) {
*ret_x = (scr->x + (scr->w - width)) + settings.geometry.x;
} else {
*ret_x = scr->x + settings.geometry.x;
}
}
if (ret_y) {
if (settings.geometry.negative_y) {
*ret_y = scr->y + (scr->h + settings.geometry.y) - height;
} else {
*ret_y = scr->y + settings.geometry.y;
}
}
}
void draw(void) void draw(void)
{ {
@ -487,12 +512,14 @@ void draw(void)
struct dimensions dim = calculate_dimensions(layouts); struct dimensions dim = calculate_dimensions(layouts);
int width = dim.w; int width = dim.w;
int height = dim.h; int height = dim.h;
int win_x, win_y;
cairo_t *c; cairo_t *c;
cairo_surface_t *image_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_surface_t *image_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
c = cairo_create(image_surface); c = cairo_create(image_surface);
x_win_move(width, height); calc_window_pos(dim.w, dim.h, &win_x, &win_y);
x_win_move(win_x, win_y, width, height);
cairo_xlib_surface_set_size(root_surface, width, height); cairo_xlib_surface_set_size(root_surface, width, height);
cairo_move_to(c, 0, 0); cairo_move_to(c, 0, 0);

View File

@ -51,42 +51,27 @@ cairo_surface_t *x_create_cairo_surface(void)
xctx.win.xwin, DefaultVisual(xctx.dpy, 0), WIDTH, HEIGHT); xctx.win.xwin, DefaultVisual(xctx.dpy, 0), WIDTH, HEIGHT);
} }
void x_win_move(int width, int height) void x_win_move(int x, int y, int width, int height)
{ {
// Previous dimensions of the window to avoid calling X11 if no change // Previous dimensions of the window to avoid calling X11 if no change
// is needed // is needed
static struct dimensions window_dim = { 0 }; static struct dimensions window_dim = { 0 };
int x, y;
screen_info *scr = get_active_screen();
xctx.win.cur_screen = scr->id;
/* calculate window position */
if (settings.geometry.negative_x) {
x = (scr->x + (scr->w - width)) + settings.geometry.x;
} else {
x = scr->x + settings.geometry.x;
}
if (settings.geometry.negative_y) {
y = scr->y + (scr->h + settings.geometry.y) - height;
} else {
y = scr->y + settings.geometry.y;
}
/* move and resize */ /* move and resize */
if (x != window_dim.x || y != window_dim.y) { if (x != window_dim.x || y != window_dim.y) {
XMoveWindow(xctx.dpy, xctx.win.xwin, x, y); XMoveWindow(xctx.dpy, xctx.win.xwin, x, y);
}
if (width != window_dim.w || height != window_dim.h) {
XResizeWindow(xctx.dpy, xctx.win.xwin, width, height);
}
window_dim.x = x; window_dim.x = x;
window_dim.y = y; window_dim.y = y;
}
if (width != window_dim.w || height != window_dim.h) {
XResizeWindow(xctx.dpy, xctx.win.xwin, width, height);
window_dim.h = height; window_dim.h = height;
window_dim.w = width; window_dim.w = width;
} }
}
static void setopacity(Window win, unsigned long opacity) static void setopacity(Window win, unsigned long opacity)
{ {
@ -181,6 +166,7 @@ gboolean x_mainloop_fd_check(GSource *source)
gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)
{ {
bool fullscreen_now; bool fullscreen_now;
screen_info *scr;
XEvent ev; XEvent ev;
unsigned int state; unsigned int state;
while (XPending(xctx.dpy) > 0) { while (XPending(xctx.dpy) > 0) {
@ -241,6 +227,7 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer
break; break;
case PropertyNotify: case PropertyNotify:
fullscreen_now = have_fullscreen_window(); fullscreen_now = have_fullscreen_window();
scr = get_active_screen();
if (fullscreen_now != fullscreen_last) { if (fullscreen_now != fullscreen_last) {
fullscreen_last = fullscreen_now; fullscreen_last = fullscreen_now;
@ -251,8 +238,9 @@ gboolean x_mainloop_fd_dispatch(GSource *source, GSourceFunc callback, gpointer
* to detect a focus change to another screen * to detect a focus change to another screen
*/ */
&& xctx.win.visible && xctx.win.visible
&& get_active_screen()->id != xctx.win.cur_screen) { && scr->id != xctx.win.cur_screen) {
draw(); draw();
xctx.win.cur_screen = scr->id;
} }
break; break;
default: default:

View File

@ -57,7 +57,7 @@ typedef struct _color_t {
extern xctx_t xctx; extern xctx_t xctx;
/* window */ /* window */
void x_win_move(int width, int height); void x_win_move(int x, int y, int width, int height);
void x_win_hide(void); void x_win_hide(void);
void x_win_show(void); void x_win_show(void);