summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Fl_win32.cxx42
1 files changed, 22 insertions, 20 deletions
diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx
index 136b3ee0f..8db05169d 100644
--- a/src/Fl_win32.cxx
+++ b/src/Fl_win32.cxx
@@ -101,11 +101,10 @@
#endif
typedef int (WINAPI* fl_wsk_select_f)(int, fd_set*, fd_set*, fd_set*, const struct timeval*);
typedef int (WINAPI* fl_wsk_fd_is_set_f)(SOCKET, fd_set *);
-typedef int (WINAPI* fl_wsk_async_select_f)(SOCKET,HWND,u_int,long);
+
static HMODULE s_wsock_mod = 0;
static fl_wsk_select_f s_wsock_select=0;
static fl_wsk_fd_is_set_f fl_wsk_fd_is_set=0;
-static fl_wsk_async_select_f fl_wsk_async_select=0;
static HMODULE get_wsock_mod() {
if (!s_wsock_mod) {
@@ -114,7 +113,6 @@ static HMODULE get_wsock_mod() {
Fl::fatal("FLTK Lib Error: %s file not found! Please check your winsock dll accessibility.\n",WSCK_DLL_NAME);
s_wsock_select = (fl_wsk_select_f) GetProcAddress(s_wsock_mod, "select");
fl_wsk_fd_is_set = (fl_wsk_fd_is_set_f) GetProcAddress(s_wsock_mod, "__WSAFDIsSet");
- fl_wsk_async_select = (fl_wsk_async_select_f) GetProcAddress(s_wsock_mod, "WSAAsyncSelect");
}
return s_wsock_mod;
}
@@ -229,14 +227,18 @@ static Fl_Window *track_mouse_win=0; // current TrackMouseEvent() window
//
// Microsoft provides the Berkeley select() call and an asynchronous
// select function that sends a WIN32 message when the select condition
-// exists...
+// exists. However, we don't try to use the asynchronous WSAAsyncSelect()
+// any more for good reasons (see above).
+//
+// A.S. Dec 2009: We got reports that current winsock2.h files define
+// POLLIN, POLLOUT, and POLLERR with conflicting values WRT what we
+// used before (STR #2301). Therefore we must not use these values
+// for our internal purposes, but use FL_READ, FL_WRITE, and
+// FL_EXCEPT, as defined for use in Fl::add_fd().
+//
static int maxfd = 0;
static fd_set fdsets[3];
-# define POLLIN 1
-# define POLLOUT 4
-# define POLLERR 8
-
#if !defined(__GNUC__) || __GNUC__ >= 3
extern IDropTarget *flIDropTarget;
#endif // !__GNUC__ || __GNUC__ >= 3
@@ -292,14 +294,14 @@ void Fl::add_fd(int n, int events, void (*cb)(int, void*), void *v) {
fd[i].cb = cb;
fd[i].arg = v;
- if (events & POLLIN) FD_SET((unsigned)n, &fdsets[0]);
- if (events & POLLOUT) FD_SET((unsigned)n, &fdsets[1]);
- if (events & POLLERR) FD_SET((unsigned)n, &fdsets[2]);
+ if (events & FL_READ) FD_SET((unsigned)n, &fdsets[0]);
+ if (events & FL_WRITE) FD_SET((unsigned)n, &fdsets[1]);
+ if (events & FL_EXCEPT) FD_SET((unsigned)n, &fdsets[2]);
if (n > maxfd) maxfd = n;
}
void Fl::add_fd(int fd, void (*cb)(int, void*), void* v) {
- Fl::add_fd(fd, POLLIN, cb, v);
+ Fl::add_fd(fd, FL_READ, cb, v);
}
void Fl::remove_fd(int n, int events) {
@@ -318,9 +320,9 @@ void Fl::remove_fd(int n, int events) {
}
nfds = j;
- if (events & POLLIN) FD_CLR(unsigned(n), &fdsets[0]);
- if (events & POLLOUT) FD_CLR(unsigned(n), &fdsets[1]);
- if (events & POLLERR) FD_CLR(unsigned(n), &fdsets[2]);
+ if (events & FL_READ) FD_CLR(unsigned(n), &fdsets[0]);
+ if (events & FL_WRITE) FD_CLR(unsigned(n), &fdsets[1]);
+ if (events & FL_EXCEPT) FD_CLR(unsigned(n), &fdsets[2]);
}
void Fl::remove_fd(int n) {
@@ -374,9 +376,9 @@ int fl_wait(double time_to_wait) {
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 |= POLLIN;
- if (fl_wsk_fd_is_set(f, &fdt[1])) revents |= POLLOUT;
- if (fl_wsk_fd_is_set(f, &fdt[2])) revents |= POLLERR;
+ 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
@@ -1292,7 +1294,7 @@ void Fl_Window::resize(int X,int Y,int W,int H) {
int resize_from_program = (this != resize_bug_fix);
if (!resize_from_program) resize_bug_fix = 0;
if (X != x() || Y != y()) {
- set_flag(FORCE_POSITION);
+ force_position(1);
} else {
if (!is_a_resize) return;
flags |= SWP_NOMOVE;
@@ -1474,7 +1476,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
wp += 2*bx;
hp += 2*by+bt;
}
- if (!(w->flags() & Fl_Widget::FORCE_POSITION)) {
+ if (!w->force_position()) {
xp = yp = CW_USEDEFAULT;
} else {
if (!Fl::grab()) {