New WSAAsyncSelect code for WIN32 Fl::add_fd() support.
Fixes for Fl_Scrollbar - pushed_ bits wrong... git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@965 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
8251826357
commit
30ce47ef69
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// "$Id: Fl_Scrollbar.cxx,v 1.7.2.3 1999/12/07 17:53:08 bill Exp $"
|
// "$Id: Fl_Scrollbar.cxx,v 1.7.2.4 1999/12/29 03:14:37 mike Exp $"
|
||||||
//
|
//
|
||||||
// Scroll bar widget for the Fast Light Tool Kit (FLTK).
|
// Scroll bar widget for the Fast Light Tool Kit (FLTK).
|
||||||
//
|
//
|
||||||
@ -39,8 +39,8 @@ void Fl_Scrollbar::increment_cb() {
|
|||||||
switch (pushed_) {
|
switch (pushed_) {
|
||||||
case 1: i = -linesize_; break;
|
case 1: i = -linesize_; break;
|
||||||
default:i = linesize_; break;
|
default:i = linesize_; break;
|
||||||
case 3: i = -int(S * (maximum() - minimum()) / W); break;
|
case 5: i = -int(S * (maximum() - minimum()) / W); break;
|
||||||
case 4: i = int(S * (maximum() - minimum()) / W); break;
|
case 6: i = int(S * (maximum() - minimum()) / W); break;
|
||||||
}
|
}
|
||||||
if (maximum() < minimum() && pushed_ < 3) i = -i;
|
if (maximum() < minimum() && pushed_ < 3) i = -i;
|
||||||
handle_drag(clamp(value() + i));
|
handle_drag(clamp(value() + i));
|
||||||
@ -80,9 +80,9 @@ int Fl_Scrollbar::handle(int event) {
|
|||||||
else if (val <= 0.0) sliderx = 0;
|
else if (val <= 0.0) sliderx = 0;
|
||||||
else sliderx = int(val*(W-S)+.5);
|
else sliderx = int(val*(W-S)+.5);
|
||||||
|
|
||||||
if (mx < X+sliderx) area = 3;
|
if (mx < X+sliderx) area = 5;
|
||||||
else if (mx >= X+sliderx+S) area = 4;
|
else if (mx >= X+sliderx+S) area = 6;
|
||||||
else area = 5;
|
else area = 8;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (mx < X || mx >= X+W) area = 0;
|
if (mx < X || mx >= X+W) area = 0;
|
||||||
@ -96,9 +96,9 @@ int Fl_Scrollbar::handle(int event) {
|
|||||||
else if (val <= 0.0) slidery = 0;
|
else if (val <= 0.0) slidery = 0;
|
||||||
else slidery = int(val*(H-S)+.5);
|
else slidery = int(val*(H-S)+.5);
|
||||||
|
|
||||||
if (my < Y+slidery) area = 3;
|
if (my < Y+slidery) area = 5;
|
||||||
else if (my >= Y+slidery+S) area = 4;
|
else if (my >= Y+slidery+S) area = 6;
|
||||||
else area = 5;
|
else area = 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (event) {
|
switch (event) {
|
||||||
@ -115,7 +115,7 @@ int Fl_Scrollbar::handle(int event) {
|
|||||||
return 1;
|
return 1;
|
||||||
case FL_PUSH:
|
case FL_PUSH:
|
||||||
if (pushed_) return 1;
|
if (pushed_) return 1;
|
||||||
if (area != 5) pushed_ = area;
|
if (area != 8) pushed_ = area;
|
||||||
if (pushed_) {
|
if (pushed_) {
|
||||||
handle_push();
|
handle_push();
|
||||||
Fl::add_timeout(INITIALREPEAT, timeout_cb, this);
|
Fl::add_timeout(INITIALREPEAT, timeout_cb, this);
|
||||||
@ -241,5 +241,5 @@ Fl_Scrollbar::Fl_Scrollbar(int X, int Y, int W, int H, const char* L)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// End of "$Id: Fl_Scrollbar.cxx,v 1.7.2.3 1999/12/07 17:53:08 bill Exp $".
|
// End of "$Id: Fl_Scrollbar.cxx,v 1.7.2.4 1999/12/29 03:14:37 mike Exp $".
|
||||||
//
|
//
|
||||||
|
109
src/Fl_win32.cxx
109
src/Fl_win32.cxx
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// "$Id: Fl_win32.cxx,v 1.33.2.17 1999/12/15 04:58:27 bill Exp $"
|
// "$Id: Fl_win32.cxx,v 1.33.2.18 1999/12/29 03:14:38 mike Exp $"
|
||||||
//
|
//
|
||||||
// WIN32-specific code for the Fast Light Tool Kit (FLTK).
|
// WIN32-specific code for the Fast Light Tool Kit (FLTK).
|
||||||
//
|
//
|
||||||
@ -38,6 +38,12 @@
|
|||||||
#include <winsock.h>
|
#include <winsock.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// USE_ASYNC_SELECT - define it if you have WSAAsyncSelect()...
|
||||||
|
//
|
||||||
|
|
||||||
|
#define USE_ASYNC_SELECT
|
||||||
|
|
||||||
//
|
//
|
||||||
// WM_SYNCPAINT is an "undocumented" message, which is finally defined in
|
// WM_SYNCPAINT is an "undocumented" message, which is finally defined in
|
||||||
// VC++ 6.0.
|
// VC++ 6.0.
|
||||||
@ -50,16 +56,22 @@
|
|||||||
# define WM_MOUSELEAVE 0x02a3
|
# define WM_MOUSELEAVE 0x02a3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// WM_FLSELECT is the user-defined message that we get when one of
|
||||||
|
// the sockets has pending data, etc.
|
||||||
|
//
|
||||||
|
|
||||||
|
#define WM_FLSELECT (WM_USER+0x0400)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
// interface to poll/select call:
|
// interface to poll/select call:
|
||||||
|
|
||||||
// fd's are only implemented for sockets. Microsoft Windows does not
|
// fd's are only implemented for sockets. Microsoft Windows does not
|
||||||
// have a unified IO system, so it doesn't support select() on files,
|
// have a unified IO system, so it doesn't support select() on files,
|
||||||
// devices, or pipes... Also, unlike UNIX the Windows select() call
|
// devices, or pipes... Also, Microsoft provides an asynchronous
|
||||||
// doesn't use the nfds parameter, so we don't need to keep track of
|
// select function that sends a WIN32 message when the select condition
|
||||||
// the maximum FD number...
|
// exists...
|
||||||
|
|
||||||
static fd_set fdsets[3];
|
|
||||||
#define POLLIN 1
|
#define POLLIN 1
|
||||||
#define POLLOUT 4
|
#define POLLOUT 4
|
||||||
#define POLLERR 8
|
#define POLLERR 8
|
||||||
@ -74,6 +86,7 @@ static struct FD {
|
|||||||
} *fd = 0;
|
} *fd = 0;
|
||||||
|
|
||||||
void Fl::add_fd(int n, int events, void (*cb)(int, void*), void *v) {
|
void Fl::add_fd(int n, int events, void (*cb)(int, void*), void *v) {
|
||||||
|
int mask;
|
||||||
remove_fd(n,events);
|
remove_fd(n,events);
|
||||||
int i = nfds++;
|
int i = nfds++;
|
||||||
if (i >= fd_array_size) {
|
if (i >= fd_array_size) {
|
||||||
@ -84,9 +97,11 @@ void Fl::add_fd(int n, int events, void (*cb)(int, void*), void *v) {
|
|||||||
fd[i].events = events;
|
fd[i].events = events;
|
||||||
fd[i].cb = cb;
|
fd[i].cb = cb;
|
||||||
fd[i].arg = v;
|
fd[i].arg = v;
|
||||||
if (events & POLLIN) FD_SET(n, &fdsets[0]);
|
mask = 0;
|
||||||
if (events & POLLOUT) FD_SET(n, &fdsets[1]);
|
if (events & POLLIN) mask |= FD_READ;
|
||||||
if (events & POLLERR) FD_SET(n, &fdsets[2]);
|
if (events & POLLOUT) mask |= FD_WRITE;
|
||||||
|
if (events & POLLERR) mask |= FD_CLOSE;
|
||||||
|
WSAAsyncSelect(n, fl_window, WM_FLSELECT, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fl::add_fd(int fd, void (*cb)(int, void*), void* v) {
|
void Fl::add_fd(int fd, void (*cb)(int, void*), void* v) {
|
||||||
@ -108,9 +123,14 @@ void Fl::remove_fd(int n, int events) {
|
|||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
nfds = j;
|
nfds = j;
|
||||||
|
|
||||||
|
#ifdef USE_ASYNC_SELECT
|
||||||
|
WSAAsyncSelect(n, 0, 0, 0);
|
||||||
|
#else
|
||||||
if (events & POLLIN) FD_CLR(unsigned(n), &fdsets[0]);
|
if (events & POLLIN) FD_CLR(unsigned(n), &fdsets[0]);
|
||||||
if (events & POLLOUT) FD_CLR(unsigned(n), &fdsets[1]);
|
if (events & POLLOUT) FD_CLR(unsigned(n), &fdsets[1]);
|
||||||
if (events & POLLERR) FD_CLR(unsigned(n), &fdsets[2]);
|
if (events & POLLERR) FD_CLR(unsigned(n), &fdsets[2]);
|
||||||
|
#endif // USE_ASYNC_SELECT
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fl::remove_fd(int n) {
|
void Fl::remove_fd(int n) {
|
||||||
@ -121,64 +141,17 @@ MSG fl_msg;
|
|||||||
|
|
||||||
int fl_ready() {
|
int fl_ready() {
|
||||||
if (PeekMessage(&fl_msg, NULL, 0, 0, PM_NOREMOVE)) return 1;
|
if (PeekMessage(&fl_msg, NULL, 0, 0, PM_NOREMOVE)) return 1;
|
||||||
|
else return (0);
|
||||||
timeval t;
|
|
||||||
t.tv_sec = 0;
|
|
||||||
t.tv_usec = 0;
|
|
||||||
fd_set fdt[3];
|
|
||||||
fdt[0] = fdsets[0];
|
|
||||||
fdt[1] = fdsets[1];
|
|
||||||
fdt[2] = fdsets[2];
|
|
||||||
return ::select(0,&fdt[0],&fdt[1],&fdt[2],&t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double fl_wait(int timeout_flag, double time) {
|
double fl_wait(int timeout_flag, double time) {
|
||||||
int have_message = 0;
|
int have_message = 0;
|
||||||
int timerid;
|
int timerid;
|
||||||
|
|
||||||
if (nfds) {
|
|
||||||
// For WIN32 we need to poll for socket input FIRST, since
|
|
||||||
// the event queue is not something we can select() on...
|
|
||||||
timeval t;
|
|
||||||
t.tv_sec = 0;
|
|
||||||
t.tv_usec = 0;
|
|
||||||
|
|
||||||
fd_set fdt[3];
|
|
||||||
fdt[0] = fdsets[0];
|
|
||||||
fdt[1] = fdsets[1];
|
|
||||||
fdt[2] = fdsets[2];
|
|
||||||
|
|
||||||
if (::select(0,&fdt[0],&fdt[1],&fdt[2],&t)) {
|
|
||||||
// We got something - do the callback!
|
|
||||||
for (int i = 0; i < nfds; i ++) {
|
|
||||||
int f = fd[i].fd;
|
|
||||||
short revents = 0;
|
|
||||||
if (FD_ISSET(f,&fdt[0])) revents |= POLLIN;
|
|
||||||
if (FD_ISSET(f,&fdt[1])) revents |= POLLOUT;
|
|
||||||
if (FD_ISSET(f,&fdt[2])) revents |= POLLERR;
|
|
||||||
if (fd[i].events & revents) fd[i].cb(f, fd[i].arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the first message by waiting the correct amount of time:
|
// get the first message by waiting the correct amount of time:
|
||||||
if (!timeout_flag) {
|
if (!timeout_flag) {
|
||||||
// If we are monitoring sockets we need to check them periodically,
|
// Wait for a message...
|
||||||
// so set a timer in this case...
|
have_message = GetMessage(&fl_msg, NULL, 0, 0);
|
||||||
if (nfds) {
|
|
||||||
// First see if there is a message waiting...
|
|
||||||
have_message = PeekMessage(&fl_msg, NULL, 0, 0, PM_REMOVE);
|
|
||||||
if (!have_message) {
|
|
||||||
// If not then set a 1ms timer...
|
|
||||||
timerid = SetTimer(NULL, 0, 1, NULL);
|
|
||||||
GetMessage(&fl_msg, NULL, 0, 0);
|
|
||||||
KillTimer(NULL, timerid);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Wait for a message...
|
|
||||||
GetMessage(&fl_msg, NULL, 0, 0);
|
|
||||||
}
|
|
||||||
have_message = 1;
|
|
||||||
} else {
|
} else {
|
||||||
// Perform the requested timeout...
|
// Perform the requested timeout...
|
||||||
have_message = PeekMessage(&fl_msg, NULL, 0, 0, PM_REMOVE);
|
have_message = PeekMessage(&fl_msg, NULL, 0, 0, PM_REMOVE);
|
||||||
@ -186,16 +159,30 @@ double fl_wait(int timeout_flag, double time) {
|
|||||||
int t = (int)(time * 1000.0);
|
int t = (int)(time * 1000.0);
|
||||||
if (t <= 0) t = 1;
|
if (t <= 0) t = 1;
|
||||||
timerid = SetTimer(NULL, 0, t, NULL);
|
timerid = SetTimer(NULL, 0, t, NULL);
|
||||||
GetMessage(&fl_msg, NULL, 0, 0);
|
have_message = GetMessage(&fl_msg, NULL, 0, 0);
|
||||||
KillTimer(NULL, timerid);
|
KillTimer(NULL, timerid);
|
||||||
have_message = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// execute it, them execute any other messages that become ready during it:
|
// execute it, them execute any other messages that become ready during it:
|
||||||
while (have_message) {
|
while (have_message) {
|
||||||
|
#ifdef USE_ASYNC_SELECT
|
||||||
|
if (fl_msg.message == WM_FLSELECT) {
|
||||||
|
// Got notification for socket
|
||||||
|
for (int i = 0; i < nfds; i ++)
|
||||||
|
if (fd[i].fd == fl_msg.wParam) {
|
||||||
|
(fd[i].cb)(fd[i].fd, fd[i].arg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Some other message...
|
||||||
|
DispatchMessage(&fl_msg);
|
||||||
|
}
|
||||||
|
#else
|
||||||
TranslateMessage(&fl_msg);
|
TranslateMessage(&fl_msg);
|
||||||
DispatchMessage(&fl_msg);
|
DispatchMessage(&fl_msg);
|
||||||
|
#endif // USE_ASYNC_SELECT
|
||||||
|
|
||||||
have_message = PeekMessage(&fl_msg, NULL, 0, 0, PM_REMOVE);
|
have_message = PeekMessage(&fl_msg, NULL, 0, 0, PM_REMOVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -896,5 +883,5 @@ void Fl_Window::make_current() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// End of "$Id: Fl_win32.cxx,v 1.33.2.17 1999/12/15 04:58:27 bill Exp $".
|
// End of "$Id: Fl_win32.cxx,v 1.33.2.18 1999/12/29 03:14:38 mike Exp $".
|
||||||
//
|
//
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="fltk" - Package Owner=<4>
|
# Microsoft Developer Studio Project File - Name="fltk" - Package Owner=<4>
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 5.00
|
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||||
# ** DO NOT EDIT **
|
# ** DO NOT EDIT **
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
||||||
@ -22,9 +22,11 @@ CFG=fltk - Win32 Debug
|
|||||||
!MESSAGE
|
!MESSAGE
|
||||||
|
|
||||||
# Begin Project
|
# Begin Project
|
||||||
|
# PROP AllowPerConfigDependencies 0
|
||||||
# PROP Scc_ProjName ""
|
# PROP Scc_ProjName ""
|
||||||
# PROP Scc_LocalPath ""
|
# PROP Scc_LocalPath ""
|
||||||
CPP=cl.exe
|
CPP=cl.exe
|
||||||
|
RSC=rc.exe
|
||||||
|
|
||||||
!IF "$(CFG)" == "fltk - Win32 Release"
|
!IF "$(CFG)" == "fltk - Win32 Release"
|
||||||
|
|
||||||
@ -38,11 +40,11 @@ CPP=cl.exe
|
|||||||
# PROP Output_Dir "Release"
|
# PROP Output_Dir "Release"
|
||||||
# PROP Intermediate_Dir "Release"
|
# PROP Intermediate_Dir "Release"
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
RSC=rc.exe
|
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
||||||
|
# ADD CPP /nologo /MT /GX /Ot /Op /Ob2 /I "." /I ".." /D "FL_STATIC" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c
|
||||||
|
# SUBTRACT CPP /Os
|
||||||
# ADD BASE RSC /l 0x409
|
# ADD BASE RSC /l 0x409
|
||||||
# ADD RSC /l 0x409
|
# ADD RSC /l 0x409
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MT /GX /Os /Ob2 /I "." /I ".." /D "FL_STATIC" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c
|
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
# ADD BASE BSC32 /nologo
|
# ADD BASE BSC32 /nologo
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
@ -62,11 +64,10 @@ LIB32=link.exe -lib
|
|||||||
# PROP Output_Dir "Debug"
|
# PROP Output_Dir "Debug"
|
||||||
# PROP Intermediate_Dir "Debug"
|
# PROP Intermediate_Dir "Debug"
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
RSC=rc.exe
|
|
||||||
# ADD BASE RSC /l 0x409
|
|
||||||
# ADD RSC /l 0x409
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
|
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
|
||||||
# ADD CPP /nologo /MTd /GX /Z7 /Od /I "." /I ".." /D "FL_STATIC" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /FR /YX /FD /c
|
# ADD CPP /nologo /MTd /GX /Z7 /Od /I "." /I ".." /D "FL_STATIC" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /FR /YX /FD /c
|
||||||
|
# ADD BASE RSC /l 0x409
|
||||||
|
# ADD RSC /l 0x409
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
# ADD BASE BSC32 /nologo
|
# ADD BASE BSC32 /nologo
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
|
@ -43,7 +43,8 @@ RSC=rc.exe
|
|||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
||||||
# ADD CPP /nologo /MT /GX /Os /Ob2 /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c
|
# ADD CPP /nologo /MT /GX /Ot /Op /Ob2 /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c
|
||||||
|
# SUBTRACT CPP /Os
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||||
|
Loading…
Reference in New Issue
Block a user