summaryrefslogtreecommitdiff
path: root/src/Fl_win32.cxx
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2020-07-01 18:03:10 +0200
committerAlbrecht Schlosser <albrechts.fltk@online.de>2020-07-06 20:28:20 +0200
commitf09e17c3c564e8310125a10c03397cbf473ff643 (patch)
tree8d0fd4a28e3686c33aaa140d07ddba26ab28bdc2 /src/Fl_win32.cxx
parentb0e0c355edaa2e23148cb0260ada907aec930f05 (diff)
Remove $Id$ tags, update URL's, and more
- remove obsolete svn '$Id$' tags from all source files - update .fl files and generated files accordingly - replace 'http://www.fltk.org' URL's with 'https://...' - replace bug report URL 'str.php' with 'bugs.php' - remove trailing whitespace - fix other whitespace errors flagged by Git - add and/or fix missing or wrong standard headers - convert tabs to spaces in all source files The only relevant code changes are in the fluid/ folder where some .fl files and other source files were used to generate the '$Id' headers and footers.
Diffstat (limited to 'src/Fl_win32.cxx')
-rw-r--r--src/Fl_win32.cxx1172
1 files changed, 583 insertions, 589 deletions
diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx
index 4ec2531ff..d234f7afd 100644
--- a/src/Fl_win32.cxx
+++ b/src/Fl_win32.cxx
@@ -1,6 +1,4 @@
//
-// "$Id$"
-//
// Windows-specific code for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2018 by Bill Spitzak and others.
@@ -9,11 +7,11 @@
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
-// http://www.fltk.org/COPYING.php
+// https://www.fltk.org/COPYING.php
//
-// Please report all bugs and problems on the following page:
+// Please see the following page on how to report bugs and issues:
//
-// http://www.fltk.org/str.php
+// https://www.fltk.org/bugs.php
//
// This file contains Windows-specific code for FLTK which is always linked
@@ -81,7 +79,7 @@ void fl_cleanup_dc_list(void);
#endif
#if !defined(NO_TRACK_MOUSE)
-# include <commctrl.h> // TrackMouseEvent
+# include <commctrl.h> // TrackMouseEvent
#endif
#if defined(__GNUC__)
@@ -261,7 +259,7 @@ static Fl_Window *track_mouse_win = 0; // current TrackMouseEvent() window
#endif
#ifndef WHEEL_DELTA
-# define WHEEL_DELTA 120 // according to MSDN.
+# define WHEEL_DELTA 120 // according to MSDN.
#endif
// This is only defined on Vista and upwards...
@@ -354,7 +352,7 @@ void Fl_WinAPI_System_Driver::remove_fd(int n, int events) {
if (fd[i].fd == n) {
short e = fd[i].events & ~events;
if (!e)
- continue; // if no events left, delete this fd
+ continue; // if no events left, delete this fd
fd[i].events = e;
}
// move it down in the array if necessary:
@@ -433,22 +431,22 @@ double Fl_WinAPI_Screen_Driver::wait(double time_to_wait) {
if (get_wsock_mod() && s_wsock_select(maxfd + 1, &fdt[0], &fdt[1], &fdt[2], &t)) {
// We got something - do the callback!
for (int i = 0; i < nfds; i++) {
- SOCKET f = fd[i].fd;
- short revents = 0;
- if (fl_wsk_fd_is_set(f, &fdt[0]))
- revents |= FL_READ;
- if (fl_wsk_fd_is_set(f, &fdt[1]))
- revents |= FL_WRITE;
- if (fl_wsk_fd_is_set(f, &fdt[2]))
- revents |= FL_EXCEPT;
- if (fd[i].events & revents)
- fd[i].cb(f, fd[i].arg);
+ SOCKET f = fd[i].fd;
+ short revents = 0;
+ if (fl_wsk_fd_is_set(f, &fdt[0]))
+ revents |= FL_READ;
+ if (fl_wsk_fd_is_set(f, &fdt[1]))
+ revents |= FL_WRITE;
+ if (fl_wsk_fd_is_set(f, &fdt[2]))
+ revents |= FL_EXCEPT;
+ if (fd[i].events & revents)
+ fd[i].cb(f, fd[i].arg);
}
time_to_wait = 0.0; // just peek for any messages
} else {
// we need to check them periodically, so set a short timeout:
if (time_to_wait > .001)
- time_to_wait = .001;
+ time_to_wait = .001;
}
}
@@ -673,15 +671,15 @@ public:
// Predict size of \r\n conversion buffer
for (i = in, lencount = inlen; lencount > 0; lencount--) {
if (*i == '\r' && *(i + 1) == '\n' && lencount >= 2) { // leave \r\n untranslated
- i += 2;
- outlen += 2;
- lencount--;
+ i += 2;
+ outlen += 2;
+ lencount--;
} else if (*i == '\n') { // \n by itself? leave room to insert \r
- i++;
- outlen += 2;
+ i++;
+ outlen += 2;
} else {
- ++i;
- ++outlen;
+ ++i;
+ ++outlen;
}
}
// Alloc conversion buffer + NULL
@@ -689,14 +687,14 @@ public:
// Handle \n -> \r\n conversion
for (i = in, o = out, lencount = inlen; lencount > 0; lencount--) {
if (*i == '\r' && *(i + 1) == '\n' && lencount >= 2) { // leave \r\n untranslated
- *o++ = *i++;
- *o++ = *i++;
- lencount--;
+ *o++ = *i++;
+ *o++ = *i++;
+ lencount--;
} else if (*i == '\n') { // \n by itself? insert \r
- *o++ = '\r';
- *o++ = *i++;
+ *o++ = '\r';
+ *o++ = *i++;
} else {
- *o++ = *i++;
+ *o++ = *i++;
}
}
*o++ = 0;
@@ -886,9 +884,9 @@ void Fl_WinAPI_System_Driver::paste(Fl_Widget &receiver, int clipboard, const ch
RECT rect = {0, 0, width, height};
Fl_Image_Surface *surf = new Fl_Image_Surface(width, height, 1);
Fl_Surface_Device::push_current(surf);
- fl_color(FL_WHITE); // draw white background
+ fl_color(FL_WHITE); // draw white background
fl_rectf(0, 0, width, height);
- rect.right *= scaling; // apply scaling to the metafile draw operation
+ rect.right *= scaling; // apply scaling to the metafile draw operation
rect.bottom *= scaling;
PlayEnhMetaFile((HDC)fl_graphics_driver->gc(), (HENHMETAFILE)h, &rect); // draw metafile to offscreen buffer
image = surf->image();
@@ -1008,7 +1006,7 @@ void fl_get_codepage() {
HWND fl_capture;
static int mouse_event(Fl_Window *window, int what, int button,
- WPARAM wParam, LPARAM lParam) {
+ WPARAM wParam, LPARAM lParam) {
static int px, py, pmx, pmy;
POINT pt;
float scale = Fl_Graphics_Driver::default_driver().scale();
@@ -1042,18 +1040,18 @@ static int mouse_event(Fl_Window *window, int what, int button,
switch (what) {
case 1: // double-click
if (Fl::e_is_click) {
- Fl::e_clicks++;
- goto J1;
+ Fl::e_clicks++;
+ goto J1;
}
case 0: // single-click
Fl::e_clicks = 0;
J1:
#ifdef USE_CAPTURE_MOUSE_WIN
if (!fl_capture)
- SetCapture(fl_xid(mouse_window)); // use mouse window
+ SetCapture(fl_xid(mouse_window)); // use mouse window
#else
if (!fl_capture)
- SetCapture(fl_xid(window)); // use main window
+ SetCapture(fl_xid(window)); // use main window
#endif
Fl::e_keysym = FL_Button + button;
Fl::e_is_click = 1;
@@ -1063,7 +1061,7 @@ static int mouse_event(Fl_Window *window, int what, int button,
case 2: // release:
if (!fl_capture)
- ReleaseCapture();
+ ReleaseCapture();
Fl::e_keysym = FL_Button + button;
return Fl::handle(FL_RELEASE, window);
@@ -1071,11 +1069,11 @@ static int mouse_event(Fl_Window *window, int what, int button,
default: // avoid compiler warning
// Windows produces extra events even if the mouse does not move, ignore em:
if (Fl::e_x_root == pmx && Fl::e_y_root == pmy)
- return 1;
+ return 1;
pmx = Fl::e_x_root;
pmy = Fl::e_y_root;
if (abs(Fl::e_x_root - px) > 5 || abs(Fl::e_y_root - py) > 5)
- Fl::e_is_click = 0;
+ Fl::e_is_click = 0;
return Fl::handle(FL_MOVE, window);
}
}
@@ -1086,68 +1084,68 @@ static int mouse_event(Fl_Window *window, int what, int button,
static const struct {
unsigned short vk, fltk, extended;
} vktab[] = {
- {VK_BACK, FL_BackSpace},
- {VK_TAB, FL_Tab},
- {VK_CLEAR, FL_KP+'5', 0xff0b/*XK_Clear*/},
- {VK_RETURN, FL_Enter, FL_KP_Enter},
- {VK_SHIFT, FL_Shift_L, FL_Shift_R},
- {VK_CONTROL, FL_Control_L, FL_Control_R},
- {VK_MENU, FL_Alt_L, FL_Alt_R},
- {VK_PAUSE, FL_Pause},
- {VK_CAPITAL, FL_Caps_Lock},
- {VK_ESCAPE, FL_Escape},
- {VK_SPACE, ' '},
- {VK_PRIOR, FL_KP+'9', FL_Page_Up},
- {VK_NEXT, FL_KP+'3', FL_Page_Down},
- {VK_END, FL_KP+'1', FL_End},
- {VK_HOME, FL_KP+'7', FL_Home},
- {VK_LEFT, FL_KP+'4', FL_Left},
- {VK_UP, FL_KP+'8', FL_Up},
- {VK_RIGHT, FL_KP+'6', FL_Right},
- {VK_DOWN, FL_KP+'2', FL_Down},
- {VK_SNAPSHOT, FL_Print}, // does not work on NT
- {VK_INSERT, FL_KP+'0', FL_Insert},
- {VK_DELETE, FL_KP+'.', FL_Delete},
- {VK_LWIN, FL_Meta_L},
- {VK_RWIN, FL_Meta_R},
- {VK_APPS, FL_Menu},
+ {VK_BACK, FL_BackSpace},
+ {VK_TAB, FL_Tab},
+ {VK_CLEAR, FL_KP+'5', 0xff0b/*XK_Clear*/},
+ {VK_RETURN, FL_Enter, FL_KP_Enter},
+ {VK_SHIFT, FL_Shift_L, FL_Shift_R},
+ {VK_CONTROL, FL_Control_L, FL_Control_R},
+ {VK_MENU, FL_Alt_L, FL_Alt_R},
+ {VK_PAUSE, FL_Pause},
+ {VK_CAPITAL, FL_Caps_Lock},
+ {VK_ESCAPE, FL_Escape},
+ {VK_SPACE, ' '},
+ {VK_PRIOR, FL_KP+'9', FL_Page_Up},
+ {VK_NEXT, FL_KP+'3', FL_Page_Down},
+ {VK_END, FL_KP+'1', FL_End},
+ {VK_HOME, FL_KP+'7', FL_Home},
+ {VK_LEFT, FL_KP+'4', FL_Left},
+ {VK_UP, FL_KP+'8', FL_Up},
+ {VK_RIGHT, FL_KP+'6', FL_Right},
+ {VK_DOWN, FL_KP+'2', FL_Down},
+ {VK_SNAPSHOT, FL_Print}, // does not work on NT
+ {VK_INSERT, FL_KP+'0', FL_Insert},
+ {VK_DELETE, FL_KP+'.', FL_Delete},
+ {VK_LWIN, FL_Meta_L},
+ {VK_RWIN, FL_Meta_R},
+ {VK_APPS, FL_Menu},
{VK_SLEEP, FL_Sleep},
- {VK_MULTIPLY, FL_KP+'*'},
- {VK_ADD, FL_KP+'+'},
- {VK_SUBTRACT, FL_KP+'-'},
- {VK_DECIMAL, FL_KP+'.'},
- {VK_DIVIDE, FL_KP+'/'},
- {VK_NUMLOCK, FL_Num_Lock},
- {VK_SCROLL, FL_Scroll_Lock},
+ {VK_MULTIPLY, FL_KP+'*'},
+ {VK_ADD, FL_KP+'+'},
+ {VK_SUBTRACT, FL_KP+'-'},
+ {VK_DECIMAL, FL_KP+'.'},
+ {VK_DIVIDE, FL_KP+'/'},
+ {VK_NUMLOCK, FL_Num_Lock},
+ {VK_SCROLL, FL_Scroll_Lock},
#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500)
- {VK_BROWSER_BACK, FL_Back},
- {VK_BROWSER_FORWARD, FL_Forward},
- {VK_BROWSER_REFRESH, FL_Refresh},
- {VK_BROWSER_STOP, FL_Stop},
- {VK_BROWSER_SEARCH, FL_Search},
+ {VK_BROWSER_BACK, FL_Back},
+ {VK_BROWSER_FORWARD, FL_Forward},
+ {VK_BROWSER_REFRESH, FL_Refresh},
+ {VK_BROWSER_STOP, FL_Stop},
+ {VK_BROWSER_SEARCH, FL_Search},
{VK_BROWSER_FAVORITES, FL_Favorites},
- {VK_BROWSER_HOME, FL_Home_Page},
- {VK_VOLUME_MUTE, FL_Volume_Mute},
- {VK_VOLUME_DOWN, FL_Volume_Down},
- {VK_VOLUME_UP, FL_Volume_Up},
- {VK_MEDIA_NEXT_TRACK, FL_Media_Next},
- {VK_MEDIA_PREV_TRACK, FL_Media_Prev},
- {VK_MEDIA_STOP, FL_Media_Stop},
- {VK_MEDIA_PLAY_PAUSE, FL_Media_Play},
- {VK_LAUNCH_MAIL, FL_Mail},
+ {VK_BROWSER_HOME, FL_Home_Page},
+ {VK_VOLUME_MUTE, FL_Volume_Mute},
+ {VK_VOLUME_DOWN, FL_Volume_Down},
+ {VK_VOLUME_UP, FL_Volume_Up},
+ {VK_MEDIA_NEXT_TRACK, FL_Media_Next},
+ {VK_MEDIA_PREV_TRACK, FL_Media_Prev},
+ {VK_MEDIA_STOP, FL_Media_Stop},
+ {VK_MEDIA_PLAY_PAUSE, FL_Media_Play},
+ {VK_LAUNCH_MAIL, FL_Mail},
#endif
- {0xba, ';'},
- {0xbb, '='},
- {0xbc, ','},
- {0xbd, '-'},
- {0xbe, '.'},
- {0xbf, '/'},
- {0xc0, '`'},
- {0xdb, '['},
- {0xdc, '\\'},
- {0xdd, ']'},
- {0xde, '\''},
- {VK_OEM_102, FL_Iso_Key}
+ {0xba, ';'},
+ {0xbb, '='},
+ {0xbc, ','},
+ {0xbd, '-'},
+ {0xbe, '.'},
+ {0xbf, '/'},
+ {0xc0, '`'},
+ {0xdb, '['},
+ {0xdc, '\\'},
+ {0xdd, ']'},
+ {0xde, '\''},
+ {VK_OEM_102, FL_Iso_Key}
};
static int ms2fltk(WPARAM vk, int extended) {
static unsigned short vklut[256];
@@ -1166,7 +1164,7 @@ static int ms2fltk(WPARAM vk, int extended) {
}
for (i = 0; i < 256; i++)
if (!extendedlut[i])
- extendedlut[i] = vklut[i];
+ extendedlut[i] = vklut[i];
}
return extended ? extendedlut[vk] : vklut[vk];
}
@@ -1202,434 +1200,434 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
switch (uMsg) {
case WM_DPICHANGED: { // 0x02E0
- if (is_dpi_aware && !Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy) {
- RECT r;
+ if (is_dpi_aware && !Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy) {
+ RECT r;
Fl_WinAPI_Screen_Driver *sd = (Fl_WinAPI_Screen_Driver*)Fl::screen_driver();
int ns = Fl_Window_Driver::driver(window)->screen_num();
sd->dpi[ns][0] = sd->dpi[ns][1] = HIWORD(wParam);
- float f = HIWORD(wParam) / 96.;
- GetClientRect(hWnd, &r);
- float old_f = float(r.right) / window->w();
- Fl::screen_driver()->scale(ns, f);
- Fl_Window_Driver::driver(window)->resize_after_scale_change(ns, old_f, f);
- }
- return 0;
+ float f = HIWORD(wParam) / 96.;
+ GetClientRect(hWnd, &r);
+ float old_f = float(r.right) / window->w();
+ Fl::screen_driver()->scale(ns, f);
+ Fl_Window_Driver::driver(window)->resize_after_scale_change(ns, old_f, f);
+ }
+ return 0;
}
case WM_QUIT: // this should not happen?
- Fl::fatal("WM_QUIT message");
+ Fl::fatal("WM_QUIT message");
case WM_CLOSE: // user clicked close box
- Fl::handle(FL_CLOSE, window);
- return 0;
+ Fl::handle(FL_CLOSE, window);
+ return 0;
case WM_SYNCPAINT:
case WM_NCPAINT:
case WM_ERASEBKGND:
- // Andreas Weitl - WM_SYNCPAINT needs to be passed to DefWindowProc
- // so that Windows can generate the proper paint messages...
- // Similarly, WM_NCPAINT and WM_ERASEBKGND need this, too...
- break;
+ // Andreas Weitl - WM_SYNCPAINT needs to be passed to DefWindowProc
+ // so that Windows can generate the proper paint messages...
+ // Similarly, WM_NCPAINT and WM_ERASEBKGND need this, too...
+ break;
case WM_PAINT: {
- Fl_Region R, R2;
- Fl_X *i = Fl_X::i(window);
- Fl_Window_Driver::driver(window)->wait_for_expose_value = 0;
- char redraw_whole_window = false;
- if (!i->region && window->damage()) {
- // Redraw the whole window...
- i->region = CreateRectRgn(0, 0, window->w(), window->h());
- redraw_whole_window = true;
- }
-
- // We need to merge Windows' damage into FLTK's damage.
- R = CreateRectRgn(0, 0, 0, 0);
- int r = GetUpdateRgn(hWnd, R, 0);
- if (r == NULLREGION && !redraw_whole_window) {
- DeleteObject(R);
- break;
- }
-
- // convert i->region in FLTK units to R2 in drawing units
- R2 = Fl_GDI_Graphics_Driver::scale_region(i->region, scale, NULL);
-
- if (R2) {
- // Also tell Windows that we are drawing someplace else as well...
- CombineRgn(R2, R2, R, RGN_OR);
- DeleteObject(R);
- } else {
- R2 = R;
- }
- if (window->type() == FL_DOUBLE_WINDOW)
- ValidateRgn(hWnd, 0);
- else {
- ValidateRgn(hWnd, R2);
- }
-
- // convert R2 in drawing units to i->region in FLTK units
- i->region = Fl_GDI_Graphics_Driver::scale_region(R2, 1 / scale, NULL);
-
- window->clear_damage((uchar)(window->damage() | FL_DAMAGE_EXPOSE));
- // These next two statements should not be here, so that all update
- // is deferred until Fl::flush() is called during idle. However Windows
- // apparently is very unhappy if we don't obey it and draw right now.
- // Very annoying!
- fl_GetDC(hWnd); // Make sure we have a DC for this window...
- fl_save_pen();
- Fl_Window_Driver::driver(window)->flush();
- fl_restore_pen();
- window->clear_damage();
- return 0;
+ Fl_Region R, R2;
+ Fl_X *i = Fl_X::i(window);
+ Fl_Window_Driver::driver(window)->wait_for_expose_value = 0;
+ char redraw_whole_window = false;
+ if (!i->region && window->damage()) {
+ // Redraw the whole window...
+ i->region = CreateRectRgn(0, 0, window->w(), window->h());
+ redraw_whole_window = true;
+ }
+
+ // We need to merge Windows' damage into FLTK's damage.
+ R = CreateRectRgn(0, 0, 0, 0);
+ int r = GetUpdateRgn(hWnd, R, 0);
+ if (r == NULLREGION && !redraw_whole_window) {
+ DeleteObject(R);
+ break;
+ }
+
+ // convert i->region in FLTK units to R2 in drawing units
+ R2 = Fl_GDI_Graphics_Driver::scale_region(i->region, scale, NULL);
+
+ if (R2) {
+ // Also tell Windows that we are drawing someplace else as well...
+ CombineRgn(R2, R2, R, RGN_OR);
+ DeleteObject(R);
+ } else {
+ R2 = R;
+ }
+ if (window->type() == FL_DOUBLE_WINDOW)
+ ValidateRgn(hWnd, 0);
+ else {
+ ValidateRgn(hWnd, R2);
+ }
+
+ // convert R2 in drawing units to i->region in FLTK units
+ i->region = Fl_GDI_Graphics_Driver::scale_region(R2, 1 / scale, NULL);
+
+ window->clear_damage((uchar)(window->damage() | FL_DAMAGE_EXPOSE));
+ // These next two statements should not be here, so that all update
+ // is deferred until Fl::flush() is called during idle. However Windows
+ // apparently is very unhappy if we don't obey it and draw right now.
+ // Very annoying!
+ fl_GetDC(hWnd); // Make sure we have a DC for this window...
+ fl_save_pen();
+ Fl_Window_Driver::driver(window)->flush();
+ fl_restore_pen();
+ window->clear_damage();
+ return 0;
} // case WM_PAINT
case WM_LBUTTONDOWN:
- mouse_event(window, 0, 1, wParam, lParam);
- return 0;
+ mouse_event(window, 0, 1, wParam, lParam);
+ return 0;
case WM_LBUTTONDBLCLK:
- mouse_event(window, 1, 1, wParam, lParam);
- return 0;
+ mouse_event(window, 1, 1, wParam, lParam);
+ return 0;
case WM_LBUTTONUP:
- mouse_event(window, 2, 1, wParam, lParam);
- return 0;
+ mouse_event(window, 2, 1, wParam, lParam);
+ return 0;
case WM_MBUTTONDOWN:
- mouse_event(window, 0, 2, wParam, lParam);
- return 0;
+ mouse_event(window, 0, 2, wParam, lParam);
+ return 0;
case WM_MBUTTONDBLCLK:
- mouse_event(window, 1, 2, wParam, lParam);
- return 0;
+ mouse_event(window, 1, 2, wParam, lParam);
+ return 0;
case WM_MBUTTONUP:
- mouse_event(window, 2, 2, wParam, lParam);
- return 0;
+ mouse_event(window, 2, 2, wParam, lParam);
+ return 0;
case WM_RBUTTONDOWN:
- mouse_event(window, 0, 3, wParam, lParam);
- return 0;
+ mouse_event(window, 0, 3, wParam, lParam);
+ return 0;
case WM_RBUTTONDBLCLK:
- mouse_event(window, 1, 3, wParam, lParam);
- return 0;
+ mouse_event(window, 1, 3, wParam, lParam);
+ return 0;
case WM_RBUTTONUP:
- mouse_event(window, 2, 3, wParam, lParam);
- return 0;
+ mouse_event(window, 2, 3, wParam, lParam);
+ return 0;
case WM_MOUSEMOVE:
#ifdef USE_TRACK_MOUSE
- if (track_mouse_win != window) {
- TRACKMOUSEEVENT tme;
- tme.cbSize = sizeof(TRACKMOUSEEVENT);
- tme.dwFlags = TME_LEAVE;
- tme.hwndTrack = hWnd;
- _TrackMouseEvent(&tme);
- track_mouse_win = window;
- }
-#endif // USE_TRACK_MOUSE
- mouse_event(window, 3, 0, wParam, lParam);
- return 0;
+ if (track_mouse_win != window) {
+ TRACKMOUSEEVENT tme;
+ tme.cbSize = sizeof(TRACKMOUSEEVENT);
+ tme.dwFlags = TME_LEAVE;
+ tme.hwndTrack = hWnd;
+ _TrackMouseEvent(&tme);
+ track_mouse_win = window;
+ }
+#endif // USE_TRACK_MOUSE
+ mouse_event(window, 3, 0, wParam, lParam);
+ return 0;
case WM_MOUSELEAVE:
- if (track_mouse_win == window) { // we left the top level window !
- Fl_Window *tw = window;
- while (tw->parent()) // find top level window
- tw = tw->window();
- Fl::belowmouse(0);
- Fl::handle(FL_LEAVE, tw);
- }
- track_mouse_win = 0; // force TrackMouseEvent() restart
- break;
+ if (track_mouse_win == window) { // we left the top level window !
+ Fl_Window *tw = window;
+ while (tw->parent()) // find top level window
+ tw = tw->window();
+ Fl::belowmouse(0);
+ Fl::handle(FL_LEAVE, tw);
+ }
+ track_mouse_win = 0; // force TrackMouseEvent() restart
+ break;
case WM_SETFOCUS:
- if ((Fl::modal_) && (Fl::modal_ != window)) {
- SetFocus(fl_xid(Fl::modal_));
- return 0;
- }
- Fl::handle(FL_FOCUS, window);
- break;
+ if ((Fl::modal_) && (Fl::modal_ != window)) {
+ SetFocus(fl_xid(Fl::modal_));
+ return 0;
+ }
+ Fl::handle(FL_FOCUS, window);
+ break;
case WM_KILLFOCUS:
- Fl::handle(FL_UNFOCUS, window);
- Fl::flush(); // it never returns to main loop when deactivated...
- break;
+ Fl::handle(FL_UNFOCUS, window);
+ Fl::flush(); // it never returns to main loop when deactivated...
+ break;
case WM_SHOWWINDOW:
- if (!window->parent()) {
- Fl::handle(wParam ? FL_SHOW : FL_HIDE, window);
- }
- break;
+ if (!window->parent()) {
+ Fl::handle(wParam ? FL_SHOW : FL_HIDE, window);
+ }
+ break;
case WM_ACTIVATEAPP:
- // From eric@vfx.sel.sony.com, we should process WM_ACTIVATEAPP
- // messages to restore the correct state of the shift/ctrl/alt/lock
- // keys... Added control, shift, alt, and meta keys, and changed
- // to use GetAsyncKeyState and do it when wParam is 1
- // (that means we have focus...)
- if (wParam) {
- ulong state = 0;
- if (GetAsyncKeyState(VK_CAPITAL))
- state |= FL_CAPS_LOCK;
- if (GetAsyncKeyState(VK_NUMLOCK))
- state |= FL_NUM_LOCK;
- if (GetAsyncKeyState(VK_SCROLL))
- state |= FL_SCROLL_LOCK;
- if (GetAsyncKeyState(VK_CONTROL) & ~1)
- state |= FL_CTRL;
- if (GetAsyncKeyState(VK_SHIFT) & ~1)
- state |= FL_SHIFT;
- if (GetAsyncKeyState(VK_MENU))
- state |= FL_ALT;
- if ((GetAsyncKeyState(VK_LWIN) | GetAsyncKeyState(VK_RWIN)) & ~1)
- state |= FL_META;
- Fl::e_state = state;
- return 0;
- }
- break;
+ // From eric@vfx.sel.sony.com, we should process WM_ACTIVATEAPP
+ // messages to restore the correct state of the shift/ctrl/alt/lock
+ // keys... Added control, shift, alt, and meta keys, and changed
+ // to use GetAsyncKeyState and do it when wParam is 1
+ // (that means we have focus...)
+ if (wParam) {
+ ulong state = 0;
+ if (GetAsyncKeyState(VK_CAPITAL))
+ state |= FL_CAPS_LOCK;
+ if (GetAsyncKeyState(VK_NUMLOCK))
+ state |= FL_NUM_LOCK;
+ if (GetAsyncKeyState(VK_SCROLL))
+ state |= FL_SCROLL_LOCK;
+ if (GetAsyncKeyState(VK_CONTROL) & ~1)
+ state |= FL_CTRL;
+ if (GetAsyncKeyState(VK_SHIFT) & ~1)
+ state |= FL_SHIFT;
+ if (GetAsyncKeyState(VK_MENU))
+ state |= FL_ALT;
+ if ((GetAsyncKeyState(VK_LWIN) | GetAsyncKeyState(VK_RWIN)) & ~1)
+ state |= FL_META;
+ Fl::e_state = state;
+ return 0;
+ }
+ break;
case WM_INPUTLANGCHANGE:
- fl_get_codepage();
- break;
+ fl_get_codepage();
+ break;
case WM_IME_COMPOSITION:
- // if (!fl_is_nt4() && lParam & GCS_RESULTCLAUSE) {
- // HIMC himc = ImmGetContext(hWnd);
- // wlen = ImmGetCompositionStringW(himc, GCS_RESULTSTR,
- // wbuf, sizeof(wbuf)) / sizeof(short);
- // if (wlen < 0) wlen = 0;
- // wbuf[wlen] = 0;
- // ImmReleaseContext(hWnd, himc);
- // }
- break;
+ // if (!fl_is_nt4() && lParam & GCS_RESULTCLAUSE) {
+ // HIMC himc = ImmGetContext(hWnd);
+ // wlen = ImmGetCompositionStringW(himc, GCS_RESULTSTR,
+ // wbuf, sizeof(wbuf)) / sizeof(short);
+ // if (wlen < 0) wlen = 0;
+ // wbuf[wlen] = 0;
+ // ImmReleaseContext(hWnd, himc);
+ // }
+ break;
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
- // save the keysym until we figure out the characters:
- Fl::e_keysym = Fl::e_original_keysym = ms2fltk(wParam, lParam & (1 << 24));
- // See if TranslateMessage turned it into a WM_*CHAR message:
- if (PeekMessageW(&fl_msg, hWnd, WM_CHAR, WM_SYSDEADCHAR, PM_REMOVE)) {
- uMsg = fl_msg.message;
- wParam = fl_msg.wParam;
- lParam = fl_msg.lParam;
- }
- // FALLTHROUGH ...
+ // save the keysym until we figure out the characters:
+ Fl::e_keysym = Fl::e_original_keysym = ms2fltk(wParam, lParam & (1 << 24));
+ // See if TranslateMessage turned it into a WM_*CHAR message:
+ if (PeekMessageW(&fl_msg, hWnd, WM_CHAR, WM_SYSDEADCHAR, PM_REMOVE)) {
+ uMsg = fl_msg.message;
+ wParam = fl_msg.wParam;
+ lParam = fl_msg.lParam;
+ }
+ // FALLTHROUGH ...
case WM_DEADCHAR:
case WM_SYSDEADCHAR:
case WM_CHAR:
case WM_SYSCHAR: {
- ulong state = Fl::e_state & 0xff000000; // keep the mouse button state
- // if GetKeyState is expensive we might want to comment some of these out:
- if (GetKeyState(VK_SHIFT) & ~1)
- state |= FL_SHIFT;
- if (GetKeyState(VK_CAPITAL))
- state |= FL_CAPS_LOCK;
- if (GetKeyState(VK_CONTROL) & ~1)
- state |= FL_CTRL;
- // Alt gets reported for the Alt-GR switch on non-English keyboards.
- // so we need to check the event as well to get it right:
- if ((lParam & (1 << 29)) // same as GetKeyState(VK_MENU)
- && uMsg != WM_CHAR)
- state |= FL_ALT;
- if (GetKeyState(VK_NUMLOCK))
- state |= FL_NUM_LOCK;
- if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & ~1) {
- // Windows bug? GetKeyState returns garbage if the user hit the
- // meta key to pop up start menu. Sigh.
- if ((GetAsyncKeyState(VK_LWIN) | GetAsyncKeyState(VK_RWIN)) & ~1)
- state |= FL_META;
- }
- if (GetKeyState(VK_SCROLL))
- state |= FL_SCROLL_LOCK;
- Fl::e_state = state;
- static char buffer[1024];
- if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) {
- wchar_t u = (wchar_t)wParam;
- Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1);
- buffer[Fl::e_length] = 0;
- } else if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) {
- if (state & FL_NUM_LOCK) {
- // Convert to regular keypress...
- buffer[0] = Fl::e_keysym - FL_KP;
- Fl::e_length = 1;
- } else {
- // Convert to special keypress...
- buffer[0] = 0;
- Fl::e_length = 0;
- switch (Fl::e_keysym) {
- case FL_KP + '0':
- Fl::e_keysym = FL_Insert;
- break;
- case FL_KP + '1':
- Fl::e_keysym = FL_End;
- break;
- case FL_KP + '2':
- Fl::e_keysym = FL_Down;
- break;
- case FL_KP + '3':
- Fl::e_keysym = FL_Page_Down;
- break;
- case FL_KP + '4':
- Fl::e_keysym = FL_Left;
- break;
- case FL_KP + '6':
- Fl::e_keysym = FL_Right;
- break;
- case FL_KP + '7':
- Fl::e_keysym = FL_Home;
- break;
- case FL_KP + '8':
- Fl::e_keysym = FL_Up;
- break;
- case FL_KP + '9':
- Fl::e_keysym = FL_Page_Up;
- break;
- case FL_KP + '.':
- Fl::e_keysym = FL_Delete;
- break;
- case FL_KP + '/':
- case FL_KP + '*':
- case FL_KP + '-':
- case FL_KP + '+':
- buffer[0] = Fl::e_keysym - FL_KP;
- Fl::e_length = 1;
- break;
- }
- }
- } else if ((lParam & (1 << 31)) == 0) {
+ ulong state = Fl::e_state & 0xff000000; // keep the mouse button state
+ // if GetKeyState is expensive we might want to comment some of these out:
+ if (GetKeyState(VK_SHIFT) & ~1)
+ state |= FL_SHIFT;
+ if (GetKeyState(VK_CAPITAL))
+ state |= FL_CAPS_LOCK;
+ if (GetKeyState(VK_CONTROL) & ~1)
+ state |= FL_CTRL;
+ // Alt gets reported for the Alt-GR switch on non-English keyboards.
+ // so we need to check the event as well to get it right:
+ if ((lParam & (1 << 29)) // same as GetKeyState(VK_MENU)
+ && uMsg != WM_CHAR)
+ state |= FL_ALT;
+ if (GetKeyState(VK_NUMLOCK))
+ state |= FL_NUM_LOCK;
+ if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & ~1) {
+ // Windows bug? GetKeyState returns garbage if the user hit the
+ // meta key to pop up start menu. Sigh.
+ if ((GetAsyncKeyState(VK_LWIN) | GetAsyncKeyState(VK_RWIN)) & ~1)
+ state |= FL_META;
+ }
+ if (GetKeyState(VK_SCROLL))
+ state |= FL_SCROLL_LOCK;
+ Fl::e_state = state;
+ static char buffer[1024];
+ if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) {
+ wchar_t u = (wchar_t)wParam;
+ Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1);
+ buffer[Fl::e_length] = 0;
+ } else if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) {
+ if (state & FL_NUM_LOCK) {
+ // Convert to regular keypress...
+ buffer[0] = Fl::e_keysym - FL_KP;
+ Fl::e_length = 1;
+ } else {
+ // Convert to special keypress...
+ buffer[0] = 0;
+ Fl::e_length = 0;
+ switch (Fl::e_keysym) {
+ case FL_KP + '0':
+ Fl::e_keysym = FL_Insert;
+ break;
+ case FL_KP + '1':
+ Fl::e_keysym = FL_End;
+ break;
+ case FL_KP + '2':
+ Fl::e_keysym = FL_Down;
+ break;
+ case FL_KP + '3':
+ Fl::e_keysym = FL_Page_Down;
+ break;
+ case FL_KP + '4':
+ Fl::e_keysym = FL_Left;
+ break;
+ case FL_KP + '6':
+ Fl::e_keysym = FL_Right;
+ break;
+ case FL_KP + '7':
+ Fl::e_keysym = FL_Home;
+ break;
+ case FL_KP + '8':
+ Fl::e_keysym = FL_Up;
+ break;
+ case FL_KP + '9':
+ Fl::e_keysym = FL_Page_Up;
+ break;
+ case FL_KP + '.':
+ Fl::e_keysym = FL_Delete;
+ break;
+ case FL_KP + '/':
+ case FL_KP + '*':
+ case FL_KP + '-':
+ case FL_KP + '+':
+ buffer[0] = Fl::e_keysym - FL_KP;
+ Fl::e_length = 1;
+ break;
+ }
+ }
+ } else if ((lParam & (1 << 31)) == 0) {
#ifdef FLTK_PREVIEW_DEAD_KEYS
- if ((lParam & (1 << 24)) == 0) { // clear if dead key (always?)
- wchar_t u = (wchar_t)wParam;
- Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1);
- buffer[Fl::e_length] = 0;
- } else { // set if "extended key" (never printable?)
- buffer[0] = 0;
- Fl::e_length = 0;
- }
+ if ((lParam & (1 << 24)) == 0) { // clear if dead key (always?)
+ wchar_t u = (wchar_t)wParam;
+ Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1);
+ buffer[Fl::e_length] = 0;
+ } else { // set if "extended key" (never printable?)
+ buffer[0] = 0;
+ Fl::e_length = 0;
+ }
#else
- buffer[0] = 0;
- Fl::e_length = 0;
+ buffer[0] = 0;
+ Fl::e_length = 0;
#endif
- }
- Fl::e_text = buffer;
- if (lParam & (1 << 31)) { // key up events.
- if (Fl::handle(FL_KEYUP, window))
- return 0;
- break;
- }
- while (window->parent())
- window = window->window();
- if (Fl::handle(FL_KEYBOARD, window)) {
- if (uMsg == WM_DEADCHAR || uMsg == WM_SYSDEADCHAR)
- Fl::compose_state = 1;
- return 0;
- }
- break; // WM_KEYDOWN ... WM_SYSKEYUP, WM_DEADCHAR ... WM_SYSCHAR
+ }
+ Fl::e_text = buffer;
+ if (lParam & (1 << 31)) { // key up events.
+ if (Fl::handle(FL_KEYUP, window))
+ return 0;
+ break;
+ }
+ while (window->parent())
+ window = window->window();
+ if (Fl::handle(FL_KEYBOARD, window)) {
+ if (uMsg == WM_DEADCHAR || uMsg == WM_SYSDEADCHAR)
+ Fl::compose_state = 1;
+ return 0;
+ }
+ break; // WM_KEYDOWN ... WM_SYSKEYUP, WM_DEADCHAR ... WM_SYSCHAR
} // case WM_DEADCHAR ... WM_SYSCHAR
case WM_MOUSEWHEEL: {
- static int delta = 0; // running total of all motion
- delta += (SHORT)(HIWORD(wParam));
- Fl::e_dx = 0;
- Fl::e_dy = -delta / WHEEL_DELTA;
- delta += Fl::e_dy * WHEEL_DELTA;
- if (Fl::e_dy)
- Fl::handle(FL_MOUSEWHEEL, window);
- return 0;
+ static int delta = 0; // running total of all motion
+ delta += (SHORT)(HIWORD(wParam));
+ Fl::e_dx = 0;
+ Fl::e_dy = -delta / WHEEL_DELTA;
+ delta += Fl::e_dy * WHEEL_DELTA;
+ if (Fl::e_dy)
+ Fl::handle(FL_MOUSEWHEEL, window);
+ return 0;
}
case WM_MOUSEHWHEEL: {
- static int delta = 0; // running total of all motion
- delta += (SHORT)(HIWORD(wParam));
- Fl::e_dy = 0;
- Fl::e_dx = delta / WHEEL_DELTA;
- delta -= Fl::e_dx * WHEEL_DELTA;
- if (Fl::e_dx)
- Fl::handle(FL_MOUSEWHEEL, window);
- return 0;
+ static int delta = 0; // running total of all motion
+ delta += (SHORT)(HIWORD(wParam));
+ Fl::e_dy = 0;
+ Fl::e_dx = delta / WHEEL_DELTA;
+ delta -= Fl::e_dx * WHEEL_DELTA;
+ if (Fl::e_dx)
+ Fl::handle(FL_MOUSEWHEEL, window);
+ return 0;
}
case WM_GETMINMAXINFO:
- Fl_WinAPI_Window_Driver::driver(window)->set_minmax((LPMINMAXINFO)lParam);
- break;
+ Fl_WinAPI_Window_Driver::driver(window)->set_minmax((LPMINMAXINFO)lParam);
+ break;
case WM_SIZE:
- if (!window->parent()) {
- if (wParam == SIZE_MINIMIZED || wParam == SIZE_MAXHIDE) {
- Fl::handle(FL_HIDE, window);
- } else {
- Fl::handle(FL_SHOW, window);
- resize_bug_fix = window;
- window->size(ceil(LOWORD(lParam) / scale), ceil(HIWORD(lParam) / scale));
- // fprintf(LOG,"WM_SIZE size(%.0f,%.0f) graph(%d,%d) s=%.2f\n",
- // ceil(LOWORD(lParam)/scale),ceil(HIWORD(lParam)/scale),
- // LOWORD(lParam),HIWORD(lParam),scale);
- }
- }
- break;
+ if (!window->parent()) {
+ if (wParam == SIZE_MINIMIZED || wParam == SIZE_MAXHIDE) {
+ Fl::handle(FL_HIDE, window);
+ } else {
+ Fl::handle(FL_SHOW, window);
+ resize_bug_fix = window;
+ window->size(ceil(LOWORD(lParam) / scale), ceil(HIWORD(lParam) / scale));
+ // fprintf(LOG,"WM_SIZE size(%.0f,%.0f) graph(%d,%d) s=%.2f\n",
+ // ceil(LOWORD(lParam)/scale),ceil(HIWORD(lParam)/scale),
+ // LOWORD(lParam),HIWORD(lParam),scale);
+ }
+ }
+ break;
case WM_MOVE: {
- if (IsIconic(hWnd)) {
- break;
- }
- resize_bug_fix = window;
- int nx = LOWORD(lParam);
- int ny = HIWORD(lParam);
- if (nx & 0x8000) nx -= 65536;
- if (ny & 0x8000) ny -= 65536;
- // fprintf(LOG,"WM_MOVE position(%d,%d) s=%.2f\n",int(nx/scale),int(ny/scale),scale);
- // detect when window centre changes screen
- Fl_WinAPI_Screen_Driver *sd = (Fl_WinAPI_Screen_Driver *)Fl::screen_driver();
- Fl_WinAPI_Window_Driver *wd = Fl_WinAPI_Window_Driver::driver(window);
- int olds = wd->screen_num();
- int news = sd->screen_num_unscaled(nx + window->w() * scale / 2, ny + window->h() * scale / 2);
- if (news == -1)
- news = olds;
- float s = sd->scale(news);
- // fprintf(LOG,"WM_MOVE olds=%d(%.2f) news=%d(%.2f) busy=%d\n",olds,
- // sd->scale(olds),news, s,
- // Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy);
- // fflush(LOG);
- if (olds != news) {
- if (s != sd->scale(olds) &&
- !Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy &&
- window->user_data() != &Fl_WinAPI_Screen_Driver::transient_scale_display) {
- Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy = true;
- Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.screen = news;
- Fl::add_timeout(1, Fl_WinAPI_Window_Driver::resize_after_screen_change, window);
- }
- else if (!Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy)
- wd->screen_num(news);
- }
- window->position(nx / scale, ny / scale);
- break;
+ if (IsIconic(hWnd)) {
+ break;
+ }
+ resize_bug_fix = window;
+ int nx = LOWORD(lParam);
+ int ny = HIWORD(lParam);
+ if (nx & 0x8000) nx -= 65536;
+ if (ny & 0x8000) ny -= 65536;
+ // fprintf(LOG,"WM_MOVE position(%d,%d) s=%.2f\n",int(nx/scale),int(ny/scale),scale);
+ // detect when window centre changes screen
+ Fl_WinAPI_Screen_Driver *sd = (Fl_WinAPI_Screen_Driver *)Fl::screen_driver();
+ Fl_WinAPI_Window_Driver *wd = Fl_WinAPI_Window_Driver::driver(window);
+ int olds = wd->screen_num();
+ int news = sd->screen_num_unscaled(nx + window->w() * scale / 2, ny + window->h() * scale / 2);
+ if (news == -1)
+ news = olds;
+ float s = sd->scale(news);
+ // fprintf(LOG,"WM_MOVE olds=%d(%.2f) news=%d(%.2f) busy=%d\n",olds,
+ // sd->scale(olds),news, s,
+ // Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy);
+ // fflush(LOG);
+ if (olds != news) {
+ if (s != sd->scale(olds) &&
+ !Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy &&
+ window->user_data() != &Fl_WinAPI_Screen_Driver::transient_scale_display) {
+ Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy = true;
+ Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.screen = news;
+ Fl::add_timeout(1, Fl_WinAPI_Window_Driver::resize_after_screen_change, window);
+ }
+ else if (!Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy)
+ wd->screen_num(news);
+ }
+ window->position(nx / scale, ny / scale);
+ break;
} // case WM_MOVE
case WM_SETCURSOR:
- if (LOWORD(lParam) == HTCLIENT) {
- while (window->parent())
- window = window->window();
- SetCursor(Fl_WinAPI_Window_Driver::driver(window)->cursor);
- return 0;
- }
- break;
+ if (LOWORD(lParam) == HTCLIENT) {
+ while (window->parent())
+ window = window->window();
+ SetCursor(Fl_WinAPI_Window_Driver::driver(window)->cursor);
+ return 0;
+ }
+ break;
#if USE_COLORMAP
case WM_QUERYNEWPALETTE:
- fl_GetDC(hWnd);
- if (fl_select_palette())
- InvalidateRect(hWnd, NULL, FALSE);
- break;
+ fl_GetDC(hWnd);
+ if (fl_select_palette())
+ InvalidateRect(hWnd, NULL, FALSE);
+ break;
case WM_PALETTECHANGED:
- if ((HWND)wParam != hWnd && fl_select_palette())
- UpdateColors(fl_GetDC(hWnd));
- break;
+ if ((HWND)wParam != hWnd && fl_select_palette())
+ UpdateColors(fl_GetDC(hWnd));
+ break;
case WM_CREATE:
- fl_GetDC(hWnd);
- fl_select_palette();
- break;
+ fl_GetDC(hWnd);
+ fl_select_palette();
+ break;
#endif
case WM_DESTROYCLIPBOARD:
- fl_i_own_selection[1] = 0;
- return 1;
+ fl_i_own_selection[1] = 0;
+ return 1;
case WM_DISPLAYCHANGE: {// occurs when screen configuration (number, size, position) changes
Fl::call_screen_init();
@@ -1641,36 +1639,36 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
return 0;
}
case WM_CHANGECBCHAIN:
- if ((hWnd == clipboard_wnd) && (next_clipboard_wnd == (HWND)wParam))
- next_clipboard_wnd = (HWND)lParam;
- else
- SendMessage(next_clipboard_wnd, WM_CHANGECBCHAIN, wParam, lParam);
- return 0;
+ if ((hWnd == clipboard_wnd) && (next_clipboard_wnd == (HWND)wParam))
+ next_clipboard_wnd = (HWND)lParam;
+ else
+ SendMessage(next_clipboard_wnd, WM_CHANGECBCHAIN, wParam, lParam);
+ return 0;
case WM_DRAWCLIPBOARD:
- // When the clipboard moves between two FLTK windows,
- // fl_i_own_selection will temporarily be false as we are
- // processing this message. Hence the need to use fl_find().
- if (!initial_clipboard && !fl_find(GetClipboardOwner()))
- fl_trigger_clipboard_notify(1);
- initial_clipboard = false;
+ // When the clipboard moves between two FLTK windows,
+ // fl_i_own_selection will temporarily be false as we are
+ // processing this message. Hence the need to use fl_find().
+ if (!initial_clipboard && !fl_find(GetClipboardOwner()))
+ fl_trigger_clipboard_notify(1);
+ initial_clipboard = false;
- if (next_clipboard_wnd)
- SendMessage(next_clipboard_wnd, WM_DRAWCLIPBOARD, wParam, lParam);
+ if (next_clipboard_wnd)
+ SendMessage(next_clipboard_wnd, WM_DRAWCLIPBOARD, wParam, lParam);
- return 0;
+ return 0;
default:
- if (Fl::handle(0, 0))
- return 0;
- break;
+ if (Fl::handle(0, 0))
+ return 0;
+ break;
} // switch (uMsg)
} // if (window)
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
}
/* Implementation note about the API to get the dimensions of the top/left borders and the title bar
-
+
Function fake_X_wm_style() below is used before calling CreateWindowExW() to create
a window and before calling SetWindowPos(). Both of these Windows functions need the window size
including borders and title bar. Function fake_X_wm_style() uses AdjustWindowRectExForDpi() or
@@ -1681,7 +1679,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
Calculates the required size of the window rectangle, based on the desired size of the client
rectangle [and the provided DPI]. This window rectangle can then be passed to the CreateWindowEx
function to create a window with a client area of the desired size.
-
+
Conversely, Fl_WinAPI_Window_Driver::border_width_title_bar_height() is used to get
the true sizes of borders and title bar of a mapped window. The correct API for that is
DwmGetWindowAttribute().
@@ -1713,10 +1711,10 @@ static int fake_X_wm_style(const Fl_Window *w, int &X, int &Y, int &bt, int &bx,
// fallback to get the best guess which is always available.
if (!style) {
- HWND hwnd = fl_xid(w);
- // request the style flags of this window, as Windows sees them
- style = GetWindowLong(hwnd, GWL_STYLE);
- styleEx = GetWindowLong(hwnd, GWL_EXSTYLE);
+ HWND hwnd = fl_xid(w);
+ // request the style flags of this window, as Windows sees them
+ style = GetWindowLong(hwnd, GWL_STYLE);
+ styleEx = GetWindowLong(hwnd, GWL_EXSTYLE);
}
RECT r;
@@ -1725,7 +1723,7 @@ static int fake_X_wm_style(const Fl_Window *w, int &X, int &Y, int &bt, int &bx,
r.right = (w->x() + w->w()) * s;
r.bottom = (w->y() + w->h()) * s;
// get the decoration rectangle for the desired client rectangle
-
+
typedef BOOL(WINAPI* AdjustWindowRectExForDpi_type)(LPRECT, DWORD, BOOL, DWORD, UINT);
static AdjustWindowRectExForDpi_type fl_AdjustWindowRectExForDpi =
(AdjustWindowRectExForDpi_type)GetProcAddress(LoadLibrary("User32.DLL"), "AdjustWindowRectExForDpi");
@@ -1737,22 +1735,22 @@ static int fake_X_wm_style(const Fl_Window *w, int &X, int &Y, int &bt, int &bx,
} else
ok = AdjustWindowRectEx(&r, style, FALSE, styleEx);
if (ok) {
- X = r.left;
- Y = r.top;
- W = r.right - r.left;
- H = r.bottom - r.top;
- bx = w->x() * s - r.left;
- by = r.bottom - (w->y() + w->h()) * s; // height of the bottom frame
- bt = w->y() * s - r.top - by; // height of top caption bar
- xoff = bx;
- yoff = by + bt;
- dx = W - w->w() * s;
- dy = H - w->h() * s;
- if (w_size_range_set && (w_maxw != w_minw || w_maxh != w_minh))
- ret = 2;
- else
- ret = 1;
- fallback = 0;
+ X = r.left;
+ Y = r.top;
+ W = r.right - r.left;
+ H = r.bottom - r.top;
+ bx = w->x() * s - r.left;
+ by = r.bottom - (w->y() + w->h()) * s; // height of the bottom frame
+ bt = w->y() * s - r.top - by; // height of top caption bar
+ xoff = bx;
+ yoff = by + bt;
+ dx = W - w->w() * s;
+ dy = H - w->h() * s;
+ if (w_size_range_set && (w_maxw != w_minw || w_maxh != w_minh))
+ ret = 2;
+ else
+ ret = 1;
+ fallback = 0;
}
}
}
@@ -1760,17 +1758,17 @@ static int fake_X_wm_style(const Fl_Window *w, int &X, int &Y, int &bt, int &bx,
if (fallback) {
if (w->border() && !w->parent()) {
if (w_size_range_set && (w_maxw != w_minw || w_maxh != w_minh)) {
- ret = 2;
- bx = GetSystemMetrics(SM_CXSIZEFRAME);
- by = GetSystemMetrics(SM_CYSIZEFRAME);
+ ret = 2;
+ bx = GetSystemMetrics(SM_CXSIZEFRAME);
+ by = GetSystemMetrics(SM_CYSIZEFRAME);
} else {
- ret = 1;
- int padding = GetSystemMetrics(SM_CXPADDEDBORDER);
- NONCLIENTMETRICS ncm;
- ncm.cbSize = sizeof(NONCLIENTMETRICS);
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
- bx = GetSystemMetrics(SM_CXFIXEDFRAME) + (padding ? padding + ncm.iBorderWidth : 0);
- by = GetSystemMetrics(SM_CYFIXEDFRAME) + (padding ? padding + ncm.iBorderWidth : 0);
+ ret = 1;
+ int padding = GetSystemMetrics(SM_CXPADDEDBORDER);
+ NONCLIENTMETRICS ncm;
+ ncm.cbSize = sizeof(NONCLIENTMETRICS);
+ SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
+ bx = GetSystemMetrics(SM_CXFIXEDFRAME) + (padding ? padding + ncm.iBorderWidth : 0);
+ by = GetSystemMetrics(SM_CYFIXEDFRAME) + (padding ? padding + ncm.iBorderWidth : 0);
}
bt = GetSystemMetrics(SM_CYCAPTION);
}
@@ -1860,7 +1858,7 @@ void Fl_WinAPI_Window_Driver::resize(int X, int Y, int W, int H) {
// with no width or height will never get an exposure event
Fl_X *i = Fl_X::i(pWindow);
if (i && W > 0 && H > 0)
- wait_for_expose_value = 1;
+ wait_for_expose_value = 1;
}
} else {
x(X);
@@ -1927,7 +1925,7 @@ public:
int i;
for (i = 0; i < nName; i++) {
if (strcmp(name[i], n) == 0)
- return 1;
+ return 1;
}
return 0;
}
@@ -1973,9 +1971,9 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
// convert UTF-8 class_name to wchar_t for RegisterClassExW and CreateWindowExW
fl_utf8toUtf16(class_name,
- (unsigned)strlen(class_name), // in
- (unsigned short *)class_namew, // out
- (unsigned)sizeof(class_namew) / sizeof(wchar_t)); // max. size
+ (unsigned)strlen(class_name), // in
+ (unsigned short *)class_namew, // out
+ (unsigned)sizeof(class_namew) / sizeof(wchar_t)); // max. size
if (!class_name_list.has_name(class_name)) {
WNDCLASSEXW wcw;
@@ -2039,16 +2037,16 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
} else {
if (!size_range_set()) {
if (w->resizable()) {
- Fl_Widget *o = w->resizable();
- int minw = o->w();
- if (minw > 100)
- minw = 100;
- int minh = o->h();
- if (minh > 100)
- minh = 100;
- w->size_range(w->w() - o->w() + minw, w->h() - o->h() + minh, 0, 0);
+ Fl_Widget *o = w->resizable();
+ int minw = o->w();
+ if (minw > 100)
+ minw = 100;
+ int minh = o->h();
+ if (minh > 100)
+ minh = 100;
+ w->size_range(w->w() - o->w() + minw, w->h() - o->h() + minh, 0, 0);
} else {
- w->size_range(w->w(), w->h(), w->w(), w->h());
+ w->size_range(w->w(), w->h(), w->w(), w->h());
}
}
styleEx |= WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT;
@@ -2056,31 +2054,31 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
int wintype = 0;
if (w->border() && !w->parent()) {
if (size_range_set() && (maxw() != minw() || maxh() != minh()))
- wintype = 2;
+ wintype = 2;
else
- wintype = 1;
+ wintype = 1;
}
switch (wintype) {
// No border (used for menus)
case 0:
- style |= WS_POPUP;
- styleEx |= WS_EX_TOOLWINDOW;
- break;
+ style |= WS_POPUP;
+ styleEx |= WS_EX_TOOLWINDOW;
+ break;
// Thin border and title bar
case 1:
- style |= WS_DLGFRAME | WS_CAPTION;
- if (!w->modal())
- style |= WS_SYSMENU | WS_MINIMIZEBOX;
- break;
+ style |= WS_DLGFRAME | WS_CAPTION;
+ if (!w->modal())
+ style |= WS_SYSMENU | WS_MINIMIZEBOX;
+ break;
// Thick, resizable border and title bar, with maximize button
case 2:
- style |= WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX | WS_CAPTION;
- if (!w->modal())
- style |= WS_MINIMIZEBOX;
- break;
+ style |= WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX | WS_CAPTION;
+ if (!w->modal())
+ style |= WS_MINIMIZEBOX;
+ break;
}
int xwm = xp, ywm = yp, bt, bx, by; // these are in graphical units
@@ -2093,10 +2091,10 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
xp = yp = CW_USEDEFAULT;
} else {
if (!Fl::grab()) {
- xp = xwm;
- yp = ywm;
- x(xp / s);
- y(yp / s);
+ xp = xwm;
+ yp = ywm;
+ x(xp / s);
+ y(yp / s);
}
xp -= bx;
yp -= by + bt;
@@ -2107,10 +2105,10 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
// find some other window to be "transient for":
Fl_Window *w = Fl_X::first->w;
while (w->parent())
- w = w->window();
+ w = w->window();
parent = fl_xid(w);
if (!w->visible())
- showit = 0;
+ showit = 0;
} else if (Fl::grab())
parent = fl_xid(Fl::grab());
}
@@ -2136,13 +2134,13 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
lab[wlen] = 0;
}
x->xid = CreateWindowExW(styleEx,
- class_namew, lab, style,
- xp, yp, wp, hp,
- parent,
- NULL, // menu
- fl_display,
- NULL // creation parameters
- );
+ class_namew, lab, style,
+ xp, yp, wp, hp,
+ parent,
+ NULL, // menu
+ fl_display,
+ NULL // creation parameters
+ );
if (lab)
free(lab);
@@ -2190,7 +2188,7 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() {
// If we've captured the mouse, we dont want to activate any
// other windows from the code, or we lose the capture.
ShowWindow(x->xid, !showit ? SW_SHOWMINNOACTIVE :
- (Fl::grab() || (styleEx & WS_EX_TOOLWINDOW)) ? SW_SHOWNOACTIVATE : SW_SHOWNORMAL);
+ (Fl::grab() || (styleEx & WS_EX_TOOLWINDOW)) ? SW_SHOWNOACTIVATE : SW_SHOWNORMAL);
// Register all windows for potential drag'n'drop operations
RegisterDragDrop(x->xid, flIDropTarget);
@@ -2289,18 +2287,18 @@ static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon, int hotx, in
for (int y = 0; y < image->h(); y++) {
for (int x = 0; x < image->w(); x++) {
switch (image->d()) {
- case 1:
- *bits = (0xff << 24) | (i[0] << 16) | (i[0] << 8) | i[0];
- break;
- case 2:
- *bits = (i[1] << 24) | (i[0] << 16) | (i[0] << 8) | i[0];
- break;
- case 3:
- *bits = (0xff << 24) | (i[0] << 16) | (i[1] << 8) | i[2];
- break;
- case 4:
- *bits = (i[3] << 24) | (i[0] << 16) | (i[1] << 8) | i[2];
- break;
+ case 1:
+ *bits = (0xff << 24) | (i[0] << 16) | (i[0] << 8) | i[0];
+ break;
+ case 2:
+ *bits = (i[1] << 24) | (i[0] << 16) | (i[0] << 8) | i[0];
+ break;
+ case 3:
+ *bits = (0xff << 24) | (i[0] << 16) | (i[1] << 8) | i[2];
+ break;
+ case 4:
+ *bits = (i[3] << 24) | (i[0] << 16) | (i[1] << 8) | i[2];
+ break;
}
i += image->d();
bits++;
@@ -2346,11 +2344,11 @@ static const Fl_RGB_Image *find_best_icon(int ideal_width, const Fl_RGB_Image *i
best = icons[i];
else {
if (best->w() < ideal_width) {
- if (icons[i]->w() > best->w())
- best = icons[i];
+ if (icons[i]->w() > best->w())
+ best = icons[i];
} else {
- if ((icons[i]->w() >= ideal_width) && (icons[i]->w() < best->w()))
- best = icons[i];
+ if ((icons[i]->w() >= ideal_width) && (icons[i]->w() < best->w()))
+ best = icons[i];
}
}
}
@@ -2450,11 +2448,11 @@ void Fl_WinAPI_Window_Driver::set_icons() {
const Fl_RGB_Image *best_big, *best_small;
best_big = find_best_icon(GetSystemMetrics(SM_CXICON),
- (const Fl_RGB_Image **)icon_->icons,
- icon_->count);
+ (const Fl_RGB_Image **)icon_->icons,
+ icon_->count);
best_small = find_best_icon(GetSystemMetrics(SM_CXSMICON),
- (const Fl_RGB_Image **)icon_->icons,
- icon_->count);
+ (const Fl_RGB_Image **)icon_->icons,
+ icon_->count);
if (best_big != NULL)
big_icon = image_to_icon(best_big, true, 0, 0);
@@ -2490,52 +2488,52 @@ int Fl_WinAPI_Window_Driver::set_cursor(Fl_Cursor c) {
else {
switch (c) {
case FL_CURSOR_ARROW:
- n = IDC_ARROW;
- break;
+ n = IDC_ARROW;
+ break;
case FL_CURSOR_CROSS:
- n = IDC_CROSS;
- break;
+ n = IDC_CROSS;
+ break;
case FL_CURSOR_WAIT:
- n = IDC_WAIT;
- break;
+ n = IDC_WAIT;
+ break;
case FL_CURSOR_INSERT:
- n = IDC_IBEAM;
- break;
+ n = IDC_IBEAM;
+ break;
case FL_CURSOR_HAND:
- n = IDC_HAND;
- break;
+ n = IDC_HAND;
+ break;
case FL_CURSOR_HELP:
- n = IDC_HELP;
- break;
+ n = IDC_HELP;
+ break;
case FL_CURSOR_MOVE:
- n = IDC_SIZEALL;
- break;
+ n = IDC_SIZEALL;
+ break;
case FL_CURSOR_N:
case FL_CURSOR_S:
// FIXME: Should probably have fallbacks for these instead
case FL_CURSOR_NS:
- n = IDC_SIZENS;
- break;
+ n = IDC_SIZENS;
+ break;
case FL_CURSOR_NE:
case FL_CURSOR_SW:
// FIXME: Dito.
case FL_CURSOR_NESW:
- n = IDC_SIZENESW;
- break;
+ n = IDC_SIZENESW;
+ break;
case FL_CURSOR_E:
case FL_CURSOR_W:
// FIXME: Dito.
case FL_CURSOR_WE:
- n = IDC_SIZEWE;
- break;
+ n = IDC_SIZEWE;
+ break;
case FL_CURSOR_SE:
case FL_CURSOR_NW:
// FIXME: Dito.
case FL_CURSOR_NWSE:
- n = IDC_SIZENWSE;
- break;
+ n = IDC_SIZENWSE;
+ break;
default:
- return 0;
+ return 0;
}
new_cursor = LoadCursor(NULL, n);
@@ -2702,9 +2700,9 @@ void fl_release_dc(HWND w, HDC dc) {
RestoreDC(dc, t->saved_dc);
ReleaseDC(w, dc);
if (!prev) {
- win_DC_list = t->next; // delete first item
+ win_DC_list = t->next; // delete first item
} else {
- prev->next = t->next; // one in the middle
+ prev->next = t->next; // one in the middle
}
delete (t);
return;
@@ -2855,7 +2853,3 @@ void preparePrintFront(void) {
#endif // USE_PRINT_BUTTON
#endif // defined(_WIN32) and !defined(FL_DOXYGEN)
-
-//
-// End of "$Id$".
-//