Mercurial > mplayer.hg
annotate gui/ui/main.c @ 37053:84c93a60ead3
Add new item 'rpotmeter'.
This is the missing counterpart to hpotmeter and vpotmeter
allowing rotary control elements in a GUI skin now.
Based on an idea and a realization by Hans-Dieter Kosch,
hdkosch kabelbw de.
Additionally, update (and revise) documentation.
author | ib |
---|---|
date | Sat, 12 Apr 2014 23:29:29 +0000 |
parents | 2ef6693131f7 |
children | ae4f30c4ef02 |
rev | line source |
---|---|
26458 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
23077 | 18 |
34699
ed0e00db4306
Cosmetic: Move, change and add some comments on GUI windows.
ib
parents:
34697
diff
changeset
|
19 /* main window */ |
ed0e00db4306
Cosmetic: Move, change and add some comments on GUI windows.
ib
parents:
34697
diff
changeset
|
20 |
37053 | 21 #include <math.h> |
23077 | 22 #include <stdlib.h> |
23 #include <stdio.h> | |
24 #include <sys/stat.h> | |
25 #include <unistd.h> | |
23305
22d3d12c6dfb
Include string.h for memcpy, fastmemcpy.h alone is not enough.
reimar
parents:
23154
diff
changeset
|
26 #include <string.h> |
23077 | 27 |
35528 | 28 #include "ui.h" |
35525 | 29 #include "gui/app/app.h" |
30 #include "gui/app/gui.h" | |
33738 | 31 #include "gui/interface.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
32 #include "gui/skin/font.h" |
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
33 #include "gui/skin/skin.h" |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33739
diff
changeset
|
34 #include "gui/util/list.h" |
33739 | 35 #include "gui/util/mem.h" |
37026
b6ff1451035d
Constrain an item's value to be in the range of 0 to 100.
ib
parents:
37023
diff
changeset
|
36 #include "gui/util/misc.h" |
33737 | 37 #include "gui/util/string.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
38 #include "gui/wm/ws.h" |
35789 | 39 #include "gui/wm/wsxdnd.h" |
23077 | 40 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
41 #include "help_mp.h" |
34174
a93891202051
Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents:
34077
diff
changeset
|
42 #include "mp_msg.h" |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
43 #include "libvo/x11_common.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
44 #include "libvo/fastmemcpy.h" |
33531
84ce059fae34
Get non-multimedia X11 key definitions from libvo/wskeys.h.
ib
parents:
33525
diff
changeset
|
45 #include "libvo/wskeys.h" |
23077 | 46 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
47 #include "stream/stream.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
48 #include "stream/url.h" |
23077 | 49 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
50 #include "libmpdemux/demuxer.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
51 #include "libmpdemux/stheader.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
52 #include "codec-cfg.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
53 #include "m_option.h" |
30516 | 54 #include "mp_core.h" |
35545 | 55 #include "libavutil/common.h" |
23077 | 56 |
33556 | 57 #include "actions.h" |
23077 | 58 |
35795 | 59 static unsigned char * mainDrawBuffer; |
35771 | 60 int uiMainRender = True; |
23077 | 61 |
35493 | 62 int mainVisible = True; |
23077 | 63 |
35493 | 64 int boxMoved = False; |
23077 | 65 int sx = 0,sy = 0; |
66 int i,pot = 0; | |
67 | |
33556 | 68 #include "render.h" |
23077 | 69 |
35780 | 70 static void uiMainDraw( void ) |
23077 | 71 { |
72 | |
33768 | 73 if ( guiApp.mainWindow.State == wsWindowClosed ) mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
74 |
33555 | 75 if ( guiApp.mainWindow.Visible == wsWindowNotVisible || |
23077 | 76 !mainVisible ) return; |
33555 | 77 // !guiApp.mainWindow.Mapped ) return; |
23077 | 78 |
33555 | 79 if ( uiMainRender && guiApp.mainWindow.State == wsWindowExpose ) |
23077 | 80 { |
33555 | 81 btnModify( evSetMoviePosition,guiInfo.Position ); |
82 btnModify( evSetVolume,guiInfo.Volume ); | |
36930 | 83 btnModify( evSetBalance,guiInfo.Balance ); |
23077 | 84 |
33555 | 85 fast_memcpy( mainDrawBuffer,guiApp.main.Bitmap.Image,guiApp.main.Bitmap.ImageSize ); |
86 RenderAll( &guiApp.mainWindow,guiApp.mainItems,guiApp.IndexOfMainItems,mainDrawBuffer ); | |
35493 | 87 uiMainRender=False; |
23077 | 88 } |
35746 | 89 // NOTE TO MYSELF: probably not, if uiMainRender is False |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35675
diff
changeset
|
90 wsImageDraw( &guiApp.mainWindow ); |
23077 | 91 // XFlush( wsDisplay ); |
92 } | |
93 | |
35780 | 94 static void uiMainMouse( int Button,int X,int Y,int RX,int RY ) |
23077 | 95 { |
96 static int itemtype = 0; | |
97 int i; | |
35688 | 98 guiItem * item = NULL; |
37053 | 99 static double prev_point; |
100 double point; | |
23077 | 101 float value = 0.0f; |
102 | |
103 static int SelectedItem = -1; | |
104 int currentselected = -1; | |
37053 | 105 static int endstop; |
23077 | 106 |
33555 | 107 for ( i=0;i <= guiApp.IndexOfMainItems;i++ ) |
108 if ( ( guiApp.mainItems[i].pressed != btnDisabled )&& | |
35675 | 109 ( isInside( X,Y,guiApp.mainItems[i].x,guiApp.mainItems[i].y,guiApp.mainItems[i].x+guiApp.mainItems[i].width,guiApp.mainItems[i].y+guiApp.mainItems[i].height ) ) ) |
23077 | 110 { currentselected=i; break; } |
111 | |
112 switch ( Button ) | |
113 { | |
114 case wsPMMouseButton: | |
37023 | 115 gtkShow( ivHidePopUpMenu,NULL ); |
35766
16ed8155439b
Rename uiShowMenu() uiMenuShow() and uiHideMenu() uiMenuHide().
ib
parents:
35763
diff
changeset
|
116 uiMenuShow( RX,RY ); |
23077 | 117 itemtype=itPRMButton; |
118 break; | |
119 case wsRMMouseButton: | |
35766
16ed8155439b
Rename uiShowMenu() uiMenuShow() and uiHideMenu() uiMenuHide().
ib
parents:
35763
diff
changeset
|
120 uiMenuHide( RX,RY,0 ); |
23077 | 121 break; |
122 | |
123 case wsPLMouseButton: | |
37023 | 124 gtkShow( ivHidePopUpMenu,NULL ); |
35493 | 125 sx=X; sy=Y; boxMoved=True; itemtype=itPLMButton; |
23077 | 126 SelectedItem=currentselected; |
127 if ( SelectedItem == -1 ) break; | |
35493 | 128 boxMoved=False; |
33555 | 129 item=&guiApp.mainItems[SelectedItem]; |
23077 | 130 itemtype=item->type; |
131 item->pressed=btnPressed; | |
35807 | 132 // NOTE TO MYSELF: commented, because the expression can never be true |
133 /*switch( item->type ) | |
23077 | 134 { |
135 case itButton: | |
136 if ( ( SelectedItem > -1 ) && | |
32911 | 137 ( ( ( item->message == evPlaySwitchToPause && item->message == evPauseSwitchToPlay ) ) || |
138 ( ( item->message == evPauseSwitchToPlay && item->message == evPlaySwitchToPause ) ) ) ) | |
23077 | 139 { item->pressed=btnDisabled; } |
140 break; | |
35807 | 141 }*/ |
37053 | 142 if ( itemtype == itRPotmeter ) |
143 { | |
144 prev_point=appRadian( item, X - item->x, Y - item->y ) - item->zeropoint; | |
145 if ( prev_point < 0.0 ) prev_point+=2*M_PI; | |
146 if ( prev_point <= item->arclength ) endstop=False; | |
147 else endstop=STOPPED_AT_0 + STOPPED_AT_100; // block movement | |
148 } | |
23077 | 149 break; |
150 case wsRLMouseButton: | |
35493 | 151 boxMoved=False; |
37052
2ef6693131f7
Cosmetic: Shorten comment (and phrase more precisely).
ib
parents:
37026
diff
changeset
|
152 if ( SelectedItem != -1 ) // NOTE TO MYSELF: only if hasButton |
33107 | 153 { |
33555 | 154 item=&guiApp.mainItems[SelectedItem]; |
33108 | 155 item->pressed=btnReleased; |
33107 | 156 } |
35351 | 157 if ( currentselected == - 1 || SelectedItem == -1 ) { itemtype=0; break; } |
23077 | 158 SelectedItem=-1; |
159 value=0; | |
160 switch( itemtype ) | |
161 { | |
162 case itHPotmeter: | |
36941 | 163 value=100.0 * ( X - item->x ) / item->width; |
23077 | 164 break; |
37023 | 165 case itVPotmeter: |
36941 | 166 value=100.0 - 100.0 * ( Y - item->y ) / item->height; |
23077 | 167 break; |
37053 | 168 case itRPotmeter: |
169 if ( endstop ) { itemtype=0; return; } | |
170 point=appRadian( item, X - item->x, Y - item->y ) - item->zeropoint; | |
171 if ( point < 0.0 ) point+=2*M_PI; | |
172 value=100.0 * point / item->arclength; | |
173 break; | |
23077 | 174 } |
35773 | 175 uiEvent( item->message,value ); |
23077 | 176 itemtype=0; |
177 break; | |
178 | |
179 case wsRRMouseButton: | |
34333 | 180 gtkShow( ivShowPopUpMenu,NULL ); |
23077 | 181 break; |
182 | |
34684 | 183 /* rolled mouse ... de szar :))) */ |
23077 | 184 case wsP5MouseButton: value=-2.5f; goto rollerhandled; |
185 case wsP4MouseButton: value= 2.5f; | |
186 rollerhandled: | |
35365 | 187 if (currentselected != - 1) |
188 { | |
35366 | 189 item=&guiApp.mainItems[currentselected]; |
37053 | 190 if ( ( item->type == itHPotmeter )||( item->type == itVPotmeter )||( item->type == itRPotmeter ) ) |
35366 | 191 { |
37026
b6ff1451035d
Constrain an item's value to be in the range of 0 to 100.
ib
parents:
37023
diff
changeset
|
192 item->value=constrain(item->value + value); |
35773 | 193 uiEvent( item->message,item->value ); |
35366 | 194 } |
35365 | 195 } |
23077 | 196 break; |
197 | |
34684 | 198 /* moving */ |
23077 | 199 case wsMoveMouse: |
33555 | 200 item=&guiApp.mainItems[SelectedItem]; |
23077 | 201 switch ( itemtype ) |
202 { | |
203 case itPLMButton: | |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35675
diff
changeset
|
204 wsWindowMove( &guiApp.mainWindow,True,RX - abs( sx ),RY - abs( sy ) ); |
23077 | 205 break; |
206 case itPRMButton: | |
35779 | 207 if (guiApp.menuIsPresent) guiApp.menuWindow.MouseHandler( 0,RX,RY,0,0 ); |
23077 | 208 break; |
37053 | 209 case itRPotmeter: |
210 point=appRadian( item, X - item->x, Y - item->y ) - item->zeropoint; | |
211 if ( point < 0.0 ) point+=2*M_PI; | |
212 if ( item->arclength < 2 * M_PI ) | |
213 /* a potmeter with separated 0% and 100% positions */ | |
214 { | |
215 value=item->value; | |
216 if ( point - prev_point > M_PI ) | |
217 /* turned beyond the 0% position */ | |
218 { | |
219 if ( !endstop ) | |
220 { | |
221 endstop=STOPPED_AT_0; | |
222 value=0.0f; | |
223 } | |
224 } | |
225 else if ( prev_point - point > M_PI ) | |
226 /* turned back from beyond the 0% position */ | |
227 { | |
228 if ( endstop == STOPPED_AT_0 ) endstop=False; | |
229 } | |
230 else if ( prev_point <= item->arclength && point > item->arclength ) | |
231 /* turned beyond the 100% position */ | |
232 { | |
233 if ( !endstop ) | |
234 { | |
235 endstop=STOPPED_AT_100; | |
236 value=100.0f; | |
237 } | |
238 } | |
239 else if ( prev_point > item->arclength && point <= item->arclength ) | |
240 /* turned back from beyond the 100% position */ | |
241 { | |
242 if ( endstop == STOPPED_AT_100 ) endstop=False; | |
243 } | |
244 } | |
245 if ( !endstop ) value=100.0 * point / item->arclength; | |
246 prev_point=point; | |
247 goto potihandled; | |
23077 | 248 case itVPotmeter: |
37026
b6ff1451035d
Constrain an item's value to be in the range of 0 to 100.
ib
parents:
37023
diff
changeset
|
249 value=100.0 - 100.0 * ( Y - item->y ) / item->height; |
23077 | 250 goto potihandled; |
251 case itHPotmeter: | |
37026
b6ff1451035d
Constrain an item's value to be in the range of 0 to 100.
ib
parents:
37023
diff
changeset
|
252 value=100.0 * ( X - item->x ) / item->width; |
23077 | 253 potihandled: |
37026
b6ff1451035d
Constrain an item's value to be in the range of 0 to 100.
ib
parents:
37023
diff
changeset
|
254 item->value=constrain(value); |
35773 | 255 uiEvent( item->message,item->value ); |
23077 | 256 break; |
257 } | |
258 break; | |
259 } | |
260 } | |
261 | |
35780 | 262 static void uiMainKey( int KeyCode,int Type,int Key ) |
23077 | 263 { |
264 int msg = evNone; | |
265 | |
266 if ( Type != wsKeyPressed ) return; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
267 |
23077 | 268 if ( !Key ) |
269 { | |
270 switch ( KeyCode ) | |
271 { | |
33524 | 272 // NOTE TO MYSELF: This is only for the Acer AirKey V keyboard. |
33536
fc1402410163
Remove support for Acer AirKey V keyboard multimedia keys.
ib
parents:
33535
diff
changeset
|
273 /*case wsXFMMPrev: msg=evPrev; break; |
37023 | 274 case wsXFMMStop: msg=evStop; break; |
275 case wsXFMMPlay: msg=evPlaySwitchToPause; break; | |
276 case wsXFMMNext: msg=evNext; break; | |
277 case wsXFMMVolUp: msg=evIncVolume; break; | |
23077 | 278 case wsXFMMVolDown: msg=evDecVolume; break; |
37023 | 279 case wsXFMMMute: msg=evMute; break;*/ |
23077 | 280 } |
281 } | |
282 else | |
283 { | |
284 switch ( Key ) | |
285 { | |
286 case wsEnter: msg=evPlay; break; | |
287 case wsXF86LowerVolume: msg=evDecVolume; break; | |
288 case wsXF86RaiseVolume: msg=evIncVolume; break; | |
289 case wsXF86Mute: msg=evMute; break; | |
33525 | 290 case wsXF86Pause: |
23077 | 291 case wsXF86Play: msg=evPlaySwitchToPause; break; |
292 case wsXF86Stop: msg=evStop; break; | |
293 case wsXF86Prev: msg=evPrev; break; | |
294 case wsXF86Next: msg=evNext; break; | |
295 case wsXF86Media: msg=evLoad; break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
296 case wsEscape: |
37023 | 297 if ( guiInfo.VideoWindow && guiInfo.Playing && guiApp.videoWindow.isFullScreen ) |
298 { | |
299 uiEvent( evNormalSize,0 ); | |
300 return; | |
301 } | |
23077 | 302 default: vo_x11_putkey( Key ); return; |
303 } | |
304 } | |
35773 | 305 if ( msg != evNone ) uiEvent( msg,0 ); |
23077 | 306 } |
307 | |
35759 | 308 /* this will be used to handle drag & drop files */ |
35780 | 309 static void uiMainDND(int num,char** files) |
23077 | 310 { |
311 struct stat buf; | |
312 int f = 0; | |
313 | |
314 char* subtitles = NULL; | |
35521 | 315 char* file = NULL; |
35384 | 316 char* s; |
23077 | 317 |
318 if (num <= 0) | |
319 return; | |
320 | |
321 | |
322 /* now fill it with new items */ | |
323 for(f=0; f < num; f++){ | |
324 char* str = strdup( files[f] ); | |
325 plItem* item; | |
326 | |
24086
f5b32d12b691
remove gconvert_uri_to_filename() and use url_unescape_string() instead.
iive
parents:
23457
diff
changeset
|
327 url_unescape_string(str, files[f]); |
23077 | 328 |
329 if(stat(str,&buf) == 0 && S_ISDIR(buf.st_mode) == 0) { | |
330 /* this is not a directory so try to play it */ | |
331 mp_msg( MSGT_GPLAYER,MSGL_V,"Received D&D %s\n",str ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
332 |
23077 | 333 /* check if it is a subtitle file */ |
334 { | |
37023 | 335 char* ext = strrchr(str,'.'); |
336 if (ext) { | |
337 static char supported[] = "utf/sub/srt/smi/rt//txt/ssa/aqt/"; | |
338 char* type; | |
339 int len; | |
340 if((len=strlen(++ext)) && (type=strstr(supported,ext)) &&\ | |
341 (type-supported)%4 == 0 && *(type+len) == '/'){ | |
342 /* handle subtitle file */ | |
343 nfree(subtitles); | |
344 subtitles = str; | |
345 continue; | |
346 } | |
347 } | |
23077 | 348 } |
349 | |
350 /* clear playlist */ | |
35521 | 351 if (file == NULL) { |
37023 | 352 file = files[f]; |
353 listMgr(PLAYLIST_DELETE,0); | |
23077 | 354 } |
355 | |
356 item = calloc(1,sizeof(plItem)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
357 |
35384 | 358 s = strrchr( str,'/' ); |
359 | |
23077 | 360 /* FIXME: decompose file name ? */ |
361 /* yes -- Pontscho */ | |
35384 | 362 if ( s ) { |
37023 | 363 *s=0; s++; |
364 item->name = gstrdup( s ); | |
365 item->path = gstrdup( str ); | |
23077 | 366 } else { |
37023 | 367 // NOTE TO MYSELF: this shouldn't happen, make sure we have a full path |
368 item->name = strdup(str); | |
369 item->path = strdup("."); | |
23077 | 370 } |
34681 | 371 listMgr(PLAYLIST_ITEM_APPEND,item); |
23077 | 372 } else { |
36694 | 373 mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_GUI_MSG_NotAFile1,str ); |
23077 | 374 } |
375 free( str ); | |
376 } | |
377 | |
35521 | 378 if (file) { |
379 uiSetFile( NULL,file,STREAMTYPE_FILE ); | |
35773 | 380 if ( guiInfo.Playing == GUI_PLAY ) uiEvent( evStop,0 ); |
381 uiEvent( evPlay,0 ); | |
23077 | 382 } |
383 if (subtitles) { | |
33897 | 384 nfree(guiInfo.SubtitleFilename); |
385 guiInfo.SubtitleFilename = subtitles; | |
386 mplayerLoadSubtitle(guiInfo.SubtitleFilename); | |
23077 | 387 } |
388 } | |
35780 | 389 |
390 void uiMainInit (void) | |
391 { | |
35789 | 392 mainDrawBuffer = malloc(guiApp.main.Bitmap.ImageSize); |
393 | |
394 if (!mainDrawBuffer) | |
395 { | |
36694 | 396 gmp_msg(MSGT_GPLAYER, MSGL_FATAL, "[main] " MSGTR_GUI_MSG_MemoryErrorWindow); |
35789 | 397 mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); |
398 } | |
399 | |
36053 | 400 wsWindowCreate(&guiApp.mainWindow, guiApp.main.x, guiApp.main.y, guiApp.main.width, guiApp.main.height, (guiApp.mainDecoration ? wsShowFrame : 0 ) | wsMinSize | wsMaxSize | wsHideWindow, wsShowMouseCursor | wsHandleMouseButton | wsHandleMouseMove, MPlayer); |
35789 | 401 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[main] mainWindow ID: 0x%x\n", (int) guiApp.mainWindow.WindowID); |
402 wsWindowShape(&guiApp.mainWindow, guiApp.main.Mask.Image); | |
403 wsWindowIcon(wsDisplay, guiApp.mainWindow.WindowID, &guiIcon); | |
404 wsXDNDMakeAwareness(&guiApp.mainWindow); | |
405 | |
35780 | 406 guiApp.mainWindow.DrawHandler = uiMainDraw; |
407 guiApp.mainWindow.MouseHandler = uiMainMouse; | |
408 guiApp.mainWindow.KeyHandler = uiMainKey; | |
409 guiApp.mainWindow.DNDHandler = uiMainDND; | |
410 } | |
35796
497a1c45a597
Add uiMainDone(), uiVideoDone(), uiPlaybarDone() and uiMenuDone().
ib
parents:
35795
diff
changeset
|
411 |
497a1c45a597
Add uiMainDone(), uiVideoDone(), uiPlaybarDone() and uiMenuDone().
ib
parents:
35795
diff
changeset
|
412 void uiMainDone (void) |
497a1c45a597
Add uiMainDone(), uiVideoDone(), uiPlaybarDone() and uiMenuDone().
ib
parents:
35795
diff
changeset
|
413 { |
497a1c45a597
Add uiMainDone(), uiVideoDone(), uiPlaybarDone() and uiMenuDone().
ib
parents:
35795
diff
changeset
|
414 nfree(mainDrawBuffer); |
497a1c45a597
Add uiMainDone(), uiVideoDone(), uiPlaybarDone() and uiMenuDone().
ib
parents:
35795
diff
changeset
|
415 wsWindowDestroy(&guiApp.mainWindow); |
36291 | 416 wsEvents(); |
35796
497a1c45a597
Add uiMainDone(), uiVideoDone(), uiPlaybarDone() and uiMenuDone().
ib
parents:
35795
diff
changeset
|
417 } |