1
0
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:
Christoph Rackwitz
2021-02-01 15:44:03 +01:00
parent 674ecc5581
commit 26da491053
7 changed files with 152 additions and 72 deletions
+2
View File
@@ -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)
+7
View File
@@ -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
+7
View File
@@ -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);
+7
View File
@@ -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
+94 -57
View File
@@ -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;
}
}
+8
View File
@@ -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");