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 HeapFree(GetProcessHeap(), 0, data);
68 /***********************************************************************
69 * set_queue_display_fd
71 * Store the event queue fd into the message queue
73 static void set_queue_display_fd(int fd)
78 if (wine_server_fd_to_handle(fd, GENERIC_READ | SYNCHRONIZE, 0, &handle))
80 MESSAGE("macdrv: Can't allocate handle for event queue fd\n");
83 SERVER_START_REQ(set_queue_fd)
85 req->handle = wine_server_obj_handle(handle);
86 ret = wine_server_call(req);
91 MESSAGE("macdrv: Can't store handle for event queue fd\n");
98 /***********************************************************************
99 * macdrv_init_thread_data
101 struct macdrv_thread_data *macdrv_init_thread_data(void)
103 struct macdrv_thread_data *data = macdrv_thread_data();
105 if (data) return data;
107 if (!(data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data))))
109 ERR("could not create data\n");
113 if (!(data->queue = macdrv_create_event_queue()))
115 ERR("macdrv: Can't create event queue.\n");
119 set_queue_display_fd(macdrv_get_event_queue_fd(data->queue));
120 TlsSetValue(thread_data_tls_index, data);
126 /***********************************************************************
129 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
135 case DLL_PROCESS_ATTACH:
136 ret = process_attach();
138 case DLL_THREAD_DETACH: