Commit | Line | Data |
---|---|---|
a09e091a JB |
1 | /* |
2 | *Copyright (C) 2003-2004 Harold L Hunt II All Rights Reserved. | |
3 | * | |
4 | *Permission is hereby granted, free of charge, to any person obtaining | |
5 | * a copy of this software and associated documentation files (the | |
6 | *"Software"), to deal in the Software without restriction, including | |
7 | *without limitation the rights to use, copy, modify, merge, publish, | |
8 | *distribute, sublicense, and/or sell copies of the Software, and to | |
9 | *permit persons to whom the Software is furnished to do so, subject to | |
10 | *the following conditions: | |
11 | * | |
12 | *The above copyright notice and this permission notice shall be | |
13 | *included in all copies or substantial portions of the Software. | |
14 | * | |
15 | *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
16 | *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
17 | *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
18 | *NONINFRINGEMENT. IN NO EVENT SHALL HAROLD L HUNT II BE LIABLE FOR | |
19 | *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |
20 | *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
21 | *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
22 | * | |
23 | *Except as contained in this notice, the name of Harold L Hunt II | |
24 | *shall not be used in advertising or otherwise to promote the sale, use | |
25 | *or other dealings in this Software without prior written authorization | |
26 | *from Harold L Hunt II. | |
27 | * | |
28 | * Authors: Harold L Hunt II | |
29 | */ | |
30 | ||
31 | #ifdef HAVE_XWIN_CONFIG_H | |
32 | #include <xwin-config.h> | |
33 | #endif | |
34 | #include "dixstruct.h" | |
35 | #include "winclipboard.h" | |
36 | ||
37 | /* | |
38 | * Local typedefs | |
39 | */ | |
40 | ||
41 | typedef int (*winDispatchProcPtr) (ClientPtr); | |
42 | ||
43 | int winProcSetSelectionOwner(ClientPtr /* client */ ); | |
44 | ||
45 | /* | |
46 | * References to external symbols | |
47 | */ | |
48 | ||
49 | extern pthread_t g_ptClipboardProc; | |
50 | extern winDispatchProcPtr winProcSetSelectionOwnerOrig; | |
51 | extern Bool g_fClipboard; | |
52 | extern HWND g_hwndClipboard; | |
53 | ||
54 | /* | |
55 | * Intialize the Clipboard module | |
56 | */ | |
57 | ||
58 | Bool | |
59 | winInitClipboard(void) | |
60 | { | |
61 | winDebug("winInitClipboard ()\n"); | |
62 | ||
63 | /* Wrap some internal server functions */ | |
64 | if (ProcVector[X_SetSelectionOwner] != winProcSetSelectionOwner) { | |
65 | winProcSetSelectionOwnerOrig = ProcVector[X_SetSelectionOwner]; | |
66 | ProcVector[X_SetSelectionOwner] = winProcSetSelectionOwner; | |
67 | } | |
68 | ||
69 | /* Spawn a thread for the Clipboard module */ | |
70 | if (pthread_create(&g_ptClipboardProc, NULL, winClipboardProc, NULL)) { | |
71 | /* Bail if thread creation failed */ | |
72 | ErrorF("winInitClipboard - pthread_create failed.\n"); | |
73 | return FALSE; | |
74 | } | |
75 | ||
76 | return TRUE; | |
77 | } | |
78 | ||
79 | /* | |
80 | * Create the Windows window that we use to recieve Windows messages | |
81 | */ | |
82 | ||
83 | HWND | |
84 | winClipboardCreateMessagingWindow(void) | |
85 | { | |
86 | WNDCLASSEX wc; | |
87 | HWND hwnd; | |
88 | ||
89 | /* Setup our window class */ | |
90 | wc.cbSize = sizeof(WNDCLASSEX); | |
91 | wc.style = CS_HREDRAW | CS_VREDRAW; | |
92 | wc.lpfnWndProc = winClipboardWindowProc; | |
93 | wc.cbClsExtra = 0; | |
94 | wc.cbWndExtra = 0; | |
95 | wc.hInstance = GetModuleHandle(NULL); | |
96 | wc.hIcon = 0; | |
97 | wc.hCursor = 0; | |
98 | wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); | |
99 | wc.lpszMenuName = NULL; | |
100 | wc.lpszClassName = WIN_CLIPBOARD_WINDOW_CLASS; | |
101 | wc.hIconSm = 0; | |
102 | RegisterClassEx(&wc); | |
103 | ||
104 | /* Create the window */ | |
105 | hwnd = CreateWindowExA(0, /* Extended styles */ | |
106 | WIN_CLIPBOARD_WINDOW_CLASS, /* Class name */ | |
107 | WIN_CLIPBOARD_WINDOW_TITLE, /* Window name */ | |
108 | WS_OVERLAPPED, /* Not visible anyway */ | |
109 | CW_USEDEFAULT, /* Horizontal position */ | |
110 | CW_USEDEFAULT, /* Vertical position */ | |
111 | CW_USEDEFAULT, /* Right edge */ | |
112 | CW_USEDEFAULT, /* Bottom edge */ | |
113 | (HWND) NULL, /* No parent or owner window */ | |
114 | (HMENU) NULL, /* No menu */ | |
115 | GetModuleHandle(NULL), /* Instance handle */ | |
116 | NULL); /* Creation data */ | |
117 | assert(hwnd != NULL); | |
118 | ||
119 | /* I'm not sure, but we may need to call this to start message processing */ | |
120 | ShowWindow(hwnd, SW_HIDE); | |
121 | ||
122 | /* Similarly, we may need a call to this even though we don't paint */ | |
123 | UpdateWindow(hwnd); | |
124 | ||
125 | return hwnd; | |
126 | } | |
127 | ||
128 | void | |
129 | winFixClipboardChain(void) | |
130 | { | |
131 | if (g_fClipboard && g_hwndClipboard) { | |
132 | PostMessage(g_hwndClipboard, WM_WM_REINIT, 0, 0); | |
133 | } | |
134 | } |