internal override bool SetZOrder(IntPtr handle, IntPtr after_handle, bool top, bool bottom) {
Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
if (!hwnd.mapped) {
return false;
}
if (top) {
lock (XlibLock) {
XRaiseWindow(DisplayHandle, hwnd.whole_window);
}
return true;
} else if (!bottom) {
Hwnd after_hwnd = null;
if (after_handle != IntPtr.Zero) {
after_hwnd = Hwnd.ObjectFromHandle(after_handle);
}
XWindowChanges values = new XWindowChanges();
if (after_hwnd == null) {
// Work around metacity 'issues'
int[] atoms;
atoms = new int[2];
atoms[0] = unixtime();
XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_USER_TIME, (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, atoms, 1);
XRaiseWindow(DisplayHandle, hwnd.whole_window);
SendNetWMMessage(hwnd.whole_window, _NET_ACTIVE_WINDOW, (IntPtr)1, IntPtr.Zero, IntPtr.Zero);
return true;
//throw new ArgumentNullException("after_handle", "Need sibling to adjust z-order");
}
values.sibling = after_hwnd.whole_window;
values.stack_mode = StackMode.Below;
lock (XlibLock) {
XConfigureWindow(DisplayHandle, hwnd.whole_window, ChangeWindowFlags.CWStackMode | ChangeWindowFlags.CWSibling, ref values);
}
} else {
// Bottom
lock (XlibLock) {
XLowerWindow(DisplayHandle, hwnd.whole_window);
}
return true;
}
return false;
}