146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997-2006 Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Lesser General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2.1 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Lesser General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Lesser General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free Software
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h"
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* This is currently only used to enable DGA mouse.
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   There is a completely separate DGA driver that is fullscreen-only.
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_video.h"
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_cursor_c.h"
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_x11dga_c.h"
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Global for the error handler */
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint dga_event, dga_error = -1;
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid X11_EnableDGAMouse(_THIS)
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_DRIVER_X11_DGAMOUSE
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    static int use_dgamouse = -1;
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Check configuration to see if we should use DGA mouse */
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if ( use_dgamouse < 0 ) {
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        int dga_major, dga_minor;
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        int dga_flags;
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        const char *env_use_dgamouse;
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        use_dgamouse = 1;
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        env_use_dgamouse = SDL_getenv("SDL_VIDEO_X11_DGAMOUSE");
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        if ( env_use_dgamouse ) {
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            use_dgamouse = SDL_atoi(env_use_dgamouse);
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        }
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Check for buggy X servers */
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        if ( use_dgamouse && BUGGY_XFREE86(==, 4000) ) {
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            use_dgamouse = 0;
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        }
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        if ( !use_dgamouse || !local_X11 ||
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             !SDL_NAME(XF86DGAQueryExtension)(SDL_Display, &dga_event, &dga_error) ||
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             !SDL_NAME(XF86DGAQueryVersion)(SDL_Display, &dga_major, &dga_minor) ||
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             !SDL_NAME(XF86DGAQueryDirectVideo)(SDL_Display, SDL_Screen, &dga_flags) ||
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner             !(dga_flags & XF86DGADirectPresent) ) {
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            use_dgamouse = 0;
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        }
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if ( use_dgamouse && !(using_dga & DGA_MOUSE) ) {
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( SDL_NAME(XF86DGADirectVideo)(SDL_Display, SDL_Screen, XF86DGADirectMouse) ) {
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner            using_dga |= DGA_MOUSE;
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        }
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* SDL_VIDEO_DRIVER_X11_DGAMOUSE */
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Argh.  Glide resets DGA mouse mode when it makes the context current! */
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid X11_CheckDGAMouse(_THIS)
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_DRIVER_X11_DGAMOUSE
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if ( using_dga & DGA_MOUSE ) {
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_NAME(XF86DGADirectVideo)(SDL_Display,SDL_Screen,XF86DGADirectMouse);
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid X11_DisableDGAMouse(_THIS)
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_DRIVER_X11_DGAMOUSE
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    if ( using_dga & DGA_MOUSE ) {
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_NAME(XF86DGADirectVideo)(SDL_Display, SDL_Screen, 0);
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        using_dga &= ~DGA_MOUSE;
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* SDL_VIDEO_DRIVER_X11_DGAMOUSE */
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
91