Port Client::client to XCB
Unfortunately the Xcb::Window wrapper cannot be used for the client window as the client should not be destroyed by KWin. All the API calls except XSelectInput are changed to xcb and the name is adjusted to m_client to follow the naming scheme.
This commit is contained in:
parent
424589ab4a
commit
b4d2129a3f
4 changed files with 30 additions and 29 deletions
35
client.cpp
35
client.cpp
|
@ -89,7 +89,7 @@ bool Client::s_haveResizeEffect = false;
|
|||
*/
|
||||
Client::Client()
|
||||
: Toplevel()
|
||||
, client(None)
|
||||
, m_client(XCB_WINDOW_NONE)
|
||||
, m_wrapper()
|
||||
, decoration(NULL)
|
||||
, bridge(new Bridge(this))
|
||||
|
@ -232,7 +232,7 @@ Client::~Client()
|
|||
XSyncDestroyAlarm(display(), syncRequest.alarm);
|
||||
#endif
|
||||
assert(!moveResizeMode);
|
||||
assert(client == None);
|
||||
assert(m_client == XCB_WINDOW_NONE);
|
||||
assert(m_wrapper == XCB_WINDOW_NONE);
|
||||
//assert( frameId() == None );
|
||||
assert(decoration == NULL);
|
||||
|
@ -289,20 +289,21 @@ void Client::releaseWindow(bool on_shutdown)
|
|||
info->setState(0, info->state()); // Reset all state flags
|
||||
} else
|
||||
untab();
|
||||
XDeleteProperty(display(), client, atoms->kde_net_wm_user_creation_time);
|
||||
XDeleteProperty(display(), client, atoms->net_frame_extents);
|
||||
XDeleteProperty(display(), client, atoms->kde_net_wm_frame_strut);
|
||||
XReparentWindow(display(), client, rootWindow(), x(), y());
|
||||
XRemoveFromSaveSet(display(), client);
|
||||
XSelectInput(display(), client, NoEventMask);
|
||||
xcb_connection_t *c = connection();
|
||||
xcb_delete_property(c, m_client, atoms->kde_net_wm_user_creation_time);
|
||||
xcb_delete_property(c, m_client, atoms->net_frame_extents);
|
||||
xcb_delete_property(c, m_client, atoms->kde_net_wm_frame_strut);
|
||||
xcb_reparent_window(c, m_client, rootWindow(), x(), y());
|
||||
xcb_change_save_set(c, XCB_SET_MODE_DELETE, m_client);
|
||||
XSelectInput(display(), m_client, NoEventMask);
|
||||
if (on_shutdown)
|
||||
// Map the window, so it can be found after another WM is started
|
||||
XMapWindow(display(), client);
|
||||
xcb_map_window(connection(), m_client);
|
||||
// TODO: Preserve minimized, shaded etc. state?
|
||||
else // Make sure it's not mapped if the app unmapped it (#65279). The app
|
||||
// may do map+unmap before we initially map the window by calling rawShow() from manage().
|
||||
XUnmapWindow(display(), client);
|
||||
client = None;
|
||||
xcb_unmap_window(connection(), m_client);
|
||||
m_client = XCB_WINDOW_NONE;
|
||||
m_wrapper.reset();
|
||||
XDestroyWindow(display(), frameId());
|
||||
//frame = None;
|
||||
|
@ -343,7 +344,7 @@ void Client::destroyClient()
|
|||
destroyDecoration();
|
||||
cleanGrouping();
|
||||
workspace()->removeClient(this);
|
||||
client = None; // invalidate
|
||||
m_client = XCB_WINDOW_NONE; // invalidate
|
||||
m_wrapper.reset();
|
||||
XDestroyWindow(display(), frameId());
|
||||
//frame = None;
|
||||
|
@ -981,7 +982,7 @@ void Client::setShade(ShadeMode mode)
|
|||
s.setHeight(border_top + border_bottom);
|
||||
XSelectInput(display(), m_wrapper, ClientWinMask); // Avoid getting UnmapNotify
|
||||
m_wrapper.unmap();
|
||||
XUnmapWindow(display(), client);
|
||||
xcb_unmap_window(connection(), m_client);
|
||||
XSelectInput(display(), m_wrapper, ClientWinMask | SubstructureNotifyMask);
|
||||
exportMappingState(IconicState);
|
||||
plainResize(s);
|
||||
|
@ -1123,7 +1124,7 @@ void Client::resetShowingDesktop(bool keep_hidden)
|
|||
*/
|
||||
void Client::exportMappingState(int s)
|
||||
{
|
||||
assert(client != None);
|
||||
assert(m_client != XCB_WINDOW_NONE);
|
||||
assert(!deleting || s == WithdrawnState);
|
||||
if (s == WithdrawnState) {
|
||||
XDeleteProperty(display(), window(), atoms->wm_state);
|
||||
|
@ -1207,7 +1208,7 @@ void Client::map()
|
|||
XMapWindow(display(), frameId());
|
||||
if (!isShade()) {
|
||||
m_wrapper.map();
|
||||
XMapWindow(display(), client);
|
||||
xcb_map_window(connection(), m_client);
|
||||
m_decoInputExtent.map();
|
||||
exportMappingState(NormalState);
|
||||
} else
|
||||
|
@ -1228,7 +1229,7 @@ void Client::unmap()
|
|||
XSelectInput(display(), m_wrapper, ClientWinMask); // Avoid getting UnmapNotify
|
||||
XUnmapWindow(display(), frameId());
|
||||
m_wrapper.unmap();
|
||||
XUnmapWindow(display(), client);
|
||||
xcb_unmap_window(connection(), m_client);
|
||||
m_decoInputExtent.unmap();
|
||||
XSelectInput(display(), m_wrapper, ClientWinMask | SubstructureNotifyMask);
|
||||
if (decoration != NULL)
|
||||
|
@ -1990,7 +1991,7 @@ void Client::getWMHints()
|
|||
void Client::getMotifHints()
|
||||
{
|
||||
bool mgot_noborder, mnoborder, mresize, mmove, mminimize, mmaximize, mclose;
|
||||
Motif::readFlags(client, mgot_noborder, mnoborder, mresize, mmove, mminimize, mmaximize, mclose);
|
||||
Motif::readFlags(m_client, mgot_noborder, mnoborder, mresize, mmove, mminimize, mmaximize, mclose);
|
||||
if (mgot_noborder && motif_noborder != mnoborder) {
|
||||
motif_noborder = mnoborder;
|
||||
// If we just got a hint telling us to hide decorations, we do so.
|
||||
|
|
2
client.h
2
client.h
|
@ -832,7 +832,7 @@ private:
|
|||
|
||||
bool tabTo(Client *other, bool behind, bool activate);
|
||||
|
||||
Window client;
|
||||
xcb_window_t m_client;
|
||||
Xcb::Window m_wrapper;
|
||||
KDecoration* decoration;
|
||||
Bridge* bridge;
|
||||
|
|
|
@ -589,7 +589,7 @@ void Client::unmapNotifyEvent(XUnmapEvent* e)
|
|||
// check whether this is result of an XReparentWindow - client then won't be parented by wrapper
|
||||
// in this case do not release the client (causes reparent to root, removal from saveSet and what not)
|
||||
// but just destroy the client
|
||||
Xcb::Tree tree(client);
|
||||
Xcb::Tree tree(m_client);
|
||||
xcb_window_t daddy = tree.parent();
|
||||
if (daddy == m_wrapper) {
|
||||
releaseWindow(); // unmapped from a regular client state
|
||||
|
|
20
manage.cpp
20
manage.cpp
|
@ -100,7 +100,7 @@ bool Client::manage(Window w, bool isMapped)
|
|||
NET::WM2FrameOverlap |
|
||||
0;
|
||||
|
||||
info = new WinInfo(this, display(), client, rootWindow(), properties, 2);
|
||||
info = new WinInfo(this, display(), m_client, rootWindow(), properties, 2);
|
||||
|
||||
cmap = attr.colormap;
|
||||
|
||||
|
@ -628,10 +628,10 @@ bool Client::manage(Window w, bool isMapped)
|
|||
// Called only from manage()
|
||||
void Client::embedClient(Window w, const XWindowAttributes& attr)
|
||||
{
|
||||
assert(client == None);
|
||||
assert(m_client == XCB_WINDOW_NONE);
|
||||
assert(frameId() == None);
|
||||
assert(m_wrapper == XCB_WINDOW_NONE);
|
||||
client = w;
|
||||
m_client = w;
|
||||
|
||||
const xcb_visualid_t visualid = XVisualIDFromVisual(attr.visual);
|
||||
const uint32_t zero_value = 0;
|
||||
|
@ -639,11 +639,11 @@ void Client::embedClient(Window w, const XWindowAttributes& attr)
|
|||
xcb_connection_t *conn = connection();
|
||||
|
||||
// We don't want the window to be destroyed when we quit
|
||||
xcb_change_save_set(conn, XCB_SET_MODE_INSERT, client);
|
||||
xcb_change_save_set(conn, XCB_SET_MODE_INSERT, m_client);
|
||||
|
||||
xcb_change_window_attributes(conn, client, XCB_CW_EVENT_MASK, &zero_value);
|
||||
xcb_unmap_window(conn, client);
|
||||
xcb_configure_window(conn, client, XCB_CONFIG_WINDOW_BORDER_WIDTH, &zero_value);
|
||||
xcb_change_window_attributes(conn, m_client, XCB_CW_EVENT_MASK, &zero_value);
|
||||
xcb_unmap_window(conn, m_client);
|
||||
xcb_configure_window(conn, m_client, XCB_CONFIG_WINDOW_BORDER_WIDTH, &zero_value);
|
||||
|
||||
// Note: These values must match the order in the xcb_cw_t enum
|
||||
const uint32_t cw_values[] = {
|
||||
|
@ -678,7 +678,7 @@ void Client::embedClient(Window w, const XWindowAttributes& attr)
|
|||
xcb_create_window(conn, attr.depth, frame, rootWindow(), 0, 0, 1, 1, 0,
|
||||
XCB_WINDOW_CLASS_INPUT_OUTPUT, visualid, cw_mask, cw_values);
|
||||
|
||||
setWindowHandles(client, frame);
|
||||
setWindowHandles(m_client, frame);
|
||||
|
||||
// Create the wrapper window
|
||||
xcb_window_t wrapperId = xcb_generate_id(conn);
|
||||
|
@ -686,14 +686,14 @@ void Client::embedClient(Window w, const XWindowAttributes& attr)
|
|||
XCB_WINDOW_CLASS_INPUT_OUTPUT, visualid, cw_mask, cw_values);
|
||||
m_wrapper.reset(wrapperId);
|
||||
|
||||
xcb_reparent_window(conn, client, m_wrapper, 0, 0);
|
||||
xcb_reparent_window(conn, m_client, m_wrapper, 0, 0);
|
||||
|
||||
// We could specify the event masks when we create the windows, but the original
|
||||
// Xlib code didn't. Let's preserve that behavior here for now so we don't end up
|
||||
// receiving any unexpected events from the wrapper creation or the reparenting.
|
||||
xcb_change_window_attributes(conn, frame, XCB_CW_EVENT_MASK, &frame_event_mask);
|
||||
xcb_change_window_attributes(conn, m_wrapper, XCB_CW_EVENT_MASK, &wrapper_event_mask);
|
||||
xcb_change_window_attributes(conn, client, XCB_CW_EVENT_MASK, &client_event_mask);
|
||||
xcb_change_window_attributes(conn, m_client, XCB_CW_EVENT_MASK, &client_event_mask);
|
||||
|
||||
updateMouseGrab();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue