Mercurial > mplayer.hg
annotate libvo/x11_common.c @ 33307:552f1f7731c8
Set GUI initialization flag earlier.
So far, the flag is set after the call of guiInit(), but there are calls
to GUI functions (like reading the GUI config) before that. As MPlayer
(when exiting) only calls GUI's cleanup function guiDone() if the flag
is set, it neglects calling guiDone() on any error between the first GUI
function call and execution of guiInit(). Now the flag is set before the
first GUI function call.
As a result, GUI's own exit function (also used for fatal GUI errors, and
thus also for errors occurring before guiInit() properly finishes) doesn't
have to handle cleanup any longer. The code can be moved to guiDone().
author | ib |
---|---|
date | Sat, 07 May 2011 15:30:14 +0000 |
parents | c7ebb0b711a6 |
children | 169a40da4c53 |
rev | line source |
---|---|
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
1 /* |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
2 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
3 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
7 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
8 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
12 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
13 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
17 */ |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
18 |
32 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
21 #include <math.h> |
6401 | 22 #include <inttypes.h> |
27893 | 23 #include <limits.h> |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
24 |
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
25 #include "config.h" |
5998 | 26 #include "mp_msg.h" |
22823
98eaf29b5dee
Code cleanup: don't include a .c file in mplayer.c and fix a few
rathann
parents:
21964
diff
changeset
|
27 #include "mp_fifo.h" |
28250 | 28 #include "libavutil/common.h" |
6401 | 29 #include "x11_common.h" |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
30 |
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
31 #ifdef X11_FULLSCREEN |
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
32 |
440
d19a3da6ac13
Pontscho's mixer, select, and hell-a-lot-of-stuff patch ;)
gabucino
parents:
416
diff
changeset
|
33 #include <string.h> |
32 | 34 #include <unistd.h> |
12520
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
35 #include <assert.h> |
32 | 36 |
37 #include "video_out.h" | |
10889 | 38 #include "aspect.h" |
12032
8cc4d4344c0f
Don't mess with the window position in xinerama when -geometry changes it.
diego
parents:
12031
diff
changeset
|
39 #include "geometry.h" |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
40 #include "help_mp.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
12972
diff
changeset
|
41 #include "osdep/timer.h" |
32 | 42 |
324 | 43 #include <X11/Xmd.h> |
32 | 44 #include <X11/Xlib.h> |
45 #include <X11/Xutil.h> | |
46 #include <X11/Xatom.h> | |
47 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
48 #ifdef CONFIG_XSS |
25482 | 49 #include <X11/extensions/scrnsaver.h> |
50 #endif | |
51 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
52 #ifdef CONFIG_XDPMS |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
53 #include <X11/extensions/dpms.h> |
1345
be674b95b485
x11_common does not compile, when the XDPMS extension is not available on the
jkeil
parents:
1266
diff
changeset
|
54 #endif |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
55 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
56 #ifdef CONFIG_XINERAMA |
2149
6358db6ad3d0
Xinerama screen size fix by Lev Babiev <harley@hosers.org>
arpi
parents:
1746
diff
changeset
|
57 #include <X11/extensions/Xinerama.h> |
6358db6ad3d0
Xinerama screen size fix by Lev Babiev <harley@hosers.org>
arpi
parents:
1746
diff
changeset
|
58 #endif |
1732 | 59 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
60 #ifdef CONFIG_XF86VM |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
61 #include <X11/extensions/xf86vmode.h> |
14636
408bcfa575bf
Separate XF86 video mode extension check from XF86 keysym check as
diego
parents:
14244
diff
changeset
|
62 #endif |
408bcfa575bf
Separate XF86 video mode extension check from XF86 keysym check as
diego
parents:
14244
diff
changeset
|
63 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
64 #ifdef CONFIG_XF86XK |
9822
1e761763566c
Support for "internet" or "multimedia" keyboards in X11.
albeu
parents:
9695
diff
changeset
|
65 #include <X11/XF86keysym.h> |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
66 #endif |
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
67 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
68 #ifdef CONFIG_XV |
10359 | 69 #include <X11/extensions/Xv.h> |
70 #include <X11/extensions/Xvlib.h> | |
14742 | 71 |
72 #include "subopt-helper.h" | |
10359 | 73 #endif |
74 | |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
12972
diff
changeset
|
75 #include "input/input.h" |
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
12972
diff
changeset
|
76 #include "input/mouse.h" |
4658 | 77 |
27343 | 78 #ifdef CONFIG_GUI |
23077 | 79 #include "gui/interface.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
12972
diff
changeset
|
80 #include "mplayer.h" |
4798 | 81 #endif |
82 | |
8660
39476cbd1673
I have looked at the fullscreen code and realized that there are
arpi
parents:
8653
diff
changeset
|
83 #define WIN_LAYER_ONBOTTOM 2 |
39476cbd1673
I have looked at the fullscreen code and realized that there are
arpi
parents:
8653
diff
changeset
|
84 #define WIN_LAYER_NORMAL 4 |
39476cbd1673
I have looked at the fullscreen code and realized that there are
arpi
parents:
8653
diff
changeset
|
85 #define WIN_LAYER_ONTOP 6 |
8669
fd398a0b4b3b
This time the patch is fixing much more that breaking :-)
arpi
parents:
8663
diff
changeset
|
86 #define WIN_LAYER_ABOVE_DOCK 10 |
12582 | 87 |
88 int fs_layer = WIN_LAYER_ABOVE_DOCK; | |
89 static int orig_layer = 0; | |
12111
8e31aacc3e81
- win_gravity memorizing and restoring while switching fullscreen mode (by Adam Tla/lka)
rathann
parents:
12096
diff
changeset
|
90 static int old_gravity = NorthWestGravity; |
8866 | 91 |
12582 | 92 int stop_xscreensaver = 0; |
6202 | 93 |
12582 | 94 static int dpms_disabled = 0; |
324 | 95 |
12582 | 96 char *mDisplayName = NULL; |
97 Display *mDisplay = NULL; | |
98 Window mRootWin; | |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
99 int mScreen; |
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
100 int mLocalDisplay; |
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
101 |
3830 | 102 /* output window id */ |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5919
diff
changeset
|
103 int vo_mouse_autohide = 0; |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
104 int vo_wm_type = 0; |
12796
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
105 int vo_fs_type = 0; // needs to be accessible for GUI X11 code |
30465
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
106 static int window_state; |
12125
f4fc74a88e65
full screen flipping synchronization corrections (by Adam Tla/lka)
rathann
parents:
12123
diff
changeset
|
107 static int vo_fs_flip = 0; |
12582 | 108 char **vo_fstype_list; |
384 | 109 |
21938 | 110 /* 1 means that the WM is metacity (broken as hell) */ |
8835
664b0612f950
Fixed metacity + xv behavior (something broke it lately).
filon
parents:
8783
diff
changeset
|
111 int metacity_hack = 0; |
664b0612f950
Fixed metacity + xv behavior (something broke it lately).
filon
parents:
8783
diff
changeset
|
112 |
10587
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
113 static Atom XA_NET_SUPPORTED; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
114 static Atom XA_NET_WM_STATE; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
115 static Atom XA_NET_WM_STATE_FULLSCREEN; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
116 static Atom XA_NET_WM_STATE_ABOVE; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
117 static Atom XA_NET_WM_STATE_STAYS_ON_TOP; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
118 static Atom XA_NET_WM_STATE_BELOW; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
119 static Atom XA_NET_WM_PID; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
120 static Atom XA_WIN_PROTOCOLS; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
121 static Atom XA_WIN_LAYER; |
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
122 static Atom XA_WIN_HINTS; |
18149
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
123 static Atom XAWM_PROTOCOLS; |
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
124 static Atom XAWM_DELETE_WINDOW; |
8742
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
125 |
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
126 #define XA_INIT(x) XA##x = XInternAtom(mDisplay, #x, False) |
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
127 |
7435 | 128 static int vo_old_x = 0; |
129 static int vo_old_y = 0; | |
130 static int vo_old_width = 0; | |
131 static int vo_old_height = 0; | |
132 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
133 #ifdef CONFIG_XF86VM |
12582 | 134 XF86VidModeModeInfo **vidmodes = NULL; |
4977
7b65a4f0b74e
vm pecs applied from daniel carter <hedonist@win.co.nz>
pontscho
parents:
4974
diff
changeset
|
135 XF86VidModeModeLine modeline; |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
136 #endif |
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
137 |
10587
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
138 static int vo_x11_get_fs_type(int supported); |
10212
d358fa9a1068
warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
alex
parents:
10193
diff
changeset
|
139 |
12520
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
140 |
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
141 /* |
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
142 * Sends the EWMH fullscreen state event. |
21938 | 143 * |
144 * action: could be one of _NET_WM_STATE_REMOVE -- remove state | |
145 * _NET_WM_STATE_ADD -- add state | |
146 * _NET_WM_STATE_TOGGLE -- toggle | |
12520
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
147 */ |
12582 | 148 void vo_x11_ewmh_fullscreen(int action) |
12520
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
149 { |
12582 | 150 assert(action == _NET_WM_STATE_REMOVE || |
151 action == _NET_WM_STATE_ADD || action == _NET_WM_STATE_TOGGLE); | |
152 | |
153 if (vo_fs_type & vo_wm_FULLSCREEN) | |
12520
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
154 { |
12582 | 155 XEvent xev; |
156 | |
21938 | 157 /* init X event structure for _NET_WM_FULLSCREEN client message */ |
12582 | 158 xev.xclient.type = ClientMessage; |
159 xev.xclient.serial = 0; | |
160 xev.xclient.send_event = True; | |
27616
213d9bc30b35
Use already "prefetched" atoms instead of calling XInternAtom each time.
reimar
parents:
27377
diff
changeset
|
161 xev.xclient.message_type = XA_NET_WM_STATE; |
12582 | 162 xev.xclient.window = vo_window; |
163 xev.xclient.format = 32; | |
164 xev.xclient.data.l[0] = action; | |
27616
213d9bc30b35
Use already "prefetched" atoms instead of calling XInternAtom each time.
reimar
parents:
27377
diff
changeset
|
165 xev.xclient.data.l[1] = XA_NET_WM_STATE_FULLSCREEN; |
12582 | 166 xev.xclient.data.l[2] = 0; |
167 xev.xclient.data.l[3] = 0; | |
168 xev.xclient.data.l[4] = 0; | |
169 | |
170 /* finally send that damn thing */ | |
171 if (!XSendEvent(mDisplay, DefaultRootWindow(mDisplay), False, | |
172 SubstructureRedirectMask | SubstructureNotifyMask, | |
173 &xev)) | |
174 { | |
175 mp_msg(MSGT_VO, MSGL_ERR, MSGTR_EwmhFullscreenStateFailed); | |
176 } | |
12520
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
177 } |
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
178 } |
94e66acdb706
Metacity fullscreen issues, patch by Alexander Strasser <eclipse7@gmx.net>,
diego
parents:
12371
diff
changeset
|
179 |
12582 | 180 void vo_hidecursor(Display * disp, Window win) |
384 | 181 { |
12582 | 182 Cursor no_ptr; |
183 Pixmap bm_no; | |
184 XColor black, dummy; | |
185 Colormap colormap; | |
13828
b4ad5f0b550d
Fix erroneus extern declarations, fix wrong signedness of some vars
atmos4
parents:
13787
diff
changeset
|
186 static char bm_no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; |
3954 | 187 |
12582 | 188 if (WinID == 0) |
21938 | 189 return; // do not hide if playing on the root window |
12582 | 190 |
191 colormap = DefaultColormap(disp, DefaultScreen(disp)); | |
14743
465c8617cbe5
We should not crash, only because we couldn't hide the cursor.
al
parents:
14742
diff
changeset
|
192 if ( !XAllocNamedColor(disp, colormap, "black", &black, &dummy) ) |
465c8617cbe5
We should not crash, only because we couldn't hide the cursor.
al
parents:
14742
diff
changeset
|
193 { |
31536 | 194 return; // color alloc failed, give up |
14743
465c8617cbe5
We should not crash, only because we couldn't hide the cursor.
al
parents:
14742
diff
changeset
|
195 } |
12582 | 196 bm_no = XCreateBitmapFromData(disp, win, bm_no_data, 8, 8); |
197 no_ptr = XCreatePixmapCursor(disp, bm_no, bm_no, &black, &black, 0, 0); | |
198 XDefineCursor(disp, win, no_ptr); | |
199 XFreeCursor(disp, no_ptr); | |
200 if (bm_no != None) | |
201 XFreePixmap(disp, bm_no); | |
13953 | 202 XFreeColors(disp,colormap,&black.pixel,1,0); |
384 | 203 } |
204 | |
12582 | 205 void vo_showcursor(Display * disp, Window win) |
206 { | |
207 if (WinID == 0) | |
208 return; | |
209 XDefineCursor(disp, win, 0); | |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5919
diff
changeset
|
210 } |
384 | 211 |
12582 | 212 static int x11_errorhandler(Display * display, XErrorEvent * event) |
4742 | 213 { |
214 #define MSGLEN 60 | |
215 char msg[MSGLEN]; | |
12582 | 216 |
217 XGetErrorText(display, event->error_code, (char *) &msg, MSGLEN); | |
218 | |
219 mp_msg(MSGT_VO, MSGL_ERR, "X11 error: %s\n", msg); | |
220 | |
221 mp_msg(MSGT_VO, MSGL_V, | |
17366 | 222 "Type: %x, display: %p, resourceid: %lx, serial: %lx\n", |
12582 | 223 event->type, event->display, event->resourceid, event->serial); |
224 mp_msg(MSGT_VO, MSGL_V, | |
225 "Error code: %x, request code: %x, minor code: %x\n", | |
226 event->error_code, event->request_code, event->minor_code); | |
227 | |
21808
eaf6ed9cb5ab
Do not abort on X11 errors, most are not at all fatal.
reimar
parents:
21623
diff
changeset
|
228 // abort(); |
23615 | 229 return 0; |
4742 | 230 #undef MSGLEN |
231 } | |
1732 | 232 |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
233 void fstype_help(void) |
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
234 { |
12582 | 235 mp_msg(MSGT_VO, MSGL_INFO, MSGTR_AvailableFsType); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18160
diff
changeset
|
236 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_FULL_SCREEN_TYPES\n"); |
12582 | 237 |
238 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "none", | |
239 "don't set fullscreen window layer"); | |
240 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer", | |
241 "use _WIN_LAYER hint with default layer"); | |
242 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer=<0..15>", | |
243 "use _WIN_LAYER hint with a given layer number"); | |
244 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "netwm", | |
245 "force NETWM style"); | |
246 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "above", | |
247 "use _NETWM_STATE_ABOVE hint if available"); | |
248 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "below", | |
249 "use _NETWM_STATE_BELOW hint if available"); | |
250 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "fullscreen", | |
31834
64ba1daa147a
various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents:
31606
diff
changeset
|
251 "use _NETWM_STATE_FULLSCREEN hint if available"); |
12582 | 252 mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "stays_on_top", |
253 "use _NETWM_STATE_STAYS_ON_TOP hint if available"); | |
254 mp_msg(MSGT_VO, MSGL_INFO, | |
255 "You can also negate the settings with simply putting '-' in the beginning"); | |
17727
096cb1dfb591
Make -xy help output consistent, output an empty line before and after.
diego
parents:
17566
diff
changeset
|
256 mp_msg(MSGT_VO, MSGL_INFO, "\n"); |
10695
879ce4016b34
Commit alex's fstype patch x11_common.c3.diff with additional manpage extension.
attila
parents:
10587
diff
changeset
|
257 } |
879ce4016b34
Commit alex's fstype patch x11_common.c3.diff with additional manpage extension.
attila
parents:
10587
diff
changeset
|
258 |
879ce4016b34
Commit alex's fstype patch x11_common.c3.diff with additional manpage extension.
attila
parents:
10587
diff
changeset
|
259 static void fstype_dump(int fstype) |
879ce4016b34
Commit alex's fstype patch x11_common.c3.diff with additional manpage extension.
attila
parents:
10587
diff
changeset
|
260 { |
879ce4016b34
Commit alex's fstype patch x11_common.c3.diff with additional manpage extension.
attila
parents:
10587
diff
changeset
|
261 if (fstype) |
879ce4016b34
Commit alex's fstype patch x11_common.c3.diff with additional manpage extension.
attila
parents:
10587
diff
changeset
|
262 { |
12582 | 263 mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting honours"); |
264 if (fstype & vo_wm_LAYER) | |
265 mp_msg(MSGT_VO, MSGL_V, " LAYER"); | |
266 if (fstype & vo_wm_FULLSCREEN) | |
267 mp_msg(MSGT_VO, MSGL_V, " FULLSCREEN"); | |
268 if (fstype & vo_wm_STAYS_ON_TOP) | |
269 mp_msg(MSGT_VO, MSGL_V, " STAYS_ON_TOP"); | |
270 if (fstype & vo_wm_ABOVE) | |
271 mp_msg(MSGT_VO, MSGL_V, " ABOVE"); | |
272 if (fstype & vo_wm_BELOW) | |
273 mp_msg(MSGT_VO, MSGL_V, " BELOW"); | |
274 mp_msg(MSGT_VO, MSGL_V, " X atoms\n"); | |
275 } else | |
276 mp_msg(MSGT_VO, MSGL_V, | |
277 "[x11] Current fstype setting doesn't honour any X atoms\n"); | |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
278 } |
12582 | 279 |
10587
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
280 static int net_wm_support_state_test(Atom atom) |
8653 | 281 { |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
282 #define NET_WM_STATE_TEST(x) { if (atom == XA_NET_WM_STATE_##x) { mp_msg( MSGT_VO,MSGL_V, "[x11] Detected wm supports " #x " state.\n" ); return vo_wm_##x; } } |
12582 | 283 |
284 NET_WM_STATE_TEST(FULLSCREEN); | |
285 NET_WM_STATE_TEST(ABOVE); | |
286 NET_WM_STATE_TEST(STAYS_ON_TOP); | |
287 NET_WM_STATE_TEST(BELOW); | |
288 return 0; | |
8653 | 289 } |
290 | |
12582 | 291 static int x11_get_property(Atom type, Atom ** args, unsigned long *nitems) |
8742
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
292 { |
12582 | 293 int format; |
294 unsigned long bytesafter; | |
8742
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
295 |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26436
diff
changeset
|
296 return Success == |
12582 | 297 XGetWindowProperty(mDisplay, mRootWin, type, 0, 16384, False, |
298 AnyPropertyType, &type, &format, nitems, | |
299 &bytesafter, (unsigned char **) args) | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26436
diff
changeset
|
300 && *nitems > 0; |
8742
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
301 } |
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
302 |
10587
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
303 static int vo_wm_detect(void) |
6009 | 304 { |
12582 | 305 int i; |
306 int wm = 0; | |
307 unsigned long nitems; | |
308 Atom *args = NULL; | |
309 | |
310 if (WinID >= 0) | |
311 return 0; | |
312 | |
8669
fd398a0b4b3b
This time the patch is fixing much more that breaking :-)
arpi
parents:
8663
diff
changeset
|
313 // -- supports layers |
12582 | 314 if (x11_get_property(XA_WIN_PROTOCOLS, &args, &nitems)) |
315 { | |
316 mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports layers.\n"); | |
317 for (i = 0; i < nitems; i++) | |
318 { | |
319 if (args[i] == XA_WIN_LAYER) | |
320 { | |
321 wm |= vo_wm_LAYER; | |
322 metacity_hack |= 1; | |
323 } else | |
21938 | 324 /* metacity is the only window manager I know which reports |
325 * supporting only the _WIN_LAYER hint in _WIN_PROTOCOLS. | |
326 * (what's more support for it is broken) */ | |
12582 | 327 metacity_hack |= 2; |
328 } | |
329 XFree(args); | |
330 if (wm && (metacity_hack == 1)) | |
331 { | |
21938 | 332 // metacity claims to support layers, but it is not the truth :-) |
12582 | 333 wm ^= vo_wm_LAYER; |
334 mp_msg(MSGT_VO, MSGL_V, | |
335 "[x11] Using workaround for Metacity bugs.\n"); | |
336 } | |
337 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
338 // --- netwm |
12582 | 339 if (x11_get_property(XA_NET_SUPPORTED, &args, &nitems)) |
340 { | |
341 mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports NetWM.\n"); | |
342 for (i = 0; i < nitems; i++) | |
343 wm |= net_wm_support_state_test(args[i]); | |
344 XFree(args); | |
345 } | |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
346 |
12582 | 347 if (wm == 0) |
348 mp_msg(MSGT_VO, MSGL_V, "[x11] Unknown wm type...\n"); | |
349 return wm; | |
350 } | |
6009 | 351 |
10587
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
352 static void init_atoms(void) |
8742
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
353 { |
12582 | 354 XA_INIT(_NET_SUPPORTED); |
355 XA_INIT(_NET_WM_STATE); | |
356 XA_INIT(_NET_WM_STATE_FULLSCREEN); | |
357 XA_INIT(_NET_WM_STATE_ABOVE); | |
358 XA_INIT(_NET_WM_STATE_STAYS_ON_TOP); | |
359 XA_INIT(_NET_WM_STATE_BELOW); | |
360 XA_INIT(_NET_WM_PID); | |
361 XA_INIT(_WIN_PROTOCOLS); | |
362 XA_INIT(_WIN_LAYER); | |
363 XA_INIT(_WIN_HINTS); | |
18149
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
364 XA_INIT(WM_PROTOCOLS); |
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
365 XA_INIT(WM_DELETE_WINDOW); |
8742
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
366 } |
241f40ef5e28
More fullscreen cleanup work. Use nice macros for X atoms.
filon
parents:
8716
diff
changeset
|
367 |
18116 | 368 void update_xinerama_info(void) { |
26436 | 369 xinerama_x = xinerama_y = 0; |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
370 #ifdef CONFIG_XINERAMA |
31061
075a2c6bebb4
Move variable declaration into the block where it is actually used.
reimar
parents:
31058
diff
changeset
|
371 if (xinerama_screen >= -1 && XineramaIsActive(mDisplay)) |
18116 | 372 { |
31061
075a2c6bebb4
Move variable declaration into the block where it is actually used.
reimar
parents:
31058
diff
changeset
|
373 int screen = xinerama_screen; |
18116 | 374 XineramaScreenInfo *screens; |
375 int num_screens; | |
376 | |
377 screens = XineramaQueryScreens(mDisplay, &num_screens); | |
26436 | 378 if (screen >= num_screens) |
379 screen = num_screens - 1; | |
380 if (screen == -1) { | |
381 int x = vo_dx + vo_dwidth / 2; | |
382 int y = vo_dy + vo_dheight / 2; | |
383 for (screen = num_screens - 1; screen > 0; screen--) { | |
384 int left = screens[screen].x_org; | |
385 int right = left + screens[screen].width; | |
386 int top = screens[screen].y_org; | |
387 int bottom = top + screens[screen].height; | |
388 if (left <= x && x <= right && top <= y && y <= bottom) | |
389 break; | |
390 } | |
26407 | 391 } |
18116 | 392 if (screen < 0) |
393 screen = 0; | |
394 vo_screenwidth = screens[screen].width; | |
395 vo_screenheight = screens[screen].height; | |
396 xinerama_x = screens[screen].x_org; | |
397 xinerama_y = screens[screen].y_org; | |
398 | |
399 XFree(screens); | |
400 } | |
18160
03bc3385a845
10l, aspect_save_screenres must be always called in update_xinerama_info.
reimar
parents:
18149
diff
changeset
|
401 #endif |
18116 | 402 aspect_save_screenres(vo_screenwidth, vo_screenheight); |
403 } | |
404 | |
12582 | 405 int vo_init(void) |
32 | 406 { |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
407 // int mScreen; |
12582 | 408 int depth, bpp; |
409 unsigned int mask; | |
410 | |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
411 // char * DisplayName = ":0.0"; |
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
412 // Display * mDisplay; |
12582 | 413 XImage *mXImage = NULL; |
414 | |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
415 // Window mRootWin; |
12582 | 416 XWindowAttributes attribs; |
417 char *dispName; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
418 |
31536 | 419 if (vo_rootwin) |
420 WinID = 0; // use root window | |
32 | 421 |
12582 | 422 if (vo_depthonscreen) |
13935 | 423 { |
424 saver_off(mDisplay); | |
12582 | 425 return 1; // already called |
13935 | 426 } |
32 | 427 |
12582 | 428 XSetErrorHandler(x11_errorhandler); |
4812 | 429 |
430 #if 0 | |
12582 | 431 if (!mDisplayName) |
432 if (!(mDisplayName = getenv("DISPLAY"))) | |
433 mDisplayName = strdup(":0.0"); | |
4812 | 434 #else |
12582 | 435 dispName = XDisplayName(mDisplayName); |
4812 | 436 #endif |
437 | |
12582 | 438 mp_msg(MSGT_VO, MSGL_V, "X11 opening display: %s\n", dispName); |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
439 |
12582 | 440 mDisplay = XOpenDisplay(dispName); |
441 if (!mDisplay) | |
442 { | |
443 mp_msg(MSGT_VO, MSGL_ERR, | |
444 "vo: couldn't open the X11 display (%s)!\n", dispName); | |
445 return 0; | |
446 } | |
21938 | 447 mScreen = DefaultScreen(mDisplay); // screen ID |
448 mRootWin = RootWindow(mDisplay, mScreen); // root window ID | |
2149
6358db6ad3d0
Xinerama screen size fix by Lev Babiev <harley@hosers.org>
arpi
parents:
1746
diff
changeset
|
449 |
12582 | 450 init_atoms(); |
451 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
452 #ifdef CONFIG_XF86VM |
12582 | 453 { |
454 int clock; | |
455 | |
456 XF86VidModeGetModeLine(mDisplay, mScreen, &clock, &modeline); | |
457 if (!vo_screenwidth) | |
458 vo_screenwidth = modeline.hdisplay; | |
459 if (!vo_screenheight) | |
460 vo_screenheight = modeline.vdisplay; | |
461 } | |
4977
7b65a4f0b74e
vm pecs applied from daniel carter <hedonist@win.co.nz>
pontscho
parents:
4974
diff
changeset
|
462 #endif |
12582 | 463 { |
464 if (!vo_screenwidth) | |
465 vo_screenwidth = DisplayWidth(mDisplay, mScreen); | |
466 if (!vo_screenheight) | |
467 vo_screenheight = DisplayHeight(mDisplay, mScreen); | |
468 } | |
469 // get color depth (from root window, or the best visual): | |
470 XGetWindowAttributes(mDisplay, mRootWin, &attribs); | |
471 depth = attribs.depth; | |
1732 | 472 |
12582 | 473 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) |
474 { | |
475 Visual *visual; | |
476 | |
477 depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); | |
478 if (depth != -1) | |
479 mXImage = XCreateImage(mDisplay, visual, depth, ZPixmap, | |
480 0, NULL, 1, 1, 8, 1); | |
481 } else | |
482 mXImage = | |
483 XGetImage(mDisplay, mRootWin, 0, 0, 1, 1, AllPlanes, ZPixmap); | |
1732 | 484 |
12582 | 485 vo_depthonscreen = depth; // display depth on screen |
1732 | 486 |
12582 | 487 // get bits/pixel from XImage structure: |
488 if (mXImage == NULL) | |
489 { | |
490 mask = 0; | |
491 } else | |
492 { | |
493 /* | |
494 * for the depth==24 case, the XImage structures might use | |
495 * 24 or 32 bits of data per pixel. The global variable | |
496 * vo_depthonscreen stores the amount of data per pixel in the | |
497 * XImage structure! | |
498 * | |
499 * Maybe we should rename vo_depthonscreen to (or add) vo_bpp? | |
500 */ | |
501 bpp = mXImage->bits_per_pixel; | |
502 if ((vo_depthonscreen + 7) / 8 != (bpp + 7) / 8) | |
503 vo_depthonscreen = bpp; // by A'rpi | |
504 mask = | |
505 mXImage->red_mask | mXImage->green_mask | mXImage->blue_mask; | |
506 mp_msg(MSGT_VO, MSGL_V, | |
507 "vo: X11 color mask: %X (R:%lX G:%lX B:%lX)\n", mask, | |
508 mXImage->red_mask, mXImage->green_mask, mXImage->blue_mask); | |
509 XDestroyImage(mXImage); | |
510 } | |
511 if (((vo_depthonscreen + 7) / 8) == 2) | |
512 { | |
513 if (mask == 0x7FFF) | |
514 vo_depthonscreen = 15; | |
515 else if (mask == 0xFFFF) | |
516 vo_depthonscreen = 16; | |
517 } | |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
741
diff
changeset
|
518 // XCloseDisplay( mDisplay ); |
1447
e82fbd67ae60
better local display connection patch by Adam Tla/lka atlka@pg.gda.pl
arpi
parents:
1415
diff
changeset
|
519 /* slightly improved local display detection AST */ |
12582 | 520 if (strncmp(dispName, "unix:", 5) == 0) |
521 dispName += 4; | |
522 else if (strncmp(dispName, "localhost:", 10) == 0) | |
523 dispName += 9; | |
524 if (*dispName == ':' && atoi(dispName + 1) < 10) | |
525 mLocalDisplay = 1; | |
526 else | |
527 mLocalDisplay = 0; | |
16301 | 528 mp_msg(MSGT_VO, MSGL_V, |
12582 | 529 "vo: X11 running at %dx%d with depth %d and %d bpp (\"%s\" => %s display)\n", |
530 vo_screenwidth, vo_screenheight, depth, vo_depthonscreen, | |
531 dispName, mLocalDisplay ? "local" : "remote"); | |
5997
b5fb9a927bf3
add WM detection, and wm specific fullscreen code. (???)
pontscho
parents:
5981
diff
changeset
|
532 |
12582 | 533 vo_wm_type = vo_wm_detect(); |
534 | |
535 vo_fs_type = vo_x11_get_fs_type(vo_wm_type); | |
5997
b5fb9a927bf3
add WM detection, and wm specific fullscreen code. (???)
pontscho
parents:
5981
diff
changeset
|
536 |
12582 | 537 fstype_dump(vo_fs_type); |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
538 |
12582 | 539 saver_off(mDisplay); |
540 return 1; | |
32 | 541 } |
542 | |
12582 | 543 void vo_uninit(void) |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
6009
diff
changeset
|
544 { |
12582 | 545 if (!mDisplay) |
546 { | |
547 mp_msg(MSGT_VO, MSGL_V, | |
25962 | 548 "vo: x11 uninit called but X11 not initialized..\n"); |
12582 | 549 return; |
550 } | |
6077 | 551 // if( !vo_depthonscreen ) return; |
12582 | 552 mp_msg(MSGT_VO, MSGL_V, "vo: uninit ...\n"); |
553 XSetErrorHandler(NULL); | |
554 XCloseDisplay(mDisplay); | |
555 vo_depthonscreen = 0; | |
556 mDisplay = NULL; | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
6009
diff
changeset
|
557 } |
4436 | 558 |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
12972
diff
changeset
|
559 #include "osdep/keycodes.h" |
32 | 560 #include "wskeys.h" |
561 | |
9822
1e761763566c
Support for "internet" or "multimedia" keyboards in X11.
albeu
parents:
9695
diff
changeset
|
562 #ifdef XF86XK_AudioPause |
31017 | 563 static const struct mp_keymap keysym_map[] = { |
28137
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
564 {XF86XK_MenuKB, KEY_MENU}, |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
565 {XF86XK_AudioPlay, KEY_PLAY}, {XF86XK_AudioPause, KEY_PAUSE}, {XF86XK_AudioStop, KEY_STOP}, |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
566 {XF86XK_AudioPrev, KEY_PREV}, {XF86XK_AudioNext, KEY_NEXT}, |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
567 {XF86XK_AudioMute, KEY_MUTE}, {XF86XK_AudioLowerVolume, KEY_VOLUME_DOWN}, {XF86XK_AudioRaiseVolume, KEY_VOLUME_UP}, |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
568 {0, 0} |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
569 }; |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
570 |
18950 | 571 static void vo_x11_putkey_ext(int keysym) |
12582 | 572 { |
28137
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
573 int mpkey = lookup_keymap_table(keysym_map, keysym); |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
574 if (mpkey) |
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
575 mplayer_put_key(mpkey); |
9822
1e761763566c
Support for "internet" or "multimedia" keyboards in X11.
albeu
parents:
9695
diff
changeset
|
576 } |
1e761763566c
Support for "internet" or "multimedia" keyboards in X11.
albeu
parents:
9695
diff
changeset
|
577 #endif |
1e761763566c
Support for "internet" or "multimedia" keyboards in X11.
albeu
parents:
9695
diff
changeset
|
578 |
31017 | 579 static const struct mp_keymap keymap[] = { |
28135 | 580 // special keys |
581 {wsEscape, KEY_ESC}, {wsBackSpace, KEY_BS}, {wsTab, KEY_TAB}, {wsEnter, KEY_ENTER}, | |
582 | |
583 // cursor keys | |
584 {wsLeft, KEY_LEFT}, {wsRight, KEY_RIGHT}, {wsUp, KEY_UP}, {wsDown, KEY_DOWN}, | |
585 | |
586 // navigation block | |
587 {wsInsert, KEY_INSERT}, {wsDelete, KEY_DELETE}, {wsHome, KEY_HOME}, {wsEnd, KEY_END}, | |
588 {wsPageUp, KEY_PAGE_UP}, {wsPageDown, KEY_PAGE_DOWN}, | |
589 | |
590 // F-keys | |
591 {wsF1, KEY_F+1}, {wsF2, KEY_F+2}, {wsF3, KEY_F+3}, {wsF4, KEY_F+4}, | |
592 {wsF5, KEY_F+5}, {wsF6, KEY_F+6}, {wsF7, KEY_F+7}, {wsF8, KEY_F+8}, | |
593 {wsF9, KEY_F+9}, {wsF10, KEY_F+10}, {wsF11, KEY_F+11}, {wsF12, KEY_F+12}, | |
594 | |
595 // numpad independent of numlock | |
596 {wsGrayMinus, '-'}, {wsGrayPlus, '+'}, {wsGrayMul, '*'}, {wsGrayDiv, '/'}, | |
597 {wsGrayEnter, KEY_KPENTER}, | |
598 | |
599 // numpad with numlock | |
600 {wsGray0, KEY_KP0}, {wsGray1, KEY_KP1}, {wsGray2, KEY_KP2}, | |
601 {wsGray3, KEY_KP3}, {wsGray4, KEY_KP4}, {wsGray5, KEY_KP5}, | |
602 {wsGray6, KEY_KP6}, {wsGray7, KEY_KP7}, {wsGray8, KEY_KP8}, | |
603 {wsGray9, KEY_KP9}, {wsGrayDecimal, KEY_KPDEC}, | |
604 | |
605 // numpad without numlock | |
606 {wsGrayInsert, KEY_KPINS}, {wsGrayEnd, KEY_KP1}, {wsGrayDown, KEY_KP2}, | |
607 {wsGrayPgDn, KEY_KP3}, {wsGrayLeft, KEY_KP4}, {wsGray5Dup, KEY_KP5}, | |
608 {wsGrayRight, KEY_KP6}, {wsGrayHome, KEY_KP7}, {wsGrayUp, KEY_KP8}, | |
609 {wsGrayPgUp, KEY_KP9}, {wsGrayDelete, KEY_KPDEL}, | |
610 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
611 {0, 0} |
28135 | 612 }; |
613 | |
12582 | 614 void vo_x11_putkey(int key) |
615 { | |
28133
272238675b78
Simplify handling of X11 key events that are just passed through.
reimar
parents:
28063
diff
changeset
|
616 static const char *passthrough_keys = " -+*/<>`~!@#$%^&()_{}:;\"\',.?\\|=[]"; |
28135 | 617 int mpkey = 0; |
28133
272238675b78
Simplify handling of X11 key events that are just passed through.
reimar
parents:
28063
diff
changeset
|
618 if ((key >= 'a' && key <= 'z') || |
272238675b78
Simplify handling of X11 key events that are just passed through.
reimar
parents:
28063
diff
changeset
|
619 (key >= 'A' && key <= 'Z') || |
272238675b78
Simplify handling of X11 key events that are just passed through.
reimar
parents:
28063
diff
changeset
|
620 (key >= '0' && key <= '9') || |
272238675b78
Simplify handling of X11 key events that are just passed through.
reimar
parents:
28063
diff
changeset
|
621 (key > 0 && key < 256 && strchr(passthrough_keys, key))) |
28135 | 622 mpkey = key; |
28133
272238675b78
Simplify handling of X11 key events that are just passed through.
reimar
parents:
28063
diff
changeset
|
623 |
28137
28bf0d126da2
Add and use a special lookup function to do table-based translation to MPlayer keycodes.
reimar
parents:
28135
diff
changeset
|
624 if (!mpkey) |
28140
49dadf7bd73a
100l, forgot an assignment, broke special keys handling for X11-based vos.
reimar
parents:
28137
diff
changeset
|
625 mpkey = lookup_keymap_table(keymap, key); |
369 | 626 |
28135 | 627 if (mpkey) |
628 mplayer_put_key(mpkey); | |
32 | 629 } |
630 | |
631 | |
632 // ----- Motif header: ------- | |
633 | |
1236 | 634 #define MWM_HINTS_FUNCTIONS (1L << 0) |
635 #define MWM_HINTS_DECORATIONS (1L << 1) | |
636 #define MWM_HINTS_INPUT_MODE (1L << 2) | |
637 #define MWM_HINTS_STATUS (1L << 3) | |
638 | |
639 #define MWM_FUNC_ALL (1L << 0) | |
640 #define MWM_FUNC_RESIZE (1L << 1) | |
641 #define MWM_FUNC_MOVE (1L << 2) | |
642 #define MWM_FUNC_MINIMIZE (1L << 3) | |
643 #define MWM_FUNC_MAXIMIZE (1L << 4) | |
644 #define MWM_FUNC_CLOSE (1L << 5) | |
645 | |
646 #define MWM_DECOR_ALL (1L << 0) | |
647 #define MWM_DECOR_BORDER (1L << 1) | |
648 #define MWM_DECOR_RESIZEH (1L << 2) | |
649 #define MWM_DECOR_TITLE (1L << 3) | |
650 #define MWM_DECOR_MENU (1L << 4) | |
651 #define MWM_DECOR_MINIMIZE (1L << 5) | |
652 #define MWM_DECOR_MAXIMIZE (1L << 6) | |
653 | |
654 #define MWM_INPUT_MODELESS 0 | |
655 #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1 | |
656 #define MWM_INPUT_SYSTEM_MODAL 2 | |
657 #define MWM_INPUT_FULL_APPLICATION_MODAL 3 | |
658 #define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL | |
659 | |
660 #define MWM_TEAROFF_WINDOW (1L<<0) | |
32 | 661 |
662 typedef struct | |
663 { | |
12582 | 664 long flags; |
665 long functions; | |
666 long decorations; | |
667 long input_mode; | |
668 long state; | |
32 | 669 } MotifWmHints; |
670 | |
12582 | 671 static MotifWmHints vo_MotifWmHints; |
672 static Atom vo_MotifHints = None; | |
32 | 673 |
12582 | 674 void vo_x11_decoration(Display * vo_Display, Window w, int d) |
32 | 675 { |
12582 | 676 static unsigned int olddecor = MWM_DECOR_ALL; |
677 static unsigned int oldfuncs = | |
678 MWM_FUNC_MOVE | MWM_FUNC_CLOSE | MWM_FUNC_MINIMIZE | | |
679 MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE; | |
680 Atom mtype; | |
681 int mformat; | |
682 unsigned long mn, mb; | |
683 | |
684 if (!WinID) | |
685 return; | |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5919
diff
changeset
|
686 |
12582 | 687 if (vo_fsmode & 8) |
688 { | |
689 XSetTransientForHint(vo_Display, w, | |
690 RootWindow(vo_Display, mScreen)); | |
691 } | |
692 | |
693 vo_MotifHints = XInternAtom(vo_Display, "_MOTIF_WM_HINTS", 0); | |
694 if (vo_MotifHints != None) | |
695 { | |
696 if (!d) | |
697 { | |
698 MotifWmHints *mhints = NULL; | |
1415 | 699 |
12582 | 700 XGetWindowProperty(vo_Display, w, vo_MotifHints, 0, 20, False, |
701 vo_MotifHints, &mtype, &mformat, &mn, | |
702 &mb, (unsigned char **) &mhints); | |
703 if (mhints) | |
704 { | |
705 if (mhints->flags & MWM_HINTS_DECORATIONS) | |
706 olddecor = mhints->decorations; | |
707 if (mhints->flags & MWM_HINTS_FUNCTIONS) | |
708 oldfuncs = mhints->functions; | |
709 XFree(mhints); | |
710 } | |
711 } | |
12096 | 712 |
12582 | 713 memset(&vo_MotifWmHints, 0, sizeof(MotifWmHints)); |
714 vo_MotifWmHints.flags = | |
715 MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS; | |
716 if (d) | |
717 { | |
718 vo_MotifWmHints.functions = oldfuncs; | |
719 d = olddecor; | |
720 } | |
4993 | 721 #if 0 |
12582 | 722 vo_MotifWmHints.decorations = |
723 d | ((vo_fsmode & 2) ? 0 : MWM_DECOR_MENU); | |
4993 | 724 #else |
12582 | 725 vo_MotifWmHints.decorations = |
726 d | ((vo_fsmode & 2) ? MWM_DECOR_MENU : 0); | |
4993 | 727 #endif |
12582 | 728 XChangeProperty(vo_Display, w, vo_MotifHints, vo_MotifHints, 32, |
729 PropModeReplace, | |
730 (unsigned char *) &vo_MotifWmHints, | |
731 (vo_fsmode & 4) ? 4 : 5); | |
732 } | |
32 | 733 } |
734 | |
30083
8375205ecdcc
vo_x11_classhint name argument should be const, since we pass string constants there.
reimar
parents:
29862
diff
changeset
|
735 void vo_x11_classhint(Display * display, Window window, const char *name) |
12582 | 736 { |
737 XClassHint wmClass; | |
738 pid_t pid = getpid(); | |
739 | |
29862
fbb1f57a313e
Added -name, -title and -use-filename-title options and implementation in X11 vos
ptt
parents:
29776
diff
changeset
|
740 wmClass.res_name = vo_winname ? vo_winname : name; |
12582 | 741 wmClass.res_class = "MPlayer"; |
742 XSetClassHint(display, window, &wmClass); | |
743 XChangeProperty(display, window, XA_NET_WM_PID, XA_CARDINAL, 32, | |
744 PropModeReplace, (unsigned char *) &pid, 1); | |
1137
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
1109
diff
changeset
|
745 } |
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
1109
diff
changeset
|
746 |
12582 | 747 Window vo_window = None; |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
748 GC vo_gc = None; |
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
749 GC f_gc = None; |
4993 | 750 XSizeHints vo_hint; |
4795 | 751 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17366
diff
changeset
|
752 void vo_x11_uninit(void) |
4437 | 753 { |
7111 | 754 saver_on(mDisplay); |
12582 | 755 if (vo_window != None) |
756 vo_showcursor(mDisplay, vo_window); | |
4742 | 757 |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
758 if (f_gc != None) |
12582 | 759 { |
760 XFreeGC(mDisplay, f_gc); | |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
761 f_gc = None; |
12582 | 762 } |
4437 | 763 { |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
764 if (vo_gc != None) |
12582 | 765 { |
766 XSetBackground(mDisplay, vo_gc, 0); | |
767 XFreeGC(mDisplay, vo_gc); | |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
768 vo_gc = None; |
12582 | 769 } |
770 if (vo_window != None) | |
771 { | |
772 XClearWindow(mDisplay, vo_window); | |
773 if (WinID < 0) | |
774 { | |
775 XEvent xev; | |
776 | |
777 XUnmapWindow(mDisplay, vo_window); | |
30718
4993c3f12cc0
Enable StructureNotifyMask before waiting for a DestroyNotify event.
reimar
parents:
30556
diff
changeset
|
778 XSelectInput(mDisplay, vo_window, StructureNotifyMask); |
12582 | 779 XDestroyWindow(mDisplay, vo_window); |
780 do | |
781 { | |
782 XNextEvent(mDisplay, &xev); | |
783 } | |
784 while (xev.type != DestroyNotify | |
785 || xev.xdestroywindow.event != vo_window); | |
786 } | |
787 vo_window = None; | |
788 } | |
789 vo_fs = 0; | |
790 vo_old_width = vo_old_height = 0; | |
4437 | 791 } |
792 } | |
793 | |
18287
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
794 static unsigned int mouse_timer; |
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
795 static int mouse_waiting_hide; |
5651
b8d8d72776f2
fix playlist bug with gui and rewrite mousecursor show/hide code
pontscho
parents:
5538
diff
changeset
|
796 |
31538 | 797 static int check_resize(void) |
798 { | |
799 int old_w = vo_dwidth, old_h = vo_dheight; | |
32368
ff2204a57cd3
Add VO_EVENT_MOVE which is required for VOs that interact directly
reimar
parents:
31834
diff
changeset
|
800 int old_x = vo_dx, old_y = vo_dy; |
ff2204a57cd3
Add VO_EVENT_MOVE which is required for VOs that interact directly
reimar
parents:
31834
diff
changeset
|
801 int rc = 0; |
31538 | 802 vo_x11_update_geometry(); |
31606
d48795123d88
100l, only set VO_EVENT_RESIZE on an actual resize, not just for movement.
reimar
parents:
31557
diff
changeset
|
803 if (vo_dwidth != old_w || vo_dheight != old_h) |
32368
ff2204a57cd3
Add VO_EVENT_MOVE which is required for VOs that interact directly
reimar
parents:
31834
diff
changeset
|
804 rc |= VO_EVENT_RESIZE; |
ff2204a57cd3
Add VO_EVENT_MOVE which is required for VOs that interact directly
reimar
parents:
31834
diff
changeset
|
805 if (vo_dx != old_x || vo_dy != old_y) |
ff2204a57cd3
Add VO_EVENT_MOVE which is required for VOs that interact directly
reimar
parents:
31834
diff
changeset
|
806 rc |= VO_EVENT_MOVE; |
ff2204a57cd3
Add VO_EVENT_MOVE which is required for VOs that interact directly
reimar
parents:
31834
diff
changeset
|
807 return rc; |
31538 | 808 } |
809 | |
12582 | 810 int vo_x11_check_events(Display * mydisplay) |
811 { | |
812 int ret = 0; | |
813 XEvent Event; | |
814 char buf[100]; | |
815 KeySym keySym; | |
816 static XComposeStatus stat; | |
5651
b8d8d72776f2
fix playlist bug with gui and rewrite mousecursor show/hide code
pontscho
parents:
5538
diff
changeset
|
817 |
31555 | 818 if (vo_mouse_autohide && mouse_waiting_hide && |
18287
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
819 (GetTimerMS() - mouse_timer >= 1000)) { |
12582 | 820 vo_hidecursor(mydisplay, vo_window); |
18287
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
821 mouse_waiting_hide = 0; |
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
822 } |
6095 | 823 |
31538 | 824 if (WinID > 0) |
825 ret |= check_resize(); | |
12582 | 826 while (XPending(mydisplay)) |
827 { | |
828 XNextEvent(mydisplay, &Event); | |
27343 | 829 #ifdef CONFIG_GUI |
12582 | 830 if (use_gui) |
831 { | |
832 guiGetEvent(0, (char *) &Event); | |
833 if (vo_window != Event.xany.window) | |
834 continue; | |
835 } | |
836 #endif | |
6095 | 837 // printf("\rEvent.type=%X \n",Event.type); |
12582 | 838 switch (Event.type) |
839 { | |
840 case Expose: | |
841 ret |= VO_EVENT_EXPOSE; | |
842 break; | |
843 case ConfigureNotify: | |
844 if (vo_window == None) | |
845 break; | |
31538 | 846 ret |= check_resize(); |
12582 | 847 break; |
848 case KeyPress: | |
849 { | |
850 int key; | |
851 | |
27343 | 852 #ifdef CONFIG_GUI |
14001 | 853 if ( use_gui ) { break; } |
854 #endif | |
855 | |
12582 | 856 XLookupString(&Event.xkey, buf, sizeof(buf), &keySym, |
857 &stat); | |
858 #ifdef XF86XK_AudioPause | |
859 vo_x11_putkey_ext(keySym); | |
860 #endif | |
861 key = | |
862 ((keySym & 0xff00) != | |
863 0 ? ((keySym & 0x00ff) + 256) : (keySym)); | |
864 vo_x11_putkey(key); | |
865 ret |= VO_EVENT_KEYPRESS; | |
866 } | |
867 break; | |
868 case MotionNotify: | |
31049
b40e41324173
Avoid duplicating mouse-movement command-generation code.
reimar
parents:
31047
diff
changeset
|
869 vo_mouse_movement(Event.xmotion.x, Event.xmotion.y); |
19850
4919b3ce8d5e
report to mplayer with a slave command the coordinates of the pointer reported by x11; rescale coordinates to [0,1]x[0,1] range - patch by Jonas Jermann and me
nicodvb
parents:
18950
diff
changeset
|
870 |
12582 | 871 if (vo_mouse_autohide) |
872 { | |
873 vo_showcursor(mydisplay, vo_window); | |
18287
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
874 mouse_waiting_hide = 1; |
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
875 mouse_timer = GetTimerMS(); |
12582 | 876 } |
877 break; | |
878 case ButtonPress: | |
879 if (vo_mouse_autohide) | |
880 { | |
881 vo_showcursor(mydisplay, vo_window); | |
18287
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
882 mouse_waiting_hide = 1; |
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
883 mouse_timer = GetTimerMS(); |
12582 | 884 } |
27343 | 885 #ifdef CONFIG_GUI |
21938 | 886 // Ignore mouse button 1-3 under GUI. |
12582 | 887 if (use_gui && (Event.xbutton.button >= 1) |
888 && (Event.xbutton.button <= 3)) | |
889 break; | |
890 #endif | |
891 mplayer_put_key((MOUSE_BTN0 + Event.xbutton.button - | |
892 1) | MP_KEY_DOWN); | |
893 break; | |
894 case ButtonRelease: | |
895 if (vo_mouse_autohide) | |
896 { | |
897 vo_showcursor(mydisplay, vo_window); | |
18287
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
898 mouse_waiting_hide = 1; |
292337d09af2
Remove updating of vo_mouse_timer_const from the main loop and also
uau
parents:
18237
diff
changeset
|
899 mouse_timer = GetTimerMS(); |
12582 | 900 } |
27343 | 901 #ifdef CONFIG_GUI |
21938 | 902 // Ignore mouse button 1-3 under GUI. |
12582 | 903 if (use_gui && (Event.xbutton.button >= 1) |
904 && (Event.xbutton.button <= 3)) | |
905 break; | |
906 #endif | |
907 mplayer_put_key(MOUSE_BTN0 + Event.xbutton.button - 1); | |
908 break; | |
909 case PropertyNotify: | |
910 { | |
911 char *name = | |
912 XGetAtomName(mydisplay, Event.xproperty.atom); | |
913 | |
914 if (!name) | |
915 break; | |
916 | |
6046 | 917 // fprintf(stderr,"[ws] PropertyNotify ( 0x%x ) %s ( 0x%x )\n",vo_window,name,Event.xproperty.atom ); |
12582 | 918 |
919 XFree(name); | |
920 } | |
921 break; | |
922 case MapNotify: | |
923 vo_hint.win_gravity = old_gravity; | |
924 XSetWMNormalHints(mDisplay, vo_window, &vo_hint); | |
925 vo_fs_flip = 0; | |
926 break; | |
31122 | 927 case DestroyNotify: |
928 mp_msg(MSGT_VO, MSGL_WARN, "Our window was destroyed, exiting\n"); | |
929 mplayer_put_key(KEY_CLOSE_WIN); | |
930 break; | |
18149
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
931 case ClientMessage: |
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
932 if (Event.xclient.message_type == XAWM_PROTOCOLS && |
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
933 Event.xclient.data.l[0] == XAWM_DELETE_WINDOW) |
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
934 mplayer_put_key(KEY_CLOSE_WIN); |
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
935 break; |
12582 | 936 } |
937 } | |
938 return ret; | |
32 | 939 } |
940 | |
13843 | 941 /** |
942 * \brief sets the size and position of the non-fullscreen window. | |
943 */ | |
944 void vo_x11_nofs_sizepos(int x, int y, int width, int height) | |
945 { | |
24312
716b7751e7ad
Make sure aspect hint is adjusted on aspect change
reimar
parents:
24311
diff
changeset
|
946 vo_x11_sizehint(x, y, width, height, 0); |
13843 | 947 if (vo_fs) { |
948 vo_old_x = x; | |
949 vo_old_y = y; | |
950 vo_old_width = width; | |
951 vo_old_height = height; | |
952 } | |
953 else | |
13871 | 954 { |
31536 | 955 vo_dwidth = width; |
956 vo_dheight = height; | |
957 XMoveResizeWindow(mDisplay, vo_window, x, y, width, height); | |
13871 | 958 } |
13843 | 959 } |
960 | |
12582 | 961 void vo_x11_sizehint(int x, int y, int width, int height, int max) |
4993 | 962 { |
24311
0ff0253c8e00
Cosmetics: set vo_hint.flags at more consistent places (directly before
reimar
parents:
23875
diff
changeset
|
963 vo_hint.flags = 0; |
12582 | 964 if (vo_keepaspect) |
965 { | |
966 vo_hint.flags |= PAspect; | |
967 vo_hint.min_aspect.x = width; | |
968 vo_hint.min_aspect.y = height; | |
969 vo_hint.max_aspect.x = width; | |
970 vo_hint.max_aspect.y = height; | |
971 } | |
8692
604f0cde816c
X11 window aspect patch by Arnaud Boulan <boulan@iie.cnam.fr>
attila
parents:
8676
diff
changeset
|
972 |
24311
0ff0253c8e00
Cosmetics: set vo_hint.flags at more consistent places (directly before
reimar
parents:
23875
diff
changeset
|
973 vo_hint.flags |= PPosition | PSize; |
12582 | 974 vo_hint.x = x; |
975 vo_hint.y = y; | |
976 vo_hint.width = width; | |
977 vo_hint.height = height; | |
978 if (max) | |
979 { | |
24311
0ff0253c8e00
Cosmetics: set vo_hint.flags at more consistent places (directly before
reimar
parents:
23875
diff
changeset
|
980 vo_hint.flags |= PMaxSize; |
12582 | 981 vo_hint.max_width = width; |
982 vo_hint.max_height = height; | |
983 } else | |
984 { | |
985 vo_hint.max_width = 0; | |
986 vo_hint.max_height = 0; | |
987 } | |
11995 | 988 |
21938 | 989 // Set minimum height/width to 4 to avoid off-by-one errors |
990 // and because mga_vid requires a minimal size of 4 pixels. | |
24311
0ff0253c8e00
Cosmetics: set vo_hint.flags at more consistent places (directly before
reimar
parents:
23875
diff
changeset
|
991 vo_hint.flags |= PMinSize; |
12582 | 992 vo_hint.min_width = vo_hint.min_height = 4; |
11995 | 993 |
28063
a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
reimar
parents:
27927
diff
changeset
|
994 // Set the base size. A window manager might display the window |
a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
reimar
parents:
27927
diff
changeset
|
995 // size to the user relative to this. |
a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
reimar
parents:
27927
diff
changeset
|
996 // Setting these to width/height might be nice, but e.g. fluxbox can't handle it. |
a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
reimar
parents:
27927
diff
changeset
|
997 vo_hint.flags |= PBaseSize; |
a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
reimar
parents:
27927
diff
changeset
|
998 vo_hint.base_width = 0 /*width*/; |
a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
reimar
parents:
27927
diff
changeset
|
999 vo_hint.base_height = 0 /*height*/; |
a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
reimar
parents:
27927
diff
changeset
|
1000 |
24311
0ff0253c8e00
Cosmetics: set vo_hint.flags at more consistent places (directly before
reimar
parents:
23875
diff
changeset
|
1001 vo_hint.flags |= PWinGravity; |
12582 | 1002 vo_hint.win_gravity = StaticGravity; |
1003 XSetWMNormalHints(mDisplay, vo_window, &vo_hint); | |
4993 | 1004 } |
1005 | |
10587
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
1006 static int vo_x11_get_gnome_layer(Display * mDisplay, Window win) |
8866 | 1007 { |
12582 | 1008 Atom type; |
1009 int format; | |
1010 unsigned long nitems; | |
1011 unsigned long bytesafter; | |
1012 unsigned short *args = NULL; | |
8866 | 1013 |
12582 | 1014 if (XGetWindowProperty(mDisplay, win, XA_WIN_LAYER, 0, 16384, |
1015 False, AnyPropertyType, &type, &format, &nitems, | |
1016 &bytesafter, | |
1017 (unsigned char **) &args) == Success | |
1018 && nitems > 0 && args) | |
1019 { | |
1020 mp_msg(MSGT_VO, MSGL_V, "[x11] original window layer is %d.\n", | |
1021 *args); | |
1022 return *args; | |
1023 } | |
1024 return WIN_LAYER_NORMAL; | |
8866 | 1025 } |
1026 | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1027 // |
12582 | 1028 Window vo_x11_create_smooth_window(Display * mDisplay, Window mRoot, |
1029 Visual * vis, int x, int y, | |
1030 unsigned int width, unsigned int height, | |
1031 int depth, Colormap col_map) | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1032 { |
27815
f92271dc5f17
Remove X11 backing store: this is now a useless flag.
ben
parents:
27713
diff
changeset
|
1033 unsigned long xswamask = CWBorderPixel; |
12582 | 1034 XSetWindowAttributes xswa; |
1035 Window ret_win; | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1036 |
12582 | 1037 if (col_map != CopyFromParent) |
1038 { | |
1039 xswa.colormap = col_map; | |
1040 xswamask |= CWColormap; | |
1041 } | |
1042 xswa.background_pixel = 0; | |
1043 xswa.border_pixel = 0; | |
27815
f92271dc5f17
Remove X11 backing store: this is now a useless flag.
ben
parents:
27713
diff
changeset
|
1044 xswa.backing_store = NotUseful; |
12582 | 1045 xswa.bit_gravity = StaticGravity; |
1046 | |
1047 ret_win = | |
1048 XCreateWindow(mDisplay, mRootWin, x, y, width, height, 0, depth, | |
1049 CopyFromParent, vis, xswamask, &xswa); | |
18149
163fe5c2577d
Register for window-manager delete window events and quit MPlayer.
reimar
parents:
18116
diff
changeset
|
1050 XSetWMProtocols(mDisplay, ret_win, &XAWM_DELETE_WINDOW, 1); |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
1051 if (f_gc == None) |
12582 | 1052 f_gc = XCreateGC(mDisplay, ret_win, 0, 0); |
1053 XSetForeground(mDisplay, f_gc, 0); | |
1054 | |
1055 return ret_win; | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1056 } |
12582 | 1057 |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1058 /** |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1059 * \brief create and setup a window suitable for display |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1060 * \param vis Visual to use for creating the window |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1061 * \param x x position of window |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1062 * \param y y position of window |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1063 * \param width width of window |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1064 * \param height height of window |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1065 * \param flags flags for window creation. |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1066 * Only VOFLAG_FULLSCREEN is supported so far. |
23823
513293585949
document "default" behaviour if CopyFromParent is passed as colormap
attila
parents:
23660
diff
changeset
|
1067 * \param col_map Colourmap for window or CopyFromParent if a specific colormap isn't needed |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1068 * \param classname name to use for the classhint |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1069 * \param title title for the window |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1070 * |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1071 * This also does the grunt-work like setting Window Manager hints etc. |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1072 * If vo_window is already set it just moves and resizes it. |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1073 */ |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1074 void vo_x11_create_vo_window(XVisualInfo *vis, int x, int y, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1075 unsigned int width, unsigned int height, int flags, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1076 Colormap col_map, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1077 const char *classname, const char *title) |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1078 { |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1079 XGCValues xgcv; |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1080 if (WinID >= 0) { |
29514
23a59bb3baf4
First attempts at supporting -fs with -wid, -vo gl on X11 only so far
reimar
parents:
29332
diff
changeset
|
1081 vo_fs = flags & VOFLAG_FULLSCREEN; |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1082 vo_window = WinID ? (Window)WinID : mRootWin; |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1083 if (col_map != CopyFromParent) { |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1084 unsigned long xswamask = CWColormap; |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1085 XSetWindowAttributes xswa; |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1086 xswa.colormap = col_map; |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1087 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); |
29572
4890363e713a
Do not do a unmap/map cycle on Windows given with -wid, with some window
reimar
parents:
29514
diff
changeset
|
1088 XInstallColormap(mDisplay, col_map); |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1089 } |
31539
b07ed23358af
Always request expose events, we have to handle them, the application
reimar
parents:
31538
diff
changeset
|
1090 if (WinID) { |
31556 | 1091 // Expose events can only really be handled by us, so request them. |
1092 // Do not remove existing masks so GUI keeps working. | |
1093 XWindowAttributes attribs; | |
1094 XGetWindowAttributes(mDisplay, vo_window, &attribs); | |
1095 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
1096 attribs.your_event_mask | ExposureMask); | |
31539
b07ed23358af
Always request expose events, we have to handle them, the application
reimar
parents:
31538
diff
changeset
|
1097 } else |
31536 | 1098 // Do not capture events since it might break the parent application |
1099 // if it relies on events being forwarded to the parent of WinID. | |
1100 // It also is consistent with the w32_common.c code. | |
1101 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1102 StructureNotifyMask | KeyPressMask | PointerMotionMask | |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1103 ButtonPressMask | ButtonReleaseMask | ExposureMask); |
31557 | 1104 |
1105 vo_x11_update_geometry(); | |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1106 goto final; |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1107 } |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1108 if (vo_window == None) { |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1109 vo_fs = 0; |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1110 vo_dwidth = width; |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1111 vo_dheight = height; |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1112 vo_window = vo_x11_create_smooth_window(mDisplay, mRootWin, vis->visual, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1113 x, y, width, height, vis->depth, col_map); |
30465
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
1114 window_state = VOFLAG_HIDDEN; |
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
1115 } |
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
1116 if (flags & VOFLAG_HIDDEN) |
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
1117 goto final; |
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
1118 if (window_state & VOFLAG_HIDDEN) { |
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
1119 XSizeHints hint; |
3422423f2e20
Create the OpenGL probe window as a hidden Window on X11.
reimar
parents:
30455
diff
changeset
|
1120 XEvent xev; |
30472
ddce1a6f3c59
Fix hang with -fixed-vo due to VOFLAG_HIDDEN never being removed from window_state.
reimar
parents:
30465
diff
changeset
|
1121 window_state &= ~VOFLAG_HIDDEN; |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1122 vo_x11_classhint(mDisplay, vo_window, classname); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1123 XStoreName(mDisplay, vo_window, title); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1124 vo_hidecursor(mDisplay, vo_window); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1125 XSelectInput(mDisplay, vo_window, StructureNotifyMask); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1126 hint.x = x; hint.y = y; |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1127 hint.width = width; hint.height = height; |
31223
4031008a248c
Change code to let Window Manager chose window location by default.
reimar
parents:
31122
diff
changeset
|
1128 hint.flags = PSize; |
4031008a248c
Change code to let Window Manager chose window location by default.
reimar
parents:
31122
diff
changeset
|
1129 if (geometry_xy_changed) |
4031008a248c
Change code to let Window Manager chose window location by default.
reimar
parents:
31122
diff
changeset
|
1130 hint.flags |= PPosition; |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1131 XSetStandardProperties(mDisplay, vo_window, title, title, None, NULL, 0, &hint); |
27304 | 1132 if (!vo_border) vo_x11_decoration(mDisplay, vo_window, 0); |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1133 // map window |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1134 XMapWindow(mDisplay, vo_window); |
30455
cfebff6a5ef9
Use vo_x11_clearwindow instead of XClearWindow, both for consistency and also
reimar
parents:
30451
diff
changeset
|
1135 vo_x11_clearwindow(mDisplay, vo_window); |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1136 // wait for map |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1137 do { |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1138 XNextEvent(mDisplay, &xev); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1139 } while (xev.type != MapNotify || xev.xmap.event != vo_window); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1140 XSelectInput(mDisplay, vo_window, NoEventMask); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1141 XSync(mDisplay, False); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1142 vo_x11_selectinput_witherr(mDisplay, vo_window, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1143 StructureNotifyMask | KeyPressMask | PointerMotionMask | |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1144 ButtonPressMask | ButtonReleaseMask | ExposureMask); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1145 } |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1146 if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop); |
31223
4031008a248c
Change code to let Window Manager chose window location by default.
reimar
parents:
31122
diff
changeset
|
1147 if (!geometry_xy_changed) |
4031008a248c
Change code to let Window Manager chose window location by default.
reimar
parents:
31122
diff
changeset
|
1148 vo_x11_update_geometry(); |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1149 vo_x11_nofs_sizepos(vo_dx, vo_dy, width, height); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1150 if (!!vo_fs != !!(flags & VOFLAG_FULLSCREEN)) |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1151 vo_x11_fullscreen(); |
28771
bd24ac0d9fd8
Make sure vo_x11_create_vo_window sets vo_dwidth and vo_dheight right
reimar
parents:
28512
diff
changeset
|
1152 else if (vo_fs) { |
bd24ac0d9fd8
Make sure vo_x11_create_vo_window sets vo_dwidth and vo_dheight right
reimar
parents:
28512
diff
changeset
|
1153 // if we are already in fullscreen do not switch back and forth, just |
bd24ac0d9fd8
Make sure vo_x11_create_vo_window sets vo_dwidth and vo_dheight right
reimar
parents:
28512
diff
changeset
|
1154 // set the size values right. |
bd24ac0d9fd8
Make sure vo_x11_create_vo_window sets vo_dwidth and vo_dheight right
reimar
parents:
28512
diff
changeset
|
1155 vo_dwidth = vo_screenwidth; |
bd24ac0d9fd8
Make sure vo_x11_create_vo_window sets vo_dwidth and vo_dheight right
reimar
parents:
28512
diff
changeset
|
1156 vo_dheight = vo_screenheight; |
bd24ac0d9fd8
Make sure vo_x11_create_vo_window sets vo_dwidth and vo_dheight right
reimar
parents:
28512
diff
changeset
|
1157 } |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1158 final: |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1159 if (vo_gc != None) |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1160 XFreeGC(mDisplay, vo_gc); |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1161 vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &xgcv); |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1162 XSync(mDisplay, False); |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27893
diff
changeset
|
1163 vo_mouse_autohide = 1; |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23615
diff
changeset
|
1164 } |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1165 |
12582 | 1166 void vo_x11_clearwindow_part(Display * mDisplay, Window vo_window, |
1167 int img_width, int img_height, int use_fs) | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1168 { |
12582 | 1169 int u_dheight, u_dwidth, left_ov, left_ov2; |
10765
c8fb7e2690a3
10000l. Never ever use such foolish GCC 3.x extensionscvs diff -u x11_common.c x11_common.h |more
alex
parents:
10757
diff
changeset
|
1170 |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
1171 if (f_gc == None) |
12582 | 1172 return; |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1173 |
12582 | 1174 u_dheight = use_fs ? vo_screenheight : vo_dheight; |
1175 u_dwidth = use_fs ? vo_screenwidth : vo_dwidth; | |
1176 if ((u_dheight <= img_height) && (u_dwidth <= img_width)) | |
1177 return; | |
10765
c8fb7e2690a3
10000l. Never ever use such foolish GCC 3.x extensionscvs diff -u x11_common.c x11_common.h |more
alex
parents:
10757
diff
changeset
|
1178 |
12582 | 1179 left_ov = (u_dheight - img_height) / 2; |
1180 left_ov2 = (u_dwidth - img_width) / 2; | |
1181 | |
1182 XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, u_dwidth, left_ov); | |
1183 XFillRectangle(mDisplay, vo_window, f_gc, 0, u_dheight - left_ov - 1, | |
1184 u_dwidth, left_ov + 1); | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1185 |
12582 | 1186 if (u_dwidth > img_width) |
1187 { | |
1188 XFillRectangle(mDisplay, vo_window, f_gc, 0, left_ov, left_ov2, | |
1189 img_height); | |
1190 XFillRectangle(mDisplay, vo_window, f_gc, u_dwidth - left_ov2 - 1, | |
23660
3ab096c77b9e
Fix vo_x11_clearwindow_part: x position is one less to avoid not clearing
reimar
parents:
23655
diff
changeset
|
1191 left_ov, left_ov2 + 1, img_height); |
12582 | 1192 } |
1193 | |
1194 XFlush(mDisplay); | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1195 } |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1196 |
12582 | 1197 void vo_x11_clearwindow(Display * mDisplay, Window vo_window) |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1198 { |
31356
c3e536cf595b
Consistently use "None" instead of "NULL" for X resources.
reimar
parents:
31328
diff
changeset
|
1199 if (f_gc == None) |
12582 | 1200 return; |
1201 XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, vo_screenwidth, | |
1202 vo_screenheight); | |
1203 // | |
1204 XFlush(mDisplay); | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1205 } |
12582 | 1206 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10754
diff
changeset
|
1207 |
12582 | 1208 void vo_x11_setlayer(Display * mDisplay, Window vo_window, int layer) |
5997
b5fb9a927bf3
add WM detection, and wm specific fullscreen code. (???)
pontscho
parents:
5981
diff
changeset
|
1209 { |
12582 | 1210 if (WinID >= 0) |
1211 return; | |
8864 | 1212 |
12582 | 1213 if (vo_fs_type & vo_wm_LAYER) |
1214 { | |
1215 XClientMessageEvent xev; | |
1216 | |
1217 if (!orig_layer) | |
1218 orig_layer = vo_x11_get_gnome_layer(mDisplay, vo_window); | |
8866 | 1219 |
12582 | 1220 memset(&xev, 0, sizeof(xev)); |
1221 xev.type = ClientMessage; | |
1222 xev.display = mDisplay; | |
1223 xev.window = vo_window; | |
1224 xev.message_type = XA_WIN_LAYER; | |
1225 xev.format = 32; | |
1226 xev.data.l[0] = layer ? fs_layer : orig_layer; // if not fullscreen, stay on default layer | |
1227 xev.data.l[1] = CurrentTime; | |
1228 mp_msg(MSGT_VO, MSGL_V, | |
17366 | 1229 "[x11] Layered style stay on top (layer %ld).\n", |
12582 | 1230 xev.data.l[0]); |
1231 XSendEvent(mDisplay, mRootWin, False, SubstructureNotifyMask, | |
1232 (XEvent *) & xev); | |
1233 } else if (vo_fs_type & vo_wm_NETWM) | |
1234 { | |
1235 XClientMessageEvent xev; | |
1236 char *state; | |
8645 | 1237 |
12582 | 1238 memset(&xev, 0, sizeof(xev)); |
1239 xev.type = ClientMessage; | |
1240 xev.message_type = XA_NET_WM_STATE; | |
1241 xev.display = mDisplay; | |
1242 xev.window = vo_window; | |
1243 xev.format = 32; | |
1244 xev.data.l[0] = layer; | |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
1245 |
12582 | 1246 if (vo_fs_type & vo_wm_STAYS_ON_TOP) |
1247 xev.data.l[1] = XA_NET_WM_STATE_STAYS_ON_TOP; | |
1248 else if (vo_fs_type & vo_wm_ABOVE) | |
1249 xev.data.l[1] = XA_NET_WM_STATE_ABOVE; | |
1250 else if (vo_fs_type & vo_wm_FULLSCREEN) | |
1251 xev.data.l[1] = XA_NET_WM_STATE_FULLSCREEN; | |
1252 else if (vo_fs_type & vo_wm_BELOW) | |
21938 | 1253 // This is not fallback. We can safely assume that the situation |
1254 // where only NETWM_STATE_BELOW is supported doesn't exist. | |
12582 | 1255 xev.data.l[1] = XA_NET_WM_STATE_BELOW; |
1256 | |
1257 XSendEvent(mDisplay, mRootWin, False, SubstructureRedirectMask, | |
1258 (XEvent *) & xev); | |
1259 state = XGetAtomName(mDisplay, xev.data.l[1]); | |
1260 mp_msg(MSGT_VO, MSGL_V, | |
1261 "[x11] NET style stay on top (layer %d). Using state %s.\n", | |
1262 layer, state); | |
1263 XFree(state); | |
1264 } | |
5997
b5fb9a927bf3
add WM detection, and wm specific fullscreen code. (???)
pontscho
parents:
5981
diff
changeset
|
1265 } |
b5fb9a927bf3
add WM detection, and wm specific fullscreen code. (???)
pontscho
parents:
5981
diff
changeset
|
1266 |
10587
382bf4771ee7
moved lot of global variables into static ones (and some minor spelling fixes)
alex
parents:
10570
diff
changeset
|
1267 static int vo_x11_get_fs_type(int supported) |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
1268 { |
12582 | 1269 int i; |
1270 int type = supported; | |
1271 | |
1272 if (vo_fstype_list) | |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
1273 { |
12582 | 1274 for (i = 0; vo_fstype_list[i]; i++) |
1275 { | |
1276 int neg = 0; | |
1277 char *arg = vo_fstype_list[i]; | |
1278 | |
1279 if (vo_fstype_list[i][0] == '-') | |
1280 { | |
1281 neg = 1; | |
1282 arg = vo_fstype_list[i] + 1; | |
1283 } | |
1284 | |
1285 if (!strncmp(arg, "layer", 5)) | |
1286 { | |
1287 if (!neg && (arg[5] == '=')) | |
1288 { | |
1289 char *endptr = NULL; | |
1290 int layer = strtol(vo_fstype_list[i] + 6, &endptr, 10); | |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
1291 |
12582 | 1292 if (endptr && *endptr == '\0' && layer >= 0 |
1293 && layer <= 15) | |
1294 fs_layer = layer; | |
1295 } | |
1296 if (neg) | |
1297 type &= ~vo_wm_LAYER; | |
1298 else | |
1299 type |= vo_wm_LAYER; | |
1300 } else if (!strcmp(arg, "above")) | |
1301 { | |
1302 if (neg) | |
1303 type &= ~vo_wm_ABOVE; | |
1304 else | |
1305 type |= vo_wm_ABOVE; | |
1306 } else if (!strcmp(arg, "fullscreen")) | |
1307 { | |
1308 if (neg) | |
1309 type &= ~vo_wm_FULLSCREEN; | |
1310 else | |
1311 type |= vo_wm_FULLSCREEN; | |
1312 } else if (!strcmp(arg, "stays_on_top")) | |
1313 { | |
1314 if (neg) | |
1315 type &= ~vo_wm_STAYS_ON_TOP; | |
1316 else | |
1317 type |= vo_wm_STAYS_ON_TOP; | |
1318 } else if (!strcmp(arg, "below")) | |
1319 { | |
1320 if (neg) | |
1321 type &= ~vo_wm_BELOW; | |
1322 else | |
1323 type |= vo_wm_BELOW; | |
1324 } else if (!strcmp(arg, "netwm")) | |
1325 { | |
1326 if (neg) | |
1327 type &= ~vo_wm_NETWM; | |
1328 else | |
1329 type |= vo_wm_NETWM; | |
1330 } else if (!strcmp(arg, "none")) | |
29763
752432ff3360
Slightly change behavior of "none" if fstype specification.
corey
parents:
29753
diff
changeset
|
1331 type = 0; // clear; keep parsing |
9317
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
1332 } |
c7f5df43b937
- support command line parameter -fstype, eg. -fstype layer=12,above,fullscreen
filon
parents:
9217
diff
changeset
|
1333 } |
5919 | 1334 |
12582 | 1335 return type; |
4981 | 1336 } |
1337 | |
27885
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1338 /** |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1339 * \brief update vo_dx, vo_dy, vo_dwidth and vo_dheight with current values of vo_window |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1340 * \return returns current color depth of vo_window |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1341 */ |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1342 int vo_x11_update_geometry(void) { |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1343 unsigned depth, w, h; |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1344 int dummy_int; |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1345 Window dummy_win; |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1346 XGetGeometry(mDisplay, vo_window, &dummy_win, &dummy_int, &dummy_int, |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1347 &w, &h, &dummy_int, &depth); |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1348 if (w <= INT_MAX && h <= INT_MAX) { vo_dwidth = w; vo_dheight = h; } |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1349 XTranslateCoordinates(mDisplay, vo_window, mRootWin, 0, 0, &vo_dx, &vo_dy, |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1350 &dummy_win); |
29862
fbb1f57a313e
Added -name, -title and -use-filename-title options and implementation in X11 vos
ptt
parents:
29776
diff
changeset
|
1351 if (vo_wintitle) |
fbb1f57a313e
Added -name, -title and -use-filename-title options and implementation in X11 vos
ptt
parents:
29776
diff
changeset
|
1352 XStoreName(mDisplay, vo_window, vo_wintitle); |
fbb1f57a313e
Added -name, -title and -use-filename-title options and implementation in X11 vos
ptt
parents:
29776
diff
changeset
|
1353 |
27885
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1354 return depth <= INT_MAX ? depth : 0; |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1355 } |
9829cfa41d6d
Replace some of the different inconsistent XGetGeometry uses by a
reimar
parents:
27815
diff
changeset
|
1356 |
12582 | 1357 void vo_x11_fullscreen(void) |
11542 | 1358 { |
12582 | 1359 int x, y, w, h; |
29753
75f54a9e4160
Move some variable initializations to the beginning of vo_x11_fullscreen().
diego
parents:
29572
diff
changeset
|
1360 x = vo_old_x; |
75f54a9e4160
Move some variable initializations to the beginning of vo_x11_fullscreen().
diego
parents:
29572
diff
changeset
|
1361 y = vo_old_y; |
75f54a9e4160
Move some variable initializations to the beginning of vo_x11_fullscreen().
diego
parents:
29572
diff
changeset
|
1362 w = vo_old_width; |
75f54a9e4160
Move some variable initializations to the beginning of vo_x11_fullscreen().
diego
parents:
29572
diff
changeset
|
1363 h = vo_old_height; |
12582 | 1364 |
29514
23a59bb3baf4
First attempts at supporting -fs with -wid, -vo gl on X11 only so far
reimar
parents:
29332
diff
changeset
|
1365 if (WinID >= 0) { |
23a59bb3baf4
First attempts at supporting -fs with -wid, -vo gl on X11 only so far
reimar
parents:
29332
diff
changeset
|
1366 vo_fs = !vo_fs; |
23a59bb3baf4
First attempts at supporting -fs with -wid, -vo gl on X11 only so far
reimar
parents:
29332
diff
changeset
|
1367 return; |
23a59bb3baf4
First attempts at supporting -fs with -wid, -vo gl on X11 only so far
reimar
parents:
29332
diff
changeset
|
1368 } |
23a59bb3baf4
First attempts at supporting -fs with -wid, -vo gl on X11 only so far
reimar
parents:
29332
diff
changeset
|
1369 if (vo_fs_flip) |
12582 | 1370 return; |
1371 | |
1372 if (vo_fs) | |
1373 { | |
12796
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1374 vo_x11_ewmh_fullscreen(_NET_WM_STATE_REMOVE); // removes fullscreen state if wm supports EWMH |
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1375 vo_fs = VO_FALSE; |
12582 | 1376 } else |
1377 { | |
1378 // win->fs | |
1379 vo_x11_ewmh_fullscreen(_NET_WM_STATE_ADD); // sends fullscreen state to be added if wm supports EWMH | |
1380 | |
12796
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1381 vo_fs = VO_TRUE; |
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1382 if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // not needed with EWMH fs |
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1383 { |
12798
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1384 vo_old_x = vo_dx; |
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1385 vo_old_y = vo_dy; |
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1386 vo_old_width = vo_dwidth; |
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1387 vo_old_height = vo_dheight; |
23875
df05ff41590e
make sure update_xinerama_info is always called even when using the
reimar
parents:
23823
diff
changeset
|
1388 } |
18116 | 1389 update_xinerama_info(); |
1390 x = xinerama_x; | |
1391 y = xinerama_y; | |
12798
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1392 w = vo_screenwidth; |
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1393 h = vo_screenheight; |
12582 | 1394 } |
1395 { | |
1396 long dummy; | |
1397 | |
1398 XGetWMNormalHints(mDisplay, vo_window, &vo_hint, &dummy); | |
1399 if (!(vo_hint.flags & PWinGravity)) | |
1400 old_gravity = NorthWestGravity; | |
1401 else | |
1402 old_gravity = vo_hint.win_gravity; | |
1403 } | |
1404 if (vo_wm_type == 0 && !(vo_fsmode & 16)) | |
1405 { | |
1406 XUnmapWindow(mDisplay, vo_window); // required for MWM | |
1407 XWithdrawWindow(mDisplay, vo_window, mScreen); | |
1408 vo_fs_flip = 1; | |
1409 } | |
1410 | |
12796
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1411 if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // not needed with EWMH fs |
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1412 { |
27303
690ba711bda8
Make vo_x11_fullscreen not break vo_border (proper support still needs vo changes)
reimar
parents:
27029
diff
changeset
|
1413 vo_x11_decoration(mDisplay, vo_window, vo_border && !vo_fs); |
12798
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1414 vo_x11_sizehint(x, y, w, h, 0); |
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1415 vo_x11_setlayer(mDisplay, vo_window, vo_fs); |
12582 | 1416 |
1417 | |
12798
33423862b159
Indentation fix from previous patch, as discussed on IRC.
rtognimp
parents:
12796
diff
changeset
|
1418 XMoveResizeWindow(mDisplay, vo_window, x, y, w, h); |
12796
24075685789b
This fixes the problems that originated from my ewmh
rtognimp
parents:
12582
diff
changeset
|
1419 } |
21938 | 1420 /* some WMs lose ontop after fullscreen */ |
14244
9b03ad0254ae
Fix ontop for some WMs that lose ontop state after fullscreen event.
al
parents:
14207
diff
changeset
|
1421 if ((!(vo_fs)) & vo_ontop) |
9b03ad0254ae
Fix ontop for some WMs that lose ontop state after fullscreen event.
al
parents:
14207
diff
changeset
|
1422 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); |
9b03ad0254ae
Fix ontop for some WMs that lose ontop state after fullscreen event.
al
parents:
14207
diff
changeset
|
1423 |
12582 | 1424 XMapRaised(mDisplay, vo_window); |
18715
30d7ddf08889
Fix window position when changing videos while in fullscreen and for
reimar
parents:
18508
diff
changeset
|
1425 if ( ! (vo_fs_type & vo_wm_FULLSCREEN) ) // some WMs change window pos on map |
30d7ddf08889
Fix window position when changing videos while in fullscreen and for
reimar
parents:
18508
diff
changeset
|
1426 XMoveResizeWindow(mDisplay, vo_window, x, y, w, h); |
12582 | 1427 XRaiseWindow(mDisplay, vo_window); |
1428 XFlush(mDisplay); | |
1429 } | |
1430 | |
1431 void vo_x11_ontop(void) | |
1432 { | |
1433 vo_ontop = (!(vo_ontop)); | |
1434 | |
1435 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
11542 | 1436 } |
1437 | |
27306
7a650839fc10
Enable runtime border/window decorations-toggling for Linux gl and gl2 vos.
reimar
parents:
27304
diff
changeset
|
1438 void vo_x11_border(void) |
7a650839fc10
Enable runtime border/window decorations-toggling for Linux gl and gl2 vos.
reimar
parents:
27304
diff
changeset
|
1439 { |
7a650839fc10
Enable runtime border/window decorations-toggling for Linux gl and gl2 vos.
reimar
parents:
27304
diff
changeset
|
1440 vo_border = !vo_border; |
7a650839fc10
Enable runtime border/window decorations-toggling for Linux gl and gl2 vos.
reimar
parents:
27304
diff
changeset
|
1441 vo_x11_decoration(mDisplay, vo_window, vo_border && !vo_fs); |
7a650839fc10
Enable runtime border/window decorations-toggling for Linux gl and gl2 vos.
reimar
parents:
27304
diff
changeset
|
1442 } |
7a650839fc10
Enable runtime border/window decorations-toggling for Linux gl and gl2 vos.
reimar
parents:
27304
diff
changeset
|
1443 |
9695 | 1444 /* |
1445 * XScreensaver stuff | |
1446 */ | |
1447 | |
25608
3ada48a71450
Use a screensaver_off variable to save current state and avoid
reimar
parents:
25482
diff
changeset
|
1448 static int screensaver_off; |
12031
0c2b8b731d42
Use system clock for xscreensaver pings (Tobias Diedrich).
diego
parents:
11995
diff
changeset
|
1449 static unsigned int time_last; |
9695 | 1450 |
12031
0c2b8b731d42
Use system clock for xscreensaver pings (Tobias Diedrich).
diego
parents:
11995
diff
changeset
|
1451 void xscreensaver_heartbeat(void) |
9695 | 1452 { |
12031
0c2b8b731d42
Use system clock for xscreensaver pings (Tobias Diedrich).
diego
parents:
11995
diff
changeset
|
1453 unsigned int time = GetTimerMS(); |
9695 | 1454 |
25609
dc64735e7391
Remove most of the messy screensaver code in favour of only XResetScreenSaver
reimar
parents:
25608
diff
changeset
|
1455 if (mDisplay && screensaver_off && (time - time_last) > 30000) |
12582 | 1456 { |
1457 time_last = time; | |
9695 | 1458 |
25609
dc64735e7391
Remove most of the messy screensaver code in favour of only XResetScreenSaver
reimar
parents:
25608
diff
changeset
|
1459 XResetScreenSaver(mDisplay); |
9695 | 1460 } |
1461 } | |
1462 | |
25466 | 1463 static int xss_suspend(Bool suspend) |
1464 { | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
1465 #ifndef CONFIG_XSS |
25466 | 1466 return 0; |
1467 #else | |
1468 int event, error, major, minor; | |
1469 if (XScreenSaverQueryExtension(mDisplay, &event, &error) != True || | |
1470 XScreenSaverQueryVersion(mDisplay, &major, &minor) != True) | |
1471 return 0; | |
27029
e8c49e69f46f
Add parentheses to expression to avoid the warning:
diego
parents:
26755
diff
changeset
|
1472 if (major < 1 || (major == 1 && minor < 1)) |
25466 | 1473 return 0; |
1474 XScreenSaverSuspend(mDisplay, suspend); | |
1475 return 1; | |
1476 #endif | |
1477 } | |
1478 | |
9695 | 1479 /* |
1480 * End of XScreensaver stuff | |
1481 */ | |
1482 | |
12582 | 1483 void saver_on(Display * mDisplay) |
1484 { | |
324 | 1485 |
25608
3ada48a71450
Use a screensaver_off variable to save current state and avoid
reimar
parents:
25482
diff
changeset
|
1486 if (!screensaver_off) |
3ada48a71450
Use a screensaver_off variable to save current state and avoid
reimar
parents:
25482
diff
changeset
|
1487 return; |
3ada48a71450
Use a screensaver_off variable to save current state and avoid
reimar
parents:
25482
diff
changeset
|
1488 screensaver_off = 0; |
25466 | 1489 if (xss_suspend(False)) |
1490 return; | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
1491 #ifdef CONFIG_XDPMS |
324 | 1492 if (dpms_disabled) |
1493 { | |
25447 | 1494 int nothing; |
12582 | 1495 if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing)) |
1496 { | |
1497 if (!DPMSEnable(mDisplay)) | |
1498 { // restoring power saving settings | |
1499 mp_msg(MSGT_VO, MSGL_WARN, "DPMS not available?\n"); | |
1500 } else | |
1501 { | |
741 | 1502 // DPMS does not seem to be enabled unless we call DPMSInfo |
12582 | 1503 BOOL onoff; |
1504 CARD16 state; | |
1505 | |
1506 DPMSForceLevel(mDisplay, DPMSModeOn); | |
1507 DPMSInfo(mDisplay, &state, &onoff); | |
1508 if (onoff) | |
1509 { | |
13946 | 1510 mp_msg(MSGT_VO, MSGL_V, |
12582 | 1511 "Successfully enabled DPMS\n"); |
1512 } else | |
1513 { | |
1514 mp_msg(MSGT_VO, MSGL_WARN, "Could not enable DPMS\n"); | |
741 | 1515 } |
1516 } | |
12582 | 1517 } |
1518 dpms_disabled = 0; | |
324 | 1519 } |
1345
be674b95b485
x11_common does not compile, when the XDPMS extension is not available on the
jkeil
parents:
1266
diff
changeset
|
1520 #endif |
324 | 1521 } |
1522 | |
12582 | 1523 void saver_off(Display * mDisplay) |
1524 { | |
1345
be674b95b485
x11_common does not compile, when the XDPMS extension is not available on the
jkeil
parents:
1266
diff
changeset
|
1525 int nothing; |
324 | 1526 |
25608
3ada48a71450
Use a screensaver_off variable to save current state and avoid
reimar
parents:
25482
diff
changeset
|
1527 if (screensaver_off) |
3ada48a71450
Use a screensaver_off variable to save current state and avoid
reimar
parents:
25482
diff
changeset
|
1528 return; |
3ada48a71450
Use a screensaver_off variable to save current state and avoid
reimar
parents:
25482
diff
changeset
|
1529 screensaver_off = 1; |
25466 | 1530 if (xss_suspend(True)) |
1531 return; | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
1532 #ifdef CONFIG_XDPMS |
324 | 1533 if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing)) |
1534 { | |
12582 | 1535 BOOL onoff; |
1536 CARD16 state; | |
1537 | |
1538 DPMSInfo(mDisplay, &state, &onoff); | |
1539 if (onoff) | |
1540 { | |
1541 Status stat; | |
1542 | |
13946 | 1543 mp_msg(MSGT_VO, MSGL_V, "Disabling DPMS\n"); |
12582 | 1544 dpms_disabled = 1; |
1545 stat = DPMSDisable(mDisplay); // monitor powersave off | |
1546 mp_msg(MSGT_VO, MSGL_V, "DPMSDisable stat: %d\n", stat); | |
1547 } | |
324 | 1548 } |
1345
be674b95b485
x11_common does not compile, when the XDPMS extension is not available on the
jkeil
parents:
1266
diff
changeset
|
1549 #endif |
326 | 1550 } |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
440
diff
changeset
|
1551 |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6401
diff
changeset
|
1552 static XErrorHandler old_handler = NULL; |
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6401
diff
changeset
|
1553 static int selectinput_err = 0; |
12582 | 1554 static int x11_selectinput_errorhandler(Display * display, |
1555 XErrorEvent * event) | |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6401
diff
changeset
|
1556 { |
12582 | 1557 if (event->error_code == BadAccess) |
1558 { | |
1559 selectinput_err = 1; | |
1560 mp_msg(MSGT_VO, MSGL_ERR, | |
1561 "X11 error: BadAccess during XSelectInput Call\n"); | |
1562 mp_msg(MSGT_VO, MSGL_ERR, | |
1563 "X11 error: The 'ButtonPressMask' mask of specified window has probably already used by another appication (see man XSelectInput)\n"); | |
21938 | 1564 /* If you think MPlayer should shutdown with this error, |
1565 * comment out the following line */ | |
12582 | 1566 return 0; |
1567 } | |
1568 if (old_handler != NULL) | |
1569 old_handler(display, event); | |
1570 else | |
1571 x11_errorhandler(display, event); | |
1572 return 0; | |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6401
diff
changeset
|
1573 } |
3990 | 1574 |
12582 | 1575 void vo_x11_selectinput_witherr(Display * display, Window w, |
1576 long event_mask) | |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6401
diff
changeset
|
1577 { |
12582 | 1578 XSync(display, False); |
1579 old_handler = XSetErrorHandler(x11_selectinput_errorhandler); | |
1580 selectinput_err = 0; | |
1581 if (vo_nomouse_input) | |
1582 { | |
1583 XSelectInput(display, w, | |
1584 event_mask & | |
1585 (~(ButtonPressMask | ButtonReleaseMask))); | |
1586 } else | |
1587 { | |
1588 XSelectInput(display, w, event_mask); | |
1589 } | |
1590 XSync(display, False); | |
1591 XSetErrorHandler(old_handler); | |
1592 if (selectinput_err) | |
1593 { | |
1594 mp_msg(MSGT_VO, MSGL_ERR, | |
1595 "X11 error: MPlayer discards mouse control (reconfiguring)\n"); | |
1596 XSelectInput(display, w, | |
1597 event_mask & | |
1598 (~ | |
1599 (ButtonPressMask | ButtonReleaseMask | | |
1600 PointerMotionMask))); | |
1601 } | |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6401
diff
changeset
|
1602 } |
3990 | 1603 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
1604 #ifdef CONFIG_XF86VM |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1605 void vo_vm_switch(void) |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1606 { |
13828
b4ad5f0b550d
Fix erroneus extern declarations, fix wrong signedness of some vars
atmos4
parents:
13787
diff
changeset
|
1607 int vm_event, vm_error; |
b4ad5f0b550d
Fix erroneus extern declarations, fix wrong signedness of some vars
atmos4
parents:
13787
diff
changeset
|
1608 int vm_ver, vm_rev; |
12582 | 1609 int i, j, have_vm = 0; |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1610 int X = vo_dwidth, Y = vo_dheight; |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1611 int modeline_width, modeline_height; |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1612 |
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1613 int modecount; |
12582 | 1614 |
1615 if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error)) | |
1616 { | |
1617 XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev); | |
18508 | 1618 mp_msg(MSGT_VO, MSGL_V, "XF86VidMode extension v%i.%i\n", vm_ver, |
12582 | 1619 vm_rev); |
1620 have_vm = 1; | |
27887
47385b5c0613
Set modeline_width/height to sane values in vo_vm_switch even when
reimar
parents:
27885
diff
changeset
|
1621 } else { |
12582 | 1622 mp_msg(MSGT_VO, MSGL_WARN, |
18508 | 1623 "XF86VidMode extension not available.\n"); |
27887
47385b5c0613
Set modeline_width/height to sane values in vo_vm_switch even when
reimar
parents:
27885
diff
changeset
|
1624 } |
12582 | 1625 |
1626 if (have_vm) | |
1627 { | |
1628 if (vidmodes == NULL) | |
1629 XF86VidModeGetAllModeLines(mDisplay, mScreen, &modecount, | |
1630 &vidmodes); | |
1631 j = 0; | |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1632 modeline_width = vidmodes[0]->hdisplay; |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1633 modeline_height = vidmodes[0]->vdisplay; |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1634 |
12582 | 1635 for (i = 1; i < modecount; i++) |
1636 if ((vidmodes[i]->hdisplay >= X) | |
1637 && (vidmodes[i]->vdisplay >= Y)) | |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1638 if ((vidmodes[i]->hdisplay <= modeline_width) |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1639 && (vidmodes[i]->vdisplay <= modeline_height)) |
12582 | 1640 { |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1641 modeline_width = vidmodes[i]->hdisplay; |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1642 modeline_height = vidmodes[i]->vdisplay; |
12582 | 1643 j = i; |
1644 } | |
1645 | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16301
diff
changeset
|
1646 mp_msg(MSGT_VO, MSGL_INFO, MSGTR_SelectedVideoMode, |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1647 modeline_width, modeline_height, X, Y); |
12582 | 1648 XF86VidModeLockModeSwitch(mDisplay, mScreen, 0); |
1649 XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[j]); | |
1650 XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[j]); | |
27889
08a5ccceb21a
Set modified window position and monitor aspect in vo_vm_switch instead of in
reimar
parents:
27887
diff
changeset
|
1651 |
08a5ccceb21a
Set modified window position and monitor aspect in vo_vm_switch instead of in
reimar
parents:
27887
diff
changeset
|
1652 // FIXME: all this is more of a hack than proper solution |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1653 X = (vo_screenwidth - modeline_width) / 2; |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1654 Y = (vo_screenheight - modeline_height) / 2; |
12582 | 1655 XF86VidModeSetViewPort(mDisplay, mScreen, X, Y); |
27889
08a5ccceb21a
Set modified window position and monitor aspect in vo_vm_switch instead of in
reimar
parents:
27887
diff
changeset
|
1656 vo_dx = X; |
08a5ccceb21a
Set modified window position and monitor aspect in vo_vm_switch instead of in
reimar
parents:
27887
diff
changeset
|
1657 vo_dy = Y; |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1658 vo_dwidth = modeline_width; |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1659 vo_dheight = modeline_height; |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1660 aspect_save_screenres(modeline_width, modeline_height); |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1661 } |
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1662 } |
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1663 |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1664 void vo_vm_close(void) |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1665 { |
12582 | 1666 if (vidmodes != NULL) |
1667 { | |
1668 int i, modecount; | |
5019 | 1669 |
12582 | 1670 free(vidmodes); |
1671 vidmodes = NULL; | |
1672 XF86VidModeGetAllModeLines(mDisplay, mScreen, &modecount, | |
1673 &vidmodes); | |
1674 for (i = 0; i < modecount; i++) | |
1675 if ((vidmodes[i]->hdisplay == vo_screenwidth) | |
1676 && (vidmodes[i]->vdisplay == vo_screenheight)) | |
1677 { | |
1678 mp_msg(MSGT_VO, MSGL_INFO, | |
1679 "Returning to original mode %dx%d\n", | |
1680 vo_screenwidth, vo_screenheight); | |
1681 break; | |
1682 } | |
5019 | 1683 |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1684 XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[i]); |
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
1685 XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[i]); |
12582 | 1686 free(vidmodes); |
1687 vidmodes = NULL; | |
1688 } | |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1689 } |
3990 | 1690 #endif |
4425
6144f63cbaa1
common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4181
diff
changeset
|
1691 |
12582 | 1692 #endif /* X11_FULLSCREEN */ |
7256
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1693 |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1694 |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1695 /* |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1696 * Scan the available visuals on this Display/Screen. Try to find |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1697 * the 'best' available TrueColor visual that has a decent color |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1698 * depth (at least 15bit). If there are multiple visuals with depth |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1699 * >= 15bit, we prefer visuals with a smaller color depth. |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1700 */ |
12582 | 1701 int vo_find_depth_from_visuals(Display * dpy, int screen, |
1702 Visual ** visual_return) | |
7256
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1703 { |
12582 | 1704 XVisualInfo visual_tmpl; |
1705 XVisualInfo *visuals; | |
1706 int nvisuals, i; | |
1707 int bestvisual = -1; | |
1708 int bestvisual_depth = -1; | |
7256
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1709 |
12582 | 1710 visual_tmpl.screen = screen; |
1711 visual_tmpl.class = TrueColor; | |
1712 visuals = XGetVisualInfo(dpy, | |
1713 VisualScreenMask | VisualClassMask, | |
1714 &visual_tmpl, &nvisuals); | |
1715 if (visuals != NULL) | |
1716 { | |
1717 for (i = 0; i < nvisuals; i++) | |
1718 { | |
1719 mp_msg(MSGT_VO, MSGL_V, | |
17366 | 1720 "vo: X11 truecolor visual %#lx, depth %d, R:%lX G:%lX B:%lX\n", |
12582 | 1721 visuals[i].visualid, visuals[i].depth, |
1722 visuals[i].red_mask, visuals[i].green_mask, | |
1723 visuals[i].blue_mask); | |
1724 /* | |
21938 | 1725 * Save the visual index and its depth, if this is the first |
12582 | 1726 * truecolor visul, or a visual that is 'preferred' over the |
21938 | 1727 * previous 'best' visual. |
12582 | 1728 */ |
1729 if (bestvisual_depth == -1 | |
1730 || (visuals[i].depth >= 15 | |
1731 && (visuals[i].depth < bestvisual_depth | |
1732 || bestvisual_depth < 15))) | |
1733 { | |
1734 bestvisual = i; | |
1735 bestvisual_depth = visuals[i].depth; | |
1736 } | |
1737 } | |
1738 | |
1739 if (bestvisual != -1 && visual_return != NULL) | |
1740 *visual_return = visuals[bestvisual].visual; | |
1741 | |
1742 XFree(visuals); | |
7256
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1743 } |
12582 | 1744 return bestvisual_depth; |
7256
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1745 } |
ec6dd0a29d93
Add the code that chooses a good X11 truecolor visual to the vo_x11 config()
jkeil
parents:
7111
diff
changeset
|
1746 |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1747 |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1748 static Colormap cmap = None; |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1749 static XColor cols[256]; |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1750 static int cm_size, red_mask, green_mask, blue_mask; |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1751 |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1752 |
12582 | 1753 Colormap vo_x11_create_colormap(XVisualInfo * vinfo) |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1754 { |
12582 | 1755 unsigned k, r, g, b, ru, gu, bu, m, rv, gv, bv, rvu, gvu, bvu; |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1756 |
12582 | 1757 if (vinfo->class != DirectColor) |
1758 return XCreateColormap(mDisplay, mRootWin, vinfo->visual, | |
1759 AllocNone); | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1760 |
12582 | 1761 /* can this function get called twice or more? */ |
1762 if (cmap) | |
1763 return cmap; | |
1764 cm_size = vinfo->colormap_size; | |
1765 red_mask = vinfo->red_mask; | |
1766 green_mask = vinfo->green_mask; | |
1767 blue_mask = vinfo->blue_mask; | |
1768 ru = (red_mask & (red_mask - 1)) ^ red_mask; | |
1769 gu = (green_mask & (green_mask - 1)) ^ green_mask; | |
1770 bu = (blue_mask & (blue_mask - 1)) ^ blue_mask; | |
1771 rvu = 65536ull * ru / (red_mask + ru); | |
1772 gvu = 65536ull * gu / (green_mask + gu); | |
1773 bvu = 65536ull * bu / (blue_mask + bu); | |
1774 r = g = b = 0; | |
1775 rv = gv = bv = 0; | |
1776 m = DoRed | DoGreen | DoBlue; | |
1777 for (k = 0; k < cm_size; k++) | |
1778 { | |
1779 int t; | |
1780 | |
1781 cols[k].pixel = r | g | b; | |
1782 cols[k].red = rv; | |
1783 cols[k].green = gv; | |
1784 cols[k].blue = bv; | |
1785 cols[k].flags = m; | |
1786 t = (r + ru) & red_mask; | |
1787 if (t < r) | |
1788 m &= ~DoRed; | |
1789 r = t; | |
1790 t = (g + gu) & green_mask; | |
1791 if (t < g) | |
1792 m &= ~DoGreen; | |
1793 g = t; | |
1794 t = (b + bu) & blue_mask; | |
1795 if (t < b) | |
1796 m &= ~DoBlue; | |
1797 b = t; | |
1798 rv += rvu; | |
1799 gv += gvu; | |
1800 bv += bvu; | |
1801 } | |
1802 cmap = XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocAll); | |
1803 XStoreColors(mDisplay, cmap, cols, cm_size); | |
1804 return cmap; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1805 } |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1806 |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1807 /* |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1808 * Via colormaps/gamma ramps we can do gamma, brightness, contrast, |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1809 * hue and red/green/blue intensity, but we cannot do saturation. |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1810 * Currently only gamma, brightness and contrast are implemented. |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1811 * Is there sufficient interest for hue and/or red/green/blue intensity? |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1812 */ |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1813 /* these values have range [-100,100] and are initially 0 */ |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1814 static int vo_gamma = 0; |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1815 static int vo_brightness = 0; |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1816 static int vo_contrast = 0; |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1817 |
25674
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1818 static int transform_color(float val, |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1819 float brightness, float contrast, float gamma) { |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1820 float s = pow(val, gamma); |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1821 s = (s - 0.5) * contrast + 0.5; |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1822 s += brightness; |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1823 if (s < 0) |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1824 s = 0; |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1825 if (s > 1) |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1826 s = 1; |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1827 return (unsigned short) (s * 65535); |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1828 } |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1829 |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1830 uint32_t vo_x11_set_equalizer(char *name, int value) |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1831 { |
12582 | 1832 float gamma, brightness, contrast; |
1833 float rf, gf, bf; | |
1834 int k; | |
1835 | |
1836 /* | |
1837 * IMPLEMENTME: consider using XF86VidModeSetGammaRamp in the case | |
1838 * of TrueColor-ed window but be careful: | |
21938 | 1839 * Unlike the colormaps, which are private for the X client |
12582 | 1840 * who created them and thus automatically destroyed on client |
1841 * disconnect, this gamma ramp is a system-wide (X-server-wide) | |
21938 | 1842 * setting and _must_ be restored before the process exits. |
1843 * Unforunately when the process crashes (or gets killed | |
12582 | 1844 * for some reason) it is impossible to restore the setting, |
1845 * and such behaviour could be rather annoying for the users. | |
1846 */ | |
1847 if (cmap == None) | |
1848 return VO_NOTAVAIL; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1849 |
12582 | 1850 if (!strcasecmp(name, "brightness")) |
1851 vo_brightness = value; | |
1852 else if (!strcasecmp(name, "contrast")) | |
1853 vo_contrast = value; | |
1854 else if (!strcasecmp(name, "gamma")) | |
1855 vo_gamma = value; | |
1856 else | |
1857 return VO_NOTIMPL; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1858 |
12582 | 1859 brightness = 0.01 * vo_brightness; |
1860 contrast = tan(0.0095 * (vo_contrast + 100) * M_PI / 4); | |
1861 gamma = pow(2, -0.02 * vo_gamma); | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1862 |
12582 | 1863 rf = (float) ((red_mask & (red_mask - 1)) ^ red_mask) / red_mask; |
1864 gf = (float) ((green_mask & (green_mask - 1)) ^ green_mask) / | |
1865 green_mask; | |
1866 bf = (float) ((blue_mask & (blue_mask - 1)) ^ blue_mask) / blue_mask; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1867 |
12582 | 1868 /* now recalculate the colormap using the newly set value */ |
1869 for (k = 0; k < cm_size; k++) | |
1870 { | |
25674
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1871 cols[k].red = transform_color(rf * k, brightness, contrast, gamma); |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1872 cols[k].green = transform_color(gf * k, brightness, contrast, gamma); |
b13f792efe7b
Use a transform_color function to reduce code duplication
reimar
parents:
25626
diff
changeset
|
1873 cols[k].blue = transform_color(bf * k, brightness, contrast, gamma); |
12582 | 1874 } |
1875 | |
1876 XStoreColors(mDisplay, cmap, cols, cm_size); | |
1877 XFlush(mDisplay); | |
1878 return VO_TRUE; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1879 } |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1880 |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1881 uint32_t vo_x11_get_equalizer(char *name, int *value) |
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1882 { |
12582 | 1883 if (cmap == None) |
1884 return VO_NOTAVAIL; | |
1885 if (!strcasecmp(name, "brightness")) | |
1886 *value = vo_brightness; | |
1887 else if (!strcasecmp(name, "contrast")) | |
1888 *value = vo_contrast; | |
1889 else if (!strcasecmp(name, "gamma")) | |
1890 *value = vo_gamma; | |
1891 else | |
1892 return VO_NOTIMPL; | |
1893 return VO_TRUE; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1894 } |
12582 | 1895 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
1896 #ifdef CONFIG_XV |
33300
c7ebb0b711a6
Make vo_xv_set/get_eq() functions expect "const char *" for attribute name.
iive
parents:
32368
diff
changeset
|
1897 int vo_xv_set_eq(uint32_t xv_port, const char *name, int value) |
10359 | 1898 { |
1899 XvAttribute *attributes; | |
12582 | 1900 int i, howmany, xv_atom; |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1901 |
10359 | 1902 mp_dbg(MSGT_VO, MSGL_V, "xv_set_eq called! (%s, %d)\n", name, value); |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7766
diff
changeset
|
1903 |
10359 | 1904 /* get available attributes */ |
1905 attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany); | |
1906 for (i = 0; i < howmany && attributes; i++) | |
12582 | 1907 if (attributes[i].flags & XvSettable) |
1908 { | |
1909 xv_atom = XInternAtom(mDisplay, attributes[i].name, True); | |
10359 | 1910 /* since we have SET_DEFAULTS first in our list, we can check if it's available |
1911 then trigger it if it's ok so that the other values are at default upon query */ | |
12582 | 1912 if (xv_atom != None) |
1913 { | |
1914 int hue = 0, port_value, port_min, port_max; | |
10359 | 1915 |
12582 | 1916 if (!strcmp(attributes[i].name, "XV_BRIGHTNESS") && |
1917 (!strcasecmp(name, "brightness"))) | |
1918 port_value = value; | |
1919 else if (!strcmp(attributes[i].name, "XV_CONTRAST") && | |
1920 (!strcasecmp(name, "contrast"))) | |
1921 port_value = value; | |
1922 else if (!strcmp(attributes[i].name, "XV_SATURATION") && | |
1923 (!strcasecmp(name, "saturation"))) | |
1924 port_value = value; | |
1925 else if (!strcmp(attributes[i].name, "XV_HUE") && | |
1926 (!strcasecmp(name, "hue"))) | |
1927 { | |
1928 port_value = value; | |
1929 hue = 1; | |
1930 } else | |
10359 | 1931 /* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */ |
12582 | 1932 if (!strcmp(attributes[i].name, "XV_RED_INTENSITY") && |
1933 (!strcasecmp(name, "red_intensity"))) | |
1934 port_value = value; | |
1935 else if (!strcmp(attributes[i].name, "XV_GREEN_INTENSITY") | |
1936 && (!strcasecmp(name, "green_intensity"))) | |
1937 port_value = value; | |
1938 else if (!strcmp(attributes[i].name, "XV_BLUE_INTENSITY") | |
1939 && (!strcasecmp(name, "blue_intensity"))) | |
1940 port_value = value; | |
1941 else | |
1942 continue; | |
1943 | |
1944 port_min = attributes[i].min_value; | |
1945 port_max = attributes[i].max_value; | |
10359 | 1946 |
12582 | 1947 /* nvidia hue workaround */ |
1948 if (hue && port_min == 0 && port_max == 360) | |
1949 { | |
1950 port_value = | |
1951 (port_value >= | |
1952 0) ? (port_value - 100) : (port_value + 100); | |
10359 | 1953 } |
12582 | 1954 // -100 -> min |
1955 // 0 -> (max+min)/2 | |
1956 // +100 -> max | |
1957 port_value = | |
1958 (port_value + 100) * (port_max - port_min) / 200 + | |
1959 port_min; | |
1960 XvSetPortAttribute(mDisplay, xv_port, xv_atom, port_value); | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26436
diff
changeset
|
1961 return VO_TRUE; |
12582 | 1962 } |
1963 } | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26436
diff
changeset
|
1964 return VO_FALSE; |
10359 | 1965 } |
1966 | |
33300
c7ebb0b711a6
Make vo_xv_set/get_eq() functions expect "const char *" for attribute name.
iive
parents:
32368
diff
changeset
|
1967 int vo_xv_get_eq(uint32_t xv_port, const char *name, int *value) |
10359 | 1968 { |
12582 | 1969 |
10359 | 1970 XvAttribute *attributes; |
12582 | 1971 int i, howmany, xv_atom; |
10359 | 1972 |
1973 /* get available attributes */ | |
1974 attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany); | |
1975 for (i = 0; i < howmany && attributes; i++) | |
12582 | 1976 if (attributes[i].flags & XvGettable) |
1977 { | |
1978 xv_atom = XInternAtom(mDisplay, attributes[i].name, True); | |
10359 | 1979 /* since we have SET_DEFAULTS first in our list, we can check if it's available |
1980 then trigger it if it's ok so that the other values are at default upon query */ | |
12582 | 1981 if (xv_atom != None) |
1982 { | |
1983 int val, port_value = 0, port_min, port_max; | |
10359 | 1984 |
12582 | 1985 XvGetPortAttribute(mDisplay, xv_port, xv_atom, |
1986 &port_value); | |
1987 | |
1988 port_min = attributes[i].min_value; | |
1989 port_max = attributes[i].max_value; | |
1990 val = | |
1991 (port_value - port_min) * 200 / (port_max - port_min) - | |
1992 100; | |
10359 | 1993 |
12582 | 1994 if (!strcmp(attributes[i].name, "XV_BRIGHTNESS") && |
1995 (!strcasecmp(name, "brightness"))) | |
1996 *value = val; | |
1997 else if (!strcmp(attributes[i].name, "XV_CONTRAST") && | |
1998 (!strcasecmp(name, "contrast"))) | |
1999 *value = val; | |
2000 else if (!strcmp(attributes[i].name, "XV_SATURATION") && | |
2001 (!strcasecmp(name, "saturation"))) | |
2002 *value = val; | |
2003 else if (!strcmp(attributes[i].name, "XV_HUE") && | |
2004 (!strcasecmp(name, "hue"))) | |
2005 { | |
2006 /* nasty nvidia detect */ | |
2007 if (port_min == 0 && port_max == 360) | |
2008 *value = (val >= 0) ? (val - 100) : (val + 100); | |
2009 else | |
2010 *value = val; | |
2011 } else | |
10359 | 2012 /* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */ |
12582 | 2013 if (!strcmp(attributes[i].name, "XV_RED_INTENSITY") && |
2014 (!strcasecmp(name, "red_intensity"))) | |
2015 *value = val; | |
2016 else if (!strcmp(attributes[i].name, "XV_GREEN_INTENSITY") | |
2017 && (!strcasecmp(name, "green_intensity"))) | |
2018 *value = val; | |
2019 else if (!strcmp(attributes[i].name, "XV_BLUE_INTENSITY") | |
2020 && (!strcasecmp(name, "blue_intensity"))) | |
2021 *value = val; | |
2022 else | |
2023 continue; | |
10359 | 2024 |
12582 | 2025 mp_dbg(MSGT_VO, MSGL_V, "xv_get_eq called! (%s, %d)\n", |
2026 name, *value); | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26436
diff
changeset
|
2027 return VO_TRUE; |
12582 | 2028 } |
2029 } | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26436
diff
changeset
|
2030 return VO_FALSE; |
10359 | 2031 } |
2032 | |
14742 | 2033 /** \brief contains flags changing the execution of the colorkeying code */ |
2034 xv_ck_info_t xv_ck_info = { CK_METHOD_MANUALFILL, CK_SRC_CUR }; | |
2035 unsigned long xv_colorkey; ///< The color used for manual colorkeying. | |
2036 unsigned int xv_port; ///< The selected Xv port. | |
2037 | |
2038 /** | |
2039 * \brief Interns the requested atom if it is available. | |
2040 * | |
2041 * \param atom_name String containing the name of the requested atom. | |
2042 * | |
2043 * \return Returns the atom if available, else None is returned. | |
2044 * | |
2045 */ | |
2046 static Atom xv_intern_atom_if_exists( char const * atom_name ) | |
2047 { | |
2048 XvAttribute * attributes; | |
2049 int attrib_count,i; | |
2050 Atom xv_atom = None; | |
2051 | |
2052 attributes = XvQueryPortAttributes( mDisplay, xv_port, &attrib_count ); | |
2053 if( attributes!=NULL ) | |
2054 { | |
2055 for ( i = 0; i < attrib_count; ++i ) | |
2056 { | |
2057 if ( strcmp(attributes[i].name, atom_name ) == 0 ) | |
2058 { | |
2059 xv_atom = XInternAtom( mDisplay, atom_name, False ); | |
2060 break; // found what we want, break out | |
2061 } | |
2062 } | |
2063 XFree( attributes ); | |
2064 } | |
2065 | |
2066 return xv_atom; | |
2067 } | |
15826
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2068 |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2069 /** |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2070 * \brief Try to enable vsync for xv. |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2071 * \return Returns -1 if not available, 0 on failure and 1 on success. |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2072 */ |
22886 | 2073 int vo_xv_enable_vsync(void) |
15826
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2074 { |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2075 Atom xv_atom = xv_intern_atom_if_exists("XV_SYNC_TO_VBLANK"); |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2076 if (xv_atom == None) |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2077 return -1; |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2078 return XvSetPortAttribute(mDisplay, xv_port, xv_atom, 1) == Success; |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2079 } |
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15789
diff
changeset
|
2080 |
14742 | 2081 /** |
16958 | 2082 * \brief Get maximum supported source image dimensions. |
2083 * | |
2084 * This function does not set the variables pointed to by | |
21938 | 2085 * width and height if the information could not be retrieved, |
2086 * so the caller is reponsible for properly initializing them. | |
16958 | 2087 * |
2088 * \param width [out] The maximum width gets stored here. | |
2089 * \param height [out] The maximum height gets stored here. | |
2090 * | |
2091 */ | |
2092 void vo_xv_get_max_img_dim( uint32_t * width, uint32_t * height ) | |
2093 { | |
2094 XvEncodingInfo * encodings; | |
2095 //unsigned long num_encodings, idx; to int or too long?! | |
2096 unsigned int num_encodings, idx; | |
2097 | |
2098 XvQueryEncodings( mDisplay, xv_port, &num_encodings, &encodings); | |
2099 | |
2100 if ( encodings ) | |
2101 { | |
2102 for ( idx = 0; idx < num_encodings; ++idx ) | |
2103 { | |
2104 if ( strcmp( encodings[idx].name, "XV_IMAGE" ) == 0 ) | |
2105 { | |
2106 *width = encodings[idx].width; | |
2107 *height = encodings[idx].height; | |
2108 break; | |
2109 } | |
2110 } | |
2111 } | |
2112 | |
2113 mp_msg( MSGT_VO, MSGL_V, | |
2114 "[xv common] Maximum source image dimensions: %ux%u\n", | |
2115 *width, *height ); | |
2116 | |
2117 XvFreeEncodingInfo( encodings ); | |
2118 } | |
2119 | |
2120 /** | |
14742 | 2121 * \brief Print information about the colorkey method and source. |
2122 * | |
2123 * \param ck_handling Integer value containing the information about | |
2124 * colorkey handling (see x11_common.h). | |
2125 * | |
2126 * Outputs the content of |ck_handling| as a readable message. | |
2127 * | |
2128 */ | |
30556
358ac046eccc
libvo: Mark functions not used outside of their files as static.
diego
parents:
30516
diff
changeset
|
2129 static void vo_xv_print_ck_info(void) |
14742 | 2130 { |
2131 mp_msg( MSGT_VO, MSGL_V, "[xv common] " ); | |
2132 | |
2133 switch ( xv_ck_info.method ) | |
2134 { | |
2135 case CK_METHOD_NONE: | |
2136 mp_msg( MSGT_VO, MSGL_V, "Drawing no colorkey.\n" ); return; | |
2137 case CK_METHOD_AUTOPAINT: | |
2138 mp_msg( MSGT_VO, MSGL_V, "Colorkey is drawn by Xv." ); break; | |
2139 case CK_METHOD_MANUALFILL: | |
2140 mp_msg( MSGT_VO, MSGL_V, "Drawing colorkey manually." ); break; | |
2141 case CK_METHOD_BACKGROUND: | |
2142 mp_msg( MSGT_VO, MSGL_V, "Colorkey is drawn as window background." ); break; | |
2143 } | |
2144 | |
2145 mp_msg( MSGT_VO, MSGL_V, "\n[xv common] " ); | |
2146 | |
2147 switch ( xv_ck_info.source ) | |
2148 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2149 case CK_SRC_CUR: |
17366 | 2150 mp_msg( MSGT_VO, MSGL_V, "Using colorkey from Xv (0x%06lx).\n", |
14742 | 2151 xv_colorkey ); |
2152 break; | |
2153 case CK_SRC_USE: | |
2154 if ( xv_ck_info.method == CK_METHOD_AUTOPAINT ) | |
2155 { | |
2156 mp_msg( MSGT_VO, MSGL_V, | |
17366 | 2157 "Ignoring colorkey from MPlayer (0x%06lx).\n", |
14742 | 2158 xv_colorkey ); |
2159 } | |
2160 else | |
2161 { | |
2162 mp_msg( MSGT_VO, MSGL_V, | |
17366 | 2163 "Using colorkey from MPlayer (0x%06lx)." |
14742 | 2164 " Use -colorkey to change.\n", |
2165 xv_colorkey ); | |
2166 } | |
2167 break; | |
2168 case CK_SRC_SET: | |
2169 mp_msg( MSGT_VO, MSGL_V, | |
17366 | 2170 "Setting and using colorkey from MPlayer (0x%06lx)." |
14742 | 2171 " Use -colorkey to change.\n", |
2172 xv_colorkey ); | |
2173 break; | |
2174 } | |
2175 } | |
2176 /** | |
2177 * \brief Init colorkey depending on the settings in xv_ck_info. | |
2178 * | |
2179 * \return Returns 0 on failure and 1 on success. | |
2180 * | |
2181 * Sets the colorkey variable according to the CK_SRC_* and CK_METHOD_* | |
2182 * flags in xv_ck_info. | |
2183 * | |
2184 * Possiblilities: | |
2185 * * Methods | |
2186 * - manual colorkey drawing ( CK_METHOD_MANUALFILL ) | |
2187 * - set colorkey as window background ( CK_METHOD_BACKGROUND ) | |
2188 * - let Xv paint the colorkey ( CK_METHOD_AUTOPAINT ) | |
2189 * * Sources | |
2190 * - use currently set colorkey ( CK_SRC_CUR ) | |
2191 * - use colorkey in vo_colorkey ( CK_SRC_USE ) | |
2192 * - use and set colorkey in vo_colorkey ( CK_SRC_SET ) | |
2193 * | |
2194 * NOTE: If vo_colorkey has bits set after the first 3 low order bytes | |
2195 * we don't draw anything as this means it was forced to off. | |
2196 */ | |
22886 | 2197 int vo_xv_init_colorkey(void) |
14742 | 2198 { |
2199 Atom xv_atom; | |
2200 int rez; | |
2201 | |
2202 /* check if colorkeying is needed */ | |
2203 xv_atom = xv_intern_atom_if_exists( "XV_COLORKEY" ); | |
2204 | |
2205 /* if we have to deal with colorkeying ... */ | |
2206 if( xv_atom != None && !(vo_colorkey & 0xFF000000) ) | |
2207 { | |
2208 /* check if we should use the colorkey specified in vo_colorkey */ | |
2209 if ( xv_ck_info.source != CK_SRC_CUR ) | |
2210 { | |
2211 xv_colorkey = vo_colorkey; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2212 |
14742 | 2213 /* check if we have to set the colorkey too */ |
2214 if ( xv_ck_info.source == CK_SRC_SET ) | |
2215 { | |
2216 xv_atom = XInternAtom(mDisplay, "XV_COLORKEY",False); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2217 |
14742 | 2218 rez = XvSetPortAttribute( mDisplay, xv_port, xv_atom, vo_colorkey ); |
2219 if ( rez != Success ) | |
2220 { | |
2221 mp_msg( MSGT_VO, MSGL_FATAL, | |
2222 "[xv common] Couldn't set colorkey!\n" ); | |
2223 return 0; // error setting colorkey | |
2224 } | |
2225 } | |
2226 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2227 else |
14742 | 2228 { |
2229 int colorkey_ret; | |
2230 | |
2231 rez=XvGetPortAttribute(mDisplay,xv_port, xv_atom, &colorkey_ret); | |
2232 if ( rez == Success ) | |
2233 { | |
2234 xv_colorkey = colorkey_ret; | |
2235 } | |
2236 else | |
2237 { | |
2238 mp_msg( MSGT_VO, MSGL_FATAL, | |
2239 "[xv common] Couldn't get colorkey!" | |
2240 "Maybe the selected Xv port has no overlay.\n" ); | |
2241 return 0; // error getting colorkey | |
2242 } | |
2243 } | |
2244 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2245 xv_atom = xv_intern_atom_if_exists( "XV_AUTOPAINT_COLORKEY" ); |
15186 | 2246 |
14742 | 2247 /* should we draw the colorkey ourselves or activate autopainting? */ |
2248 if ( xv_ck_info.method == CK_METHOD_AUTOPAINT ) | |
2249 { | |
2250 rez = !Success; // reset rez to something different than Success | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2251 |
14742 | 2252 if ( xv_atom != None ) // autopaint is supported |
2253 { | |
2254 rez = XvSetPortAttribute( mDisplay, xv_port, xv_atom, 1 ); | |
2255 } | |
2256 | |
2257 if ( rez != Success ) | |
2258 { | |
2259 // fallback to manual colorkey drawing | |
2260 xv_ck_info.method = CK_METHOD_MANUALFILL; | |
2261 } | |
2262 } | |
15186 | 2263 else // disable colorkey autopainting if supported |
2264 { | |
2265 if ( xv_atom != None ) // we have autopaint attribute | |
2266 { | |
2267 XvSetPortAttribute( mDisplay, xv_port, xv_atom, 0 ); | |
2268 } | |
2269 } | |
14742 | 2270 } |
2271 else // do no colorkey drawing at all | |
2272 { | |
2273 xv_ck_info.method = CK_METHOD_NONE; | |
2274 } /* end: should we draw colorkey */ | |
2275 | |
21938 | 2276 /* output information about the current colorkey settings */ |
14742 | 2277 vo_xv_print_ck_info(); |
2278 | |
2279 return 1; // success | |
2280 } | |
2281 | |
2282 /** | |
2283 * \brief Draw the colorkey on the video window. | |
2284 * | |
2285 * Draws the colorkey depending on the set method ( colorkey_handling ). | |
2286 * | |
21938 | 2287 * Also draws the black bars ( when the video doesn't fit the display in |
2288 * fullscreen ) separately, so they don't overlap with the video area. | |
2289 * It doesn't call XFlush. | |
14742 | 2290 * |
2291 */ | |
24890 | 2292 void vo_xv_draw_colorkey( int32_t x, int32_t y, |
15100 | 2293 int32_t w, int32_t h ) |
14742 | 2294 { |
15100 | 2295 if( xv_ck_info.method == CK_METHOD_MANUALFILL || |
2296 xv_ck_info.method == CK_METHOD_BACKGROUND )//less tearing than XClearWindow() | |
14742 | 2297 { |
2298 XSetForeground( mDisplay, vo_gc, xv_colorkey ); | |
2299 XFillRectangle( mDisplay, vo_window, vo_gc, | |
2300 x, y, | |
2301 w, h ); | |
2302 } | |
2303 | |
2304 /* draw black bars if needed */ | |
15100 | 2305 /* TODO! move this to vo_x11_clearwindow_part() */ |
14742 | 2306 if ( vo_fs ) |
2307 { | |
2308 XSetForeground( mDisplay, vo_gc, 0 ); | |
21938 | 2309 /* making non-overlap fills, requires 8 checks instead of 4 */ |
14742 | 2310 if ( y > 0 ) |
2311 XFillRectangle( mDisplay, vo_window, vo_gc, | |
2312 0, 0, | |
2313 vo_screenwidth, y); | |
2314 if (x > 0) | |
2315 XFillRectangle( mDisplay, vo_window, vo_gc, | |
15100 | 2316 0, 0, |
2317 x, vo_screenheight); | |
14742 | 2318 if (x + w < vo_screenwidth) |
2319 XFillRectangle( mDisplay, vo_window, vo_gc, | |
15100 | 2320 x + w, 0, |
2321 vo_screenwidth, vo_screenheight); | |
14742 | 2322 if (y + h < vo_screenheight) |
2323 XFillRectangle( mDisplay, vo_window, vo_gc, | |
2324 0, y + h, | |
15100 | 2325 vo_screenwidth, vo_screenheight); |
14742 | 2326 } |
2327 } | |
2328 | |
21938 | 2329 /** \brief Tests if a valid argument for the ck suboption was given. */ |
14742 | 2330 int xv_test_ck( void * arg ) |
2331 { | |
2332 strarg_t * strarg = (strarg_t *)arg; | |
2333 | |
15734
7e4fa8fc255c
helper functions for comparing strarg_t "strings".
reimar
parents:
15186
diff
changeset
|
2334 if ( strargcmp( strarg, "use" ) == 0 || |
7e4fa8fc255c
helper functions for comparing strarg_t "strings".
reimar
parents:
15186
diff
changeset
|
2335 strargcmp( strarg, "set" ) == 0 || |
7e4fa8fc255c
helper functions for comparing strarg_t "strings".
reimar
parents:
15186
diff
changeset
|
2336 strargcmp( strarg, "cur" ) == 0 ) |
14742 | 2337 { |
2338 return 1; | |
2339 } | |
2340 | |
2341 return 0; | |
2342 } | |
21938 | 2343 /** \brief Tests if a valid arguments for the ck-method suboption was given. */ |
14742 | 2344 int xv_test_ckm( void * arg ) |
2345 { | |
2346 strarg_t * strarg = (strarg_t *)arg; | |
2347 | |
15734
7e4fa8fc255c
helper functions for comparing strarg_t "strings".
reimar
parents:
15186
diff
changeset
|
2348 if ( strargcmp( strarg, "bg" ) == 0 || |
7e4fa8fc255c
helper functions for comparing strarg_t "strings".
reimar
parents:
15186
diff
changeset
|
2349 strargcmp( strarg, "man" ) == 0 || |
7e4fa8fc255c
helper functions for comparing strarg_t "strings".
reimar
parents:
15186
diff
changeset
|
2350 strargcmp( strarg, "auto" ) == 0 ) |
14742 | 2351 { |
2352 return 1; | |
2353 } | |
2354 | |
2355 return 0; | |
2356 } | |
2357 | |
2358 /** | |
2359 * \brief Modify the colorkey_handling var according to str | |
2360 * | |
2361 * Checks if a valid pointer ( not NULL ) to the string | |
2362 * was given. And in that case modifies the colorkey_handling | |
2363 * var to reflect the requested behaviour. | |
2364 * If nothing happens the content of colorkey_handling stays | |
2365 * the same. | |
2366 * | |
2367 * \param str Pointer to the string or NULL | |
2368 * | |
2369 */ | |
2370 void xv_setup_colorkeyhandling( char const * ck_method_str, | |
2371 char const * ck_str ) | |
2372 { | |
2373 /* check if a valid pointer to the string was passed */ | |
2374 if ( ck_str ) | |
2375 { | |
2376 if ( strncmp( ck_str, "use", 3 ) == 0 ) | |
2377 { | |
2378 xv_ck_info.source = CK_SRC_USE; | |
2379 } | |
2380 else if ( strncmp( ck_str, "set", 3 ) == 0 ) | |
2381 { | |
2382 xv_ck_info.source = CK_SRC_SET; | |
2383 } | |
2384 } | |
2385 /* check if a valid pointer to the string was passed */ | |
2386 if ( ck_method_str ) | |
2387 { | |
2388 if ( strncmp( ck_method_str, "bg", 2 ) == 0 ) | |
2389 { | |
2390 xv_ck_info.method = CK_METHOD_BACKGROUND; | |
2391 } | |
2392 else if ( strncmp( ck_method_str, "man", 3 ) == 0 ) | |
2393 { | |
2394 xv_ck_info.method = CK_METHOD_MANUALFILL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2395 } |
14742 | 2396 else if ( strncmp( ck_method_str, "auto", 4 ) == 0 ) |
2397 { | |
2398 xv_ck_info.method = CK_METHOD_AUTOPAINT; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28771
diff
changeset
|
2399 } |
14742 | 2400 } |
2401 } | |
2402 | |
10359 | 2403 #endif |