diff --git a/awesome.c b/awesome.c index 0649c649..3fe05dff 100644 --- a/awesome.c +++ b/awesome.c @@ -66,19 +66,11 @@ typedef struct void awesome_atexit(void) { - int screen_nbr, nscreens; - signal_object_emit(globalconf.L, &global_signals, "exit", 0); a_dbus_cleanup(); - /* do this only for real screen */ - const xcb_setup_t *setup = xcb_get_setup(globalconf.connection); - nscreens = setup ? xcb_setup_roots_length(setup) : -1; - for(screen_nbr = 0; - screen_nbr < nscreens; - screen_nbr++) - systray_cleanup(screen_nbr); + systray_cleanup(); /* Close Lua */ lua_close(globalconf.L); @@ -96,89 +88,82 @@ awesome_atexit(void) static void scan(void) { - int i, 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]; + int i, tree_c_len; + root_win_t root_win; xcb_query_tree_reply_t *tree_r; xcb_window_t *wins = NULL; xcb_get_window_attributes_reply_t *attr_r; xcb_get_geometry_reply_t *geom_r; long state; - for(phys_screen = 0; phys_screen < screen_max; phys_screen++) - { - /* Get the root window ID associated to this screen */ - root_wins[phys_screen].id = xutil_screen_get(globalconf.connection, phys_screen)->root; + /* Get the root window ID associated to this screen */ + root_win.id = xutil_screen_get(globalconf.connection, globalconf.default_screen)->root; - /* Get the window tree associated to this screen */ - root_wins[phys_screen].tree_cookie = xcb_query_tree_unchecked(globalconf.connection, - root_wins[phys_screen].id); + /* Get the window tree associated to this screen */ + root_win.tree_cookie = xcb_query_tree_unchecked(globalconf.connection, + root_win.id); + + tree_r = xcb_query_tree_reply(globalconf.connection, + root_win.tree_cookie, + NULL); + + if(!tree_r) + return; + + /* Get the tree of the children windows of the current root window */ + if(!(wins = xcb_query_tree_children(tree_r))) + fatal("cannot get tree children"); + + tree_c_len = xcb_query_tree_children_length(tree_r); + xcb_get_window_attributes_cookie_t attr_wins[tree_c_len]; + xcb_get_property_cookie_t state_wins[tree_c_len]; + + for(i = 0; i < tree_c_len; i++) + { + attr_wins[i] = xcb_get_window_attributes_unchecked(globalconf.connection, + wins[i]); + + state_wins[i] = xwindow_get_state_unchecked(wins[i]); } - for(phys_screen = 0; phys_screen < screen_max; phys_screen++) - { - tree_r = xcb_query_tree_reply(globalconf.connection, - root_wins[phys_screen].tree_cookie, - NULL); + xcb_get_geometry_cookie_t *geom_wins[tree_c_len]; - if(!tree_r) + for(i = 0; i < tree_c_len; i++) + { + attr_r = xcb_get_window_attributes_reply(globalconf.connection, + attr_wins[i], + NULL); + + state = xwindow_get_state_reply(state_wins[i]); + + if(!attr_r || attr_r->override_redirect + || attr_r->map_state == XCB_MAP_STATE_UNMAPPED + || state == XCB_WM_STATE_WITHDRAWN) + { + geom_wins[i] = NULL; + p_delete(&attr_r); + continue; + } + + p_delete(&attr_r); + + /* Get the geometry of the current window */ + geom_wins[i] = p_alloca(xcb_get_geometry_cookie_t, 1); + *(geom_wins[i]) = xcb_get_geometry_unchecked(globalconf.connection, wins[i]); + } + + for(i = 0; i < tree_c_len; i++) + { + if(!geom_wins[i] || !(geom_r = xcb_get_geometry_reply(globalconf.connection, + *(geom_wins[i]), NULL))) continue; - /* Get the tree of the children windows of the current root window */ - if(!(wins = xcb_query_tree_children(tree_r))) - fatal("cannot get tree children"); + client_manage(wins[i], geom_r, true); - tree_c_len = xcb_query_tree_children_length(tree_r); - xcb_get_window_attributes_cookie_t attr_wins[tree_c_len]; - xcb_get_property_cookie_t state_wins[tree_c_len]; - - for(i = 0; i < tree_c_len; i++) - { - attr_wins[i] = xcb_get_window_attributes_unchecked(globalconf.connection, - wins[i]); - - state_wins[i] = xwindow_get_state_unchecked(wins[i]); - } - - xcb_get_geometry_cookie_t *geom_wins[tree_c_len]; - - for(i = 0; i < tree_c_len; i++) - { - attr_r = xcb_get_window_attributes_reply(globalconf.connection, - attr_wins[i], - NULL); - - state = xwindow_get_state_reply(state_wins[i]); - - if(!attr_r || attr_r->override_redirect - || attr_r->map_state == XCB_MAP_STATE_UNMAPPED - || state == XCB_WM_STATE_WITHDRAWN) - { - geom_wins[i] = NULL; - p_delete(&attr_r); - continue; - } - - p_delete(&attr_r); - - /* Get the geometry of the current window */ - geom_wins[i] = p_alloca(xcb_get_geometry_cookie_t, 1); - *(geom_wins[i]) = xcb_get_geometry_unchecked(globalconf.connection, wins[i]); - } - - for(i = 0; i < tree_c_len; i++) - { - if(!geom_wins[i] || !(geom_r = xcb_get_geometry_reply(globalconf.connection, - *(geom_wins[i]), NULL))) - continue; - - client_manage(wins[i], geom_r, phys_screen, true); - - p_delete(&geom_r); - } - - p_delete(&tree_r); + p_delete(&geom_r); } + + p_delete(&tree_r); } static void @@ -283,7 +268,7 @@ int main(int argc, char **argv) { char *confpath = NULL; - int xfd, i, screen_nbr, opt, colors_nbr; + int xfd, i, opt, colors_nbr; xcolor_init_request_t colors_reqs[2]; ssize_t cmdlen = 1; xdgHandle xdg; @@ -408,15 +393,12 @@ main(int argc, char **argv) ev_prepare_start(globalconf.loop, &a_refresh); ev_unref(globalconf.loop); - for(screen_nbr = 0; - screen_nbr < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen_nbr++) { const uint32_t select_input_val = XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT; /* This causes an error if some other window manager is running */ xcb_change_window_attributes(globalconf.connection, - xutil_screen_get(globalconf.connection, screen_nbr)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, XCB_CW_EVENT_MASK, &select_input_val); } @@ -465,13 +447,8 @@ main(int argc, char **argv) &globalconf.modeswitchmask); /* do this only for real screen */ - for(screen_nbr = 0; - screen_nbr < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen_nbr++) - { - ewmh_init(screen_nbr); - systray_init(screen_nbr); - } + ewmh_init(); + systray_init(); /* init spawn (sn) */ spawn_init(); @@ -487,10 +464,6 @@ main(int argc, char **argv) /* scan existing windows */ scan(); - /* do this only for real screen */ - for(screen_nbr = 0; - screen_nbr < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen_nbr++) { /* select for events */ const uint32_t change_win_vals[] = @@ -505,7 +478,7 @@ main(int argc, char **argv) }; xcb_change_window_attributes(globalconf.connection, - xutil_screen_get(globalconf.connection, screen_nbr)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, XCB_CW_EVENT_MASK, change_win_vals); } diff --git a/common/xembed.h b/common/xembed.h index 9ce64f91..3e9d4260 100644 --- a/common/xembed.h +++ b/common/xembed.h @@ -42,7 +42,6 @@ typedef struct xembed_window xembed_window_t; struct xembed_window { xcb_window_t win; - int phys_screen; xembed_info_t info; }; diff --git a/common/xutil.c b/common/xutil.c index 3d80e8d6..3676a3cd 100644 --- a/common/xutil.c +++ b/common/xutil.c @@ -136,21 +136,4 @@ xutil_key_mask_tostr(uint16_t mask, const char **name, size_t *len) } } -/** Convert a root window a physical screen ID. - * \param connection The connection to the X server. - * \param root Root window. - * \return A physical screen number. - */ -int -xutil_root2screen(xcb_connection_t *connection, xcb_window_t root) -{ - xcb_screen_iterator_t iter; - int phys_screen = 0; - - for(iter = xcb_setup_roots_iterator(xcb_get_setup(connection)); - iter.rem && iter.data->root != root; xcb_screen_next(&iter), ++phys_screen); - - return phys_screen; -} - // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/common/xutil.h b/common/xutil.h index 5d9b7598..35e91e76 100644 --- a/common/xutil.h +++ b/common/xutil.h @@ -80,7 +80,5 @@ xutil_screen_get(xcb_connection_t *c, int screen) return s; } -int xutil_root2screen(xcb_connection_t *, xcb_window_t); - #endif // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/draw.c b/draw.c index bf38e448..7bcb262d 100644 --- a/draw.c +++ b/draw.c @@ -126,16 +126,15 @@ draw_text_context_init(draw_text_context_t *data, const char *str, ssize_t slen) * \param bg Background color. */ void -draw_context_init(draw_context_t *d, int phys_screen, +draw_context_init(draw_context_t *d, int width, int height, xcb_pixmap_t px, const xcolor_t *fg, const xcolor_t *bg) { - d->phys_screen = phys_screen; d->width = width; d->height = height; d->pixmap = px; d->surface = cairo_xcb_surface_create(globalconf.connection, - px, globalconf.screens.tab[phys_screen].visual, + px, globalconf.screens.tab[0].visual, width, height); d->cr = cairo_create(d->surface); d->layout = pango_cairo_create_layout(d->cr); @@ -308,10 +307,10 @@ draw_rotate(draw_context_t *ctx, cairo_t *cr; surface = cairo_xcb_surface_create(globalconf.connection, dest, - globalconf.screens.tab[ctx->phys_screen].visual, + globalconf.screens.tab[0].visual, dest_w, dest_h); source = cairo_xcb_surface_create(globalconf.connection, src, - globalconf.screens.tab[ctx->phys_screen].visual, + globalconf.screens.tab[0].visual, src_w, src_h); cr = cairo_create (surface); diff --git a/draw.h b/draw.h index f3e30bfd..1d776cbb 100644 --- a/draw.h +++ b/draw.h @@ -61,7 +61,6 @@ typedef struct xcb_pixmap_t pixmap; uint16_t width; uint16_t height; - int phys_screen; cairo_t *cr; cairo_surface_t *surface; PangoLayout *layout; @@ -69,7 +68,7 @@ typedef struct xcolor_t bg; } draw_context_t; -void draw_context_init(draw_context_t *, int, int, int, +void draw_context_init(draw_context_t *, int, int, xcb_pixmap_t, const xcolor_t *, const xcolor_t *); /** Wipe a draw context. diff --git a/event.c b/event.c index f1ddf717..97ac89ac 100644 --- a/event.c +++ b/event.c @@ -133,8 +133,6 @@ event_handle_mousegrabber(int x, int y, uint16_t mask) static void event_handle_button(xcb_button_press_event_t *ev) { - int screen; - const int nb_screen = xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); client_t *c; wibox_t *wibox; @@ -194,12 +192,11 @@ event_handle_button(xcb_button_press_event_t *ev) XCB_CURRENT_TIME); } else if(ev->child == XCB_NONE) - for(screen = 0; screen < nb_screen; screen++) - if(xutil_screen_get(globalconf.connection, screen)->root == ev->event) - { - event_button_callback(ev, &globalconf.buttons, 0, 0, NULL); - return; - } + if(xutil_screen_get(globalconf.connection, globalconf.default_screen)->root == ev->event) + { + event_button_callback(ev, &globalconf.buttons, 0, 0, NULL); + return; + } } static void @@ -290,16 +287,13 @@ event_handle_configurerequest(xcb_configure_request_event_t *ev) static void event_handle_configurenotify(xcb_configure_notify_event_t *ev) { - int screen_nbr; - const xcb_screen_t *screen; + const xcb_screen_t *screen = xutil_screen_get(globalconf.connection, globalconf.default_screen); - for(screen_nbr = 0; screen_nbr < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); screen_nbr++) - if((screen = xutil_screen_get(globalconf.connection, screen_nbr)) != NULL - && ev->window == screen->root - && (ev->width != screen->width_in_pixels - || ev->height != screen->height_in_pixels)) - /* it's not that we panic, but restart */ - awesome_restart(); + if(ev->window == screen->root + && (ev->width != screen->width_in_pixels + || ev->height != screen->height_in_pixels)) + /* it's not that we panic, but restart */ + awesome_restart(); } /** The destroy notify event handler. @@ -578,7 +572,6 @@ event_handle_key(xcb_key_press_event_t *ev) static void event_handle_maprequest(xcb_map_request_event_t *ev) { - int phys_screen; client_t *c; xcb_get_window_attributes_cookie_t wa_c; xcb_get_window_attributes_reply_t *wa_r; @@ -619,9 +612,7 @@ event_handle_maprequest(xcb_map_request_event_t *ev) goto bailout; } - phys_screen = xutil_root2screen(globalconf.connection, geom_r->root); - - client_manage(ev->window, geom_r, phys_screen, false); + client_manage(ev->window, geom_r, false); p_delete(&geom_r); } @@ -729,16 +720,11 @@ event_handle_mappingnotify(xcb_mapping_notify_event_t *ev) &globalconf.shiftlockmask, &globalconf.capslockmask, &globalconf.modeswitchmask); - int nscreen = xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - /* regrab everything */ - for(int phys_screen = 0; phys_screen < nscreen; phys_screen++) - { - xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); - /* yes XCB_BUTTON_MASK_ANY is also for grab_key even if it's look weird */ - xcb_ungrab_key(globalconf.connection, XCB_GRAB_ANY, s->root, XCB_BUTTON_MASK_ANY); - xwindow_grabkeys(s->root, &globalconf.keys); - } + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); + /* yes XCB_BUTTON_MASK_ANY is also for grab_key even if it's look weird */ + xcb_ungrab_key(globalconf.connection, XCB_GRAB_ANY, s->root, XCB_BUTTON_MASK_ANY); + xwindow_grabkeys(s->root, &globalconf.keys); foreach(_c, globalconf.clients) { @@ -758,7 +744,7 @@ event_handle_reparentnotify(xcb_reparent_notify_event_t *ev) { /* Ignore reparents to the root window, they *might* be caused by * ourselves if a client quickly unmaps and maps itself again. */ - xcb_screen_t *s = xutil_screen_get(globalconf.connection, c->phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); if (ev->parent != s->root) client_unmanage(c); } diff --git a/ewmh.c b/ewmh.c index 4422ff08..880fa980 100644 --- a/ewmh.c +++ b/ewmh.c @@ -98,43 +98,40 @@ ewmh_signal_on_client_new(lua_State *L) } /** Update the desktop geometry. - * \param phys_screen The physical screen id. */ static void -ewmh_update_desktop_geometry(int phys_screen) +ewmh_update_desktop_geometry(void) { - area_t geom = screen_area_get(&globalconf.screens.tab[phys_screen], false); + area_t geom = screen_area_get(&globalconf.screens.tab[0], false); uint32_t sizes[] = { geom.width, geom.height }; xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - xutil_screen_get(globalconf.connection, phys_screen)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, _NET_DESKTOP_GEOMETRY, XCB_ATOM_CARDINAL, 32, countof(sizes), sizes); } static int ewmh_update_net_active_window(lua_State *L) { - client_t *c = luaA_checkudata(L, 1, &client_class); xcb_window_t win; - if(globalconf.screen_focus->client_focus - && globalconf.screen_focus->client_focus->phys_screen == c->phys_screen) + if(globalconf.screen_focus->client_focus) win = globalconf.screen_focus->client_focus->window; else win = XCB_NONE; xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - xutil_screen_get(globalconf.connection, c->phys_screen)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, _NET_ACTIVE_WINDOW, XCB_ATOM_WINDOW, 32, 1, &win); return 0; } void -ewmh_init(int phys_screen) +ewmh_init(void) { xcb_window_t father; - xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, phys_screen); + xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, globalconf.default_screen); xcb_atom_t atom[] = { _NET_SUPPORTED, @@ -211,7 +208,7 @@ ewmh_init(int phys_screen) xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, father, _NET_WM_PID, XCB_ATOM_CARDINAL, 32, 1, &i); - ewmh_update_desktop_geometry(phys_screen); + ewmh_update_desktop_geometry(); lua_pushcfunction(globalconf.L, ewmh_signal_on_client_new); luaA_class_add_signal(globalconf.L, &client_class, "new", -1); @@ -222,7 +219,7 @@ ewmh_init(int phys_screen) } void -ewmh_update_net_client_list(int phys_screen) +ewmh_update_net_client_list(void) { xcb_window_t *wins = p_alloca(xcb_window_t, globalconf.clients.len); @@ -230,68 +227,65 @@ ewmh_update_net_client_list(int phys_screen) foreach(_c, globalconf.clients) { client_t *c = *_c; - if(c->phys_screen == phys_screen) - wins[n++] = c->window; + wins[n++] = c->window; } xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - xutil_screen_get(globalconf.connection, phys_screen)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, _NET_CLIENT_LIST, XCB_ATOM_WINDOW, 32, n, wins); } /** Set the client list in stacking order, bottom to top. - * \param phys_screen The physical screen id. */ void -ewmh_update_net_client_list_stacking(int phys_screen) +ewmh_update_net_client_list_stacking(void) { int n = 0; xcb_window_t *wins = p_alloca(xcb_window_t, globalconf.stack.len); foreach(client, globalconf.stack) - if((*client)->phys_screen == phys_screen) - wins[n++] = (*client)->window; + wins[n++] = (*client)->window; xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - xutil_screen_get(globalconf.connection, phys_screen)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, _NET_CLIENT_LIST_STACKING, XCB_ATOM_WINDOW, 32, n, wins); } void -ewmh_update_net_numbers_of_desktop(int phys_screen) +ewmh_update_net_numbers_of_desktop(void) { - uint32_t count = globalconf.screens.tab[phys_screen].tags.len; + uint32_t count = globalconf.screens.tab[0].tags.len; xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - xutil_screen_get(globalconf.connection, phys_screen)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, _NET_NUMBER_OF_DESKTOPS, XCB_ATOM_CARDINAL, 32, 1, &count); } void -ewmh_update_net_current_desktop(int phys_screen) +ewmh_update_net_current_desktop(void) { - uint32_t idx = tags_get_first_selected_index(&globalconf.screens.tab[phys_screen]); + uint32_t idx = tags_get_first_selected_index(&globalconf.screens.tab[0]); xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - xutil_screen_get(globalconf.connection, phys_screen)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, _NET_CURRENT_DESKTOP, XCB_ATOM_CARDINAL, 32, 1, &idx); } void -ewmh_update_net_desktop_names(int phys_screen) +ewmh_update_net_desktop_names(void) { buffer_t buf; buffer_inita(&buf, BUFSIZ); - foreach(tag, globalconf.screens.tab[phys_screen].tags) + foreach(tag, globalconf.screens.tab[0].tags) { buffer_adds(&buf, tag_get_name(*tag)); buffer_addc(&buf, '\0'); } xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - xutil_screen_get(globalconf.connection, phys_screen)->root, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, _NET_DESKTOP_NAMES, UTF8_STRING, 8, buf.len, buf.s); buffer_wipe(&buf); } @@ -399,16 +393,9 @@ int ewmh_process_client_message(xcb_client_message_event_t *ev) { client_t *c; - int screen; if(ev->type == _NET_CURRENT_DESKTOP) - for(screen = 0; - screen < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen++) - { - if(ev->window == xutil_screen_get(globalconf.connection, screen)->root) - tag_view_only_byindex(&globalconf.screens.tab[screen], ev->data.data32[0]); - } + tag_view_only_byindex(&globalconf.screens.tab[0], ev->data.data32[0]); else if(ev->type == _NET_CLOSE_WINDOW) { if((c = client_getbywin(ev->window))) diff --git a/ewmh.h b/ewmh.h index f8e38182..631f9b58 100644 --- a/ewmh.h +++ b/ewmh.h @@ -25,13 +25,13 @@ #include "globalconf.h" #include "strut.h" -void ewmh_init(int); -void ewmh_update_net_client_list(int); -void ewmh_update_net_numbers_of_desktop(int); -void ewmh_update_net_current_desktop(int); -void ewmh_update_net_desktop_names(int); +void ewmh_init(void); +void ewmh_update_net_client_list(void); +void ewmh_update_net_numbers_of_desktop(void); +void ewmh_update_net_current_desktop(void); +void ewmh_update_net_desktop_names(void); int ewmh_process_client_message(xcb_client_message_event_t *); -void ewmh_update_net_client_list_stacking(int); +void ewmh_update_net_client_list_stacking(void); void ewmh_client_check_hints(client_t *); void ewmh_client_update_desktop(client_t *); void ewmh_process_client_strut(client_t *); diff --git a/mouse.c b/mouse.c index 2a1b95f5..dd80d8d2 100644 --- a/mouse.c +++ b/mouse.c @@ -71,17 +71,12 @@ mouse_query_pointer(xcb_window_t window, int16_t *x, int16_t *y, xcb_window_t *c static bool mouse_query_pointer_root(screen_t **s, int16_t *x, int16_t *y, xcb_window_t *child, uint16_t *mask) { - for(int screen = 0; - screen < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen++) - { - xcb_window_t root = xutil_screen_get(globalconf.connection, screen)->root; + xcb_window_t root = xutil_screen_get(globalconf.connection, globalconf.default_screen)->root; - if(mouse_query_pointer(root, x, y, child, mask)) - { - *s = &globalconf.screens.tab[screen]; - return true; - } + if(mouse_query_pointer(root, x, y, child, mask)) + { + *s = &globalconf.screens.tab[0]; + return true; } return false; } @@ -141,7 +136,7 @@ luaA_mouse_newindex(lua_State *L) const char *attr = luaL_checklstring(L, 2, &len); int x, y = 0; xcb_window_t root; - int screen, phys_screen; + int screen; switch(a_tokenize(attr, len)) { @@ -149,9 +144,7 @@ luaA_mouse_newindex(lua_State *L) screen = luaL_checknumber(L, 3) - 1; luaA_checkscreen(screen); - /* we need the physical one to get the root window */ - phys_screen = screen_virttophys(screen); - root = xutil_screen_get(globalconf.connection, phys_screen)->root; + root = xutil_screen_get(globalconf.connection, globalconf.default_screen)->root; x = globalconf.screens.tab[screen].geometry.x; y = globalconf.screens.tab[screen].geometry.y; diff --git a/mousegrabber.c b/mousegrabber.c index 94b9f97d..d7a5fbde 100644 --- a/mousegrabber.c +++ b/mousegrabber.c @@ -35,19 +35,7 @@ static bool mousegrabber_grab(xcb_cursor_t cursor) { - xcb_window_t root = XCB_NONE; - - for(int screen = 0; - screen < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen++) - { - int16_t x, y; - uint16_t mask; - - root = xutil_screen_get(globalconf.connection, screen)->root; - if(mouse_query_pointer(root, &x, &y, NULL, &mask)) - break; - } + xcb_window_t root = xutil_screen_get(globalconf.connection, globalconf.default_screen)->root; for(int i = 1000; i; i--) { diff --git a/objects/client.c b/objects/client.c index 72ee888e..4821b453 100644 --- a/objects/client.c +++ b/objects/client.c @@ -253,7 +253,7 @@ client_getbyframewin(xcb_window_t w) void client_unfocus_update(client_t *c) { - globalconf.screens.tab[c->phys_screen].client_focus = NULL; + globalconf.screens.tab[0].client_focus = NULL; luaA_object_push(globalconf.L, c); luaA_class_emit_signal(globalconf.L, &client_class, "unfocus", 1); @@ -266,7 +266,7 @@ void client_unfocus(client_t *c) { - xcb_window_t root_win = xutil_screen_get(globalconf.connection, c->phys_screen)->root; + xcb_window_t root_win = xutil_screen_get(globalconf.connection, globalconf.default_screen)->root; /* Set focus on root window, so no events leak to the current window. * This kind of inlines client_set_focus(), but a root window will never have * the WM_TAKE_FOCUS protocol. @@ -311,11 +311,11 @@ client_set_focus(client_t *c, bool set_input_focus) */ void client_ban_unfocus(client_t *c) { - if(globalconf.screens.tab[c->phys_screen].prev_client_focus == c) - globalconf.screens.tab[c->phys_screen].prev_client_focus = NULL; + if(globalconf.screens.tab[0].prev_client_focus == c) + globalconf.screens.tab[0].prev_client_focus = NULL; /* Wait until the last moment to take away the focus from the window. */ - if(globalconf.screens.tab[c->phys_screen].client_focus == c) + if(globalconf.screens.tab[0].client_focus == c) client_unfocus(c); } @@ -393,7 +393,7 @@ client_focus_update(client_t *c) return; } - globalconf.screen_focus = &globalconf.screens.tab[c->phys_screen]; + globalconf.screen_focus = &globalconf.screens.tab[0]; globalconf.screen_focus->prev_client_focus = c; globalconf.screen_focus->client_focus = c; @@ -467,17 +467,16 @@ client_update_properties(client_t *c) /** Manage a new client. * \param w The window. * \param wgeom Window geometry. - * \param phys_screen Physical screen number. * \param startup True if we are managing at startup time. */ void -client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int phys_screen, bool startup) +client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, bool startup) { const uint32_t select_input_val[] = { CLIENT_SELECT_INPUT_EVENT_MASK }; if(systray_iskdedockapp(w)) { - systray_request_handle(w, phys_screen, NULL); + systray_request_handle(w, NULL); return; } @@ -492,10 +491,8 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int phys_screen, xcb_change_save_set(globalconf.connection, XCB_SET_MODE_INSERT, w); client_t *c = client_new(globalconf.L); - xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); - /* This cannot change, ever. */ - c->phys_screen = phys_screen; /* consider the window banned */ c->isbanned = true; /* Store window */ @@ -542,7 +539,7 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int phys_screen, client_array_push(&globalconf.clients, luaA_object_ref(globalconf.L, -1)); /* Set the right screen */ - screen_client_moveto(c, screen_getbycoord(&globalconf.screens.tab[phys_screen], wgeom->x, wgeom->y), false); + screen_client_moveto(c, screen_getbycoord(&globalconf.screens.tab[0], wgeom->x, wgeom->y), false); /* Store initial geometry and emits signals so we inform that geometry have * been set. */ @@ -573,7 +570,7 @@ HANDLE_GEOM(height) /* Push client in stack */ client_raise(c); - ewmh_update_net_client_list(c->phys_screen); + ewmh_update_net_client_list(); /* Always stay in NORMAL_STATE. Even though iconified seems more * appropriate sometimes. The only possible loss is that clients not using @@ -730,7 +727,7 @@ client_resize(client_t *c, area_t geometry, bool hints) area_t area; /* offscreen appearance fixes */ - area = display_area_get(c->phys_screen); + area = display_area_get(); if(geometry.x > area.width) geometry.x = area.width - geometry.width; @@ -1041,10 +1038,10 @@ client_unmanage(client_t *c) tc->transient_for = NULL; } - if(globalconf.screens.tab[c->phys_screen].prev_client_focus == c) - globalconf.screens.tab[c->phys_screen].prev_client_focus = NULL; + if(globalconf.screens.tab[0].prev_client_focus == c) + globalconf.screens.tab[0].prev_client_focus = NULL; - if(globalconf.screens.tab[c->phys_screen].client_focus == c) + if(globalconf.screens.tab[0].client_focus == c) client_unfocus(c); /* remove client from global list and everywhere else */ @@ -1066,7 +1063,7 @@ client_unmanage(client_t *c) if(strut_has_value(&c->strut)) screen_emit_signal(globalconf.L, c->screen, "property::workarea", 0); - ewmh_update_net_client_list(c->phys_screen); + ewmh_update_net_client_list(); /* Clear our event mask so that we don't receive any events from now on, * especially not for the following requests. */ @@ -1079,7 +1076,7 @@ client_unmanage(client_t *c) XCB_CW_EVENT_MASK, (const uint32_t []) { 0 }); - xcb_screen_t *s = xutil_screen_get(globalconf.connection, c->phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); xcb_unmap_window(globalconf.connection, c->window); xcb_reparent_window(globalconf.connection, c->window, s->root, c->geometry.x, c->geometry.y); diff --git a/objects/client.h b/objects/client.h index d42e8ca6..67b7638b 100644 --- a/objects/client.h +++ b/objects/client.h @@ -111,8 +111,6 @@ struct client_t xcb_window_t leader_window; /** Client's WM_PROTOCOLS property */ xcb_get_wm_protocols_reply_t protocols; - /** Client physical screen */ - int phys_screen; /** Key bindings */ key_array_t keys; /** Icon */ @@ -144,7 +142,7 @@ client_t * client_getbyframewin(xcb_window_t); void client_ban(client_t *); void client_ban_unfocus(client_t *); void client_unban(client_t *); -void client_manage(xcb_window_t, xcb_get_geometry_reply_t *, int, bool); +void client_manage(xcb_window_t, xcb_get_geometry_reply_t *, bool); 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/objects/tag.c b/objects/tag.c index f260f270..cf7e1aeb 100644 --- a/objects/tag.c +++ b/objects/tag.c @@ -75,11 +75,9 @@ tag_view(lua_State *L, int udx, bool view) if(tag->screen) { - int screen_index = screen_array_indexof(&globalconf.screens, tag->screen); - banning_need_update(tag->screen); - ewmh_update_net_current_desktop(screen_virttophys(screen_index)); + ewmh_update_net_current_desktop(); } luaA_object_emit_signal(L, udx, "property::selected", 0); @@ -103,13 +101,10 @@ tag_append_to_screen(lua_State *L, int udx, screen_t *s) return; } - int screen_index = screen_array_indexof(&globalconf.screens, s); - int phys_screen = screen_virttophys(screen_index); - tag->screen = s; tag_array_append(&s->tags, luaA_object_ref_class(globalconf.L, udx, &tag_class)); - ewmh_update_net_numbers_of_desktop(phys_screen); - ewmh_update_net_desktop_names(phys_screen); + ewmh_update_net_numbers_of_desktop(); + ewmh_update_net_desktop_names(); luaA_object_push(globalconf.L, tag); luaA_object_emit_signal(L, -1, "property::screen", 0); @@ -128,8 +123,6 @@ tag_remove_from_screen(tag_t *tag) if(!tag->screen) return; - int screen_index = screen_array_indexof(&globalconf.screens, tag->screen); - int phys_screen = screen_virttophys(screen_index); tag_array_t *tags = &tag->screen->tags; for(int i = 0; i < tags->len; i++) @@ -143,8 +136,8 @@ tag_remove_from_screen(tag_t *tag) if(tag->selected) banning_need_update(tag->screen); - ewmh_update_net_numbers_of_desktop(phys_screen); - ewmh_update_net_desktop_names(phys_screen); + ewmh_update_net_numbers_of_desktop(); + ewmh_update_net_desktop_names(); screen_t *s = tag->screen; tag->screen = NULL; diff --git a/objects/wibox.c b/objects/wibox.c index 57cb2b2c..8bc21c07 100644 --- a/objects/wibox.c +++ b/objects/wibox.c @@ -34,23 +34,22 @@ LUA_OBJECT_FUNCS(wibox_class, wibox_t, wibox) /** Kick out systray windows. - * \param phys_screen Physical screen number. */ static void -wibox_systray_kickout(int phys_screen) +wibox_systray_kickout(void) { - xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); - if(globalconf.screens.tab[phys_screen].systray.parent != s->root) + if(globalconf.screens.tab[0].systray.parent != s->root) { /* Who! Check that we're not deleting a wibox with a systray, because it * may be its parent. If so, we reparent to root before, otherwise it will * hurt very much. */ xcb_reparent_window(globalconf.connection, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, s->root, -512, -512); - globalconf.screens.tab[phys_screen].systray.parent = s->root; + globalconf.screens.tab[0].systray.parent = s->root; } } @@ -62,13 +61,11 @@ wibox_wipe_resources(wibox_t *w) { if(w->window) { - int phys_screen = w->ctx.phys_screen; - /* Activate BMA */ client_ignore_enterleave_events(); /* Make sure we don't accidentally kill the systray window */ - if(globalconf.screens.tab[phys_screen].systray.parent == w->window) - wibox_systray_kickout(phys_screen); + if(globalconf.screens.tab[0].systray.parent == w->window) + wibox_systray_kickout(); xcb_destroy_window(globalconf.connection, w->window); /* Deactivate BMA */ client_restore_enterleave_events(); @@ -182,7 +179,6 @@ static void wibox_draw_context_update(wibox_t *w, xcb_screen_t *s) { xcolor_t fg = w->ctx.fg, bg = w->ctx.bg; - int phys_screen = w->ctx.phys_screen; draw_context_wipe(&w->ctx); @@ -198,13 +194,13 @@ wibox_draw_context_update(wibox_t *w, xcb_screen_t *s) w->ctx.pixmap, s->root, w->geometry.height, w->geometry.width); - draw_context_init(&w->ctx, phys_screen, + draw_context_init(&w->ctx, w->geometry.height, w->geometry.width, w->ctx.pixmap, &fg, &bg); break; case East: - draw_context_init(&w->ctx, phys_screen, + draw_context_init(&w->ctx, w->geometry.width, w->geometry.height, w->pixmap, &fg, &bg); @@ -214,12 +210,11 @@ wibox_draw_context_update(wibox_t *w, xcb_screen_t *s) /** Initialize a wibox. * \param w The wibox to initialize. - * \param phys_screen Physical screen number. */ static void -wibox_init(wibox_t *w, int phys_screen) +wibox_init(wibox_t *w) { - xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); w->window = xcb_generate_id(globalconf.connection); xcb_create_window(globalconf.connection, s->root_depth, w->window, s->root, @@ -247,7 +242,6 @@ wibox_init(wibox_t *w, int phys_screen) w->geometry.width, w->geometry.height); /* Update draw context physical screen, important for Zaphod. */ - w->ctx.phys_screen = phys_screen; wibox_draw_context_update(w, s); /* The default GC is just a newly created associated to the root window */ @@ -312,7 +306,7 @@ wibox_moveresize(lua_State *L, int udx, area_t geometry) if(w->pixmap != w->ctx.pixmap) xcb_free_pixmap(globalconf.connection, w->ctx.pixmap); w->pixmap = xcb_generate_id(globalconf.connection); - xcb_screen_t *s = xutil_screen_get(globalconf.connection, w->ctx.phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); xcb_create_pixmap(globalconf.connection, s->root_depth, w->pixmap, s->root, w->geometry.width, w->geometry.height); wibox_draw_context_update(w, s); @@ -384,7 +378,7 @@ wibox_set_orientation(lua_State *L, int udx, orientation_t o) wibox_t *w = luaA_checkudata(L, udx, &wibox_class); if(o != w->orientation) { - xcb_screen_t *s = xutil_screen_get(globalconf.connection, w->ctx.phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); w->orientation = o; /* orientation != East */ if(w->pixmap != w->ctx.pixmap) @@ -426,7 +420,6 @@ wibox_systray_refresh(wibox_t *wibox) uint32_t config_win_vals[4]; uint32_t config_win_vals_off[2] = { -512, -512 }; xembed_window_t *em; - int phys_screen = wibox->ctx.phys_screen; wibox->has_systray = true; @@ -436,10 +429,10 @@ wibox_systray_refresh(wibox_t *wibox) { /* Set background of the systray window. */ xcb_change_window_attributes(globalconf.connection, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, XCB_CW_BACK_PIXEL, config_back); /* Map it. */ - xcb_map_window(globalconf.connection, globalconf.screens.tab[phys_screen].systray.window); + xcb_map_window(globalconf.connection, globalconf.screens.tab[0].systray.window); /* Move it. */ switch(wibox->orientation) { @@ -463,16 +456,16 @@ wibox_systray_refresh(wibox_t *wibox) break; } /* reparent */ - if(globalconf.screens.tab[phys_screen].systray.parent != wibox->window) + if(globalconf.screens.tab[0].systray.parent != wibox->window) { xcb_reparent_window(globalconf.connection, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, wibox->window, config_win_vals[0], config_win_vals[1]); - globalconf.screens.tab[phys_screen].systray.parent = wibox->window; + globalconf.screens.tab[0].systray.parent = wibox->window; } xcb_configure_window(globalconf.connection, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH @@ -483,7 +476,7 @@ wibox_systray_refresh(wibox_t *wibox) config_win_vals[0] = 0; } else - return wibox_systray_kickout(phys_screen); + return wibox_systray_kickout(); switch(wibox->orientation) { @@ -492,25 +485,22 @@ wibox_systray_refresh(wibox_t *wibox) for(int j = 0; j < globalconf.embedded.len; j++) { em = &globalconf.embedded.tab[j]; - if(em->phys_screen == phys_screen) + if(config_win_vals[1] - config_win_vals[2] >= (uint32_t) wibox->geometry.y) { - if(config_win_vals[1] - config_win_vals[2] >= (uint32_t) wibox->geometry.y) - { - xcb_map_window(globalconf.connection, em->win); - xcb_configure_window(globalconf.connection, em->win, - XCB_CONFIG_WINDOW_X - | XCB_CONFIG_WINDOW_Y - | XCB_CONFIG_WINDOW_WIDTH - | XCB_CONFIG_WINDOW_HEIGHT, - config_win_vals); - config_win_vals[1] -= config_win_vals[3]; - } - else - xcb_configure_window(globalconf.connection, em->win, - XCB_CONFIG_WINDOW_X - | XCB_CONFIG_WINDOW_Y, - config_win_vals_off); + xcb_map_window(globalconf.connection, em->win); + xcb_configure_window(globalconf.connection, em->win, + XCB_CONFIG_WINDOW_X + | XCB_CONFIG_WINDOW_Y + | XCB_CONFIG_WINDOW_WIDTH + | XCB_CONFIG_WINDOW_HEIGHT, + config_win_vals); + config_win_vals[1] -= config_win_vals[3]; } + else + xcb_configure_window(globalconf.connection, em->win, + XCB_CONFIG_WINDOW_X + | XCB_CONFIG_WINDOW_Y, + config_win_vals_off); } break; case South: @@ -518,26 +508,23 @@ wibox_systray_refresh(wibox_t *wibox) for(int j = 0; j < globalconf.embedded.len; j++) { em = &globalconf.embedded.tab[j]; - if(em->phys_screen == phys_screen) + /* if(y + width <= wibox.y + systray.right) */ + if(config_win_vals[1] + config_win_vals[3] <= (uint32_t) wibox->geometry.y + AREA_RIGHT(systray->geometry)) { - /* if(y + width <= wibox.y + systray.right) */ - if(config_win_vals[1] + config_win_vals[3] <= (uint32_t) wibox->geometry.y + AREA_RIGHT(systray->geometry)) - { - xcb_map_window(globalconf.connection, em->win); - xcb_configure_window(globalconf.connection, em->win, - XCB_CONFIG_WINDOW_X - | XCB_CONFIG_WINDOW_Y - | XCB_CONFIG_WINDOW_WIDTH - | XCB_CONFIG_WINDOW_HEIGHT, - config_win_vals); - config_win_vals[1] += config_win_vals[3]; - } - else - xcb_configure_window(globalconf.connection, em->win, - XCB_CONFIG_WINDOW_X - | XCB_CONFIG_WINDOW_Y, - config_win_vals_off); + xcb_map_window(globalconf.connection, em->win); + xcb_configure_window(globalconf.connection, em->win, + XCB_CONFIG_WINDOW_X + | XCB_CONFIG_WINDOW_Y + | XCB_CONFIG_WINDOW_WIDTH + | XCB_CONFIG_WINDOW_HEIGHT, + config_win_vals); + config_win_vals[1] += config_win_vals[3]; } + else + xcb_configure_window(globalconf.connection, em->win, + XCB_CONFIG_WINDOW_X + | XCB_CONFIG_WINDOW_Y, + config_win_vals_off); } break; case East: @@ -545,26 +532,23 @@ wibox_systray_refresh(wibox_t *wibox) for(int j = 0; j < globalconf.embedded.len; j++) { em = &globalconf.embedded.tab[j]; - if(em->phys_screen == phys_screen) + /* if(x + width < systray.x + systray.width) */ + if(config_win_vals[0] + config_win_vals[2] <= (uint32_t) AREA_RIGHT(systray->geometry) + wibox->geometry.x) { - /* if(x + width < systray.x + systray.width) */ - if(config_win_vals[0] + config_win_vals[2] <= (uint32_t) AREA_RIGHT(systray->geometry) + wibox->geometry.x) - { - xcb_map_window(globalconf.connection, em->win); - xcb_configure_window(globalconf.connection, em->win, - XCB_CONFIG_WINDOW_X - | XCB_CONFIG_WINDOW_Y - | XCB_CONFIG_WINDOW_WIDTH - | XCB_CONFIG_WINDOW_HEIGHT, - config_win_vals); - config_win_vals[0] += config_win_vals[2]; - } - else - xcb_configure_window(globalconf.connection, em->win, - XCB_CONFIG_WINDOW_X - | XCB_CONFIG_WINDOW_Y, - config_win_vals_off); + xcb_map_window(globalconf.connection, em->win); + xcb_configure_window(globalconf.connection, em->win, + XCB_CONFIG_WINDOW_X + | XCB_CONFIG_WINDOW_Y + | XCB_CONFIG_WINDOW_WIDTH + | XCB_CONFIG_WINDOW_HEIGHT, + config_win_vals); + config_win_vals[0] += config_win_vals[2]; } + else + xcb_configure_window(globalconf.connection, em->win, + XCB_CONFIG_WINDOW_X + | XCB_CONFIG_WINDOW_Y, + config_win_vals_off); } break; } @@ -714,8 +698,6 @@ wibox_detach(lua_State *L, int udx) static void wibox_attach(lua_State *L, int udx, screen_t *s) { - int phys_screen = screen_virttophys(screen_array_indexof(&globalconf.screens, s)); - /* duplicate wibox */ lua_pushvalue(L, udx); /* ref it */ @@ -739,7 +721,7 @@ wibox_attach(lua_State *L, int udx, screen_t *s) wibox_array_append(&globalconf.wiboxes, wibox); - wibox_init(wibox, phys_screen); + wibox_init(wibox); xwindow_set_cursor(wibox->window, xcursor_new(globalconf.connection, xcursor_font_fromstr(wibox->cursor))); diff --git a/objects/widget.c b/objects/widget.c index bc648cdf..d6b5b0d4 100644 --- a/objects/widget.c +++ b/objects/widget.c @@ -251,7 +251,7 @@ widget_render(wibox_t *wibox) char *data; xcb_pixmap_t rootpix; xcb_get_property_cookie_t prop_c; - xcb_screen_t *s = xutil_screen_get(globalconf.connection, ctx->phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); prop_c = xcb_get_property_unchecked(globalconf.connection, false, s->root, _XROOTPMAP_ID, XCB_ATOM_PIXMAP, 0, 1); if((prop_r = xcb_get_property_reply(globalconf.connection, prop_c, NULL))) diff --git a/objects/widgets/systray.c b/objects/widgets/systray.c index abe7dfde..c47d613a 100644 --- a/objects/widgets/systray.c +++ b/objects/widgets/systray.c @@ -46,12 +46,11 @@ systray_extents(lua_State *L, widget_t *widget) luaA_checkscreen(screen); area_t geometry; - int phys_screen = screen_virttophys(screen), n = 0; + int n = 0; systray_data_t *d = widget->data; for(int i = 0; i < globalconf.embedded.len; i++) - if(globalconf.embedded.tab[i].phys_screen == phys_screen) - n++; + n++; /** \todo use class hints */ geometry.width = d->height * n; @@ -73,7 +72,7 @@ systray_draw(widget_t *widget, draw_context_t *ctx, /* set wibox orientation */ /** \todo stop setting that property on each redraw */ xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, - globalconf.screens.tab[p->ctx.phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, _NET_SYSTEM_TRAY_ORIENTATION, XCB_ATOM_CARDINAL, 32, 1, &orient); } diff --git a/property.c b/property.c index bb138d90..3c2e8181 100644 --- a/property.c +++ b/property.c @@ -337,10 +337,8 @@ property_handle_xrootpmap_id(uint8_t state, (*w)->need_update = true; else { - int screen = xutil_root2screen(globalconf.connection, window); foreach(w, globalconf.wiboxes) - if(screen == screen_array_indexof(&globalconf.screens, (*w)->screen)) - (*w)->need_update = true; + (*w)->need_update = true; } return 0; diff --git a/root.c b/root.c index 2a0bafc5..579414fc 100644 --- a/root.c +++ b/root.c @@ -128,14 +128,9 @@ luaA_root_keys(lua_State *L) while(lua_next(L, 1)) key_array_append(&globalconf.keys, luaA_object_ref_class(L, -1, &key_class)); - int nscreen = xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - - for(int phys_screen = 0; phys_screen < nscreen; phys_screen++) - { - xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); - xcb_ungrab_key(globalconf.connection, XCB_GRAB_ANY, s->root, XCB_BUTTON_MASK_ANY); - xwindow_grabkeys(s->root, &globalconf.keys); - } + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); + xcb_ungrab_key(globalconf.connection, XCB_GRAB_ANY, s->root, XCB_BUTTON_MASK_ANY); + xwindow_grabkeys(s->root, &globalconf.keys); return 1; } @@ -204,13 +199,10 @@ luaA_root_cursor(lua_State *L) { uint32_t change_win_vals[] = { xcursor_new(globalconf.connection, cursor_font) }; - for(int screen_nbr = 0; - screen_nbr < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen_nbr++) - xcb_change_window_attributes(globalconf.connection, - xutil_screen_get(globalconf.connection, screen_nbr)->root, - XCB_CW_CURSOR, - change_win_vals); + xcb_change_window_attributes(globalconf.connection, + xutil_screen_get(globalconf.connection, globalconf.default_screen)->root, + XCB_CW_CURSOR, + change_win_vals); } else luaA_warn(L, "invalid cursor %s", cursor_name); diff --git a/screen.c b/screen.c index 1e4fc22d..dffe347e 100644 --- a/screen.c +++ b/screen.c @@ -225,20 +225,15 @@ screen_scan_xinerama(void) static void screen_scan_x11(void) { /* One screen only / Zaphod mode */ - for(int screen = 0; - screen < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - screen++) - { - xcb_screen_t *xcb_screen = xutil_screen_get(globalconf.connection, screen); - screen_t s; - p_clear(&s, 1); - s.geometry.x = 0; - s.geometry.y = 0; - s.geometry.width = xcb_screen->width_in_pixels; - s.geometry.height = xcb_screen->height_in_pixels; - s.visual = screen_default_visual(xcb_screen); - screen_array_append(&globalconf.screens, s); - } + xcb_screen_t *xcb_screen = xutil_screen_get(globalconf.connection, globalconf.default_screen); + screen_t s; + p_clear(&s, 1); + s.geometry.x = 0; + s.geometry.y = 0; + s.geometry.width = xcb_screen->width_in_pixels; + s.geometry.height = xcb_screen->height_in_pixels; + s.visual = screen_default_visual(xcb_screen); + screen_array_append(&globalconf.screens, s); } /** Get screens informations and fill global configuration. @@ -339,13 +334,12 @@ screen_area_get(screen_t *screen, bool strut) } /** Get display info. - * \param phys_screen Physical screen number. * \return The display area. */ area_t -display_area_get(int phys_screen) +display_area_get(void) { - xcb_screen_t *s = xutil_screen_get(globalconf.connection, phys_screen); + xcb_screen_t *s = xutil_screen_get(globalconf.connection, globalconf.default_screen); area_t area = { .x = 0, .y = 0, .width = s->width_in_pixels, @@ -353,19 +347,6 @@ display_area_get(int phys_screen) return area; } -/** This returns the real X screen number for a logical - * screen if Xinerama is active. - * \param screen The logical screen. - * \return The X screen. - */ -int -screen_virttophys(int screen) -{ - if(globalconf.xinerama_is_active) - return globalconf.default_screen; - return screen; -} - /** Move a client to a virtual screen. * \param c The client to move. * \param new_screen The destination screen. diff --git a/screen.h b/screen.h index eff01fd8..717e9f72 100644 --- a/screen.h +++ b/screen.h @@ -64,8 +64,7 @@ void screen_emit_signal(lua_State *, screen_t *, const char *, int); void screen_scan(void); screen_t *screen_getbycoord(screen_t *, int, int); area_t screen_area_get(screen_t *, bool); -area_t display_area_get(int); -int screen_virttophys(int); +area_t display_area_get(void); void screen_client_moveto(client_t *, screen_t *, bool); #endif diff --git a/spawn.c b/spawn.c index 0728047c..8b1de8e9 100644 --- a/spawn.c +++ b/spawn.c @@ -236,13 +236,10 @@ spawn_init(void) { globalconf.sndisplay = sn_xcb_display_new(globalconf.connection, NULL, NULL); - const int screen_max = xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); - - for(int screen = 0; screen < screen_max; screen++) - globalconf.screens.tab[screen].snmonitor = sn_monitor_context_new(globalconf.sndisplay, - screen, - spawn_monitor_event, - NULL, NULL); + globalconf.screens.tab[0].snmonitor = sn_monitor_context_new(globalconf.sndisplay, + globalconf.default_screen, + spawn_monitor_event, + NULL, NULL); } static void @@ -330,7 +327,7 @@ luaA_spawn(lua_State *L) else cmdname = a_strdup(cmd); - context = sn_launcher_context_new(globalconf.sndisplay, screen_virttophys(screen)); + context = sn_launcher_context_new(globalconf.sndisplay, globalconf.default_screen); sn_launcher_context_set_name(context, "awesome"); sn_launcher_context_set_description(context, "awesome spawn"); sn_launcher_context_set_binary_name(context, cmdname); diff --git a/stack.c b/stack.c index 0f3e218a..86c50d37 100644 --- a/stack.c +++ b/stack.c @@ -34,7 +34,7 @@ stack_client_remove(client_t *c) client_array_remove(&globalconf.stack, client); break; } - ewmh_update_net_client_list_stacking(c->phys_screen); + ewmh_update_net_client_list_stacking(); stack_windows(); } @@ -46,7 +46,7 @@ stack_client_push(client_t *c) { stack_client_remove(c); client_array_push(&globalconf.stack, c); - ewmh_update_net_client_list_stacking(c->phys_screen); + ewmh_update_net_client_list_stacking(); stack_windows(); } @@ -58,7 +58,7 @@ stack_client_append(client_t *c) { stack_client_remove(c); client_array_append(&globalconf.stack, c); - ewmh_update_net_client_list_stacking(c->phys_screen); + ewmh_update_net_client_list_stacking(); stack_windows(); } diff --git a/systray.c b/systray.c index 2cbea340..bac01846 100644 --- a/systray.c +++ b/systray.c @@ -35,16 +35,15 @@ #define SYSTEM_TRAY_REQUEST_DOCK 0 /* Begin icon docking */ /** Initialize systray information in X. - * \param phys_screen Physical screen. */ void -systray_init(int phys_screen) +systray_init(void) { - xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, phys_screen); + xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, globalconf.default_screen); - globalconf.screens.tab[phys_screen].systray.window = xcb_generate_id(globalconf.connection); + globalconf.screens.tab[0].systray.window = xcb_generate_id(globalconf.connection); xcb_create_window(globalconf.connection, xscreen->root_depth, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, xscreen->root, -1, -1, 1, 1, 0, XCB_COPY_FROM_PARENT, xscreen->root_visual, 0, NULL); @@ -54,46 +53,40 @@ systray_init(int phys_screen) /** Refresh all systrays registrations per physical screen */ void -systray_refresh() +systray_refresh(void) { - int nscreen = xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); + bool has_systray = false; + foreach(w, globalconf.wiboxes) + if((*w)->has_systray) + /* Can't use "break" with foreach() :( */ + has_systray = true; - for(int phys_screen = 0; phys_screen < nscreen; phys_screen++) - { - bool has_systray = false; - foreach(w, globalconf.wiboxes) - if(phys_screen == (*w)->ctx.phys_screen && (*w)->has_systray) - /* Can't use "break" with foreach() :( */ - has_systray = true; - - if(has_systray) - systray_register(phys_screen); - else - systray_cleanup(phys_screen); - } + if(has_systray) + systray_register(); + else + systray_cleanup(); } /** Register systray in X. - * \param phys_screen Physical screen. */ void -systray_register(int phys_screen) +systray_register(void) { xcb_client_message_event_t ev; - xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, phys_screen); + xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, globalconf.default_screen); char *atom_name; xcb_intern_atom_cookie_t atom_systray_q; xcb_intern_atom_reply_t *atom_systray_r; xcb_atom_t atom_systray; /* Set registered even if it fails to don't try again unless forced */ - if(globalconf.screens.tab[phys_screen].systray.registered) + if(globalconf.screens.tab[0].systray.registered) return; - globalconf.screens.tab[phys_screen].systray.registered = true; + globalconf.screens.tab[0].systray.registered = true; /* Send requests */ - if(!(atom_name = xcb_atom_name_by_screen("_NET_SYSTEM_TRAY", phys_screen))) + if(!(atom_name = xcb_atom_name_by_screen("_NET_SYSTEM_TRAY", globalconf.default_screen))) { warn("error getting systray atom"); return; @@ -111,7 +104,7 @@ systray_register(int phys_screen) ev.format = 32; ev.type = MANAGER; ev.data.data32[0] = XCB_CURRENT_TIME; - ev.data.data32[2] = globalconf.screens.tab[phys_screen].systray.window; + ev.data.data32[2] = globalconf.screens.tab[0].systray.window; ev.data.data32[3] = ev.data.data32[4] = 0; if(!(atom_systray_r = xcb_intern_atom_reply(globalconf.connection, atom_systray_q, NULL))) @@ -125,7 +118,7 @@ systray_register(int phys_screen) p_delete(&atom_systray_r); xcb_set_selection_owner(globalconf.connection, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, atom_systray, XCB_CURRENT_TIME); @@ -133,19 +126,18 @@ systray_register(int phys_screen) } /** Remove systray information in X. - * \param phys_screen Physical screen. */ void -systray_cleanup(int phys_screen) +systray_cleanup(void) { xcb_intern_atom_reply_t *atom_systray_r; char *atom_name; - if(!globalconf.screens.tab[phys_screen].systray.registered) + if(!globalconf.screens.tab[0].systray.registered) return; - globalconf.screens.tab[phys_screen].systray.registered = false; + globalconf.screens.tab[0].systray.registered = false; - if(!(atom_name = xcb_atom_name_by_screen("_NET_SYSTEM_TRAY", phys_screen)) + if(!(atom_name = xcb_atom_name_by_screen("_NET_SYSTEM_TRAY", globalconf.default_screen)) || !(atom_systray_r = xcb_intern_atom_reply(globalconf.connection, xcb_intern_atom_unchecked(globalconf.connection, false, @@ -170,12 +162,11 @@ systray_cleanup(int phys_screen) /** Handle a systray request. * \param embed_win The window to embed. - * \param phys_screen The physical monitor to display on. * \param info The embedding info * \return 0 on no error. */ int -systray_request_handle(xcb_window_t embed_win, int phys_screen, xembed_info_t *info) +systray_request_handle(xcb_window_t embed_win, xembed_info_t *info) { xembed_window_t em; xcb_get_property_cookie_t em_cookie; @@ -204,11 +195,10 @@ systray_request_handle(xcb_window_t embed_win, int phys_screen, xembed_info_t *i */ xcb_change_save_set(globalconf.connection, XCB_SET_MODE_INSERT, embed_win); xcb_reparent_window(globalconf.connection, embed_win, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, 0, 0); em.win = embed_win; - em.phys_screen = phys_screen; if(info) em.info = *info; @@ -216,7 +206,7 @@ systray_request_handle(xcb_window_t embed_win, int phys_screen, xembed_info_t *i xembed_info_get_reply(globalconf.connection, em_cookie, &em.info); xembed_embedded_notify(globalconf.connection, em.win, - globalconf.screens.tab[phys_screen].systray.window, + globalconf.screens.tab[0].systray.window, MIN(XEMBED_VERSION, em.info.version)); xembed_window_array_append(&globalconf.embedded, em); @@ -233,10 +223,9 @@ systray_request_handle(xcb_window_t embed_win, int phys_screen, xembed_info_t *i int systray_process_client_message(xcb_client_message_event_t *ev) { - int screen_nbr = 0, ret = 0; + int ret = 0; xcb_get_geometry_cookie_t geom_c; xcb_get_geometry_reply_t *geom_r; - xcb_screen_iterator_t iter; switch(ev->data.data32[1]) { @@ -246,12 +235,10 @@ systray_process_client_message(xcb_client_message_event_t *ev) if(!(geom_r = xcb_get_geometry_reply(globalconf.connection, geom_c, NULL))) return -1; - for(iter = xcb_setup_roots_iterator(xcb_get_setup(globalconf.connection)), screen_nbr = 0; - iter.rem && iter.data->root != geom_r->root; xcb_screen_next (&iter), ++screen_nbr); + if(xutil_screen_get(globalconf.connection, globalconf.default_screen)->root == geom_r->root) + ret = systray_request_handle(ev->data.data32[2], NULL); p_delete(&geom_r); - - ret = systray_request_handle(ev->data.data32[2], screen_nbr, NULL); break; } diff --git a/systray.h b/systray.h index 829d5adf..3ccd8ec3 100644 --- a/systray.h +++ b/systray.h @@ -25,11 +25,11 @@ #include #include "common/xembed.h" -void systray_init(int); +void systray_init(void); void systray_refresh(void); -void systray_register(int); -void systray_cleanup(int); -int systray_request_handle(xcb_window_t, int, xembed_info_t *); +void systray_register(void); +void systray_cleanup(void); +int systray_request_handle(xcb_window_t, xembed_info_t *); bool systray_iskdedockapp(xcb_window_t); int systray_process_client_message(xcb_client_message_event_t *); int xembed_process_client_message(xcb_client_message_event_t *);