// send the WM a message to begin a window resize operation
case Msg.WM_LBUTTONDOWN: {
Point p = new Point (LowOrder ((int)m.LParam.ToInt32 ()), HighOrder ((int)m.LParam.ToInt32 ()));
+ Form form = FindForm ();
if (this.SizingGrip && this.SizeGripBounds.Contains (p)) {
- XplatUI.SendMessage (this.FindForm().Handle, Msg.WM_NCLBUTTONDOWN, (IntPtr) HitTest.HTBOTTOMRIGHT, IntPtr.Zero);
+ // For top level forms it's not enoug to send a NCLBUTTONDOWN message, so
+ // we make a direct call to our XplatUI engine.
+ if (!form.IsMdiChild)
+ XplatUI.BeginMoveResize (form.Handle);
+
+ XplatUI.SendMessage (form.Handle, Msg.WM_NCLBUTTONDOWN, (IntPtr) HitTest.HTBOTTOMRIGHT, IntPtr.Zero);
return;
}
_NET_WM_STATE_TOGGLE = 2
}
+ internal enum NetWmMoveResize {
+ _NET_WM_MOVERESIZE_SIZE_TOPLEFT = 0,
+ _NET_WM_MOVERESIZE_SIZE_TOP = 1,
+ _NET_WM_MOVERESIZE_SIZE_TOPRIGHT = 2,
+ _NET_WM_MOVERESIZE_SIZE_RIGHT = 3,
+ _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT = 4,
+ _NET_WM_MOVERESIZE_SIZE_BOTTOM = 5,
+ _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT = 6,
+ _NET_WM_MOVERESIZE_SIZE_LEFT = 7,
+ _NET_WM_MOVERESIZE_MOVE = 8,
+ _NET_WM_MOVERESIZE_SIZE_KEYBOARD = 9,
+ _NET_WM_MOVERESIZE_MOVE_KEYBOARD = 10,
+ _NET_WM_MOVERESIZE_CANCEL = 11
+ }
+
[Flags]
internal enum XSizeHintsFlags {
USPosition = (1 << 0),
//private static IntPtr _NET_SHOWING_DESKTOP;
//private static IntPtr _NET_CLOSE_WINDOW;
//private static IntPtr _NET_MOVERESIZE_WINDOW;
- //private static IntPtr _NET_WM_MOVERESIZE;
+ private static IntPtr _NET_WM_MOVERESIZE;
//private static IntPtr _NET_RESTACK_WINDOW;
//private static IntPtr _NET_REQUEST_FRAME_EXTENTS;
private static IntPtr _NET_WM_NAME;
//"_NET_SHOWING_DESKTOP",
//"_NET_CLOSE_WINDOW",
//"_NET_MOVERESIZE_WINDOW",
- //"_NET_WM_MOVERESIZE",
+ "_NET_WM_MOVERESIZE",
//"_NET_RESTACK_WINDOW",
//"_NET_REQUEST_FRAME_EXTENTS",
"_NET_WM_NAME",
//_NET_SHOWING_DESKTOP = atoms [off++];
//_NET_CLOSE_WINDOW = atoms [off++];
//_NET_MOVERESIZE_WINDOW = atoms [off++];
- //_NET_WM_MOVERESIZE = atoms [off++];
+ _NET_WM_MOVERESIZE = atoms [off++];
//_NET_RESTACK_WINDOW = atoms [off++];
//_NET_REQUEST_FRAME_EXTENTS = atoms [off++];
_NET_WM_NAME = atoms [off++];
}
private void SendNetWMMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2) {
+ SendNetWMMessage (window, message_type, l0, l1, l2, IntPtr.Zero);
+ }
+
+ private void SendNetWMMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2, IntPtr l3) {
XEvent xev;
xev = new XEvent();
xev.ClientMessageEvent.ptr1 = l0;
xev.ClientMessageEvent.ptr2 = l1;
xev.ClientMessageEvent.ptr3 = l2;
+ xev.ClientMessageEvent.ptr4 = l3;
XSendEvent(DisplayHandle, RootWindow, false, new IntPtr ((int) (EventMask.SubstructureRedirectMask | EventMask.SubstructureNotifyMask)), ref xev);
}
(IntPtr) (screen_y << 16 | screen_x & 0xFFFF));
}
+ // Our very basic implementation of MoveResize - we can extend it later
+ // *if* needed
+ internal override void BeginMoveResize (IntPtr handle)
+ {
+ // We *need* to ungrab the pointer in the current display
+ XplatUI.UngrabWindow (Grab.Hwnd);
+
+ int x_root, y_root;
+ GetCursorPos (IntPtr.Zero, out x_root, out y_root);
+
+ Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
+ SendNetWMMessage (hwnd.whole_window, _NET_WM_MOVERESIZE, (IntPtr) x_root, (IntPtr) y_root,
+ (IntPtr) NetWmMoveResize._NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT,
+ (IntPtr) 1); // left button
+ }
+
internal override bool GetText(IntPtr handle, out string text) {
lock (XlibLock) {