| 1 | /* |
| 2 | * fg_internal_x11.h |
| 3 | * |
| 4 | * The freeglut library private include file. |
| 5 | * |
| 6 | * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved. |
| 7 | * Written by Diederick C. Niehorster, <dcnieho@gmail.com> |
| 8 | * Creation date: Fri Jan 20, 2012 |
| 9 | * |
| 10 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 11 | * copy of this software and associated documentation files (the "Software"), |
| 12 | * to deal in the Software without restriction, including without limitation |
| 13 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| 14 | * and/or sell copies of the Software, and to permit persons to whom the |
| 15 | * Software is furnished to do so, subject to the following conditions: |
| 16 | * |
| 17 | * The above copyright notice and this permission notice shall be included |
| 18 | * in all copies or substantial portions of the Software. |
| 19 | * |
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| 21 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 23 | * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| 24 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| 25 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 26 | */ |
| 27 | |
| 28 | #ifndef FREEGLUT_INTERNAL_X11_H |
| 29 | #define FREEGLUT_INTERNAL_X11_H |
| 30 | |
| 31 | |
| 32 | /* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */ |
| 33 | #ifdef EGL_VERSION_1_0 |
| 34 | #include "egl/fg_internal_egl.h" |
| 35 | #else |
| 36 | #include <GL/glx.h> |
| 37 | #include "x11/fg_internal_x11_glx.h" |
| 38 | #endif |
| 39 | #include <X11/Xlib.h> |
| 40 | #include <X11/Xatom.h> |
| 41 | #include <X11/keysym.h> |
| 42 | #include <X11/extensions/XInput.h> |
| 43 | #ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H |
| 44 | # include <X11/extensions/xf86vmode.h> |
| 45 | #endif |
| 46 | #ifdef HAVE_X11_EXTENSIONS_XRANDR_H |
| 47 | # include <X11/extensions/Xrandr.h> |
| 48 | #endif |
| 49 | |
| 50 | |
| 51 | /* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */ |
| 52 | /* The structure used by display initialization in fg_init.c */ |
| 53 | typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay; |
| 54 | struct tagSFG_PlatformDisplay |
| 55 | { |
| 56 | Display* Display; /* The display we are being run in. */ |
| 57 | int Screen; /* The screen we are about to use. */ |
| 58 | Window RootWindow; /* The screen's root window. */ |
| 59 | int Connection; /* The display's connection number */ |
| 60 | Atom DeleteWindow; /* The window deletion atom */ |
| 61 | Atom State; /* The state atom */ |
| 62 | Atom StateFullScreen; /* The full screen atom */ |
| 63 | int NetWMSupported; /* Flag for EWMH Window Managers */ |
| 64 | Atom NetWMPid; /* The _NET_WM_PID atom */ |
| 65 | Atom ClientMachine; /* The client machine name atom */ |
| 66 | XIM IM; /* The input method */ |
| 67 | XIMStyle InputStyle; /* The input method style */ |
| 68 | |
| 69 | #ifdef HAVE_X11_EXTENSIONS_XRANDR_H |
| 70 | int prev_xsz, prev_ysz; |
| 71 | int prev_refresh; |
| 72 | int prev_size_valid; |
| 73 | #endif /* HAVE_X11_EXTENSIONS_XRANDR_H */ |
| 74 | |
| 75 | #ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H |
| 76 | /* |
| 77 | * XF86VidMode may be compilable even if it fails at runtime. Therefore, |
| 78 | * the validity of the VidMode has to be tracked |
| 79 | */ |
| 80 | int DisplayModeValid; /* Flag that indicates runtime status*/ |
| 81 | XF86VidModeModeLine DisplayMode; /* Current screen's display settings */ |
| 82 | int DisplayModeClock; /* The display mode's refresh rate */ |
| 83 | int DisplayViewPortX; /* saved X location of the viewport */ |
| 84 | int DisplayViewPortY; /* saved Y location of the viewport */ |
| 85 | #endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */ |
| 86 | |
| 87 | #ifdef EGL_VERSION_1_0 |
| 88 | struct tagSFG_PlatformDisplayEGL egl; |
| 89 | #endif |
| 90 | |
| 91 | int DisplayPointerX; /* saved X location of the pointer */ |
| 92 | int DisplayPointerY; /* saved Y location of the pointer */ |
| 93 | }; |
| 94 | |
| 95 | |
| 96 | /* |
| 97 | * Make "freeglut" window handle and context types so that we don't need so |
| 98 | * much conditionally-compiled code later in the library. |
| 99 | */ |
| 100 | #ifndef EGL_VERSION_1_0 |
| 101 | typedef Window SFG_WindowHandleType ; |
| 102 | typedef GLXContext SFG_WindowContextType ; |
| 103 | #endif |
| 104 | typedef struct tagSFG_PlatformContext SFG_PlatformContext; |
| 105 | struct tagSFG_PlatformContext |
| 106 | { |
| 107 | #ifdef EGL_VERSION_1_0 |
| 108 | struct tagSFG_PlatformContextEGL egl; |
| 109 | #else |
| 110 | GLXFBConfig FBConfig; /* The window's FBConfig */ |
| 111 | #endif |
| 112 | XIC IC; /* The window's input context */ |
| 113 | }; |
| 114 | |
| 115 | |
| 116 | /* Window's state description. This structure should be kept portable. */ |
| 117 | typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState; |
| 118 | struct tagSFG_PlatformWindowState |
| 119 | { |
| 120 | int OldWidth; /* Window width from before a resize */ |
| 121 | int OldHeight; /* " height " " " " */ |
| 122 | GLboolean KeyRepeating; /* Currently in repeat mode? */ |
| 123 | }; |
| 124 | |
| 125 | |
| 126 | /* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */ |
| 127 | /* |
| 128 | * Initial defines from "js.h" starting around line 33 with the existing "fg_joystick.c" |
| 129 | * interspersed |
| 130 | */ |
| 131 | # ifdef HAVE_SYS_IOCTL_H |
| 132 | # include <sys/ioctl.h> |
| 133 | # endif |
| 134 | # ifdef HAVE_FCNTL_H |
| 135 | # include <fcntl.h> |
| 136 | # endif |
| 137 | |
| 138 | #include <errno.h> |
| 139 | #include <string.h> |
| 140 | |
| 141 | # if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) |
| 142 | /* XXX The below hack is done until freeglut's autoconf is updated. */ |
| 143 | # define HAVE_USB_JS 1 |
| 144 | |
| 145 | # if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
| 146 | # include <sys/joystick.h> |
| 147 | # else |
| 148 | /* |
| 149 | * XXX NetBSD/amd64 systems may find that they have to steal the |
| 150 | * XXX /usr/include/machine/joystick.h from a NetBSD/i386 system. |
| 151 | * XXX I cannot comment whether that works for the interface, but |
| 152 | * XXX it lets you compile...(^& I do not think that we can do away |
| 153 | * XXX with this header. |
| 154 | */ |
| 155 | # include <machine/joystick.h> /* For analog joysticks */ |
| 156 | # endif |
| 157 | # define JS_DATA_TYPE joystick |
| 158 | # define JS_RETURN (sizeof(struct JS_DATA_TYPE)) |
| 159 | # endif |
| 160 | |
| 161 | # if defined(__linux__) |
| 162 | # include <linux/joystick.h> |
| 163 | |
| 164 | /* check the joystick driver version */ |
| 165 | # if defined(JS_VERSION) && JS_VERSION >= 0x010000 |
| 166 | # define JS_NEW |
| 167 | # endif |
| 168 | # else /* Not BSD or Linux */ |
| 169 | # ifndef JS_RETURN |
| 170 | |
| 171 | /* |
| 172 | * We'll put these values in and that should |
| 173 | * allow the code to at least compile when there is |
| 174 | * no support. The JS open routine should error out |
| 175 | * and shut off all the code downstream anyway and if |
| 176 | * the application doesn't use a joystick we'll be fine. |
| 177 | */ |
| 178 | |
| 179 | struct JS_DATA_TYPE |
| 180 | { |
| 181 | int buttons; |
| 182 | int x; |
| 183 | int y; |
| 184 | }; |
| 185 | |
| 186 | # define JS_RETURN (sizeof(struct JS_DATA_TYPE)) |
| 187 | # endif |
| 188 | # endif |
| 189 | |
| 190 | /* XXX It might be better to poll the operating system for the numbers of buttons and |
| 191 | * XXX axes and then dynamically allocate the arrays. |
| 192 | */ |
| 193 | # define _JS_MAX_AXES 16 |
| 194 | typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick; |
| 195 | struct tagSFG_PlatformJoystick |
| 196 | { |
| 197 | # if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) |
| 198 | struct os_specific_s *os; |
| 199 | # endif |
| 200 | |
| 201 | # ifdef JS_NEW |
| 202 | struct js_event js; |
| 203 | int tmp_buttons; |
| 204 | float tmp_axes [ _JS_MAX_AXES ]; |
| 205 | # else |
| 206 | struct JS_DATA_TYPE js; |
| 207 | # endif |
| 208 | |
| 209 | char fname [ 128 ]; |
| 210 | int fd; |
| 211 | }; |
| 212 | |
| 213 | |
| 214 | /* Menu font and color definitions */ |
| 215 | #define GLUT_BITMAP_HELVETICA_18 |
| 216 | |
| 217 | #define {0.0f, 0.0f, 0.0f, 1.0f} |
| 218 | #define {0.70f, 0.70f, 0.70f, 1.0f} |
| 219 | #define {0.0f, 0.0f, 0.0f, 1.0f} |
| 220 | #define {1.0f, 1.0f, 1.0f, 1.0f} |
| 221 | |
| 222 | |
| 223 | |
| 224 | |
| 225 | /* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */ |
| 226 | /* spaceball device functions, defined in fg_spaceball.c */ |
| 227 | int fgIsSpaceballXEvent( const XEvent *ev ); |
| 228 | void fgSpaceballHandleXEvent( const XEvent *ev ); |
| 229 | |
| 230 | /* |
| 231 | * Check if "hint" is present in "property" for "window". See fg_init.c |
| 232 | */ |
| 233 | int fgHintPresent(Window window, Atom property, Atom hint); |
| 234 | |
| 235 | /* Handler for X extension Events */ |
| 236 | #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H |
| 237 | void fgHandleExtensionEvents( XEvent * ev ); |
| 238 | void fgRegisterDevices( Display* dpy, Window* win ); |
| 239 | #endif |
| 240 | |
| 241 | |
| 242 | #endif /* FREEGLUT_INTERNAL_X11_H */ |
| 243 | |