// 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>
#include <java/util/Hashtable.h>
#include <org/xwt/Box.h>
#include <org/xwt/Surface.h>
-#include <org/xwt/DoubleBuffer.h>
+#include <org/xwt/PixelBuffer.h>
#include <org/xwt/Picture.h>
-#include <org/xwt/ByteStream.h>
#include <org/xwt/Platform.h>
-#include <org/xwt/Platform$ParsedFont.h>
#include <org/xwt/plat/Win32.h>
-#include <org/xwt/plat/Win32$Win32Font.h>
#include <org/xwt/plat/Win32$Win32Surface.h>
-#include <org/xwt/plat/Win32$Win32DoubleBuffer.h>
+#include <org/xwt/plat/Win32$Win32PixelBuffer.h>
#include <org/xwt/plat/Win32$Win32Picture.h>
#include <org/xwt/util/Log.h>
#include <org/xwt/util/Semaphore.h>
}
}
-// This function iterates over each family (lparam == 0), and then over each size (lparam == 1)
-int CALLBACK fontproc(const LOGFONTA* enumlogfont, const TEXTMETRICA* tm, long unsigned int type, LPARAM lparam) {
-
- if (lparam == 0) {
- LOGFONT lf;
- lf.lfCharSet = ANSI_CHARSET;
- strncpy(lf.lfFaceName, enumlogfont->lfFaceName, 32);
- lf.lfPitchAndFamily = 0;
- EnumFontFamiliesEx((HDC)org::xwt::plat::Win32::desktop_dc, &lf, fontproc, 1, 0);
-
- } else {
- org::xwt::plat::Win32::addFont(JvNewStringLatin1(enumlogfont->lfFaceName),
- ((type & RASTER_FONTTYPE) == 0) ? 0 : tm->tmHeight,
- tm->tmItalic == 0 ? 0 : 1,
- tm->tmWeight <= 400 ? 0 : 1);
- }
- return 1;
-}
-
// Initialization ////////////////////////////////////////////////////////////////////
org::xwt::plat::Win32::sizewe_cursor = (jint)LoadCursor(NULL, IDC_SIZEWE);
org::xwt::plat::Win32::hand_cursor = (jint)CreateCursor(GetModuleHandle(NULL), 14, 1, 32, 32, hand_cursor_and, hand_cursor_xor);
- // enumerate fonts
- LOGFONT lf;
- lf.lfCharSet = ANSI_CHARSET;
- lf.lfFaceName[0] = 0;
- lf.lfPitchAndFamily = 0;
- EnumFontFamiliesEx((HDC)desktop_dc, &lf, fontproc, 0, 0);
-
messagePumpThread = (jint)GetCurrentThreadId();
messagePumpStarted->release();
// 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];
char buf[JvGetStringUTFLength(message) + 1];
buf[JvGetStringUTFLength(message)] = '\0';
JvGetStringUTFRegion(message, 0, JvGetStringUTFLength(message), buf);
- MessageBox (NULL, buf, "XWT Critical Abort", MB_OK | MB_ICONSTOP | MB_TASKMODAL | MB_SETFOREGROUND);
+ MessageBox (NULL, buf, "XWT Cannot Continue", MB_OK | MB_ICONSTOP | MB_TASKMODAL | MB_SETFOREGROUND);
java::lang::System::exit(-1);
}
return rect.bottom - rect.top;
}
-org::xwt::plat::Win32$Win32Font* org::xwt::plat::Win32::mapFont(org::xwt::Platform$ParsedFont* pf) {
- org::xwt::plat::Win32$Win32Font* ret = new org::xwt::plat::Win32$Win32Font();
- LOGFONT logfont;
- memset(&logfont, 0, sizeof(LOGFONT));
- logfont.lfHeight = -MulDiv(pf->size, GetDeviceCaps((HDC)org::xwt::plat::Win32::desktop_dc, LOGPIXELSY), 72);
- if (pf->italic) logfont.lfItalic = 1;
- if (pf->bold) logfont.lfWeight = FW_BOLD;
- logfont.lfCharSet = ANSI_CHARSET;
-
- JvGetStringUTFRegion(pf->name, 0, min(31, JvGetStringUTFLength(pf->name)), logfont.lfFaceName);
- logfont.lfFaceName[min(31, JvGetStringUTFLength(pf->name))] = 0;
-
- ret->hfont = (jint)CreateFontIndirect(&logfont);
- SelectObject((HDC)desktop_dc, (HFONT)(ret->hfont));
-
- TEXTMETRIC tm;
- GetTextMetrics((HDC)desktop_dc, &tm);
- POINT p;
- p.x = 0; p.y = tm.tmAscent;
- LPtoDP((HDC)desktop_dc, &p, 1);
- ret->maxAscent = p.y;
-
- p.x = 0; p.y = tm.tmDescent;
- LPtoDP((HDC)desktop_dc, &p, 1);
- ret->maxDescent = p.y;
-
- return ret;
-}
-
-jint org::xwt::plat::Win32::_stringWidth(jstring font, jstring text) {
-
- HFONT hfont = (HFONT)(getFont(font)->hfont);
- SelectObject((HDC)org::xwt::plat::Win32::desktop_dc, hfont);
-
- int len = min(1024, JvGetStringUTFLength(text));
- char buf[len + 1];
- buf[len] = '\0';
- JvGetStringUTFRegion(text, 0, len, buf);
-
- SIZE size;
- GetTextExtentPoint32((HDC)org::xwt::plat::Win32::desktop_dc, buf, len, &size);
- return size.cx;
-}
-
jboolean org::xwt::plat::Win32::_newBrowserWindow_(jstring url) {
int len = min(2048, JvGetStringUTFLength(url));
}
-// Win32DoubleBuffer /////////////////////////////////////////////////////////////////////////
+// Win32PixelBuffer /////////////////////////////////////////////////////////////////////////
// This is a scratch area; when blitting a translucent image, we copy the underlying data here first.
// Since all drawing operations are single-threaded, it's safe to use a global here.
else \
StretchBlt(dest, dx1, dy1, dx2 - dx1, dy2 - dy1, src, sx1, sy1, sx2 - sx1, sy2 - sy1, op);
-void org::xwt::plat::Win32$Win32DoubleBuffer::drawPicture(org::xwt::Picture* source0,
+void org::xwt::plat::Win32$Win32PixelBuffer::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) {
}
-void org::xwt::plat::Win32$Win32DoubleBuffer::drawString(jstring font, jstring text, jint x, jint y, jint color) {
-
- org::xwt::plat::Win32$Win32Font* wf = org::xwt::plat::Win32::getFont(font);
- SelectObject((HDC)hdc, (HFONT)(wf->hfont));
-
- // Platform API passes us the y-pos of the bottom of the text; we need the top
- y -= wf->maxAscent;
-
- int len = min(1024, JvGetStringUTFLength(text));
- char buf[len + 1];
- buf[len] = '\0';
- JvGetStringUTFRegion(text, 0, len, buf);
-
- SetTextColor((HDC)hdc, PALETTERGB((color & 0xFF0000) >> 16, (color & 0xFF00) >> 8, color & 0xFF));
- TextOut((HDC)hdc, x, y, buf, len);
-}
-
-void org::xwt::plat::Win32$Win32DoubleBuffer::fillRect(jint x, jint y, jint x2, jint y2, jint color) {
+void org::xwt::plat::Win32$Win32PixelBuffer::fillRect(jint x, jint y, jint x2, jint y2, jint color) {
jint w = x2 - x;
jint h = y2 - y;
DeleteObject(brush);
}
-void org::xwt::plat::Win32$Win32Surface::blit(org::xwt::DoubleBuffer* s, jint sx, jint sy, jint dx, jint dy, jint dx2, jint dy2) {
- BitBlt((HDC)hdc, dx, dy, dx2 - dx, dy2 - dy, (HDC)(((org::xwt::plat::Win32$Win32DoubleBuffer*)s)->hdc), sx, sy, SRCCOPY);
+void org::xwt::plat::Win32$Win32Surface::blit(org::xwt::PixelBuffer* 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$Win32PixelBuffer*)s)->hdc), sx, sy, SRCCOPY);
}
-void org::xwt::plat::Win32$Win32DoubleBuffer::natInit() {
+void org::xwt::plat::Win32$Win32PixelBuffer::natInit() {
hbitmap = (jint)CreateCompatibleBitmap((HDC)org::xwt::plat::Win32::desktop_dc, w, h);
hdc = (jint)CreateCompatibleDC((HDC)org::xwt::plat::Win32::desktop_dc);
SetBkMode((HDC)hdc, TRANSPARENT);
SelectObject((HDC)hdc, (HBITMAP)hbitmap);
}
-void org::xwt::plat::Win32$Win32DoubleBuffer::setClip(jint x, jint y, jint x2, jint y2) {
+void org::xwt::plat::Win32$Win32PixelBuffer::setClip(jint x, jint y, jint x2, jint y2) {
clipx1 = x; clipx2 = x2; clipy1 = y; clipy2 = y2;
HRGN hrgn = CreateRectRgn(x, y, x2, y2);
SelectClipRgn((HDC)hdc, hrgn);
DeleteObject(hrgn);
}
-void org::xwt::plat::Win32$Win32DoubleBuffer::finalize() {
+void org::xwt::plat::Win32$Win32PixelBuffer::finalize() {
DeleteObject((void*)hdc);
DeleteObject((void*)hbitmap);
}
// GC_enable_incremental();
ShowWindow ((HWND)hwnd, SW_SHOWDEFAULT);
- hdc = (jint)GetDC((HWND)hwnd);
}
void org::xwt::plat::Win32$Win32Surface::finalize() { /* DeleteObject((void*)hwnd); */ }
void org::xwt::plat::Win32$Win32Surface::_setMaximized(jboolean m) { ShowWindow((HWND)hwnd, m ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL); }
void org::xwt::plat::Win32$Win32Surface::postCursorChange() { PostMessage((HWND)hwnd, WM_USER_SETCURSOR, 0, 0); }
-void org::xwt::plat::Win32$Win32Surface::setLocation(jint x, jint y) {
+void org::xwt::plat::Win32$Win32Surface::setLocation() {
POINT point;
RECT rect;
point.x = 0;
point.y = 0;
ClientToScreen((HWND)hwnd, &point);
GetWindowRect((HWND)hwnd, &rect);
- SetWindowPos((HWND)hwnd, NULL, x - (point.x - rect.left), y - (point.y - rect.top), 0, 0, SWP_NOZORDER | SWP_NOSIZE);
+ SetWindowPos((HWND)hwnd, NULL, root->x - (point.x - rect.left), root->y - (point.y - rect.top), 0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
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) {
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);
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
case WM_DISPLAYCHANGE: break; // FEATURE: screen size changed
- case WM_FONTCHANGE: break; // FEATURE: set of fonts changed
case WM_MOUSEWHEEL: break; // FEATURE: Mouse Wheel
case WM_SYSKEYDOWN: if (GetKeyState(VK_MENU) >> (sizeof(SHORT) * 8 - 1) == 0) return 0;
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->minwidth) + addwidth;
+ mmi->ptMinTrackSize.y = ((uint32_t)root->minheight) + addheight;
+ mmi->ptMaxTrackSize.x = min(org::xwt::plat::Win32::getScreenWidth(), ((uint32_t)root->maxwidth) + addwidth);
+ mmi->ptMaxTrackSize.y = min(org::xwt::plat::Win32::getScreenHeight(), ((uint32_t)root->maxheight) + addheight);
return 0;
case WM_PAINT: