strmbase: Fixed user-after-free (Coverity).
[wine] / dlls / winemac.drv / macdrv_cocoa.h
1 /*
2  * MACDRV Cocoa interface declarations
3  *
4  * Copyright 2011, 2012, 2013 Ken Thomases for CodeWeavers Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 /* This header serves as a C interface between the Wine parts of MACDRV
22  * and the Objective-C parts.  It should restrict itself to C and the C-based
23  * Mac APIs, avoiding both Wine and Objective-C/Cocoa features, so that it can
24  * be included by both sides without contaminating either.
25  */
26
27 #ifndef __WINE_MACDRV_COCOA_H
28 #define __WINE_MACDRV_COCOA_H
29
30
31 #define GetCurrentProcess MacGetCurrentProcess
32 #define GetCurrentThread MacGetCurrentThread
33 #define LoadResource MacLoadResource
34 #define AnimatePalette MacAnimatePalette
35 #define EqualRgn MacEqualRgn
36 #define FillRgn MacFillRgn
37 #define FrameRgn MacFrameRgn
38 #define GetPixel MacGetPixel
39 #define InvertRgn MacInvertRgn
40 #define LineTo MacLineTo
41 #define OffsetRgn MacOffsetRgn
42 #define PaintRgn MacPaintRgn
43 #define Polygon MacPolygon
44 #define ResizePalette MacResizePalette
45 #define SetRectRgn MacSetRectRgn
46 #define EqualRect MacEqualRect
47 #define FillRect MacFillRect
48 #define FrameRect MacFrameRect
49 #define GetCursor MacGetCursor
50 #define InvertRect MacInvertRect
51 #define OffsetRect MacOffsetRect
52 #define PtInRect MacPtInRect
53 #define SetCursor MacSetCursor
54 #define SetRect MacSetRect
55 #define ShowCursor MacShowCursor
56 #define UnionRect MacUnionRect
57
58 #include <ApplicationServices/ApplicationServices.h>
59
60 #undef GetCurrentProcess
61 #undef GetCurrentThread
62 #undef LoadResource
63 #undef AnimatePalette
64 #undef EqualRgn
65 #undef FillRgn
66 #undef FrameRgn
67 #undef GetPixel
68 #undef InvertRgn
69 #undef LineTo
70 #undef OffsetRgn
71 #undef PaintRgn
72 #undef Polygon
73 #undef ResizePalette
74 #undef SetRectRgn
75 #undef EqualRect
76 #undef FillRect
77 #undef FrameRect
78 #undef GetCursor
79 #undef InvertRect
80 #undef OffsetRect
81 #undef PtInRect
82 #undef SetCursor
83 #undef SetRect
84 #undef ShowCursor
85 #undef UnionRect
86 #undef DPRINTF
87
88 #include <pthread.h>
89
90
91 #ifndef DECLSPEC_HIDDEN
92 # if defined(__MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__)
93 #  define DECLSPEC_HIDDEN
94 # elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))
95 #  define DECLSPEC_HIDDEN __attribute__((visibility ("hidden")))
96 # else
97 #  define DECLSPEC_HIDDEN
98 # endif
99 #endif
100
101
102 /* Must match the values of Cocoa's NSDragOperation enum. */
103 enum {
104     DRAG_OP_NONE    = 0,
105     DRAG_OP_COPY    = 1,
106     DRAG_OP_LINK    = 2,
107     DRAG_OP_GENERIC = 4,
108     DRAG_OP_PRIVATE = 8,
109     DRAG_OP_MOVE    = 16,
110     DRAG_OP_DELETE  = 32,
111     DRAG_OP_EVERY   = UINT32_MAX
112 };
113
114
115 typedef struct macdrv_opaque_window* macdrv_window;
116 typedef struct macdrv_opaque_event_queue* macdrv_event_queue;
117 typedef struct macdrv_opaque_view* macdrv_view;
118 typedef struct macdrv_opaque_opengl_context* macdrv_opengl_context;
119 typedef struct macdrv_opaque_status_item* macdrv_status_item;
120 struct macdrv_event;
121 struct macdrv_query;
122
123 struct macdrv_display {
124     CGDirectDisplayID displayID;
125     CGRect frame;
126     CGRect work_frame;
127 };
128
129
130 /* main */
131 extern int macdrv_err_on;
132
133 extern int macdrv_start_cocoa_app(unsigned long long tickcount) DECLSPEC_HIDDEN;
134 extern void macdrv_window_rejected_focus(const struct macdrv_event *event) DECLSPEC_HIDDEN;
135 extern void macdrv_beep(void) DECLSPEC_HIDDEN;
136 extern void macdrv_set_application_icon(CFArrayRef images) DECLSPEC_HIDDEN;
137
138
139 /* cursor */
140 extern void macdrv_set_cursor(CFStringRef name, CFArrayRef frames) DECLSPEC_HIDDEN;
141 extern int macdrv_get_cursor_position(CGPoint *pos) DECLSPEC_HIDDEN;
142 extern int macdrv_set_cursor_position(CGPoint pos) DECLSPEC_HIDDEN;
143 extern int macdrv_clip_cursor(CGRect rect) DECLSPEC_HIDDEN;
144
145
146 /* display */
147 extern int macdrv_get_displays(struct macdrv_display** displays, int* count) DECLSPEC_HIDDEN;
148 extern void macdrv_free_displays(struct macdrv_display* displays) DECLSPEC_HIDDEN;
149 extern int macdrv_set_display_mode(const struct macdrv_display* display,
150                                    CGDisplayModeRef display_mode) DECLSPEC_HIDDEN;
151
152
153 /* event */
154 enum {
155     APP_DEACTIVATED,
156     DISPLAYS_CHANGED,
157     KEY_PRESS,
158     KEY_RELEASE,
159     KEYBOARD_CHANGED,
160     MOUSE_BUTTON,
161     MOUSE_MOVED,
162     MOUSE_MOVED_ABSOLUTE,
163     MOUSE_SCROLL,
164     QUERY_EVENT,
165     STATUS_ITEM_CLICKED,
166     WINDOW_CLOSE_REQUESTED,
167     WINDOW_DID_MINIMIZE,
168     WINDOW_DID_UNMINIMIZE,
169     WINDOW_FRAME_CHANGED,
170     WINDOW_GOT_FOCUS,
171     WINDOW_LOST_FOCUS,
172     NUM_EVENT_TYPES
173 };
174
175 typedef uint32_t macdrv_event_mask;
176
177 typedef struct macdrv_event {
178     int                 type;
179     macdrv_window       window;
180     union {
181         struct {
182             int activating;
183         }                                           displays_changed;
184         struct {
185             CGKeyCode                   keycode;
186             CGEventFlags                modifiers;
187             unsigned long               time_ms;
188         }                                           key;
189         struct {
190             CFDataRef                   uchr;
191             CGEventSourceKeyboardType   keyboard_type;
192             int                         iso_keyboard;
193         }                                           keyboard_changed;
194         struct {
195             int             button;
196             int             pressed;
197             int             x;
198             int             y;
199             unsigned long   time_ms;
200         }                                           mouse_button;
201         struct {
202             int             x;
203             int             y;
204             unsigned long   time_ms;
205         }                                           mouse_moved;
206         struct {
207             int             x_scroll;
208             int             y_scroll;
209             int             x;
210             int             y;
211             unsigned long   time_ms;
212         }                                           mouse_scroll;
213         struct {
214             struct macdrv_query *query;
215         }                                           query_event;
216         struct {
217             macdrv_status_item  item;
218             int                 count;
219         }                                           status_item_clicked;
220         struct {
221             CGRect frame;
222         }                                           window_frame_changed;
223         struct {
224             unsigned long   serial;
225             void           *tried_windows;
226         }                                           window_got_focus;
227     };
228 } macdrv_event;
229
230 enum {
231     QUERY_DRAG_DROP,
232     QUERY_DRAG_EXITED,
233     QUERY_DRAG_OPERATION,
234     QUERY_PASTEBOARD_DATA,
235     NUM_QUERY_TYPES
236 };
237
238 typedef struct macdrv_query {
239     int                 refs;
240     int                 type;
241     macdrv_window       window;
242     int                 status;
243     int                 done;
244     union {
245         struct {
246             int                 x;
247             int                 y;
248             uint32_t            op;
249             CFTypeRef           pasteboard;
250         }                                           drag_drop;
251         struct {
252             int                 x;
253             int                 y;
254             uint32_t            offered_ops;
255             uint32_t            accepted_op;
256             CFTypeRef           pasteboard;
257         }                                           drag_operation;
258         struct {
259             CFStringRef type;
260         }                                           pasteboard_data;
261     };
262 } macdrv_query;
263
264 static inline macdrv_event_mask event_mask_for_type(int type)
265 {
266     return ((macdrv_event_mask)1 << type);
267 }
268
269 typedef void (*macdrv_event_handler)(macdrv_event *event);
270
271 extern macdrv_event_queue macdrv_create_event_queue(macdrv_event_handler handler) DECLSPEC_HIDDEN;
272 extern void macdrv_destroy_event_queue(macdrv_event_queue queue) DECLSPEC_HIDDEN;
273 extern int macdrv_get_event_queue_fd(macdrv_event_queue queue) DECLSPEC_HIDDEN;
274
275 extern int macdrv_get_event_from_queue(macdrv_event_queue queue,
276         macdrv_event_mask mask, macdrv_event *event) DECLSPEC_HIDDEN;
277 extern void macdrv_cleanup_event(macdrv_event *event) DECLSPEC_HIDDEN;
278
279 extern macdrv_query* macdrv_create_query(void) DECLSPEC_HIDDEN;
280 extern macdrv_query* macdrv_retain_query(macdrv_query *query) DECLSPEC_HIDDEN;
281 extern void macdrv_release_query(macdrv_query *query) DECLSPEC_HIDDEN;
282 extern void macdrv_set_query_done(macdrv_query *query) DECLSPEC_HIDDEN;
283
284
285 /* window */
286 struct macdrv_window_features {
287     unsigned int    title_bar:1;
288     unsigned int    close_button:1;
289     unsigned int    minimize_button:1;
290     unsigned int    resizable:1;
291     unsigned int    utility:1;
292     unsigned int    shadow:1;
293 };
294
295 struct macdrv_window_state {
296     unsigned int    disabled:1;
297     unsigned int    no_activate:1;
298     unsigned int    floating:1;
299     unsigned int    excluded_by_expose:1;
300     unsigned int    excluded_by_cycle:1;
301     unsigned int    minimized:1;
302 };
303
304 extern macdrv_window macdrv_create_cocoa_window(const struct macdrv_window_features* wf,
305         CGRect frame, void* hwnd, macdrv_event_queue queue) DECLSPEC_HIDDEN;
306 extern void macdrv_destroy_cocoa_window(macdrv_window w) DECLSPEC_HIDDEN;
307 extern void* macdrv_get_window_hwnd(macdrv_window w) DECLSPEC_HIDDEN;
308 extern void macdrv_set_cocoa_window_features(macdrv_window w,
309         const struct macdrv_window_features* wf) DECLSPEC_HIDDEN;
310 extern void macdrv_set_cocoa_window_state(macdrv_window w,
311         const struct macdrv_window_state* state) DECLSPEC_HIDDEN;
312 extern void macdrv_set_cocoa_window_title(macdrv_window w, const UniChar* title,
313         size_t length) DECLSPEC_HIDDEN;
314 extern int macdrv_order_cocoa_window(macdrv_window w, macdrv_window prev,
315         macdrv_window next) DECLSPEC_HIDDEN;
316 extern void macdrv_hide_cocoa_window(macdrv_window w) DECLSPEC_HIDDEN;
317 extern int macdrv_set_cocoa_window_frame(macdrv_window w, const CGRect* new_frame) DECLSPEC_HIDDEN;
318 extern void macdrv_get_cocoa_window_frame(macdrv_window w, CGRect* out_frame) DECLSPEC_HIDDEN;
319 extern void macdrv_set_cocoa_parent_window(macdrv_window w, macdrv_window parent) DECLSPEC_HIDDEN;
320 extern void macdrv_set_window_surface(macdrv_window w, void *surface, pthread_mutex_t *mutex) DECLSPEC_HIDDEN;
321 extern CGImageRef create_surface_image(void *window_surface, CGRect *rect, int copy_data) DECLSPEC_HIDDEN;
322 extern int get_surface_region_rects(void *window_surface, const CGRect **rects, int *count) DECLSPEC_HIDDEN;
323 extern void macdrv_window_needs_display(macdrv_window w, CGRect rect) DECLSPEC_HIDDEN;
324 extern void macdrv_set_window_shape(macdrv_window w, const CGRect *rects, int count) DECLSPEC_HIDDEN;
325 extern void macdrv_set_window_alpha(macdrv_window w, CGFloat alpha) DECLSPEC_HIDDEN;
326 extern void macdrv_set_window_color_key(macdrv_window w, CGFloat keyRed, CGFloat keyGreen,
327                                         CGFloat keyBlue) DECLSPEC_HIDDEN;
328 extern void macdrv_clear_window_color_key(macdrv_window w) DECLSPEC_HIDDEN;
329 extern void macdrv_window_use_per_pixel_alpha(macdrv_window w, int use_per_pixel_alpha) DECLSPEC_HIDDEN;
330 extern void macdrv_give_cocoa_window_focus(macdrv_window w) DECLSPEC_HIDDEN;
331 extern macdrv_view macdrv_create_view(macdrv_window w, CGRect rect) DECLSPEC_HIDDEN;
332 extern void macdrv_dispose_view(macdrv_view v) DECLSPEC_HIDDEN;
333 extern void macdrv_set_view_window_and_frame(macdrv_view v, macdrv_window w, CGRect rect) DECLSPEC_HIDDEN;
334 extern void macdrv_add_view_opengl_context(macdrv_view v, macdrv_opengl_context c) DECLSPEC_HIDDEN;
335 extern void macdrv_remove_view_opengl_context(macdrv_view v, macdrv_opengl_context c) DECLSPEC_HIDDEN;
336
337
338 /* keyboard */
339 extern CFDataRef macdrv_copy_keyboard_layout(CGEventSourceKeyboardType* keyboard_type, int* is_iso) DECLSPEC_HIDDEN;
340
341
342 /* clipboard */
343 extern CFArrayRef macdrv_copy_pasteboard_types(CFTypeRef pasteboard) DECLSPEC_HIDDEN;
344 extern CFDataRef macdrv_copy_pasteboard_data(CFTypeRef pasteboard, CFStringRef type) DECLSPEC_HIDDEN;
345 extern int macdrv_is_pasteboard_owner(void) DECLSPEC_HIDDEN;
346 extern void macdrv_clear_pasteboard(void) DECLSPEC_HIDDEN;
347 extern int macdrv_set_pasteboard_data(CFStringRef type, CFDataRef data, macdrv_window w) DECLSPEC_HIDDEN;
348
349
350 /* opengl */
351 extern macdrv_opengl_context macdrv_create_opengl_context(void* cglctx) DECLSPEC_HIDDEN;
352 extern void macdrv_dispose_opengl_context(macdrv_opengl_context c) DECLSPEC_HIDDEN;
353 extern void macdrv_make_context_current(macdrv_opengl_context c, macdrv_view v) DECLSPEC_HIDDEN;
354 extern void macdrv_update_opengl_context(macdrv_opengl_context c) DECLSPEC_HIDDEN;
355 extern void macdrv_flush_opengl_context(macdrv_opengl_context c) DECLSPEC_HIDDEN;
356
357
358 /* systray / status item */
359 extern macdrv_status_item macdrv_create_status_item(macdrv_event_queue q) DECLSPEC_HIDDEN;
360 extern void macdrv_destroy_status_item(macdrv_status_item s) DECLSPEC_HIDDEN;
361 extern void macdrv_set_status_item_image(macdrv_status_item s, CGImageRef cgimage) DECLSPEC_HIDDEN;
362 extern void macdrv_set_status_item_tooltip(macdrv_status_item s, CFStringRef cftip) DECLSPEC_HIDDEN;
363
364 #endif  /* __WINE_MACDRV_COCOA_H */