src/video/x11/SDL_x11dyn.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 12 Jan 2009 06:19:05 +0000
changeset 3025 54fac87e1f34
parent 2859 99210400e8b9
child 3036 76a1692fcec5
permissions -rw-r--r--
Added an API to enable/disable the screen saver.
The screensaver is disabled by default when using SDL 1.2 compatibility.
Use the new XScreenSaver extension, removed unused DPMS extension.
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2009 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Library General Public
     7     License as published by the Free Software Foundation; either
     8     version 2 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Library General Public License for more details.
    14 
    15     You should have received a copy of the GNU Library General Public
    16     License along with this library; if not, write to the Free
    17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 #define DEBUG_DYNAMIC_X11 0
    25 
    26 #include "SDL_x11dyn.h"
    27 
    28 #if DEBUG_DYNAMIC_X11
    29 #include <stdio.h>
    30 #endif
    31 
    32 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC
    33 
    34 #include "SDL_name.h"
    35 #include "SDL_loadso.h"
    36 
    37 typedef struct
    38 {
    39     void *lib;
    40     const char *libname;
    41 } x11dynlib;
    42 
    43 #ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC
    44 #define SDL_VIDEO_DRIVER_X11_DYNAMIC NULL
    45 #endif
    46 #ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT
    47 #define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT NULL
    48 #endif
    49 #ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER
    50 #define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER NULL
    51 #endif
    52 #ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR
    53 #define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR NULL
    54 #endif
    55 #ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT
    56 #define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT NULL
    57 #endif
    58 
    59 static x11dynlib x11libs[] = {
    60     {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC},
    61     {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT},
    62     {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER},
    63     {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR},
    64     {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT},
    65     {NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS},
    66 };
    67 
    68 static void
    69 X11_GetSym(const char *fnname, int *rc, void **fn)
    70 {
    71     int i;
    72     for (i = 0; i < SDL_TABLESIZE(x11libs); i++) {
    73         if (x11libs[i].lib != NULL) {
    74             *fn = SDL_LoadFunction(x11libs[i].lib, fnname);
    75             if (*fn != NULL)
    76                 break;
    77         }
    78     }
    79 
    80 #if DEBUG_DYNAMIC_X11
    81     if (*fn != NULL)
    82         printf("X11: Found '%s' in %s (%p)\n", fnname, x11libs[i].libname,
    83                *fn);
    84     else
    85         printf("X11: Symbol '%s' NOT FOUND!\n", fnname);
    86 #endif
    87 
    88     if (*fn == NULL)
    89         *rc = 0;                /* kill this module. */
    90 }
    91 
    92 
    93 /* Define all the function pointers and wrappers... */
    94 #define SDL_X11_MODULE(modname)
    95 #define SDL_X11_SYM(rc,fn,params,args,ret) \
    96 	static rc (*p##fn) params = NULL; \
    97 	rc fn params { ret p##fn args ; }
    98 #include "SDL_x11sym.h"
    99 #undef SDL_X11_MODULE
   100 #undef SDL_X11_SYM
   101 #endif /* SDL_VIDEO_DRIVER_X11_DYNAMIC */
   102 
   103 /* Annoying varargs entry point... */
   104 #ifdef X_HAVE_UTF8_STRING
   105 XIC(*pXCreateIC) (XIM,...) = NULL;
   106 char *(*pXGetICValues) (XIC, ...) = NULL;
   107 #endif
   108 
   109 /* These SDL_X11_HAVE_* flags are here whether you have dynamic X11 or not. */
   110 #define SDL_X11_MODULE(modname) int SDL_X11_HAVE_##modname = 1;
   111 #define SDL_X11_SYM(rc,fn,params,args,ret)
   112 #include "SDL_x11sym.h"
   113 #undef SDL_X11_MODULE
   114 #undef SDL_X11_SYM
   115 
   116 
   117 static int x11_load_refcount = 0;
   118 
   119 void
   120 SDL_X11_UnloadSymbols(void)
   121 {
   122 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC
   123     /* Don't actually unload if more than one module is using the libs... */
   124     if (x11_load_refcount > 0) {
   125         if (--x11_load_refcount == 0) {
   126             int i;
   127 
   128             /* set all the function pointers to NULL. */
   129 #define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1;
   130 #define SDL_X11_SYM(rc,fn,params,args,ret) p##fn = NULL;
   131 #include "SDL_x11sym.h"
   132 #undef SDL_X11_MODULE
   133 #undef SDL_X11_SYM
   134 
   135 #ifdef X_HAVE_UTF8_STRING
   136             pXCreateIC = NULL;
   137             pXGetICValues = NULL;
   138 #endif
   139 
   140             for (i = 0; i < SDL_TABLESIZE(x11libs); i++) {
   141                 if (x11libs[i].lib != NULL) {
   142                     SDL_UnloadObject(x11libs[i].lib);
   143                     x11libs[i].lib = NULL;
   144                 }
   145             }
   146         }
   147     }
   148 #endif
   149 }
   150 
   151 /* returns non-zero if all needed symbols were loaded. */
   152 int
   153 SDL_X11_LoadSymbols(void)
   154 {
   155     int rc = 1;                 /* always succeed if not using Dynamic X11 stuff. */
   156 
   157 #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC
   158     /* deal with multiple modules (dga, x11, etc) needing these symbols... */
   159     if (x11_load_refcount++ == 0) {
   160         int i;
   161         int *thismod = NULL;
   162         for (i = 0; i < SDL_TABLESIZE(x11libs); i++) {
   163             if (x11libs[i].libname != NULL) {
   164                 x11libs[i].lib = SDL_LoadObject(x11libs[i].libname);
   165             }
   166         }
   167 #define SDL_X11_MODULE(modname) thismod = &SDL_X11_HAVE_##modname;
   168 #define SDL_X11_SYM(a,fn,x,y,z) X11_GetSym(#fn,thismod,(void**)&p##fn);
   169 #include "SDL_x11sym.h"
   170 #undef SDL_X11_MODULE
   171 #undef SDL_X11_SYM
   172 
   173 #ifdef X_HAVE_UTF8_STRING
   174         X11_GetSym("XCreateIC", &SDL_X11_HAVE_UTF8, (void **) &pXCreateIC);
   175         X11_GetSym("XGetICValues", &SDL_X11_HAVE_UTF8,
   176                    (void **) &pXGetICValues);
   177 #endif
   178 
   179         if (SDL_X11_HAVE_BASEXLIB) {
   180             /* all required symbols loaded. */
   181             SDL_ClearError();
   182         } else {
   183             /* in case something got loaded... */
   184             SDL_X11_UnloadSymbols();
   185             rc = 0;
   186         }
   187     }
   188 #else
   189 #ifdef X_HAVE_UTF8_STRING
   190     pXCreateIC = XCreateIC;
   191     pXGetICValues = XGetICValues;
   192 #endif
   193 #endif
   194 
   195     return rc;
   196 }
   197 
   198 /* vi: set ts=4 sw=4 expandtab: */