Bug 1620101 - Apply the _NET_WM_DESKTOP property on the root window instead, to make workspace switching work on KDE and others. r=stransky

This patch also tweaks the behavior on Ubuntu Unity slightly to work with the
adaptive workspaces.

Differential Revision: https://phabricator.services.mozilla.com/D66431

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Mike de Boer 2020-03-12 13:59:44 +00:00
parent 19e49d0819
commit 9c44d249e7

View File

@ -1599,35 +1599,12 @@ void nsWindow::SetSizeMode(nsSizeMode aMode) {
mSizeState = mSizeMode;
}
static int32_t GdkX11ScreenGetNumberOfDesktops(GdkScreen* screen) {
GdkAtom cardinal_atom = gdk_x11_xatom_to_atom(XA_CARDINAL);
GdkAtom type_returned;
int format_returned;
int length_returned;
long* number_of_desktops;
if (!gdk_property_get(gdk_screen_get_root_window(screen),
gdk_atom_intern("_NET_NUMBER_OF_DESKTOPS", FALSE),
cardinal_atom,
0, // offset
INT32_MAX, // length
FALSE, // delete
&type_returned, &format_returned, &length_returned,
(guchar**)&number_of_desktops)) {
return 0;
}
auto desktops = int32_t(number_of_desktops[0]);
g_free(number_of_desktops);
return desktops;
}
int32_t nsWindow::GetWorkspaceID() {
if (!mIsX11Display) {
if (!mIsX11Display || !mShell) {
return 0;
}
// Get the gdk window for this widget.
GdkWindow* gdk_window = mGdkWindow;
GdkWindow* gdk_window = gtk_widget_get_window(mShell);
if (!gdk_window) {
return 0;
}
@ -1654,25 +1631,22 @@ int32_t nsWindow::GetWorkspaceID() {
}
void nsWindow::MoveToWorkspace(int32_t workspaceID) {
if (!workspaceID || !mIsX11Display) {
if (!workspaceID || !mIsX11Display || !mShell) {
return;
}
// Get the gdk window for this widget.
GdkWindow* gdk_window = mGdkWindow;
GdkWindow* gdk_window = gtk_widget_get_window(mShell);
if (!gdk_window) {
return;
}
GdkScreen* screen = gdk_window_get_screen(gdk_window);
if (workspaceID > GdkX11ScreenGetNumberOfDesktops(screen) - 1) {
return;
}
// This code is inspired by some found in the 'gxtuner' project.
// https://github.com/brummer10/gxtuner/blob/792d453da0f3a599408008f0f1107823939d730d/deskpager.cpp#L50
XEvent xevent;
guint value = workspaceID;
Display* xdisplay = gdk_x11_get_default_xdisplay();
GdkScreen* screen = gdk_window_get_screen(gdk_window);
Window root_win = GDK_WINDOW_XID(gdk_screen_get_root_window(screen));
GdkDisplay* display = gdk_window_get_display(gdk_window);
Atom type = gdk_x11_get_xatom_by_name_for_display(display, "_NET_WM_DESKTOP");