jscript: Rename jsheap_t to heap_pool_t.
[wine] / dlls / winemac.drv / macdrv_main.c
1 /*
2  * MACDRV initialization code
3  *
4  * Copyright 1998 Patrik Stridvall
5  * Copyright 2000 Alexandre Julliard
6  * Copyright 2011, 2012, 2013 Ken Thomases for CodeWeavers Inc.
7  *
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.
12  *
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.
17  *
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
21  */
22 #include "config.h"
23
24 #include "macdrv.h"
25 #include "wine/server.h"
26
27 WINE_DEFAULT_DEBUG_CHANNEL(macdrv);
28
29
30 DWORD thread_data_tls_index = TLS_OUT_OF_INDEXES;
31
32
33 /***********************************************************************
34  *              process_attach
35  */
36 static BOOL process_attach(void)
37 {
38     assert(NUM_EVENT_TYPES <= sizeof(macdrv_event_mask) * 8);
39
40     if ((thread_data_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) return FALSE;
41
42     macdrv_err_on = ERR_ON(macdrv);
43     if (macdrv_start_cocoa_app(GetTickCount64()))
44     {
45         ERR("Failed to start Cocoa app main loop\n");
46         return FALSE;
47     }
48
49     return TRUE;
50 }
51
52
53 /***********************************************************************
54  *              thread_detach
55  */
56 static void thread_detach(void)
57 {
58     struct macdrv_thread_data *data = macdrv_thread_data();
59
60     if (data)
61     {
62         macdrv_destroy_event_queue(data->queue);
63         if (data->keyboard_layout_uchr)
64             CFRelease(data->keyboard_layout_uchr);
65         HeapFree(GetProcessHeap(), 0, data);
66     }
67 }
68
69
70 /***********************************************************************
71  *              set_queue_display_fd
72  *
73  * Store the event queue fd into the message queue
74  */
75 static void set_queue_display_fd(int fd)
76 {
77     HANDLE handle;
78     int ret;
79
80     if (wine_server_fd_to_handle(fd, GENERIC_READ | SYNCHRONIZE, 0, &handle))
81     {
82         MESSAGE("macdrv: Can't allocate handle for event queue fd\n");
83         ExitProcess(1);
84     }
85     SERVER_START_REQ(set_queue_fd)
86     {
87         req->handle = wine_server_obj_handle(handle);
88         ret = wine_server_call(req);
89     }
90     SERVER_END_REQ;
91     if (ret)
92     {
93         MESSAGE("macdrv: Can't store handle for event queue fd\n");
94         ExitProcess(1);
95     }
96     CloseHandle(handle);
97 }
98
99
100 /***********************************************************************
101  *              macdrv_init_thread_data
102  */
103 struct macdrv_thread_data *macdrv_init_thread_data(void)
104 {
105     struct macdrv_thread_data *data = macdrv_thread_data();
106
107     if (data) return data;
108
109     if (!(data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data))))
110     {
111         ERR("could not create data\n");
112         ExitProcess(1);
113     }
114
115     if (!(data->queue = macdrv_create_event_queue()))
116     {
117         ERR("macdrv: Can't create event queue.\n");
118         ExitProcess(1);
119     }
120
121     data->keyboard_layout_uchr = macdrv_copy_keyboard_layout(&data->keyboard_type, &data->iso_keyboard);
122     macdrv_compute_keyboard_layout(data);
123
124     set_queue_display_fd(macdrv_get_event_queue_fd(data->queue));
125     TlsSetValue(thread_data_tls_index, data);
126
127     return data;
128 }
129
130
131 /***********************************************************************
132  *              DllMain
133  */
134 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
135 {
136     BOOL ret = TRUE;
137
138     switch(reason)
139     {
140     case DLL_PROCESS_ATTACH:
141         ret = process_attach();
142         break;
143     case DLL_THREAD_DETACH:
144         thread_detach();
145         break;
146     }
147     return ret;
148 }