mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
implementation of pollKey, companion to waitKey
w32 backend: implemented other backends: stubbed or fallback to waitKey documentation: cross-linked and more precise in some places
This commit is contained in:
@@ -281,6 +281,8 @@ int cv::waitKey(int delay)
|
||||
return (code != -1) ? (code & 0xff) : -1;
|
||||
}
|
||||
|
||||
// NOTE: cv::pollKey has no C API equivalent. it is implemented in each backend source file.
|
||||
|
||||
int cv::createTrackbar(const String& trackbarName, const String& winName,
|
||||
int* value, int count, TrackbarCallback callback,
|
||||
void* userdata)
|
||||
|
||||
@@ -382,6 +382,13 @@ CV_IMPL int cvWaitKey(int delay)
|
||||
}
|
||||
|
||||
|
||||
int cv::pollKey()
|
||||
{
|
||||
CV_TRACE_FUNCTION();
|
||||
// fallback. please implement a proper polling function
|
||||
return cvWaitKey(1);
|
||||
}
|
||||
|
||||
//Yannick Verdie
|
||||
//This function is experimental and some functions (such as cvSet/getWindowProperty will not work)
|
||||
//We recommend not using this function for now
|
||||
|
||||
@@ -632,6 +632,13 @@ CV_IMPL int cvWaitKey (int maxWait)
|
||||
return returnCode;
|
||||
}
|
||||
|
||||
int cv::pollKey()
|
||||
{
|
||||
CV_TRACE_FUNCTION();
|
||||
// fallback. please implement a proper polling function
|
||||
return cvWaitKey(1);
|
||||
}
|
||||
|
||||
CvRect cvGetWindowRect_COCOA( const char* name )
|
||||
{
|
||||
CvRect result = cvRect(-1, -1, -1, -1);
|
||||
|
||||
@@ -1950,6 +1950,13 @@ CV_IMPL int cvWaitKey( int delay )
|
||||
return last_key;
|
||||
}
|
||||
|
||||
int cv::pollKey()
|
||||
{
|
||||
CV_TRACE_FUNCTION();
|
||||
// fallback. please implement a proper polling function
|
||||
return cvWaitKey(1);
|
||||
}
|
||||
|
||||
|
||||
#endif // HAVE_GTK
|
||||
#endif // _WIN32
|
||||
|
||||
@@ -1981,6 +1981,97 @@ static void showSaveDialog(CvWindow* window)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* message received. check if it belongs to our windows (frame, hwnd).
|
||||
* returns true (and value in keyCode) if a key was pressed.
|
||||
* otherwise returns false (indication to continue event loop).
|
||||
*/
|
||||
static bool handleMessage(MSG& message, int& keyCode)
|
||||
{
|
||||
// whether we have to call translate and dispatch yet
|
||||
// otherwise the message was handled specifically
|
||||
bool is_processed = false;
|
||||
|
||||
for (CvWindow* window = hg_windows; window != 0 && is_processed == 0; window = window->next)
|
||||
{
|
||||
if (!(window->hwnd == message.hwnd || window->frame == message.hwnd))
|
||||
continue;
|
||||
|
||||
is_processed = true;
|
||||
switch (message.message)
|
||||
{
|
||||
case WM_DESTROY:
|
||||
case WM_CHAR:
|
||||
DispatchMessage(&message);
|
||||
keyCode = (int)message.wParam;
|
||||
return true;
|
||||
|
||||
case WM_SYSKEYDOWN:
|
||||
if (message.wParam == VK_F10)
|
||||
{
|
||||
is_processed = true;
|
||||
keyCode = (int)(message.wParam << 16);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
TranslateMessage(&message);
|
||||
if ((message.wParam >= VK_F1 && message.wParam <= VK_F24) ||
|
||||
message.wParam == VK_HOME || message.wParam == VK_END ||
|
||||
message.wParam == VK_UP || message.wParam == VK_DOWN ||
|
||||
message.wParam == VK_LEFT || message.wParam == VK_RIGHT ||
|
||||
message.wParam == VK_INSERT || message.wParam == VK_DELETE ||
|
||||
message.wParam == VK_PRIOR || message.wParam == VK_NEXT)
|
||||
{
|
||||
DispatchMessage(&message);
|
||||
is_processed = true;
|
||||
keyCode = (int)(message.wParam << 16);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Intercept Ctrl+C for copy to clipboard
|
||||
if ('C' == message.wParam && (::GetKeyState(VK_CONTROL) >> 15))
|
||||
::SendMessage(message.hwnd, WM_COPY, 0, 0);
|
||||
|
||||
// Intercept Ctrl+S for "save as" dialog
|
||||
if ('S' == message.wParam && (::GetKeyState(VK_CONTROL) >> 15))
|
||||
showSaveDialog(window);
|
||||
|
||||
default:
|
||||
DispatchMessage(&message);
|
||||
is_processed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_processed)
|
||||
{
|
||||
TranslateMessage(&message);
|
||||
DispatchMessage(&message);
|
||||
}
|
||||
|
||||
return false; // no value to return, keep processing
|
||||
}
|
||||
|
||||
/*
|
||||
* process until queue is empty but don't wait.
|
||||
*/
|
||||
int cv::pollKey()
|
||||
{
|
||||
CV_TRACE_FUNCTION();
|
||||
for(;;)
|
||||
{
|
||||
MSG message;
|
||||
if (PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE)
|
||||
return -1;
|
||||
|
||||
int keyCode = -1;
|
||||
if (handleMessage(message, keyCode))
|
||||
return keyCode;
|
||||
}
|
||||
}
|
||||
|
||||
CV_IMPL int
|
||||
cvWaitKey( int delay )
|
||||
{
|
||||
@@ -1989,9 +2080,7 @@ cvWaitKey( int delay )
|
||||
|
||||
for(;;)
|
||||
{
|
||||
CvWindow* window;
|
||||
MSG message;
|
||||
int is_processed = 0;
|
||||
|
||||
if( (delay <= 0) && hg_windows)
|
||||
GetMessage(&message, 0, 0, 0);
|
||||
@@ -2004,61 +2093,9 @@ cvWaitKey( int delay )
|
||||
continue;
|
||||
}
|
||||
|
||||
for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )
|
||||
{
|
||||
if( window->hwnd == message.hwnd || window->frame == message.hwnd )
|
||||
{
|
||||
is_processed = 1;
|
||||
switch(message.message)
|
||||
{
|
||||
case WM_DESTROY:
|
||||
case WM_CHAR:
|
||||
DispatchMessage(&message);
|
||||
return (int)message.wParam;
|
||||
|
||||
case WM_SYSKEYDOWN:
|
||||
if( message.wParam == VK_F10 )
|
||||
{
|
||||
is_processed = 1;
|
||||
return (int)(message.wParam << 16);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
TranslateMessage(&message);
|
||||
if( (message.wParam >= VK_F1 && message.wParam <= VK_F24) ||
|
||||
message.wParam == VK_HOME || message.wParam == VK_END ||
|
||||
message.wParam == VK_UP || message.wParam == VK_DOWN ||
|
||||
message.wParam == VK_LEFT || message.wParam == VK_RIGHT ||
|
||||
message.wParam == VK_INSERT || message.wParam == VK_DELETE ||
|
||||
message.wParam == VK_PRIOR || message.wParam == VK_NEXT )
|
||||
{
|
||||
DispatchMessage(&message);
|
||||
is_processed = 1;
|
||||
return (int)(message.wParam << 16);
|
||||
}
|
||||
|
||||
// Intercept Ctrl+C for copy to clipboard
|
||||
if ('C' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
|
||||
::SendMessage(message.hwnd, WM_COPY, 0, 0);
|
||||
|
||||
// Intercept Ctrl+S for "save as" dialog
|
||||
if ('S' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
|
||||
showSaveDialog(window);
|
||||
|
||||
default:
|
||||
DispatchMessage(&message);
|
||||
is_processed = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !is_processed )
|
||||
{
|
||||
TranslateMessage(&message);
|
||||
DispatchMessage(&message);
|
||||
}
|
||||
int keyCode = -1;
|
||||
if (handleMessage(message, keyCode))
|
||||
return keyCode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -205,6 +205,14 @@ CV_IMPL int cvGetTrackbarPos(const char* trackbar_name, const char* window_name)
|
||||
|
||||
/********************************** Not YET implemented API ****************************************************/
|
||||
|
||||
int cv::pollKey()
|
||||
{
|
||||
CV_TRACE_FUNCTION();
|
||||
CV_WINRT_NO_GUI_ERROR("cvPollKey");
|
||||
|
||||
// TODO: implement appropriate logic here
|
||||
}
|
||||
|
||||
CV_IMPL int cvWaitKey(int delay)
|
||||
{
|
||||
CV_WINRT_NO_GUI_ERROR("cvWaitKey");
|
||||
|
||||
Reference in New Issue
Block a user