Mercurial > mplayer.hg
annotate libvo/sdl_common.c @ 36084:64825e4a3fed
Remove pointless code.
The URL dialog widget will be destroyed after a selection has been made,
and urlEntries will be freed and rebuilt every time the URL dialog
widget is created (newly). So it makes no sense to prepend any data to
the GList that never will be used.
author | ib |
---|---|
date | Mon, 29 Apr 2013 11:21:23 +0000 |
parents | 60cb31e9e55d |
children |
rev | line source |
---|---|
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
1 /* |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
2 * common SDL routines |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
3 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
4 * This file is part of MPlayer. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
5 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
9 * (at your option) any later version. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
10 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
14 * GNU General Public License for more details. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
15 * |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
19 */ |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
20 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
21 #include "sdl_common.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
22 #include "mp_msg.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
23 #include "mp_fifo.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
24 #include "osdep/keycodes.h" |
34645 | 25 #include "osdep/setenv.h" |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
26 #include "input/input.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
27 #include "input/mouse.h" |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
28 #include "video_out.h" |
34614 | 29 #include "geometry.h" |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
30 |
31035 | 31 static int old_w; |
32 static int old_h; | |
33 static int mode_flags; | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
34 static int reinit; |
31035 | 35 |
34482
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
36 /** |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
37 * Update vo_screenwidth and vo_screenheight. |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
38 * |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
39 * This function only works with SDL since 1.2.10 and |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
40 * even then only when called before the first |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
41 * SDL_SetVideoMode. |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
42 * Once there's a better way available implement an |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
43 * update_xinerama_info function. |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
44 */ |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
45 static void get_screensize(void) { |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
46 const SDL_VideoInfo *vi; |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
47 // TODO: better to use a check that gets the runtime version instead? |
34843 | 48 #if SDL_VERSION_ATLEAST(1, 2, 10) |
34482
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
49 // Keep user-provided settings |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
50 if (vo_screenwidth > 0 || vo_screenheight > 0) return; |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
51 vi = SDL_GetVideoInfo(); |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
52 vo_screenwidth = vi->current_w; |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
53 vo_screenheight = vi->current_h; |
34843 | 54 #endif |
34482
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
55 } |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
56 |
31037 | 57 int vo_sdl_init(void) |
58 { | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
59 reinit = 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
60 |
34551 | 61 if (!SDL_WasInit(SDL_INIT_VIDEO)) { |
62 // Unfortunately SDL_WINDOWID must be set at SDL_Init | |
63 // and is ignored afterwards, thus it cannot work per-file. | |
64 // Also, a value of 0 does not work for selecting the root window. | |
65 if (WinID > 0) { | |
66 char envstr[20]; | |
67 snprintf(envstr, sizeof(envstr), "0x%"PRIx64, WinID); | |
68 setenv("SDL_WINDOWID", envstr, 1); | |
69 } | |
70 if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE) < 0) | |
71 return 0; | |
72 } | |
31037 | 73 |
74 // Setup Keyrepeats (500/30 are defaults) | |
75 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, 100 /*SDL_DEFAULT_REPEAT_INTERVAL*/); | |
76 | |
31038
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
77 // Easiest way to get uppercase characters |
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
78 SDL_EnableUNICODE(1); |
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
79 |
31037 | 80 // We don't want those in our event queue. |
81 SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE); | |
82 SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); | |
83 SDL_EventState(SDL_USEREVENT, SDL_IGNORE); | |
84 | |
34482
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
85 // Try to get a sensible default for fullscreen. |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
86 get_screensize(); |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
87 |
31037 | 88 return 1; |
89 } | |
90 | |
91 void vo_sdl_uninit(void) | |
92 { | |
93 if (SDL_WasInit(SDL_INIT_VIDEO)) | |
94 SDL_QuitSubSystem(SDL_INIT_VIDEO); | |
95 } | |
96 | |
34812 | 97 int vo_sdl_config(int w, int h, int flags, const char *title) |
98 { | |
99 SDL_WM_SetCaption(title, NULL); | |
100 vo_dwidth = old_w = w; | |
101 vo_dheight = old_h = h; | |
102 vo_fs = !!(flags & VOFLAG_FULLSCREEN); | |
103 if (vo_fs) { | |
104 vo_dwidth = vo_screenwidth; | |
105 vo_dheight = vo_screenheight; | |
106 } | |
34844 | 107 SDL_GL_SetAttribute(SDL_GL_STEREO, !!(flags & VOFLAG_STEREO)); |
34812 | 108 return 1; |
109 } | |
110 | |
31035 | 111 void vo_sdl_fullscreen(void) |
112 { | |
113 if (vo_fs) { | |
114 vo_dwidth = old_w; | |
115 vo_dheight = old_h; | |
116 } else { | |
117 old_w = vo_dwidth; | |
118 old_h = vo_dheight; | |
119 vo_dwidth = vo_screenwidth; | |
120 vo_dheight = vo_screenheight; | |
121 } | |
122 vo_fs = !vo_fs; | |
123 sdl_set_mode(0, mode_flags); | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
124 // on OSX at least we now need to do a full reinit. |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
125 // TODO: this should only be set if really necessary. |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
126 reinit = 1; |
31035 | 127 } |
128 | |
34611 | 129 SDL_Surface *sdl_set_mode(int bpp, uint32_t flags) |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
130 { |
31035 | 131 SDL_Surface *s; |
132 mode_flags = flags; | |
133 if (vo_fs) flags |= SDL_FULLSCREEN; | |
134 // doublebuf with opengl creates flickering | |
34611 | 135 #if !defined( __AMIGAOS4__ ) && !defined( __APPLE__ ) |
31035 | 136 if (vo_doublebuffering && !(flags & SDL_OPENGL)) |
137 flags |= SDL_DOUBLEBUF; | |
34611 | 138 #endif |
34597 | 139 if (!vo_border) |
140 flags |= SDL_NOFRAME; | |
34614 | 141 if (geometry_xy_changed) { |
142 char envstr[20]; | |
143 snprintf(envstr, sizeof(envstr), "%i,%i", vo_dx, vo_dy); | |
144 setenv("SDL_VIDEO_WINDOW_POS", envstr, 1); | |
145 } | |
31035 | 146 s = SDL_SetVideoMode(vo_dwidth, vo_dheight, bpp, flags); |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
147 if (!s) { |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
148 mp_msg(MSGT_VO, MSGL_FATAL, "SDL SetVideoMode failed: %s\n", SDL_GetError()); |
34611 | 149 return NULL; |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
150 } |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
151 vo_dwidth = s->w; |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
152 vo_dheight = s->h; |
34611 | 153 return s; |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
154 } |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
155 |
31040 | 156 static const struct mp_keymap keysym_map[] = { |
157 {SDLK_RETURN, KEY_ENTER}, {SDLK_ESCAPE, KEY_ESC}, | |
158 {SDLK_F1, KEY_F+1}, {SDLK_F2, KEY_F+2}, {SDLK_F3, KEY_F+3}, | |
159 {SDLK_F4, KEY_F+4}, {SDLK_F5, KEY_F+5}, {SDLK_F6, KEY_F+6}, | |
160 {SDLK_F7, KEY_F+7}, {SDLK_F8, KEY_F+8}, {SDLK_F9, KEY_F+9}, | |
161 {SDLK_F10, KEY_F+10}, {SDLK_F11, KEY_F+11}, {SDLK_F12, KEY_F+12}, | |
162 {SDLK_KP_PLUS, '+'}, {SDLK_KP_MINUS, '-'}, {SDLK_TAB, KEY_TAB}, | |
163 {SDLK_PAGEUP, KEY_PAGE_UP}, {SDLK_PAGEDOWN, KEY_PAGE_DOWN}, | |
164 {SDLK_UP, KEY_UP}, {SDLK_DOWN, KEY_DOWN}, | |
165 {SDLK_LEFT, KEY_LEFT}, {SDLK_RIGHT, KEY_RIGHT}, | |
166 {SDLK_KP_MULTIPLY, '*'}, {SDLK_KP_DIVIDE, '/'}, | |
167 {SDLK_KP0, KEY_KP0}, {SDLK_KP1, KEY_KP1}, {SDLK_KP2, KEY_KP2}, | |
168 {SDLK_KP3, KEY_KP3}, {SDLK_KP4, KEY_KP4}, {SDLK_KP5, KEY_KP5}, | |
169 {SDLK_KP6, KEY_KP6}, {SDLK_KP7, KEY_KP7}, {SDLK_KP8, KEY_KP8}, | |
170 {SDLK_KP9, KEY_KP9}, | |
171 {SDLK_KP_PERIOD, KEY_KPDEC}, {SDLK_KP_ENTER, KEY_KPENTER}, | |
31318 | 172 {0, 0} |
31040 | 173 }; |
174 | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
175 int sdl_default_handle_event(SDL_Event *event) |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
176 { |
31040 | 177 int mpkey; |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
178 if (!event) { |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
179 int res = reinit ? VO_EVENT_REINIT : 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
180 reinit = 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
181 return res; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
182 } |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
183 switch (event->type) { |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
184 case SDL_VIDEORESIZE: |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
185 vo_dwidth = event->resize.w; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
186 vo_dheight = event->resize.h; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
187 return VO_EVENT_RESIZE; |
31046 | 188 |
31042 | 189 case SDL_VIDEOEXPOSE: |
190 return VO_EVENT_EXPOSE; | |
31046 | 191 |
31050 | 192 case SDL_MOUSEMOTION: |
193 vo_mouse_movement(event->motion.x, event->motion.y); | |
194 break; | |
195 | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
196 case SDL_MOUSEBUTTONDOWN: |
31046 | 197 if (!vo_nomouse_input) |
198 mplayer_put_key((MOUSE_BTN0 + event->button.button - 1) | MP_KEY_DOWN); | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
199 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
200 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
201 case SDL_MOUSEBUTTONUP: |
31051 | 202 if (!vo_nomouse_input) |
31046 | 203 mplayer_put_key(MOUSE_BTN0 + event->button.button - 1); |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
204 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
205 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
206 case SDL_KEYDOWN: |
31040 | 207 mpkey = lookup_keymap_table(keysym_map, event->key.keysym.sym); |
208 if (!mpkey && | |
209 event->key.keysym.unicode > 0 && | |
210 event->key.keysym.unicode < 128) | |
211 mpkey = event->key.keysym.unicode; | |
212 if (mpkey) | |
213 mplayer_put_key(mpkey); | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
214 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
215 |
31046 | 216 case SDL_QUIT: |
217 mplayer_put_key(KEY_CLOSE_WIN); | |
218 break; | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
219 } |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
220 return 0; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
221 } |