Commits:
-
2ecaa369
by Ben Wagner at 2023-05-12T15:47:22+00:00
[graph] Correct function pointer types
Building the demos with the CFI sanitizer detects a number of uses of
undefined behavior in the Minimalist Graphics Subsystem where an
indirect function call is made through a pointer of a different type.
All of these cases worked in practice since the differing argument
types were the same size and would have the same pointer value at
runtime.
Change the functions to take the correct types and downcast inside the
function.
* graph/beos/grbeos.cpp: remove casts
* graph/mac/grmac.c: correct return type of `listen_event`, remove casts
* graph/os2/gros2pm.c: correct function signatures, downcast inside
functions, remove function pointer casts
* graph/win32/grwin32.c: ditto
* graph/x11/grx11.c: ditto
5 changed files:
Changes:
graph/beos/grbeos.cpp
... |
... |
@@ -167,7 +167,7 @@ grDevice gr_beos_device = |
167
|
167
|
init_device,
|
168
|
168
|
done_device,
|
169
|
169
|
|
170
|
|
- (grDeviceInitSurfaceFunc) Window::init_surface,
|
|
170
|
+ Window::init_surface,
|
171
|
171
|
|
172
|
172
|
0,
|
173
|
173
|
0
|
graph/mac/grmac.c
... |
... |
@@ -154,9 +154,9 @@ |
154
|
154
|
}
|
155
|
155
|
|
156
|
156
|
static
|
157
|
|
- void listen_event( grSurface* surface,
|
158
|
|
- int event_mask,
|
159
|
|
- grEvent* grevent )
|
|
157
|
+ int listen_event( grSurface* surface,
|
|
158
|
+ int event_mask,
|
|
159
|
+ grEvent* grevent )
|
160
|
160
|
{
|
161
|
161
|
grEvent our_grevent;
|
162
|
162
|
EventRecord mac_event;
|
... |
... |
@@ -200,7 +200,7 @@ |
200
|
200
|
/* destroy the window here, since done_surface() doesn't get called */
|
201
|
201
|
done_window();
|
202
|
202
|
*grevent = our_grevent;
|
203
|
|
- return;
|
|
203
|
+ return 1;
|
204
|
204
|
case updateEvt:
|
205
|
205
|
if ( theWindow && (WindowPtr)mac_event.message == theWindow )
|
206
|
206
|
{
|
... |
... |
@@ -243,7 +243,7 @@ |
243
|
243
|
our_grevent.type = gr_event_key;
|
244
|
244
|
our_grevent.key = grKeyEsc;
|
245
|
245
|
*grevent = our_grevent;
|
246
|
|
- return;
|
|
246
|
+ return 1;
|
247
|
247
|
}
|
248
|
248
|
}
|
249
|
249
|
else if (part == inContent)
|
... |
... |
@@ -265,6 +265,7 @@ |
265
|
265
|
}
|
266
|
266
|
}
|
267
|
267
|
}
|
|
268
|
+ return 0;
|
268
|
269
|
}
|
269
|
270
|
|
270
|
271
|
|
... |
... |
@@ -359,10 +360,10 @@ grSurface* init_surface( grSurface* surface, |
359
|
360
|
theWindow = NewCWindow(NULL, &bounds, "\p???", 1, 0, (WindowRef)-1, 1, 0);
|
360
|
361
|
|
361
|
362
|
/* fill in surface interface */
|
362
|
|
- surface->done = (grDoneSurfaceFunc) done_surface;
|
363
|
|
- surface->refresh_rect = (grRefreshRectFunc) refresh_rectangle;
|
364
|
|
- surface->set_title = (grSetTitleFunc) set_title;
|
365
|
|
- surface->listen_event = (grListenEventFunc) listen_event;
|
|
363
|
+ surface->done = done_surface;
|
|
364
|
+ surface->refresh_rect = refresh_rectangle;
|
|
365
|
+ surface->set_title = set_title;
|
|
366
|
+ surface->listen_event = listen_event;
|
366
|
367
|
|
367
|
368
|
return surface;
|
368
|
369
|
}
|
... |
... |
@@ -386,7 +387,7 @@ grSurface* init_surface( grSurface* surface, |
386
|
387
|
init_device,
|
387
|
388
|
done_device,
|
388
|
389
|
|
389
|
|
- (grDeviceInitSurfaceFunc) init_surface,
|
|
390
|
+ init_surface,
|
390
|
391
|
|
391
|
392
|
0,
|
392
|
393
|
0
|
graph/os2/gros2pm.c
... |
... |
@@ -170,8 +170,11 @@ |
170
|
170
|
|
171
|
171
|
/* close a given window */
|
172
|
172
|
static
|
173
|
|
- void done_surface( grPMSurface* surface )
|
|
173
|
+ void done_surface( grSurface* baseSurface )
|
174
|
174
|
{
|
|
175
|
+ grPMSurface* surface = (grPMSurface*)baseSurface;
|
|
176
|
+
|
|
177
|
+
|
175
|
178
|
LOG(( "Os2PM: done_surface(%08lx)\n", (long)surface ));
|
176
|
179
|
|
177
|
180
|
if ( surface->frame_window )
|
... |
... |
@@ -260,12 +263,15 @@ |
260
|
263
|
|
261
|
264
|
|
262
|
265
|
static
|
263
|
|
- void refresh_rectangle( grPMSurface* surface,
|
264
|
|
- int x,
|
265
|
|
- int y,
|
266
|
|
- int w,
|
267
|
|
- int h )
|
|
266
|
+ void refresh_rectangle( grSurface* baseSurface,
|
|
267
|
+ int x,
|
|
268
|
+ int y,
|
|
269
|
+ int w,
|
|
270
|
+ int h )
|
268
|
271
|
{
|
|
272
|
+ grPMSurface* surface = (grPMSurface*)baseSurface;
|
|
273
|
+
|
|
274
|
+
|
269
|
275
|
LOG(( "Os2PM: refresh_rectangle( %08lx, %d, %d, %d, %d )\n",
|
270
|
276
|
(long)surface, x, y, w, h ));
|
271
|
277
|
|
... |
... |
@@ -291,10 +297,11 @@ |
291
|
297
|
|
292
|
298
|
|
293
|
299
|
static
|
294
|
|
- void set_title( grPMSurface* surface,
|
|
300
|
+ void set_title( grSurface* baseSurface,
|
295
|
301
|
const char* title )
|
296
|
302
|
{
|
297
|
|
- ULONG rc;
|
|
303
|
+ grPMSurface* surface = (grPMSurface*)baseSurface;
|
|
304
|
+ ULONG rc;
|
298
|
305
|
|
299
|
306
|
#if 1
|
300
|
307
|
LOG(( "Os2PM: set_title( %08lx == %08lx, %s )\n",
|
... |
... |
@@ -311,11 +318,12 @@ |
311
|
318
|
|
312
|
319
|
|
313
|
320
|
static
|
314
|
|
- void listen_event( grPMSurface* surface,
|
315
|
|
- int event_mask,
|
316
|
|
- grEvent* grevent )
|
|
321
|
+ int listen_event( grSurface* baseSurface,
|
|
322
|
+ int event_mask,
|
|
323
|
+ grEvent* grevent )
|
317
|
324
|
{
|
318
|
|
- ULONG ulRequestCount;
|
|
325
|
+ grPMSurface* surface = (grPMSurface*)baseSurface;
|
|
326
|
+ ULONG ulRequestCount;
|
319
|
327
|
|
320
|
328
|
(void) event_mask; /* ignored for now */
|
321
|
329
|
|
... |
... |
@@ -325,14 +333,15 @@ |
325
|
333
|
*grevent = surface->event;
|
326
|
334
|
DosResetEventSem( surface->event_lock, &ulRequestCount );
|
327
|
335
|
|
328
|
|
- return;
|
|
336
|
+ return 1;
|
329
|
337
|
}
|
330
|
338
|
|
331
|
339
|
|
332
|
340
|
static
|
333
|
|
- grPMSurface* init_surface( grPMSurface* surface,
|
334
|
|
- grBitmap* bitmap )
|
|
341
|
+ grPMSurface* init_surface( grSurface* baseSurface,
|
|
342
|
+ grBitmap* bitmap )
|
335
|
343
|
{
|
|
344
|
+ grPMSurface* surface = (grPMSurface*)baseSurface;
|
336
|
345
|
PBITMAPINFO2 bit;
|
337
|
346
|
SIZEL sizl = { 0, 0 };
|
338
|
347
|
LONG palette[256];
|
... |
... |
@@ -474,10 +483,10 @@ |
474
|
483
|
LOCK(surface->image_lock);
|
475
|
484
|
UNLOCK(surface->image_lock);
|
476
|
485
|
|
477
|
|
- surface->root.done = (grDoneSurfaceFunc) done_surface;
|
478
|
|
- surface->root.refresh_rect = (grRefreshRectFunc) refresh_rectangle;
|
479
|
|
- surface->root.set_title = (grSetTitleFunc) set_title;
|
480
|
|
- surface->root.listen_event = (grListenEventFunc) listen_event;
|
|
486
|
+ surface->root.done = done_surface;
|
|
487
|
+ surface->root.refresh_rect = refresh_rectangle;
|
|
488
|
+ surface->root.set_title = set_title;
|
|
489
|
+ surface->root.listen_event = listen_event;
|
481
|
490
|
|
482
|
491
|
/* convert_rectangle( surface, 0, 0, bitmap->width, bitmap->rows ); */
|
483
|
492
|
return surface;
|
... |
... |
@@ -743,7 +752,7 @@ |
743
|
752
|
init_device,
|
744
|
753
|
done_device,
|
745
|
754
|
|
746
|
|
- (grDeviceInitSurfaceFunc) init_surface,
|
|
755
|
+ init_surface,
|
747
|
756
|
|
748
|
757
|
0,
|
749
|
758
|
0
|
graph/win32/grwin32.c
... |
... |
@@ -110,8 +110,11 @@ |
110
|
110
|
|
111
|
111
|
/* destroys the surface*/
|
112
|
112
|
static void
|
113
|
|
-gr_win32_surface_done( grWin32Surface* surface )
|
|
113
|
+gr_win32_surface_done( grSurface* baseSurface )
|
114
|
114
|
{
|
|
115
|
+ grWin32Surface* surface = (grWin32Surface*)baseSurface;
|
|
116
|
+
|
|
117
|
+
|
115
|
118
|
/* The graphical window has perhaps already destroyed itself */
|
116
|
119
|
if ( surface->window )
|
117
|
120
|
{
|
... |
... |
@@ -134,15 +137,17 @@ gr_win32_surface_done( grWin32Surface* surface ) |
134
|
137
|
|
135
|
138
|
static void
|
136
|
139
|
gr_win32_surface_refresh_rectangle(
|
137
|
|
- grWin32Surface* surface,
|
138
|
|
- int x,
|
139
|
|
- int y,
|
140
|
|
- int w,
|
141
|
|
- int h )
|
|
140
|
+ grSurface* baseSurface,
|
|
141
|
+ int x,
|
|
142
|
+ int y,
|
|
143
|
+ int w,
|
|
144
|
+ int h )
|
142
|
145
|
{
|
143
|
|
- int delta;
|
144
|
|
- RECT rect;
|
145
|
|
- grBitmap* bitmap = &surface->root.bitmap;
|
|
146
|
+ grWin32Surface* surface = (grWin32Surface*)baseSurface;
|
|
147
|
+ int delta;
|
|
148
|
+ RECT rect;
|
|
149
|
+ grBitmap* bitmap = &surface->root.bitmap;
|
|
150
|
+
|
146
|
151
|
|
147
|
152
|
LOG(( "gr_win32_surface_refresh_rectangle: ( %p, %d, %d, %d, %d )\n",
|
148
|
153
|
surface->root.bitmap.buffer, x, y, w, h ));
|
... |
... |
@@ -234,21 +239,25 @@ gr_win32_surface_refresh_rectangle( |
234
|
239
|
|
235
|
240
|
|
236
|
241
|
static void
|
237
|
|
-gr_win32_surface_set_title( grWin32Surface* surface,
|
238
|
|
- const char* title )
|
|
242
|
+gr_win32_surface_set_title( grSurface* baseSurface,
|
|
243
|
+ const char* title )
|
239
|
244
|
{
|
|
245
|
+ grWin32Surface* surface = (grWin32Surface*)baseSurface;
|
|
246
|
+
|
|
247
|
+
|
240
|
248
|
SetWindowText( surface->window, title );
|
241
|
249
|
}
|
242
|
250
|
|
243
|
251
|
|
244
|
252
|
static int
|
245
|
|
-gr_win32_surface_set_icon( grWin32Surface* surface,
|
246
|
|
- grBitmap* icon )
|
|
253
|
+gr_win32_surface_set_icon( grSurface* baseSurface,
|
|
254
|
+ grBitmap* icon )
|
247
|
255
|
{
|
248
|
|
- int s[] = { GetSystemMetrics( SM_CYSMICON ),
|
249
|
|
- GetSystemMetrics( SM_CYICON ) };
|
250
|
|
- WPARAM wParam;
|
251
|
|
- HICON hIcon;
|
|
256
|
+ grWin32Surface* surface = (grWin32Surface*)baseSurface;
|
|
257
|
+ int s[] = { GetSystemMetrics( SM_CYSMICON ),
|
|
258
|
+ GetSystemMetrics( SM_CYICON ) };
|
|
259
|
+ WPARAM wParam;
|
|
260
|
+ HICON hIcon;
|
252
|
261
|
|
253
|
262
|
if ( !icon )
|
254
|
263
|
return s[1];
|
... |
... |
@@ -330,12 +339,13 @@ gr_win32_surface_resize( grWin32Surface* surface, |
330
|
339
|
return 1;
|
331
|
340
|
}
|
332
|
341
|
|
333
|
|
-static void
|
334
|
|
-gr_win32_surface_listen_event( grWin32Surface* surface,
|
335
|
|
- int event_mask,
|
336
|
|
- grEvent* grevent )
|
|
342
|
+static int
|
|
343
|
+gr_win32_surface_listen_event( grSurface* baseSurface,
|
|
344
|
+ int event_mask,
|
|
345
|
+ grEvent* grevent )
|
337
|
346
|
{
|
338
|
|
- MSG msg;
|
|
347
|
+ grWin32Surface* surface = (grWin32Surface*)baseSurface;
|
|
348
|
+ MSG msg;
|
339
|
349
|
|
340
|
350
|
event_mask=event_mask; /* unused parameter */
|
341
|
351
|
|
... |
... |
@@ -359,7 +369,7 @@ gr_win32_surface_listen_event( grWin32Surface* surface, |
359
|
369
|
grevent->type = gr_event_resize;
|
360
|
370
|
grevent->x = width;
|
361
|
371
|
grevent->y = height;
|
362
|
|
- return;
|
|
372
|
+ return 1;
|
363
|
373
|
}
|
364
|
374
|
}
|
365
|
375
|
break;
|
... |
... |
@@ -373,11 +383,13 @@ gr_win32_surface_listen_event( grWin32Surface* surface, |
373
|
383
|
? "KeyPress: Char = '%c'\n"
|
374
|
384
|
: "KeyPress: Char = <%02x>\n",
|
375
|
385
|
msg.wParam ));
|
376
|
|
- return;
|
|
386
|
+ return 1;
|
377
|
387
|
}
|
378
|
388
|
break;
|
379
|
389
|
}
|
380
|
390
|
}
|
|
391
|
+
|
|
392
|
+ return 0;
|
381
|
393
|
}
|
382
|
394
|
|
383
|
395
|
|
... |
... |
@@ -427,10 +439,11 @@ DWORD WINAPI Window_ThreadProc( LPVOID lpParameter ) |
427
|
439
|
|
428
|
440
|
|
429
|
441
|
static int
|
430
|
|
-gr_win32_surface_init( grWin32Surface* surface,
|
431
|
|
- grBitmap* bitmap )
|
|
442
|
+gr_win32_surface_init( grSurface* baseSurface,
|
|
443
|
+ grBitmap* bitmap )
|
432
|
444
|
{
|
433
|
|
- MSG msg;
|
|
445
|
+ grWin32Surface* surface = (grWin32Surface*)baseSurface;
|
|
446
|
+ MSG msg;
|
434
|
447
|
|
435
|
448
|
|
436
|
449
|
/* Set default mode */
|
... |
... |
@@ -546,11 +559,11 @@ gr_win32_surface_init( grWin32Surface* surface, |
546
|
559
|
goto Fail;
|
547
|
560
|
|
548
|
561
|
/* wrap up */
|
549
|
|
- surface->root.done = (grDoneSurfaceFunc) gr_win32_surface_done;
|
550
|
|
- surface->root.refresh_rect = (grRefreshRectFunc) gr_win32_surface_refresh_rectangle;
|
551
|
|
- surface->root.set_title = (grSetTitleFunc) gr_win32_surface_set_title;
|
552
|
|
- surface->root.set_icon = (grSetIconFunc) gr_win32_surface_set_icon;
|
553
|
|
- surface->root.listen_event = (grListenEventFunc) gr_win32_surface_listen_event;
|
|
562
|
+ surface->root.done = gr_win32_surface_done;
|
|
563
|
+ surface->root.refresh_rect = gr_win32_surface_refresh_rectangle;
|
|
564
|
+ surface->root.set_title = gr_win32_surface_set_title;
|
|
565
|
+ surface->root.set_icon = gr_win32_surface_set_icon;
|
|
566
|
+ surface->root.listen_event = gr_win32_surface_listen_event;
|
554
|
567
|
|
555
|
568
|
LOG(( "Surface initialized: %dx%dx%d\n",
|
556
|
569
|
surface->root.bitmap.width, surface->root.bitmap.rows,
|
... |
... |
@@ -559,7 +572,7 @@ gr_win32_surface_init( grWin32Surface* surface, |
559
|
572
|
return 1;
|
560
|
573
|
|
561
|
574
|
Fail:
|
562
|
|
- gr_win32_surface_done( surface );
|
|
575
|
+ gr_win32_surface_done( &surface->root );
|
563
|
576
|
return 0;
|
564
|
577
|
}
|
565
|
578
|
|
... |
... |
@@ -696,7 +709,7 @@ LRESULT CALLBACK Message_Process( HWND handle, UINT mess, |
696
|
709
|
gr_win32_device_init,
|
697
|
710
|
gr_win32_device_done,
|
698
|
711
|
|
699
|
|
- (grDeviceInitSurfaceFunc) gr_win32_surface_init,
|
|
712
|
+ gr_win32_surface_init,
|
700
|
713
|
|
701
|
714
|
0,
|
702
|
715
|
0
|
graph/x11/grx11.c
... |
... |
@@ -965,9 +965,10 @@ |
965
|
965
|
|
966
|
966
|
/* close a given window */
|
967
|
967
|
static void
|
968
|
|
- gr_x11_surface_done( grX11Surface* surface )
|
|
968
|
+ gr_x11_surface_done( grSurface* baseSurface )
|
969
|
969
|
{
|
970
|
|
- Display* display = surface->display;
|
|
970
|
+ grX11Surface* surface = (grX11Surface*)baseSurface;
|
|
971
|
+ Display* display = surface->display;
|
971
|
972
|
|
972
|
973
|
|
973
|
974
|
if ( display )
|
... |
... |
@@ -992,13 +993,14 @@ |
992
|
993
|
|
993
|
994
|
|
994
|
995
|
static void
|
995
|
|
- gr_x11_surface_refresh_rect( grX11Surface* surface,
|
996
|
|
- int x,
|
997
|
|
- int y,
|
998
|
|
- int w,
|
999
|
|
- int h )
|
|
996
|
+ gr_x11_surface_refresh_rect( grSurface* baseSurface,
|
|
997
|
+ int x,
|
|
998
|
+ int y,
|
|
999
|
+ int w,
|
|
1000
|
+ int h )
|
1000
|
1001
|
{
|
1001
|
|
- grX11Blitter blit;
|
|
1002
|
+ grX11Surface* surface = (grX11Surface*)baseSurface;
|
|
1003
|
+ grX11Blitter blit;
|
1002
|
1004
|
|
1003
|
1005
|
|
1004
|
1006
|
if ( surface->convert &&
|
... |
... |
@@ -1015,17 +1017,21 @@ |
1015
|
1017
|
|
1016
|
1018
|
|
1017
|
1019
|
static void
|
1018
|
|
- gr_x11_surface_set_title( grX11Surface* surface,
|
1019
|
|
- const char* title )
|
|
1020
|
+ gr_x11_surface_set_title( grSurface* baseSurface,
|
|
1021
|
+ const char* title )
|
1020
|
1022
|
{
|
|
1023
|
+ grX11Surface* surface = (grX11Surface*)baseSurface;
|
|
1024
|
+
|
|
1025
|
+
|
1021
|
1026
|
XStoreName( surface->display, surface->win, title );
|
1022
|
1027
|
}
|
1023
|
1028
|
|
1024
|
1029
|
|
1025
|
1030
|
static int
|
1026
|
|
- gr_x11_surface_set_icon( grX11Surface* surface,
|
1027
|
|
- grBitmap* icon )
|
|
1031
|
+ gr_x11_surface_set_icon( grSurface* baseSurface,
|
|
1032
|
+ grBitmap* icon )
|
1028
|
1033
|
{
|
|
1034
|
+ grX11Surface* surface = (grX11Surface*)baseSurface;
|
1029
|
1035
|
const unsigned char* s = (const unsigned char*)"\x80\x40\x20\x10";
|
1030
|
1036
|
unsigned long* buffer;
|
1031
|
1037
|
unsigned long* dst;
|
... |
... |
@@ -1151,17 +1157,18 @@ |
1151
|
1157
|
|
1152
|
1158
|
|
1153
|
1159
|
static int
|
1154
|
|
- gr_x11_surface_listen_event( grX11Surface* surface,
|
1155
|
|
- int event_mask,
|
1156
|
|
- grEvent* grevent )
|
|
1160
|
+ gr_x11_surface_listen_event( grSurface* baseSurface,
|
|
1161
|
+ int event_mask,
|
|
1162
|
+ grEvent* grevent )
|
1157
|
1163
|
{
|
1158
|
|
- Display* display = surface->display;
|
1159
|
|
- XEvent x_event;
|
1160
|
|
- XExposeEvent exposed;
|
1161
|
|
- KeySym key;
|
|
1164
|
+ grX11Surface* surface = (grX11Surface*)baseSurface;
|
|
1165
|
+ Display* display = surface->display;
|
|
1166
|
+ XEvent x_event;
|
|
1167
|
+ XExposeEvent exposed;
|
|
1168
|
+ KeySym key;
|
1162
|
1169
|
|
1163
|
|
- int num;
|
1164
|
|
- grKey grkey;
|
|
1170
|
+ int num;
|
|
1171
|
+ grKey grkey;
|
1165
|
1172
|
|
1166
|
1173
|
/* XXX: for now, ignore the event mask, and only exit when */
|
1167
|
1174
|
/* a key is pressed */
|
... |
... |
@@ -1289,11 +1296,11 @@ |
1289
|
1296
|
|
1290
|
1297
|
|
1291
|
1298
|
static int
|
1292
|
|
- gr_x11_surface_init( grX11Surface* surface,
|
1293
|
|
- grBitmap* bitmap )
|
|
1299
|
+ gr_x11_surface_init( grSurface* baseSurface,
|
|
1300
|
+ grBitmap* bitmap )
|
1294
|
1301
|
{
|
1295
|
|
- Display* display;
|
1296
|
|
-
|
|
1302
|
+ grX11Surface* surface = (grX11Surface*)baseSurface;
|
|
1303
|
+ Display* display;
|
1297
|
1304
|
|
1298
|
1305
|
surface->key_number = 0;
|
1299
|
1306
|
surface->key_cursor = 0;
|
... |
... |
@@ -1447,11 +1454,11 @@ |
1447
|
1454
|
(unsigned char *)&pid, 1 );
|
1448
|
1455
|
}
|
1449
|
1456
|
|
1450
|
|
- surface->root.done = (grDoneSurfaceFunc)gr_x11_surface_done;
|
1451
|
|
- surface->root.refresh_rect = (grRefreshRectFunc)gr_x11_surface_refresh_rect;
|
1452
|
|
- surface->root.set_title = (grSetTitleFunc) gr_x11_surface_set_title;
|
1453
|
|
- surface->root.set_icon = (grSetIconFunc) gr_x11_surface_set_icon;
|
1454
|
|
- surface->root.listen_event = (grListenEventFunc)gr_x11_surface_listen_event;
|
|
1457
|
+ surface->root.done = gr_x11_surface_done;
|
|
1458
|
+ surface->root.refresh_rect = gr_x11_surface_refresh_rect;
|
|
1459
|
+ surface->root.set_title = gr_x11_surface_set_title;
|
|
1460
|
+ surface->root.set_icon = gr_x11_surface_set_icon;
|
|
1461
|
+ surface->root.listen_event = gr_x11_surface_listen_event;
|
1455
|
1462
|
|
1456
|
1463
|
return 1;
|
1457
|
1464
|
}
|
... |
... |
@@ -1465,7 +1472,7 @@ |
1465
|
1472
|
gr_x11_device_init,
|
1466
|
1473
|
gr_x11_device_done,
|
1467
|
1474
|
|
1468
|
|
- (grDeviceInitSurfaceFunc) gr_x11_surface_init,
|
|
1475
|
+ gr_x11_surface_init,
|
1469
|
1476
|
|
1470
|
1477
|
0,
|
1471
|
1478
|
0
|
|