some windows issues

This commit is contained in:
David Rose 2009-07-06 21:58:21 +00:00
parent e4169cfbc9
commit 92265c7134
4 changed files with 39 additions and 12 deletions

View File

@ -279,7 +279,24 @@ command_and_response(TiXmlDocument *command) {
return NULL;
}
#ifdef _WIN32
// Make sure we process the Windows event loop while we're
// waiting, or everything that depends on Windows messages--in
// particular, the CreateWindow() call within the subprocess--will
// starve, and we could end up with deadlock.
// A single PeekMessage() seems to be sufficient.
MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE | PM_NOYIELD);
// We wait with a timeout, so we can go back and spin the event
// loop some more.
_response_ready.wait(0.1);
#else // _WIN32
// On non-Windows platforms, we can just wait indefinitely.
_response_ready.wait();
#endif // _WIN32
}
// When we exit the loop, we've found the desired response.

View File

@ -23,3 +23,16 @@ inline NPP PPInstance::
get_npp_instance() const {
return _npp_instance;
}
////////////////////////////////////////////////////////////////////
// Function: PPInstance::get_window
// Access: Public
// Description: Returns the current window parameters.
////////////////////////////////////////////////////////////////////
const NPWindow *PPInstance::
get_window() const {
if (_got_window) {
return &_window;
}
return NULL;
}

View File

@ -38,6 +38,7 @@ public:
inline NPP get_npp_instance() const;
inline const NPWindow *get_window() const;
void set_window(NPWindow *window);
NPError new_stream(NPMIMEType type, NPStream *stream,
bool seekable, uint16 *stype);

View File

@ -33,10 +33,6 @@ open_logfile() {
}
}
#ifdef _WIN32
DWORD main_thread_id = 0;
#endif
////////////////////////////////////////////////////////////////////
// Function: handle_request_loop
@ -103,7 +99,14 @@ request_ready(P3D_instance *instance) {
// Since we might be in a sub-thread at this point, use a Windows
// message to forward this event to the main thread.
PostThreadMessage(main_thread_id, WM_USER, 0, 0);
// Get the window handle for the window associated with this
// instance.
PPInstance *inst = (PPInstance *)(instance->_user_data);
assert(inst != NULL);
const NPWindow *win = inst->get_window();
if (win != NULL) {
PostMessage((HWND)(win->window), WM_USER, 0, 0);
}
#else
// On Mac, we ignore this asynchronous event, and rely on detecting
@ -139,13 +142,6 @@ NP_Initialize(NPNetscapeFuncs *browserFuncs,
open_logfile();
logfile << "initializing\n" << flush;
#ifdef _WIN32
// Save the calling thread ID (i.e. the main thread) so we can post
// messages back to this thread when needed.
main_thread_id = GetCurrentThreadId();
logfile << "main thread = " << main_thread_id << "\n";
#endif
logfile << "browserFuncs = " << browserFuncs << "\n" << flush;
return NPERR_NO_ERROR;