diff --git a/awesome.c b/awesome.c index cff169fbd..046b08b40 100644 --- a/awesome.c +++ b/awesome.c @@ -89,7 +89,7 @@ awesome_atexit(void) static void scan(void) { - int i, screen, real_screen, tree_c_len; + int i, screen, phys_screen, tree_c_len; const int screen_max = xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); root_win_t root_wins[screen_max]; xcb_query_tree_reply_t *tree_r; @@ -98,20 +98,20 @@ scan(void) xcb_get_geometry_reply_t *geom_r; long state; - for(screen = 0; screen < screen_max; screen++) + for(phys_screen = 0; phys_screen < screen_max; phys_screen++) { /* Get the root window ID associated to this screen */ - root_wins[screen].id = xutil_screen_get(globalconf.connection, screen)->root; + root_wins[phys_screen].id = xutil_screen_get(globalconf.connection, phys_screen)->root; /* Get the window tree associated to this screen */ - root_wins[screen].tree_cookie = xcb_query_tree_unchecked(globalconf.connection, - root_wins[screen].id); + root_wins[phys_screen].tree_cookie = xcb_query_tree_unchecked(globalconf.connection, + root_wins[phys_screen].id); } - for(screen = 0; screen < screen_max; screen++) + for(phys_screen = 0; phys_screen < screen_max; phys_screen++) { tree_r = xcb_query_tree_reply(globalconf.connection, - root_wins[screen].tree_cookie, + root_wins[phys_screen].tree_cookie, NULL); if(!tree_r) @@ -170,10 +170,10 @@ scan(void) *(geom_wins[i]), NULL))) continue; - real_screen = screen_get_bycoord(globalconf.screens_info, screen, - geom_r->x, geom_r->y); + screen = screen_get_bycoord(globalconf.screens_info, phys_screen, + geom_r->x, geom_r->y); - client_manage(wins[i], geom_r, real_screen); + client_manage(wins[i], geom_r, phys_screen, screen); p_delete(&geom_r); } diff --git a/client.c b/client.c index 8e0dc107b..e414e6396 100644 --- a/client.c +++ b/client.c @@ -392,10 +392,11 @@ client_stack(void) /** Manage a new client. * \param w The window. * \param wgeom Window geometry. + * \param phys_screen Physical screen number. * \param screen Virtual screen number where to manage client. */ void -client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen) +client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int phys_screen, int screen) { xcb_get_property_cookie_t ewmh_icon_cookie; client_t *c; @@ -413,7 +414,7 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen) if(systray_iskdedockapp(w)) { - systray_request_handle(w, screen_virttophys(screen), NULL); + systray_request_handle(w, phys_screen, NULL); return; } @@ -421,10 +422,7 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen) c->screen = screen_get_bycoord(globalconf.screens_info, screen, wgeom->x, wgeom->y); - if(globalconf.screens_info->xinerama_is_active) - c->phys_screen = globalconf.default_screen; - else - c->phys_screen = c->screen; + c->phys_screen = phys_screen; /* Initial values */ c->win = w; diff --git a/client.h b/client.h index 58a671160..f2055bcd0 100644 --- a/client.h +++ b/client.h @@ -40,7 +40,7 @@ client_t * client_getbywin(xcb_window_t); void client_stack(void); void client_ban(client_t *); void client_unban(client_t *); -void client_manage(xcb_window_t, xcb_get_geometry_reply_t *, int); +void client_manage(xcb_window_t, xcb_get_geometry_reply_t *, int, int); area_t client_geometry_hints(client_t *, area_t); bool client_resize(client_t *, area_t, bool); void client_unmanage(client_t *); diff --git a/event.c b/event.c index 9ce780eba..107b7dd59 100644 --- a/event.c +++ b/event.c @@ -553,7 +553,7 @@ static int event_handle_maprequest(void *data __attribute__ ((unused)), xcb_connection_t *connection, xcb_map_request_event_t *ev) { - int screen_nbr = 0, ret = 0; + int phys_screen, screen = 0, ret = 0; client_t *c; xcb_get_window_attributes_cookie_t wa_c; xcb_get_window_attributes_reply_t *wa_r; @@ -592,36 +592,35 @@ event_handle_maprequest(void *data __attribute__ ((unused)), geom_c = xcb_get_geometry_unchecked(connection, ev->window); if(globalconf.screens_info->xinerama_is_active) - qp_c = xcb_query_pointer_unchecked(connection, xutil_screen_get(globalconf.connection, - screen_nbr)->root); + qp_c = xcb_query_pointer_unchecked(connection, + xutil_screen_get(globalconf.connection, + globalconf.default_screen)->root); if(!(geom_r = xcb_get_geometry_reply(connection, geom_c, NULL))) { if(globalconf.screens_info->xinerama_is_active) - { qp_r = xcb_query_pointer_reply(connection, qp_c, NULL); - p_delete(&qp_r); - } ret = -1; goto bailout; } + + for(iter = xcb_setup_roots_iterator(xcb_get_setup(connection)), phys_screen = 0; + iter.rem && iter.data->root != geom_r->root; xcb_screen_next(&iter), ++phys_screen); + if(globalconf.screens_info->xinerama_is_active && (qp_r = xcb_query_pointer_reply(connection, qp_c, NULL))) - { - screen_nbr = screen_get_bycoord(globalconf.screens_info, screen_nbr, - qp_r->root_x, qp_r->root_y); - p_delete(&qp_r); - } + screen = screen_get_bycoord(globalconf.screens_info, screen, + qp_r->root_x, qp_r->root_y); else - for(iter = xcb_setup_roots_iterator(xcb_get_setup(connection)), screen_nbr = 0; - iter.rem && iter.data->root != geom_r->root; xcb_screen_next (&iter), ++screen_nbr); + screen = phys_screen; - client_manage(ev->window, geom_r, screen_nbr); + client_manage(ev->window, geom_r, phys_screen, screen); p_delete(&geom_r); } bailout: + p_delete(&qp_r); p_delete(&wa_r); return ret; }