internal override void SetWindowPos(IntPtr handle, int x, int y, int width, int height) {
Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
if (hwnd == null) {
return;
}
// Win32 automatically changes negative width/height to 0.
if (width < 0)
width = 0;
if (height < 0)
height = 0;
// X requires a sanity check for width & height; otherwise it dies
if (hwnd.zero_sized && width > 0 && height > 0) {
if (hwnd.visible) {
HIViewSetVisible(hwnd.WholeWindow, true);
}
hwnd.zero_sized = false;
}
if ((width < 1) || (height < 1)) {
hwnd.zero_sized = true;
HIViewSetVisible(hwnd.WholeWindow, false);
}
// Save a server roundtrip (and prevent a feedback loop)
if ((hwnd.x == x) && (hwnd.y == y) && (hwnd.width == width) && (hwnd.height == height)) {
return;
}
if (!hwnd.zero_sized) {
hwnd.x = x;
hwnd.y = y;
hwnd.width = width;
hwnd.height = height;
SendMessage(hwnd.client_window, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
Control ctrl = Control.FromHandle (handle);
CreateParams cp = ctrl.GetCreateParams ();
Size TranslatedSize = TranslateWindowSizeToQuartzWindowSize (cp, new Size (width, height));
Carbon.Rect rect = new Carbon.Rect ();
if (WindowMapping [hwnd.Handle] != null) {
if (StyleSet (cp.Style, WindowStyles.WS_POPUP)) {
SetRect (ref rect, (short)x, (short)y, (short)(x+TranslatedSize.Width), (short)(y+TranslatedSize.Height));
} else {
SetRect (ref rect, (short)x, (short)(y+MenuBarHeight), (short)(x+TranslatedSize.Width), (short)(y+MenuBarHeight+TranslatedSize.Height));
}
SetWindowBounds ((IntPtr) WindowMapping [hwnd.Handle], 33, ref rect);
Carbon.HIRect frame_rect = new Carbon.HIRect (0, 0, TranslatedSize.Width, TranslatedSize.Height);
HIViewSetFrame (hwnd.whole_window, ref frame_rect);
SetCaretPos (Caret.Hwnd, Caret.X, Caret.Y);
} else {
Carbon.HIRect frame_rect = new Carbon.HIRect (x, y, TranslatedSize.Width, TranslatedSize.Height);
HIViewSetFrame (hwnd.whole_window, ref frame_rect);
}
PerformNCCalc(hwnd);
}
hwnd.x = x;
hwnd.y = y;
hwnd.width = width;
hwnd.height = height;
}