Changeset View
Changeset View
Standalone View
Standalone View
netinfo.cpp
Show All 16 Lines | |||||
17 | GNU General Public License for more details. | 17 | GNU General Public License for more details. | ||
18 | 18 | | |||
19 | You should have received a copy of the GNU General Public License | 19 | You should have received a copy of the GNU General Public License | ||
20 | along with this program. If not, see <http://www.gnu.org/licenses/>. | 20 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
21 | *********************************************************************/ | 21 | *********************************************************************/ | ||
22 | // own | 22 | // own | ||
23 | #include "netinfo.h" | 23 | #include "netinfo.h" | ||
24 | // kwin | 24 | // kwin | ||
25 | #include "client.h" | 25 | #include "x11client.h" | ||
26 | #include "rootinfo_filter.h" | 26 | #include "rootinfo_filter.h" | ||
27 | #include "virtualdesktops.h" | 27 | #include "virtualdesktops.h" | ||
28 | #include "workspace.h" | 28 | #include "workspace.h" | ||
29 | // Qt | 29 | // Qt | ||
30 | #include <QDebug> | 30 | #include <QDebug> | ||
31 | 31 | | |||
32 | namespace KWin | 32 | namespace KWin | ||
33 | { | 33 | { | ||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Line(s) | |||||
156 | void RootInfo::changeCurrentDesktop(int d) | 156 | void RootInfo::changeCurrentDesktop(int d) | ||
157 | { | 157 | { | ||
158 | VirtualDesktopManager::self()->setCurrent(d); | 158 | VirtualDesktopManager::self()->setCurrent(d); | ||
159 | } | 159 | } | ||
160 | 160 | | |||
161 | void RootInfo::changeActiveWindow(xcb_window_t w, NET::RequestSource src, xcb_timestamp_t timestamp, xcb_window_t active_window) | 161 | void RootInfo::changeActiveWindow(xcb_window_t w, NET::RequestSource src, xcb_timestamp_t timestamp, xcb_window_t active_window) | ||
162 | { | 162 | { | ||
163 | Workspace *workspace = Workspace::self(); | 163 | Workspace *workspace = Workspace::self(); | ||
164 | if (Client* c = workspace->findClient(Predicate::WindowMatch, w)) { | 164 | if (X11Client *c = workspace->findClient(Predicate::WindowMatch, w)) { | ||
165 | if (timestamp == XCB_CURRENT_TIME) | 165 | if (timestamp == XCB_CURRENT_TIME) | ||
166 | timestamp = c->userTime(); | 166 | timestamp = c->userTime(); | ||
167 | if (src != NET::FromApplication && src != FromTool) | 167 | if (src != NET::FromApplication && src != FromTool) | ||
168 | src = NET::FromTool; | 168 | src = NET::FromTool; | ||
169 | if (src == NET::FromTool) | 169 | if (src == NET::FromTool) | ||
170 | workspace->activateClient(c, true); // force | 170 | workspace->activateClient(c, true); // force | ||
171 | else if (c == workspace->mostRecentlyActivatedClient()) { | 171 | else if (c == workspace->mostRecentlyActivatedClient()) { | ||
172 | return; // WORKAROUND? With > 1 plasma activities, we cause this ourselves. bug #240673 | 172 | return; // WORKAROUND? With > 1 plasma activities, we cause this ourselves. bug #240673 | ||
173 | } else { // NET::FromApplication | 173 | } else { // NET::FromApplication | ||
174 | Client* c2; | 174 | X11Client *c2; | ||
175 | if (workspace->allowClientActivation(c, timestamp, false, true)) | 175 | if (workspace->allowClientActivation(c, timestamp, false, true)) | ||
176 | workspace->activateClient(c); | 176 | workspace->activateClient(c); | ||
177 | // if activation of the requestor's window would be allowed, allow activation too | 177 | // if activation of the requestor's window would be allowed, allow activation too | ||
178 | else if (active_window != XCB_WINDOW_NONE | 178 | else if (active_window != XCB_WINDOW_NONE | ||
179 | && (c2 = workspace->findClient(Predicate::WindowMatch, active_window)) != nullptr | 179 | && (c2 = workspace->findClient(Predicate::WindowMatch, active_window)) != nullptr | ||
180 | && workspace->allowClientActivation(c2, | 180 | && workspace->allowClientActivation(c2, | ||
181 | timestampCompare(timestamp, c2->userTime() > 0 ? timestamp : c2->userTime()), false, true)) { | 181 | timestampCompare(timestamp, c2->userTime() > 0 ? timestamp : c2->userTime()), false, true)) { | ||
182 | workspace->activateClient(c); | 182 | workspace->activateClient(c); | ||
183 | } else | 183 | } else | ||
184 | c->demandAttention(); | 184 | c->demandAttention(); | ||
185 | } | 185 | } | ||
186 | } | 186 | } | ||
187 | } | 187 | } | ||
188 | 188 | | |||
189 | void RootInfo::restackWindow(xcb_window_t w, RequestSource src, xcb_window_t above, int detail, xcb_timestamp_t timestamp) | 189 | void RootInfo::restackWindow(xcb_window_t w, RequestSource src, xcb_window_t above, int detail, xcb_timestamp_t timestamp) | ||
190 | { | 190 | { | ||
191 | if (Client* c = Workspace::self()->findClient(Predicate::WindowMatch, w)) { | 191 | if (X11Client *c = Workspace::self()->findClient(Predicate::WindowMatch, w)) { | ||
192 | if (timestamp == XCB_CURRENT_TIME) | 192 | if (timestamp == XCB_CURRENT_TIME) | ||
193 | timestamp = c->userTime(); | 193 | timestamp = c->userTime(); | ||
194 | if (src != NET::FromApplication && src != FromTool) | 194 | if (src != NET::FromApplication && src != FromTool) | ||
195 | src = NET::FromTool; | 195 | src = NET::FromTool; | ||
196 | c->restackWindow(above, detail, src, timestamp, true); | 196 | c->restackWindow(above, detail, src, timestamp, true); | ||
197 | } | 197 | } | ||
198 | } | 198 | } | ||
199 | 199 | | |||
200 | void RootInfo::closeWindow(xcb_window_t w) | 200 | void RootInfo::closeWindow(xcb_window_t w) | ||
201 | { | 201 | { | ||
202 | Client* c = Workspace::self()->findClient(Predicate::WindowMatch, w); | 202 | X11Client *c = Workspace::self()->findClient(Predicate::WindowMatch, w); | ||
203 | if (c) | 203 | if (c) | ||
204 | c->closeWindow(); | 204 | c->closeWindow(); | ||
205 | } | 205 | } | ||
206 | 206 | | |||
207 | void RootInfo::moveResize(xcb_window_t w, int x_root, int y_root, unsigned long direction) | 207 | void RootInfo::moveResize(xcb_window_t w, int x_root, int y_root, unsigned long direction) | ||
208 | { | 208 | { | ||
209 | Client* c = Workspace::self()->findClient(Predicate::WindowMatch, w); | 209 | X11Client *c = Workspace::self()->findClient(Predicate::WindowMatch, w); | ||
210 | if (c) { | 210 | if (c) { | ||
211 | updateXTime(); // otherwise grabbing may have old timestamp - this message should include timestamp | 211 | updateXTime(); // otherwise grabbing may have old timestamp - this message should include timestamp | ||
212 | c->NETMoveResize(x_root, y_root, (Direction)direction); | 212 | c->NETMoveResize(x_root, y_root, (Direction)direction); | ||
213 | } | 213 | } | ||
214 | } | 214 | } | ||
215 | 215 | | |||
216 | void RootInfo::moveResizeWindow(xcb_window_t w, int flags, int x, int y, int width, int height) | 216 | void RootInfo::moveResizeWindow(xcb_window_t w, int flags, int x, int y, int width, int height) | ||
217 | { | 217 | { | ||
218 | Client* c = Workspace::self()->findClient(Predicate::WindowMatch, w); | 218 | X11Client *c = Workspace::self()->findClient(Predicate::WindowMatch, w); | ||
219 | if (c) | 219 | if (c) | ||
220 | c->NETMoveResizeWindow(flags, x, y, width, height); | 220 | c->NETMoveResizeWindow(flags, x, y, width, height); | ||
221 | } | 221 | } | ||
222 | 222 | | |||
223 | void RootInfo::gotPing(xcb_window_t w, xcb_timestamp_t timestamp) | 223 | void RootInfo::gotPing(xcb_window_t w, xcb_timestamp_t timestamp) | ||
224 | { | 224 | { | ||
225 | if (Client* c = Workspace::self()->findClient(Predicate::WindowMatch, w)) | 225 | if (X11Client *c = Workspace::self()->findClient(Predicate::WindowMatch, w)) | ||
226 | c->gotPing(timestamp); | 226 | c->gotPing(timestamp); | ||
227 | } | 227 | } | ||
228 | 228 | | |||
229 | void RootInfo::changeShowingDesktop(bool showing) | 229 | void RootInfo::changeShowingDesktop(bool showing) | ||
230 | { | 230 | { | ||
231 | Workspace::self()->setShowingDesktop(showing); | 231 | Workspace::self()->setShowingDesktop(showing); | ||
232 | } | 232 | } | ||
233 | 233 | | |||
234 | void RootInfo::setActiveClient(AbstractClient *client) | 234 | void RootInfo::setActiveClient(AbstractClient *client) | ||
235 | { | 235 | { | ||
236 | const xcb_window_t w = client ? client->window() : xcb_window_t{XCB_WINDOW_NONE}; | 236 | const xcb_window_t w = client ? client->window() : xcb_window_t{XCB_WINDOW_NONE}; | ||
237 | if (m_activeWindow == w) { | 237 | if (m_activeWindow == w) { | ||
238 | return; | 238 | return; | ||
239 | } | 239 | } | ||
240 | m_activeWindow = w; | 240 | m_activeWindow = w; | ||
241 | setActiveWindow(m_activeWindow); | 241 | setActiveWindow(m_activeWindow); | ||
242 | } | 242 | } | ||
243 | 243 | | |||
244 | // **************************************** | 244 | // **************************************** | ||
245 | // WinInfo | 245 | // WinInfo | ||
246 | // **************************************** | 246 | // **************************************** | ||
247 | 247 | | |||
248 | WinInfo::WinInfo(Client * c, xcb_window_t window, | 248 | WinInfo::WinInfo(X11Client *c, xcb_window_t window, | ||
249 | xcb_window_t rwin, NET::Properties properties, NET::Properties2 properties2) | 249 | xcb_window_t rwin, NET::Properties properties, NET::Properties2 properties2) | ||
250 | : NETWinInfo(connection(), window, rwin, properties, properties2, NET::WindowManager), m_client(c) | 250 | : NETWinInfo(connection(), window, rwin, properties, properties2, NET::WindowManager), m_client(c) | ||
251 | { | 251 | { | ||
252 | } | 252 | } | ||
253 | 253 | | |||
254 | void WinInfo::changeDesktop(int desktop) | 254 | void WinInfo::changeDesktop(int desktop) | ||
255 | { | 255 | { | ||
256 | Workspace::self()->sendClientToDesktop(m_client, desktop, true); | 256 | Workspace::self()->sendClientToDesktop(m_client, desktop, true); | ||
▲ Show 20 Lines • Show All 49 Lines • Show Last 20 Lines |