diff --git a/include/view.h b/include/view.h index 783d6f4a6..cef073e1c 100644 --- a/include/view.h +++ b/include/view.h @@ -56,6 +56,8 @@ typedef enum { MENU_NORMAL_WINDOW = 2, /** ERROR dialog */ MENU_ERROR_DIALOG = 4, + /** Create transient window. */ + MENU_TRANSIENT_WINDOW = 8, } MenuFlags; /** diff --git a/source/rofi.c b/source/rofi.c index 3d6917f8e..175db7711 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -768,6 +768,9 @@ static gboolean startup(G_GNUC_UNUSED gpointer data) { if (find_arg("-normal-window") >= 0) { window_flags |= MENU_NORMAL_WINDOW; } + if (find_arg("-transient-window") >= 0) { + window_flags |= MENU_TRANSIENT_WINDOW; + } TICK_N("Grab keyboard"); __create_window(window_flags); TICK_N("Create Window"); diff --git a/source/view.c b/source/view.c index aac8c22ee..712f1aa71 100644 --- a/source/view.c +++ b/source/view.c @@ -1120,7 +1120,25 @@ void __create_window(MenuFlags menu_flags) { TICK_N("textbox setup"); // // make it an unmanaged window - if (((menu_flags & MENU_NORMAL_WINDOW) == 0)) { + if (((menu_flags & MENU_TRANSIENT_WINDOW) != 0)) { + xcb_atom_t atoms[] = {xcb->ewmh._NET_WM_STATE_MODAL}; + + window_set_atom_prop(box_window, xcb->ewmh._NET_WM_STATE, atoms, + sizeof(atoms) / sizeof(xcb_atom_t)); + window_set_atom_prop (box_window, xcb->ewmh._NET_WM_WINDOW_TYPE, + &(xcb->ewmh._NET_WM_WINDOW_TYPE_UTILITY), 1); + x11_disable_decoration(box_window); + + xcb_window_t active_window; + xcb_get_property_cookie_t awc; + awc = xcb_ewmh_get_active_window (&xcb->ewmh, xcb->screen_nbr); + + if (xcb_ewmh_get_active_window_reply(&xcb->ewmh, awc, &active_window, NULL)) { + xcb_change_property(xcb->connection, XCB_PROP_MODE_REPLACE, box_window, + XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32, + 1, &active_window); + } + } else if (((menu_flags & MENU_NORMAL_WINDOW) == 0)) { window_set_atom_prop(box_window, xcb->ewmh._NET_WM_STATE, &(xcb->ewmh._NET_WM_STATE_ABOVE), 1); uint32_t values[] = {1};