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