2 * MACDRV initialization code
4 * Copyright 1998 Patrik Stridvall
5 * Copyright 2000 Alexandre Julliard
6 * Copyright 2011, 2012, 2013 Ken Thomases for CodeWeavers Inc.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/server.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(macdrv);
30 DWORD thread_data_tls_index = TLS_OUT_OF_INDEXES;
33 /***********************************************************************
36 static BOOL process_attach(void)
38 assert(NUM_EVENT_TYPES <= sizeof(macdrv_event_mask) * 8);
40 if ((thread_data_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) return FALSE;
42 macdrv_err_on = ERR_ON(macdrv);
43 if (macdrv_start_cocoa_app(GetTickCount64()))
45 ERR("Failed to start Cocoa app main loop\n");
53 /***********************************************************************
56 static void thread_detach(void)
58 struct macdrv_thread_data *data = macdrv_thread_data();
62 macdrv_destroy_event_queue(data->queue);
63 if (data->keyboard_layout_uchr)
64 CFRelease(data->keyboard_layout_uchr);
65 HeapFree(GetProcessHeap(), 0, data);
70 /***********************************************************************
71 * set_queue_display_fd
73 * Store the event queue fd into the message queue
75 static void set_queue_display_fd(int fd)
80 if (wine_server_fd_to_handle(fd, GENERIC_READ | SYNCHRONIZE, 0, &handle))
82 MESSAGE("macdrv: Can't allocate handle for event queue fd\n");
85 SERVER_START_REQ(set_queue_fd)
87 req->handle = wine_server_obj_handle(handle);
88 ret = wine_server_call(req);
93 MESSAGE("macdrv: Can't store handle for event queue fd\n");
100 /***********************************************************************
101 * macdrv_init_thread_data
103 struct macdrv_thread_data *macdrv_init_thread_data(void)
105 struct macdrv_thread_data *data = macdrv_thread_data();
107 if (data) return data;
109 if (!(data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data))))
111 ERR("could not create data\n");
115 if (!(data->queue = macdrv_create_event_queue()))
117 ERR("macdrv: Can't create event queue.\n");
121 data->keyboard_layout_uchr = macdrv_copy_keyboard_layout(&data->keyboard_type, &data->iso_keyboard);
122 macdrv_compute_keyboard_layout(data);
124 set_queue_display_fd(macdrv_get_event_queue_fd(data->queue));
125 TlsSetValue(thread_data_tls_index, data);
131 /***********************************************************************
134 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
140 case DLL_PROCESS_ATTACH:
141 ret = process_attach();
143 case DLL_THREAD_DETACH: