X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fmanage.c;h=1dc39b9eabe18a2c88acc5e5b29e252c281721bd;hb=884627ef20dfb2edae9a5c99bb470bfbf0301904;hp=df4dc11e3030b745642f8a8b9525c6045a23a6dc;hpb=10d3281b0f483892e5ff234ee716c9553497750c;p=i3%2Fi3 diff --git a/src/manage.c b/src/manage.c index df4dc11e..1dc39b9e 100644 --- a/src/manage.c +++ b/src/manage.c @@ -1,8 +1,10 @@ +#undef I3__FILE__ +#define I3__FILE__ "manage.c" /* * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE) * * manage.c: Initially managing new windows (or existing ones on restart). * @@ -47,7 +49,7 @@ void manage_existing_windows(xcb_window_t root) { * side-effects which are to be expected when continuing to run i3. * */ -void restore_geometry() { +void restore_geometry(void) { DLOG("Restoring geometry\n"); Con *con; @@ -80,7 +82,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki xcb_get_property_cookie_t wm_type_cookie, strut_cookie, state_cookie, utf8_title_cookie, title_cookie, class_cookie, leader_cookie, transient_cookie, - role_cookie, startup_id_cookie; + role_cookie, startup_id_cookie, wm_hints_cookie; geomc = xcb_get_geometry(conn, d); @@ -142,12 +144,14 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki class_cookie = GET_PROPERTY(XCB_ATOM_WM_CLASS, 128); role_cookie = GET_PROPERTY(A_WM_WINDOW_ROLE, 128); startup_id_cookie = GET_PROPERTY(A__NET_STARTUP_ID, 512); + wm_hints_cookie = xcb_icccm_get_wm_hints(conn, window); /* TODO: also get wm_normal_hints here. implement after we got rid of xcb-event */ DLOG("Managing window 0x%08x\n", window); i3Window *cwindow = scalloc(sizeof(i3Window)); cwindow->id = window; + cwindow->depth = get_visual_depth(attr->visual); /* We need to grab the mouse buttons for click to focus */ xcb_grab_button(conn, false, window, XCB_EVENT_MASK_BUTTON_PRESS, @@ -169,6 +173,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki window_update_transient_for(cwindow, xcb_get_property_reply(conn, transient_cookie, NULL)); window_update_strut_partial(cwindow, xcb_get_property_reply(conn, strut_cookie, NULL)); window_update_role(cwindow, xcb_get_property_reply(conn, role_cookie, NULL), true); + window_update_hints(cwindow, xcb_get_property_reply(conn, wm_hints_cookie, NULL)); xcb_get_property_reply_t *startup_id_reply; startup_id_reply = xcb_get_property_reply(conn, startup_id_cookie, NULL); @@ -214,7 +219,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki DLOG("Initial geometry: (%d, %d, %d, %d)\n", geom->x, geom->y, geom->width, geom->height); Con *nc = NULL; - Match *match; + Match *match = NULL; Assignment *assignment; /* TODO: two matches for one container */ @@ -265,7 +270,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki nc->border_width = geom->border_width; char *name; - asprintf(&name, "[i3 con] container around %p", cwindow); + sasprintf(&name, "[i3 con] container around %p", cwindow); x_set_name(nc, name); free(name); @@ -284,7 +289,9 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki Con *target_output = con_get_output(ws); if (workspace_is_visible(ws) && current_output == target_output) { - con_focus(nc); + if (!match || !match->restart_mode) { + con_focus(nc); + } else DLOG("not focusing, matched with restart_mode == true\n"); } else DLOG("workspace not visible, not focusing\n"); } else DLOG("dock, not focusing\n"); } else { @@ -318,7 +325,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki (cwindow->leader != XCB_NONE && cwindow->leader != cwindow->id && con_by_window_id(cwindow->leader) != NULL)) { - LOG("This window is transiert for another window, setting floating\n"); + LOG("This window is transient for another window, setting floating\n"); want_floating = true; if (config.popup_during_fullscreen == PDF_LEAVE_FULLSCREEN &&