2003/06/18 07:49:51
[org.ibex.core.git] / src / org / xwt / plat / Win32.cc
index 195171b..6ba10bf 100644 (file)
@@ -1,4 +1,8 @@
 // Copyright 2002 Adam Megacz, see the COPYING file for licensing [LGPL]
+#include "GCJ.cc"
+
+// we have to do this because the jpeg libraries use the symbol 'INT32'
+#define INT32 WIN32_INT32
 
 // this has to precede the others so we don't get collisions on min/max
 #include <org/xwt/Box.h>
@@ -236,6 +240,17 @@ void org::xwt::plat::Win32::natInit() {
 
 // Platform Methods ///////////////////////////////////////////////////////////////////
 
+jstring org::xwt::plat::Win32::_getEnv(jstring key) {
+    int len = JvGetStringUTFLength(key);
+    char buf[len + 1];
+    JvGetStringUTFRegion(key, 0, len, buf);
+    buf[len] = '\0';
+    char buf2[1024];
+    DWORD ret = GetEnvironmentVariable(buf, buf2, 1024);
+    if (ret > 0 && ret < 1024) return JvNewStringLatin1(buf2);
+    return NULL;
+}
+
 jstring org::xwt::plat::Win32::_fileDialog(jstring suggestedFileName, jboolean write) {
 
     char buf[1024];
@@ -420,7 +435,6 @@ static jint scratch_h = 0;
 void org::xwt::plat::Win32$Win32DoubleBuffer::drawPicture(org::xwt::Picture* source0,
                                                           jint dx1, jint dy1, jint dx2, jint dy2,
                                                           jint sx1, jint sy1, jint sx2, jint sy2) {
-
     org::xwt::plat::Win32$Win32Picture* source = (org::xwt::plat::Win32$Win32Picture*)source0;
 
     if (source->hasalpha) {
@@ -510,6 +524,8 @@ void org::xwt::plat::Win32$Win32DoubleBuffer::fillRect(jint x, jint y, jint x2,
 }
 
 void org::xwt::plat::Win32$Win32Surface::blit(org::xwt::DoubleBuffer* s, jint sx, jint sy, jint dx, jint dy, jint dx2, jint dy2) {
+    // we create the DC lazily to get around some strange race condition in WinXP
+    if (hdc == 0) hdc = (jint)GetDC((HWND)hwnd);
     BitBlt((HDC)hdc, dx, dy, dx2 - dx, dy2 - dy, (HDC)(((org::xwt::plat::Win32$Win32DoubleBuffer*)s)->hdc), sx, sy, SRCCOPY);
 }
 
@@ -599,7 +615,6 @@ void org::xwt::plat::Win32$Win32Surface::natInit(jboolean framed) {
     // GC_enable_incremental();
 
     ShowWindow ((HWND)hwnd, SW_SHOWDEFAULT);
-    hdc = (jint)GetDC((HWND)hwnd);
 }
 
 void org::xwt::plat::Win32$Win32Surface::finalize() { /* DeleteObject((void*)hwnd); */ }
@@ -625,9 +640,9 @@ void org::xwt::plat::Win32$Win32Surface::setSize(jint w, jint h) {
     RECT client_rect, window_rect;
     GetClientRect((HWND)hwnd, &client_rect);
     GetWindowRect((HWND)hwnd, &window_rect);
-    int addwidth = (window_rect.right - window_rect.left) - (client_rect.right - client_rect.left);
-    int addheight = (window_rect.bottom - window_rect.top) - (client_rect.bottom - client_rect.top);
-    SetWindowPos((HWND)hwnd, NULL, 0, 0, w + addwidth, h + addheight, SWP_NOZORDER | SWP_NOMOVE);
+    int width = (window_rect.right - window_rect.left) - (client_rect.right - client_rect.left) + w;
+    int height = (window_rect.bottom - window_rect.top) - (client_rect.bottom - client_rect.top) + h;
+    SetWindowPos((HWND)hwnd, NULL, 0, 0, width, height, SWP_NOZORDER | SWP_NOMOVE);
 }
 
 void org::xwt::plat::Win32$Win32Surface::setTitleBarText(java::lang::String* title) {
@@ -644,6 +659,9 @@ void org::xwt::plat::Win32$Win32Surface::setIcon(org::xwt::Picture* p0) {
     int icon_width = GetSystemMetrics(SM_CXSMICON);
     int icon_height = GetSystemMetrics(SM_CYSMICON);
 
+    // we create the DC lazily to get around some strange race condition in WinXP
+    if (hdc == 0) hdc = (jint)GetDC((HWND)hwnd);
+
     // create the bitmap
     HBITMAP bit = CreateCompatibleBitmap((HDC)hdc, icon_width, icon_height);
     HDC memdc = CreateCompatibleDC((HDC)hdc);
@@ -684,9 +702,11 @@ jint org::xwt::plat::Win32$Win32Surface::WndProc(jint _hwnd, jint _iMsg, jint _w
     POINT point;
     HWND hwnd2;
     RECT rect, rect2;
+    RECT client_rect, window_rect;
     jboolean newinside;
     int16_t mouse_x;
     int16_t mouse_y;
+    int addwidth, addheight;
 
     switch(iMsg) {
     case WM_DEVMODECHANGE: break;    // FEATURE: color depth changed
@@ -793,11 +813,15 @@ jint org::xwt::plat::Win32$Win32Surface::WndProc(jint _hwnd, jint _iMsg, jint _w
         return 0;
 
     case WM_GETMINMAXINFO:
+        GetClientRect((HWND)hwnd, &client_rect);
+        GetWindowRect((HWND)hwnd, &window_rect);
+        addwidth = (window_rect.right - window_rect.left) - (client_rect.right - client_rect.left);
+        addheight = (window_rect.bottom - window_rect.top) - (client_rect.bottom - client_rect.top);
         mmi = (MINMAXINFO*)lParam;
-        mmi->ptMinTrackSize.x = root->dmin(0);
-        mmi->ptMinTrackSize.y = root->dmin(1);
-        mmi->ptMaxTrackSize.x = root->dmax(0);
-        mmi->ptMaxTrackSize.y = root->dmax(1);
+        mmi->ptMinTrackSize.x = ((uint32_t)root->dmin(0)) + addwidth;
+        mmi->ptMinTrackSize.y = ((uint32_t)root->dmin(1)) + addheight;
+        mmi->ptMaxTrackSize.x = min(org::xwt::plat::Win32::getScreenWidth(), ((uint32_t)root->dmax(0)) + addwidth);
+        mmi->ptMaxTrackSize.y = min(org::xwt::plat::Win32::getScreenHeight(), ((uint32_t)root->dmax(1)) + addheight);
         return 0;
         
     case WM_PAINT: