/** Handle a systray request. * \param embed_win The window to embed. * \param info The embedding info * \return 0 on no error. */ int systray_request_handle(xcb_window_t embed_win, xembed_info_t *info) { xembed_window_t em; xcb_get_property_cookie_t em_cookie; const uint32_t select_input_val[] = { XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_ENTER_WINDOW }; /* check if not already trayed */ if(xembed_getbywin(&globalconf.embedded, embed_win)) return -1; p_clear(&em_cookie, 1); if(!info) em_cookie = xembed_info_get_unchecked(globalconf.connection, embed_win); xcb_change_window_attributes(globalconf.connection, embed_win, XCB_CW_EVENT_MASK, select_input_val); xwindow_set_state(embed_win, XCB_ICCCM_WM_STATE_WITHDRAWN); /* we grab the window, but also make sure it's automatically reparented back * to the root window if we should die. */ xcb_change_save_set(globalconf.connection, XCB_SET_MODE_INSERT, embed_win); xcb_reparent_window(globalconf.connection, embed_win, globalconf.systray.window, 0, 0); em.win = embed_win; if(info) em.info = *info; else xembed_info_get_reply(globalconf.connection, em_cookie, &em.info); xembed_embedded_notify(globalconf.connection, em.win, globalconf.systray.window, MIN(XEMBED_VERSION, em.info.version)); xembed_window_array_append(&globalconf.embedded, em); luaA_systray_invalidate(); return 0; }
/** The destroy notify event handler. * \param ev The event. */ static void event_handle_destroynotify(xcb_destroy_notify_event_t *ev) { client_t *c; if((c = client_getbywin(ev->window))) client_unmanage(c, false); else for(int i = 0; i < globalconf.embedded.len; i++) if(globalconf.embedded.tab[i].win == ev->window) { xembed_window_array_take(&globalconf.embedded, i); luaA_systray_invalidate(); } }
/** The unmap notify event handler. * \param ev The event. */ static void event_handle_unmapnotify(xcb_unmap_notify_event_t *ev) { client_t *c; if((c = client_getbywin(ev->window))) client_unmanage(c, true); else for(int i = 0; i < globalconf.embedded.len; i++) if(globalconf.embedded.tab[i].win == ev->window) { xembed_window_array_take(&globalconf.embedded, i); xcb_change_save_set(globalconf.connection, XCB_SET_MODE_DELETE, ev->window); luaA_systray_invalidate(); } }