Mercurial > mplayer.hg
annotate libvo/sdl_common.c @ 34685:311b47301ea7
Remove gstrcasecmp().
This function isn't necessary. strcasecmp() can be used just as well,
because both arguments to the gstrcasecmp() calls have been checked
to be not NULL prior to the call.
author | ib |
---|---|
date | Fri, 24 Feb 2012 17:26:35 +0000 |
parents | 0bce77ccae9a |
children | f2274219a79c |
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? |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
48 if (!SDL_VERSION_ATLEAST(1, 2, 10)) return; |
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; |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
54 } |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
55 |
31037 | 56 int vo_sdl_init(void) |
57 { | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
58 reinit = 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
59 |
34551 | 60 if (!SDL_WasInit(SDL_INIT_VIDEO)) { |
61 // Unfortunately SDL_WINDOWID must be set at SDL_Init | |
62 // and is ignored afterwards, thus it cannot work per-file. | |
63 // Also, a value of 0 does not work for selecting the root window. | |
64 if (WinID > 0) { | |
65 char envstr[20]; | |
66 snprintf(envstr, sizeof(envstr), "0x%"PRIx64, WinID); | |
67 setenv("SDL_WINDOWID", envstr, 1); | |
68 } | |
69 if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE) < 0) | |
70 return 0; | |
71 } | |
31037 | 72 |
73 // Setup Keyrepeats (500/30 are defaults) | |
74 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, 100 /*SDL_DEFAULT_REPEAT_INTERVAL*/); | |
75 | |
31038
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
76 // Easiest way to get uppercase characters |
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
77 SDL_EnableUNICODE(1); |
3e67417271d7
Make uppercase characters and in general all ASCII characters work
reimar
parents:
31037
diff
changeset
|
78 |
31037 | 79 // We don't want those in our event queue. |
80 SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE); | |
81 SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); | |
82 SDL_EventState(SDL_USEREVENT, SDL_IGNORE); | |
83 | |
34482
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
84 // 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
|
85 get_screensize(); |
3c51a42da09c
SDL: Try to select a fullscreen mode that does not require resolution changes by default.
reimar
parents:
31318
diff
changeset
|
86 |
31037 | 87 return 1; |
88 } | |
89 | |
90 void vo_sdl_uninit(void) | |
91 { | |
92 if (SDL_WasInit(SDL_INIT_VIDEO)) | |
93 SDL_QuitSubSystem(SDL_INIT_VIDEO); | |
94 } | |
95 | |
31035 | 96 void vo_sdl_fullscreen(void) |
97 { | |
98 if (vo_fs) { | |
99 vo_dwidth = old_w; | |
100 vo_dheight = old_h; | |
101 } else { | |
102 old_w = vo_dwidth; | |
103 old_h = vo_dheight; | |
104 vo_dwidth = vo_screenwidth; | |
105 vo_dheight = vo_screenheight; | |
106 } | |
107 vo_fs = !vo_fs; | |
108 sdl_set_mode(0, mode_flags); | |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
109 // 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
|
110 // TODO: this should only be set if really necessary. |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
111 reinit = 1; |
31035 | 112 } |
113 | |
34611 | 114 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
|
115 { |
31035 | 116 SDL_Surface *s; |
117 mode_flags = flags; | |
118 if (vo_fs) flags |= SDL_FULLSCREEN; | |
119 // doublebuf with opengl creates flickering | |
34611 | 120 #if !defined( __AMIGAOS4__ ) && !defined( __APPLE__ ) |
31035 | 121 if (vo_doublebuffering && !(flags & SDL_OPENGL)) |
122 flags |= SDL_DOUBLEBUF; | |
34611 | 123 #endif |
34597 | 124 if (!vo_border) |
125 flags |= SDL_NOFRAME; | |
34614 | 126 if (geometry_xy_changed) { |
127 char envstr[20]; | |
128 snprintf(envstr, sizeof(envstr), "%i,%i", vo_dx, vo_dy); | |
129 setenv("SDL_VIDEO_WINDOW_POS", envstr, 1); | |
130 } | |
31035 | 131 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
|
132 if (!s) { |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
133 mp_msg(MSGT_VO, MSGL_FATAL, "SDL SetVideoMode failed: %s\n", SDL_GetError()); |
34611 | 134 return NULL; |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
135 } |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
136 vo_dwidth = s->w; |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
137 vo_dheight = s->h; |
34611 | 138 return s; |
31033
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
139 } |
8d1080e9c92d
Window resizing support for -vo gl with SDL backend.
reimar
parents:
31032
diff
changeset
|
140 |
31040 | 141 static const struct mp_keymap keysym_map[] = { |
142 {SDLK_RETURN, KEY_ENTER}, {SDLK_ESCAPE, KEY_ESC}, | |
143 {SDLK_F1, KEY_F+1}, {SDLK_F2, KEY_F+2}, {SDLK_F3, KEY_F+3}, | |
144 {SDLK_F4, KEY_F+4}, {SDLK_F5, KEY_F+5}, {SDLK_F6, KEY_F+6}, | |
145 {SDLK_F7, KEY_F+7}, {SDLK_F8, KEY_F+8}, {SDLK_F9, KEY_F+9}, | |
146 {SDLK_F10, KEY_F+10}, {SDLK_F11, KEY_F+11}, {SDLK_F12, KEY_F+12}, | |
147 {SDLK_KP_PLUS, '+'}, {SDLK_KP_MINUS, '-'}, {SDLK_TAB, KEY_TAB}, | |
148 {SDLK_PAGEUP, KEY_PAGE_UP}, {SDLK_PAGEDOWN, KEY_PAGE_DOWN}, | |
149 {SDLK_UP, KEY_UP}, {SDLK_DOWN, KEY_DOWN}, | |
150 {SDLK_LEFT, KEY_LEFT}, {SDLK_RIGHT, KEY_RIGHT}, | |
151 {SDLK_KP_MULTIPLY, '*'}, {SDLK_KP_DIVIDE, '/'}, | |
152 {SDLK_KP0, KEY_KP0}, {SDLK_KP1, KEY_KP1}, {SDLK_KP2, KEY_KP2}, | |
153 {SDLK_KP3, KEY_KP3}, {SDLK_KP4, KEY_KP4}, {SDLK_KP5, KEY_KP5}, | |
154 {SDLK_KP6, KEY_KP6}, {SDLK_KP7, KEY_KP7}, {SDLK_KP8, KEY_KP8}, | |
155 {SDLK_KP9, KEY_KP9}, | |
156 {SDLK_KP_PERIOD, KEY_KPDEC}, {SDLK_KP_ENTER, KEY_KPENTER}, | |
31318 | 157 {0, 0} |
31040 | 158 }; |
159 | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
160 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
|
161 { |
31040 | 162 int mpkey; |
31043
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
163 if (!event) { |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
164 int res = reinit ? VO_EVENT_REINIT : 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
165 reinit = 0; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
166 return res; |
80036ef586ff
Add reinitialization support. Necessary for fullscreen on OSX.
reimar
parents:
31042
diff
changeset
|
167 } |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
168 switch (event->type) { |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
169 case SDL_VIDEORESIZE: |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
170 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
|
171 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
|
172 return VO_EVENT_RESIZE; |
31046 | 173 |
31042 | 174 case SDL_VIDEOEXPOSE: |
175 return VO_EVENT_EXPOSE; | |
31046 | 176 |
31050 | 177 case SDL_MOUSEMOTION: |
178 vo_mouse_movement(event->motion.x, event->motion.y); | |
179 break; | |
180 | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
181 case SDL_MOUSEBUTTONDOWN: |
31046 | 182 if (!vo_nomouse_input) |
183 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
|
184 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
185 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
186 case SDL_MOUSEBUTTONUP: |
31051 | 187 if (!vo_nomouse_input) |
31046 | 188 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
|
189 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
190 |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
191 case SDL_KEYDOWN: |
31040 | 192 mpkey = lookup_keymap_table(keysym_map, event->key.keysym.sym); |
193 if (!mpkey && | |
194 event->key.keysym.unicode > 0 && | |
195 event->key.keysym.unicode < 128) | |
196 mpkey = event->key.keysym.unicode; | |
197 if (mpkey) | |
198 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
|
199 break; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
200 |
31046 | 201 case SDL_QUIT: |
202 mplayer_put_key(KEY_CLOSE_WIN); | |
203 break; | |
31032
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
204 } |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
205 return 0; |
362425fe3de8
Add sdl_common file and use it to share the input handling between -vo gl
reimar
parents:
diff
changeset
|
206 } |