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