ao_pulse: support native mute control
[mplayer.git] / libvo / vo_xmga.c
blobcc6cd1cd0e30a95d1339fa65d19af6e752cebf4e
1 /*
2 * copyright (C) 2001 Zoltan Ponekker
4 * This file is part of MPlayer.
6 * MPlayer is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * MPlayer is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 //#define SHOW_TIME
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
27 #include "config.h"
29 #include "video_out.h"
30 #include "video_out_internal.h"
33 #include <sys/ioctl.h>
34 #include <unistd.h>
35 #include <fcntl.h>
36 #include <sys/mman.h>
38 #include "drivers/mga_vid.h"
40 #include <X11/Xlib.h>
41 #include <X11/Xutil.h>
42 #include <errno.h>
44 #ifdef CONFIG_XINERAMA
45 #include <X11/extensions/Xinerama.h>
46 #endif
48 #include "x11_common.h"
49 #include "sub/sub.h"
50 #include "aspect.h"
52 #ifdef SHOW_TIME
53 #include "osdep/timer.h"
54 static unsigned int timer = 0;
55 static unsigned int timerd = 0;
56 #endif
58 static const vo_info_t info = {
59 "Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)",
60 "xmga",
61 "Zoltan Ponekker <pontscho@makacs.poliod.hu>",
65 const LIBVO_EXTERN(xmga)
67 static uint32_t mDepth;
68 static XWindowAttributes attribs;
69 static int colorkey;
71 static uint32_t mvHeight;
72 static uint32_t mvWidth;
74 static XSetWindowAttributes xWAttribs;
76 static int initialized = 0;
78 #define VO_XMGA
79 #include "mga_template.c"
80 #undef VO_XMGA
82 static void mDrawColorKey(void)
84 XSetBackground(mDisplay, vo_gc, 0);
85 XClearWindow(mDisplay, vo_window);
86 XSetForeground(mDisplay, vo_gc, colorkey);
87 XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth,
88 (vo_fs ? drwHeight - 1 : drwHeight));
89 XFlush(mDisplay);
92 static void check_events(void)
94 int e = vo_x11_check_events(mDisplay);
96 if (e & (VO_EVENT_RESIZE | VO_EVENT_MOVE))
97 set_window();
98 if (e & (VO_EVENT_RESIZE | VO_EVENT_EXPOSE))
99 mDrawColorKey();
102 static void flip_page(void)
104 #ifdef SHOW_TIME
105 unsigned int t;
107 t = GetTimer();
108 mp_msg(MSGT_VO, MSGL_STATUS,
109 " [timer: %08X diff: %6d dd: %6d ] \n", t, t - timer,
110 (t - timer) - timerd);
111 timerd = t - timer;
112 timer = t;
113 #endif
115 vo_mga_flip_page();
118 static int config(uint32_t width, uint32_t height, uint32_t d_width,
119 uint32_t d_height, uint32_t flags, char *title,
120 uint32_t format)
122 XVisualInfo vinfo;
123 unsigned long xswamask;
124 int r, g, b;
126 if (mga_init(width, height, format))
127 return -1; // ioctl errors?
129 mvWidth = width;
130 mvHeight = height;
132 r = (vo_colorkey & 0x00ff0000) >> 16;
133 g = (vo_colorkey & 0x0000ff00) >> 8;
134 b = vo_colorkey & 0x000000ff;
135 switch (vo_depthonscreen)
137 case 32:
138 colorkey = vo_colorkey;
139 break;
140 case 24:
141 colorkey = vo_colorkey & 0x00ffffff;
142 break;
143 case 16:
144 colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
145 break;
146 case 15:
147 colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);
148 break;
149 default:
150 mp_msg(MSGT_VO, MSGL_ERR,
151 "Sorry, this (%d) color depth not supported.\n",
152 vo_depthonscreen);
153 return -1;
155 mp_msg(MSGT_VO, MSGL_V, "Using colorkey: %x\n", colorkey);
157 initialized = 1;
159 XGetWindowAttributes(mDisplay, mRootWin, &attribs);
160 mDepth = attribs.depth;
161 if (mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32)
162 mDepth = 24;
163 XMatchVisualInfo(mDisplay, mScreen, mDepth, TrueColor, &vinfo);
164 xWAttribs.colormap =
165 XCreateColormap(mDisplay, mRootWin, vinfo.visual, AllocNone);
166 xWAttribs.background_pixel = 0;
167 xWAttribs.border_pixel = 0;
168 xswamask = CWBackPixel | CWBorderPixel | CWColormap;
170 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height,
171 flags, xWAttribs.colormap, "xmga", title);
172 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xWAttribs);
174 mga_vid_config.colkey_on = 1;
175 mga_vid_config.colkey_red = r;
176 mga_vid_config.colkey_green = g;
177 mga_vid_config.colkey_blue = b;
179 set_window(); // set up mga_vid_config.dest_width etc
181 XSync(mDisplay, False);
183 ioctl(f, MGA_VID_ON, 0);
185 return 0;
188 static void uninit(void)
190 mp_msg(MSGT_VO, MSGL_V, "vo: uninit!\n");
191 mga_uninit();
192 if (!initialized)
193 return; // no window?
194 initialized = 0;
195 vo_x11_uninit(); // destroy the window