Add a test case for clipboard functionality and fix some bugs revealed
by it.
diff --git a/server/clipboard.c b/server/clipboard.c
index 7d54e57..5b9d6b4 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -80,26 +80,22 @@
static int set_clipboard_owner(user_handle_t win, int clear)
{
- if (cbthread == current)
- {
- if (!clear)
- {
- cbowner = current;
- owner = win;
- }
- else
- {
- cbowner = 0;
- owner = 0;
- }
- seqno++;
- return 1;
- }
- else
+ if (cbowner && cbowner != current)
{
set_error(STATUS_WAS_LOCKED);
return 0;
}
+ else if (!clear)
+ {
+ owner = win;
+ cbowner = current;
+ }
+ else
+ {
+ owner = 0;
+ cbowner = NULL;
+ }
+ return 1;
}
@@ -124,11 +120,24 @@
if (req->flags & SET_CB_OPEN)
{
+ if (cbthread)
+ {
+ /* clipboard already opened */
+ set_error(STATUS_WAS_LOCKED);
+ return;
+ }
+
if (!set_clipboard_window(req->clipboard, 0))
return;
}
else if (req->flags & SET_CB_CLOSE)
{
+ if (cbthread != current)
+ {
+ set_win32_error(ERROR_CLIPBOARD_NOT_OPEN);
+ return;
+ }
+
if (!set_clipboard_window(0, 1))
return;
}