static void install_grabs(void) { XSync(dpy, False); hildon_set_non_compositing(); XDefineCursor(dpy, win, CreateNullCursor(dpy, win)); XGrabPointer(dpy, win, False, MOUSE_MASK, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); XGetPointerControl(dpy, &mouse_accel_numerator, &mouse_accel_denominator, &mouse_threshold); XChangePointerControl(dpy, True, True, 1, 1, 0); XSync(dpy, False); mwx = glConfig.vidWidth / 2; mwy = glConfig.vidHeight / 2; mx = my = 0; XGrabKeyboard(dpy, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); XSync(dpy, False); }
// // Check to see if we have grabbed the mouse or not and deal with it // appropriately // static void CheckMouseState(void) { if (x_focus && _windowed_mouse.value && !x_grabbed) { x_grabbed = true; printf("fooling with mouse!\n"); if (XGetPointerControl( x_disp, &x_mouse_num, &x_mouse_denom, &x_mouse_thresh )) printf( "XGetPointerControl failed!\n" ); //printf( "mouse %d/%d thresh %d\n", x_mouse_num, x_mouse_denom, x_mouse_thresh ); // make input rawer XAutoRepeatOff(x_disp); XGrabKeyboard(x_disp, x_win, True, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabPointer(x_disp, x_win, True, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); // if (XChangePointerControl( x_disp, True, True, 1, MOUSE_SCALE, x_mouse_thresh )) // printf( "XChangePointerControl failed!\n" ); IN_CenterMouse(); // safe initial values x_root = x_root_old = vid.width >> 1; y_root = y_root_old = vid.height >> 1; } else if (x_grabbed && (!_windowed_mouse.value || !x_focus)) {
/* _xwin_set_mouse_speed: * The actual function that sets the speed of the mouse cursor. * Each step slows down or speeds the mouse up by 0.5x. */ static void _xwin_set_mouse_speed(int xspeed, int yspeed) { int speed; int hundredths; XLOCK(); if (mouse_mult < 0) XGetPointerControl(_xwin.display, &mouse_mult, &mouse_div, &mouse_threshold); speed = MAX(1, (xspeed + yspeed) / 2); if (mouse_div == 0) hundredths = mouse_mult * 100; else hundredths = (mouse_mult * 100 / mouse_div); hundredths -= (speed - 2) * 50; if (hundredths < 0) hundredths = 0; XChangePointerControl(_xwin.display, 1, 1, hundredths, 100, mouse_threshold); XUNLOCK(); }
static void getMouseParameters(Display * dpy, float *accel, int *thre) { int n, d; XGetPointerControl(dpy, &n, &d, thre); *accel = (float)n / (float)d; }
static void install_grabs(void) { // inviso cursor XWarpPointer(dpy, None, win, 0, 0, 0, 0, glConfig.vidWidth / 2, glConfig.vidHeight / 2); XSync(dpy, False); XDefineCursor(dpy, win, CreateNullCursor(dpy, win)); XGrabPointer(dpy, win, // bk010108 - do this earlier? False, MOUSE_MASK, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); XGetPointerControl(dpy, &mouse_accel_numerator, &mouse_accel_denominator, &mouse_threshold); XChangePointerControl(dpy, True, True, 1, 1, 0); XSync(dpy, False); mouseResetTime = Sys_Milliseconds (); #ifdef HAVE_XF86DGA if (in_dgamouse->value) { int MajorVersion, MinorVersion; if (!XF86DGAQueryVersion(dpy, &MajorVersion, &MinorVersion)) { // unable to query, probalby not supported, force the setting to 0 ri.Printf( PRINT_ALL, "Failed to detect XF86DGA Mouse\n" ); ri.Cvar_Set( "in_dgamouse", "0" ); } else { XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectMouse); XWarpPointer(dpy, None, win, 0, 0, 0, 0, 0, 0); } } else #endif /* HAVE_XF86DGA */ { mwx = glConfig.vidWidth / 2; mwy = glConfig.vidHeight / 2; mx = my = 0; } XGrabKeyboard(dpy, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); XSync(dpy, False); }
static void Sys_XInstallGrabs( void ) { assert( dpy ); XWarpPointer( dpy, None, win, 0, 0, 0, 0, glConfig.vidWidth / 2, glConfig.vidHeight / 2 ); XSync( dpy, False ); XDefineCursor( dpy, win, Sys_XCreateNullCursor( dpy, win ) ); XGrabPointer( dpy, win, False, MOUSE_MASK, GrabModeAsync, GrabModeAsync, win, None, CurrentTime ); XGetPointerControl( dpy, &mouse_accel_numerator, &mouse_accel_denominator, &mouse_threshold ); XChangePointerControl( dpy, True, True, 1, 1, 0 ); XSync( dpy, False ); mouse_reset_time = Sys_Milliseconds (); if ( in_dgamouse.GetBool() && !dga_found ) { common->Printf("XF86DGA not available, forcing DGA mouse off\n"); in_dgamouse.SetBool( false ); } if ( in_dgamouse.GetBool() ) { #if defined( ID_ENABLE_DGA ) XF86DGADirectVideo( dpy, DefaultScreen( dpy ), XF86DGADirectMouse ); XWarpPointer( dpy, None, win, 0, 0, 0, 0, 0, 0 ); #endif } else { mwx = glConfig.vidWidth / 2; mwy = glConfig.vidHeight / 2; mx = my = 0; } XGrabKeyboard( dpy, win, False, GrabModeAsync, GrabModeAsync, CurrentTime ); XSync( dpy, False ); mouse_active = true; }
/* Check to see if we need to enter or leave mouse relative mode */ void X11_CheckMouseModeNoLock(_THIS) { const Uint8 full_focus = (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS); char *env_override; int enable_relative = 1; /* Allow the user to override the relative mouse mode. They almost never want to do this, as it seriously affects applications that rely on continuous relative mouse motion. */ env_override = SDL_getenv("SDL_MOUSE_RELATIVE"); if ( env_override ) { enable_relative = atoi(env_override); } /* If the mouse is hidden and input is grabbed, we use relative mode */ if ( enable_relative && !(SDL_cursorstate & CURSOR_VISIBLE) && (this->input_grab != SDL_GRAB_OFF) && (SDL_GetAppState() & full_focus) == full_focus ) { if ( ! mouse_relative ) { X11_EnableDGAMouse(this); if ( ! (using_dga & DGA_MOUSE) ) { char *xmouse_accel; SDL_GetMouseState(&mouse_last.x, &mouse_last.y); /* Use as raw mouse mickeys as possible */ XGetPointerControl(SDL_Display, &mouse_accel.numerator, &mouse_accel.denominator, &mouse_accel.threshold); xmouse_accel=SDL_getenv("SDL_VIDEO_X11_MOUSEACCEL"); if ( xmouse_accel ) { SetMouseAccel(this, xmouse_accel); } } mouse_relative = 1; } } else { if ( mouse_relative ) { if ( using_dga & DGA_MOUSE ) { X11_DisableDGAMouse(this); } else { XChangePointerControl(SDL_Display, True, True, mouse_accel.numerator, mouse_accel.denominator, mouse_accel.threshold); } mouse_relative = 0; } } }
long int GetPointerSensitivity() { long int value = -1; int accel_numerator, accel_denominator, threshold; XGetPointerControl(disp, &accel_numerator, &accel_denominator, &threshold); if (accel_numerator >= 0) { value = accel_numerator; } (void) accel_denominator; (void) threshold; return value; }
long int GetPointerAccelerationThreshold() { long int value = -1; int accel_numerator, accel_denominator, threshold; XGetPointerControl(disp, &accel_numerator, &accel_denominator, &threshold); if (threshold >= 0) { value = threshold; } (void) accel_numerator; (void) accel_denominator; return value; }
long int GetPointerAccelerationMultiplier() { long int value = -1; int accel_numerator, accel_denominator, threshold; XGetPointerControl(disp, &accel_numerator, &accel_denominator, &threshold); if (accel_denominator >= 0) { value = accel_denominator; } (void) accel_numerator; (void) threshold; return value; }
static void get_default_mouse_info (int *default_numerator, int *default_denominator, int *default_threshold) { int numerator, denominator; int threshold; int tmp_num, tmp_den, tmp_threshold; /* Query X for the default value */ XGetPointerControl (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), &numerator, &denominator, &threshold); XChangePointerControl (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), True, True, -1, -1, -1); XGetPointerControl (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), &tmp_num, &tmp_den, &tmp_threshold); XChangePointerControl (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), True, True, numerator, denominator, threshold); if (default_numerator) *default_numerator = tmp_num; if (default_denominator) *default_denominator = tmp_den; if (default_threshold) *default_threshold = tmp_threshold; }
static void install_grabs(void) { // inviso cursor XDefineCursor(dpy, win, CreateNullCursor(dpy, win)); XGrabPointer(dpy, win, False, MOUSE_MASK, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); XGetPointerControl(dpy, &mouse_accel_numerator, &mouse_accel_denominator, &mouse_threshold); XChangePointerControl(dpy, qtrue, qtrue, 2, 1, 0); if (in_dgamouse->value) { int MajorVersion, MinorVersion; if (!XF86DGAQueryVersion(dpy, &MajorVersion, &MinorVersion)) { // unable to query, probalby not supported ri.Printf( PRINT_ALL, "Failed to detect XF86DGA Mouse\n" ); ri.Cvar_Set( "in_dgamouse", "0" ); } else { dgamouse = qtrue; XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectMouse); XWarpPointer(dpy, None, win, 0, 0, 0, 0, 0, 0); } } else { XWarpPointer(dpy, None, win, 0, 0, 0, 0, glConfig.vidWidth / 2, glConfig.vidHeight / 2); } XGrabKeyboard(dpy, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); // XSync(dpy, True); }
// // Constructor. // UXViewport::UXViewport() : UViewport() , ViewportStatus( X_ViewportOpening ) { guard(UXViewport::UXViewport); // Open the display. XDisplay = XOpenDisplay(0); if (!XDisplay) appErrorf( TEXT("Can't open X server display. XViewport requires X windows.") ); // Create the default window. XSetWindowAttributes swa; swa.colormap = DefaultColormap(XDisplay, DefaultScreen(XDisplay)); swa.border_pixel = 0; swa.override_redirect = True; // swa.override_redirect = False; swa.event_mask = ExposureMask | StructureNotifyMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | ResizeRedirectMask | PointerMotionMask | FocusChangeMask; XWindow = XCreateWindow( XDisplay, DefaultRootWindow(XDisplay), 0, 0, 640, 480, 0, DefaultDepth(XDisplay, DefaultScreen(XDisplay)), InputOutput, DefaultVisual(XDisplay, DefaultScreen(XDisplay)), CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, &swa ); TCHAR WindowName[80]; appSprintf( WindowName, TEXT("Unreal Tournament") ); XStoreName( XDisplay, XWindow, WindowName ); XMapWindow(XDisplay, XWindow); Mapped = True; // Set color bytes based on screen resolution. switch( DefaultDepth( XDisplay, 0 ) ) { case 8: ColorBytes = 2; break; case 16: ColorBytes = 2; Caps |= CC_RGB565; break; case 24: ColorBytes = 4; break; case 32: ColorBytes = 4; break; default: ColorBytes = 2; Caps |= CC_RGB565; break; } // Zero out Keysym map. for (INT i=0; i<65536; i++) KeysymMap[i] = 0; // Remap important keys. // TTY Functions. KeysymMap[XK_BackSpace] = IK_Backspace; KeysymMap[XK_Tab] = IK_Tab; KeysymMap[XK_Return] = IK_Enter; KeysymMap[XK_Pause] = IK_Pause; KeysymMap[XK_Escape] = IK_Escape; KeysymMap[XK_Delete] = IK_Delete; // Modifiers. KeysymMap[XK_Shift_L] = IK_LShift; KeysymMap[XK_Shift_R] = IK_RShift; KeysymMap[XK_Control_L] = IK_LControl; KeysymMap[XK_Control_R] = IK_RControl; KeysymMap[XK_Meta_L] = IK_Alt; KeysymMap[XK_Meta_R] = IK_Alt; KeysymMap[XK_Alt_L] = IK_Alt; KeysymMap[XK_Alt_R] = IK_Alt; // Special remaps. KeysymMap[XK_grave] = IK_Tilde; // Misc function keys. KeysymMap[XK_F1] = IK_F1; KeysymMap[XK_F2] = IK_F2; KeysymMap[XK_F3] = IK_F3; KeysymMap[XK_F4] = IK_F4; KeysymMap[XK_F5] = IK_F5; KeysymMap[XK_F6] = IK_F6; KeysymMap[XK_F7] = IK_F7; KeysymMap[XK_F8] = IK_F8; KeysymMap[XK_F9] = IK_F9; KeysymMap[XK_F10] = IK_F10; KeysymMap[XK_F11] = IK_F11; KeysymMap[XK_F12] = IK_F12; // Cursor control and motion. KeysymMap[XK_Home] = IK_Home; KeysymMap[XK_Left] = IK_Left; KeysymMap[XK_Up] = IK_Up; KeysymMap[XK_Right] = IK_Right; KeysymMap[XK_Down] = IK_Down; KeysymMap[XK_Page_Up] = IK_PageUp; KeysymMap[XK_Page_Down] = IK_PageDown; KeysymMap[XK_End] = IK_End; // Keypad functions and numbers. KeysymMap[XK_KP_Enter] = IK_Enter; KeysymMap[XK_KP_0] = IK_NumPad0; KeysymMap[XK_KP_1] = IK_NumPad1; KeysymMap[XK_KP_2] = IK_NumPad2; KeysymMap[XK_KP_3] = IK_NumPad3; KeysymMap[XK_KP_4] = IK_NumPad4; KeysymMap[XK_KP_5] = IK_NumPad5; KeysymMap[XK_KP_6] = IK_NumPad6; KeysymMap[XK_KP_7] = IK_NumPad7; KeysymMap[XK_KP_8] = IK_NumPad8; KeysymMap[XK_KP_9] = IK_NumPad9; KeysymMap[XK_KP_Multiply] = IK_GreyStar; KeysymMap[XK_KP_Add] = IK_GreyPlus; KeysymMap[XK_KP_Separator] = IK_Separator; KeysymMap[XK_KP_Subtract] = IK_GreyMinus; KeysymMap[XK_KP_Decimal] = IK_NumPadPeriod; KeysymMap[XK_KP_Divide] = IK_GreySlash; // Other KeysymMap[XK_minus] = IK_Minus; KeysymMap[XK_equal] = IK_Equals; // Zero out ShiftMask map. for (i=0; i<256; i++) ShiftMaskMap[i] = 0; // ShiftMask map. ShiftMaskMap['1'] = '!'; ShiftMaskMap['2'] = '@'; ShiftMaskMap['3'] = '#'; ShiftMaskMap['4'] = '$'; ShiftMaskMap['5'] = '%'; ShiftMaskMap['6'] = '^'; ShiftMaskMap['7'] = '&'; ShiftMaskMap['8'] = '*'; ShiftMaskMap['9'] = '('; ShiftMaskMap['0'] = ')'; ShiftMaskMap['-'] = '_'; ShiftMaskMap['='] = '+'; ShiftMaskMap['['] = '{'; ShiftMaskMap[']'] = '}'; ShiftMaskMap['\\'] = '|'; ShiftMaskMap[';'] = ':'; ShiftMaskMap['\''] = '\"'; ShiftMaskMap[','] = '<'; ShiftMaskMap['.'] = '>'; ShiftMaskMap['/'] = '?'; // WM_CHAR allowables. for (i=0; i<256; i++) WMCharMap[i] = 0; for (i='A'; i<='Z'; i++) WMCharMap[i] = 1; for (i='a'; i<='z'; i++) WMCharMap[i] = 1; WMCharMap[IK_Backspace] = 1; WMCharMap[IK_Space] = 1; WMCharMap[IK_Tab] = 1; WMCharMap[IK_Enter] = 1; WMCharMap['1'] = 1; WMCharMap['2'] = 1; WMCharMap['3'] = 1; WMCharMap['4'] = 1; WMCharMap['5'] = 1; WMCharMap['6'] = 1; WMCharMap['7'] = 1; WMCharMap['8'] = 1; WMCharMap['9'] = 1; WMCharMap['0'] = 1; WMCharMap['-'] = 1; WMCharMap['='] = 1; WMCharMap['['] = 1; WMCharMap[']'] = 1; WMCharMap['\\'] = 1; WMCharMap[';'] = 1; WMCharMap['\''] = 1; WMCharMap[','] = 1; WMCharMap['.'] = 1; WMCharMap['/'] = 1; WMCharMap['!'] = 1; WMCharMap['@'] = 1; WMCharMap['#'] = 1; WMCharMap['$'] = 1; WMCharMap['%'] = 1; WMCharMap['^'] = 1; WMCharMap['&'] = 1; WMCharMap['*'] = 1; WMCharMap['('] = 1; WMCharMap[')'] = 1; WMCharMap['_'] = 1; WMCharMap['+'] = 1; WMCharMap['{'] = 1; WMCharMap['}'] = 1; WMCharMap['|'] = 1; WMCharMap[':'] = 1; WMCharMap['\"'] = 1; WMCharMap['<'] = 1; WMCharMap['>'] = 1; WMCharMap['?'] = 1; // Zero out KeyRepeat map. for (i=0; i<256; i++) KeyRepeatMap[i] = 0; // Remember pointer settings. XGetPointerControl(XDisplay, &MouseAccel_N, &MouseAccel_D, &MouseThreshold); debugf( TEXT("Created and initialized a new X viewport.") ); unguard; }
void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecursor) { static int originalmouseparms_num; static int originalmouseparms_denom; static int originalmouseparms_threshold; static qboolean restore_spi; #ifdef USEDGA qboolean usedgamouse; #endif if (!vidx11_display || !win) return; if (relative) fullscreengrab = true; if (!mouse_avail) fullscreengrab = relative = hidecursor = false; #ifdef USEDGA usedgamouse = relative && vid_dgamouse.integer; if (!vid_x11_dgasupported) usedgamouse = false; if (fullscreengrab && vid_usingmouse && (vid_usingdgamouse != usedgamouse)) VID_SetMouse(false, false, false); // ungrab first! #endif if (vid_usingmousegrab != fullscreengrab) { vid_usingmousegrab = fullscreengrab; cl_ignoremousemoves = 2; if (fullscreengrab) { XGrabPointer(vidx11_display, win, True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); if (vid_grabkeyboard.integer || vid_isoverrideredirect) XGrabKeyboard(vidx11_display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); } else { XUngrabPointer(vidx11_display, CurrentTime); XUngrabKeyboard(vidx11_display, CurrentTime); } } if (relative) { if (!vid_usingmouse) { XWindowAttributes attribs_1; XSetWindowAttributes attribs_2; XGetWindowAttributes(vidx11_display, win, &attribs_1); attribs_2.event_mask = attribs_1.your_event_mask | KEY_MASK | MOUSE_MASK; XChangeWindowAttributes(vidx11_display, win, CWEventMask, &attribs_2); #ifdef USEDGA vid_usingdgamouse = usedgamouse; if (usedgamouse) { XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), XF86DGADirectMouse); XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, 0, 0); } else #endif XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, vid.width / 2, vid.height / 2); // COMMANDLINEOPTION: X11 Input: -noforcemparms disables setting of mouse parameters (not used with DGA, windows only) #ifdef USEDGA if (!COM_CheckParm ("-noforcemparms") && !usedgamouse) #else if (!COM_CheckParm ("-noforcemparms")) #endif { XGetPointerControl(vidx11_display, &originalmouseparms_num, &originalmouseparms_denom, &originalmouseparms_threshold); XChangePointerControl (vidx11_display, true, false, 1, 1, -1); // TODO maybe change threshold here, or remove this comment restore_spi = true; } else restore_spi = false; cl_ignoremousemoves = 2; vid_usingmouse = true; } } else { if (vid_usingmouse) { #ifdef USEDGA if (vid_usingdgamouse) XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), 0); vid_usingdgamouse = false; #endif cl_ignoremousemoves = 2; if (restore_spi) XChangePointerControl (vidx11_display, true, true, originalmouseparms_num, originalmouseparms_denom, originalmouseparms_threshold); restore_spi = false; vid_usingmouse = false; } } if (vid_usinghidecursor != hidecursor) { vid_usinghidecursor = hidecursor; if (hidecursor) XDefineCursor(vidx11_display, win, CreateNullCursor(vidx11_display, win)); else XUndefineCursor(vidx11_display, win); } }
main() { Window w2; Display *dpy = XOpenDisplay(NIL); assert(dpy); Screen *scr = DefaultScreenOfDisplay(dpy); // CreateWindow Window w = XCreateWindow(dpy, RootWindowOfScreen(scr), 10, 100, 200, 300, 0, CopyFromParent, CopyFromParent, CopyFromParent, 0, NIL); XDestroyWindow(dpy, w); // CreateWindow with arguments XSetWindowAttributes swa; swa.background_pixel = WhitePixelOfScreen(scr); swa.bit_gravity = NorthWestGravity; swa.border_pixel = BlackPixelOfScreen(scr); swa.colormap = DefaultColormapOfScreen(scr); swa.cursor = None; swa.win_gravity = NorthGravity; w = XCreateWindow(dpy, RootWindowOfScreen(scr), 10, 100, 200, 300, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWBackPixel | CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWWinGravity, &swa); // CreateWindow with other arguments XDestroyWindow(dpy, w); Pixmap pixmap = XCreatePixmap(dpy, RootWindowOfScreen(scr), 45, 25, DefaultDepthOfScreen(scr)); assert(pixmap); swa.background_pixmap = pixmap; swa.border_pixmap = pixmap; w = XCreateWindow(dpy, RootWindowOfScreen(scr), 10, 100, 200, 300, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWBackPixmap | CWBorderPixmap, &swa); // ChangeWindowAttributes swa.backing_planes = 0x1; swa.backing_pixel = WhitePixelOfScreen(scr); swa.save_under = True; swa.event_mask = KeyPressMask | KeyReleaseMask; swa.do_not_propagate_mask = ButtonPressMask | Button4MotionMask; swa.override_redirect = False; XChangeWindowAttributes(dpy, w, CWBackingPlanes | CWBackingPixel | CWSaveUnder | CWEventMask | CWDontPropagate | CWOverrideRedirect, &swa); // GetWindowAttributes XWindowAttributes wa; Status success = XGetWindowAttributes(dpy, w, &wa); // DestroyWindow (done) // DestroySubwindows w2 = XCreateWindow(dpy, w, 20, 30, 40, 50, 3, CopyFromParent, CopyFromParent, CopyFromParent, 0, NIL); XDestroySubwindows(dpy, w); // ChangeSaveSet // Display *dpy2 = XOpenDisplay(NIL); // assert(dpy2); // XAddToSaveSet(dpy2, w); // XCloseDisplay(dpy2); // ReparentWindow w2 = XCreateWindow(dpy, RootWindowOfScreen(scr), 20, 30, 40, 50, 3, CopyFromParent, CopyFromParent, CopyFromParent, 0, NIL); XReparentWindow(dpy, w2, w, 10, 5); // MapWindow XMapWindow(dpy, w); // MapSubwindows XMapSubwindows(dpy, w); // UnmapWindow XUnmapWindow(dpy, w); // UnmapSubwindows XMapWindow(dpy, w); XUnmapSubwindows(dpy, w2); XMapSubwindows(dpy, w); // ConfigureWindow Window w3 = XCreateWindow(dpy, w, 10, 50, 100, 10, 2, CopyFromParent, CopyFromParent, CopyFromParent, 0, NIL); XMapWindow(dpy, w3); XWindowChanges wc; wc.x = -5; wc.y = -10; wc.width = 50; wc.height = 40; wc.border_width = 7; wc.sibling = w2; wc.stack_mode = Opposite; XConfigureWindow(dpy, w3, CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWSibling | CWStackMode, &wc); // CirculateWindow XCirculateSubwindows(dpy, w, RaiseLowest); // GetGeometry Window root; int x, y; unsigned width, height, border_width, depth; XGetGeometry(dpy, w, &root, &x, &y, &width, &height, &border_width, &depth); // QueryTree Window parent; Window *children; unsigned nchildren; success = XQueryTree(dpy, w, &root, &parent, &children, &nchildren); XFree(children); // InternAtom Atom a = XInternAtom(dpy, "WM_PROTOCOLS", True); // GetAtomName char *string = XGetAtomName(dpy, XA_PRIMARY); XFree(string); // ChangeProperty XStoreName(dpy, w, "test window"); // DeleteProperty XDeleteProperty(dpy, w, XA_WM_NAME); // GetProperty // TODO // ListProperties int num_prop; Atom *list = XListProperties(dpy, w, &num_prop); XFree(list); // SetSelectionOwner XSetSelectionOwner(dpy, XA_PRIMARY, w, 12000); XSetSelectionOwner(dpy, XA_SECONDARY, w, CurrentTime); // GetSelectionOwner Window wx = XGetSelectionOwner(dpy, XA_PRIMARY); // ConvertSelection XConvertSelection(dpy, XA_SECONDARY, XA_CURSOR, XA_POINT, w, CurrentTime); // SendEvent // GrabPointer std::cerr << "Grabbing" << std::endl; int res = XGrabPointer(dpy, w, False, Button5MotionMask | PointerMotionHintMask, GrabModeSync, GrabModeAsync, w, None, CurrentTime); XSync(dpy, False); // sleep(5); // UngrabPointer std::cerr << "Ungrabbing" << std::endl; XUngrabPointer(dpy, CurrentTime); // GrabButton XGrabButton(dpy, 3, ShiftMask | ControlMask, w, False, PointerMotionHintMask | Button2MotionMask, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, 2, AnyModifier, w, False, PointerMotionHintMask | Button2MotionMask, GrabModeAsync, GrabModeSync, None, None); // UngrabButton XUngrabButton(dpy, 2, LockMask, w); // ChangeActivePointerGrab XChangeActivePointerGrab(dpy, ButtonPressMask, None, CurrentTime); // GrabKeyboard XGrabKeyboard(dpy, w, True, GrabModeSync, GrabModeSync, 12000); // UngrabKeyboard XUngrabKeyboard(dpy, 13000); // GrabKey XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Tab), ShiftMask | Mod3Mask, w, True, GrabModeSync, GrabModeSync); // UngrabKey XUngrabKey(dpy, AnyKey, AnyModifier, w); // AllowEvents XAllowEvents(dpy, AsyncPointer, 14000); // GrabServer XGrabServer(dpy); // UngrabServer XUngrabServer(dpy); // QueryPointer Window child; int root_x, root_y, win_x, win_y; unsigned mask; Bool bres = XQueryPointer(dpy, w, &root, &child, &root_x, &root_y, &win_x, &win_y, &mask); // GetMotionEvents int nevents; XGetMotionEvents(dpy, w, 15000, 16000, &nevents); // TranslateCoordinates int dest_x, dest_y; XTranslateCoordinates(dpy, w, w2, 10, 20, &dest_x, &dest_y, &child); // WarpPointer XWarpPointer(dpy, w, w2, 0, 0, 100, 100, 20, 30); // SetInputFocus XSetInputFocus(dpy,w, RevertToPointerRoot, 17000); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, 17000); // GetInputFocus Window focus; int revert_to; XGetInputFocus(dpy, &focus, &revert_to); // QueryKeymap char keys_return[32]; XQueryKeymap(dpy, keys_return); // OpenFont Font fid = XLoadFont(dpy, "cursor"); // CloseFont XUnloadFont(dpy, fid); // QueryFont XFontStruct *fs = XLoadQueryFont(dpy, "cursor"); assert(fs); // QueryTextExtents int direction, font_ascent, font_descent; XCharStruct overall; XQueryTextExtents(dpy, fs -> fid, "toto", 4, &direction, &font_ascent, &font_descent, &overall); XQueryTextExtents(dpy, fs -> fid, "odd__length", 11, &direction, &font_ascent, &font_descent, &overall); XChar2b c2bs; c2bs.byte1 = '$'; c2bs.byte2 = 'B'; XQueryTextExtents16(dpy, fs -> fid, &c2bs, 1, &direction, &font_ascent, &font_descent, &overall); XQueryTextExtents(dpy, fs -> fid, longString, strlen(longString), &direction, &font_ascent, &font_descent, &overall); // ListFonts int actual_count; char **fontList = XListFonts(dpy, "*", 100, &actual_count); XFree((char *)fontList); // ListFontsWithInfo int count; XFontStruct *info; char **names = XListFontsWithInfo(dpy, "*", 100, &count, &info); XFreeFontInfo(names, info, count); // SetFontPath // GetFontPath int npaths; char **charList = XGetFontPath(dpy, &npaths); char **charList2 = new char *[npaths + 1]; memcpy(charList2, charList, npaths * sizeof(char *)); charList2[npaths] = charList2[0]; XSetFontPath(dpy, charList2, npaths + 1); XSetFontPath(dpy, charList, npaths); // Reset to some reasonnable value XFreeFontPath(charList); delete [] charList2; // CreatePixmap Pixmap pix2 = XCreatePixmap(dpy, w, 100, 200, DefaultDepthOfScreen(scr)); // FreePixmap XFreePixmap(dpy, pix2); // CreateGC Pixmap bitmap = XCreateBitmapFromData(dpy, RootWindowOfScreen(scr), "\000\000\001\000\000\001\000\000\001\377\377\377", 3, 4); XGCValues gcv; gcv.function = GXand; gcv.plane_mask = 0x1; gcv.foreground = WhitePixelOfScreen(scr); gcv.background = BlackPixelOfScreen(scr); gcv.line_width = 2; gcv.line_style = LineDoubleDash; gcv.cap_style = CapProjecting; gcv.join_style = JoinRound; gcv.fill_style = FillStippled; gcv.fill_rule = EvenOddRule; gcv.arc_mode = ArcPieSlice; gcv.tile = pixmap; gcv.stipple = bitmap; gcv.ts_x_origin = 3; gcv.ts_y_origin = 4; gcv.font = fs -> fid; gcv.subwindow_mode = ClipByChildren; gcv.graphics_exposures = True; gcv.clip_x_origin = 5; gcv.clip_y_origin = 6; gcv.clip_mask = bitmap; gcv.dash_offset = 1; gcv.dashes = 0xc2; GC gc = XCreateGC(dpy, w, GCFunction | GCPlaneMask | GCForeground | GCBackground | GCLineWidth | GCLineStyle | GCCapStyle | GCJoinStyle | GCFillStyle | GCFillRule | GCTile | GCStipple | GCTileStipXOrigin | GCTileStipYOrigin | GCFont | GCSubwindowMode | GCGraphicsExposures | GCClipXOrigin | GCClipYOrigin | GCClipMask | GCDashOffset | GCDashList | GCArcMode, &gcv); // ChangeGC gcv.function = GXandReverse; // Only a few of these should appear, since the values are cached on the client side by the Xlib. XChangeGC(dpy, gc, GCFunction | GCLineStyle | GCStipple | GCGraphicsExposures | GCDashList, &gcv); // CopyGC GC gc2 = XCreateGC(dpy, w, 0, NIL); XCopyGC(dpy, gc, GCFunction | GCLineStyle | GCStipple | GCGraphicsExposures | GCDashList, gc2); // SetDashes XSetDashes(dpy, gc, 3, "\001\377\001", 3); // SetClipRectangles XRectangle rectangles[] = { { 10, 20, 30, 40 }, { 100, 200, 5, 3 }, { -5, 1, 12, 24 } }; XSetClipRectangles(dpy, gc, 12, 9, rectangles, SIZEOF(rectangles), Unsorted); // FreeGC // done already // ClearArea XClearArea(dpy, w, 30, 10, 10, 100, False); // CopyArea XCopyArea(dpy, w, pixmap, gc, 0, 0, 100, 100, 10, 10); // CopyPlane // This won't work if the Screen doesn't have at least 3 planes XCopyPlane(dpy, pixmap, w, gc, 20, 10, 40, 30, 0, 0, 0x4); // PolyPoint XDrawPoint(dpy, w, gc, 1, 2); XPoint points[] = { { 3, 4 }, { 5, 6 } }; XDrawPoints(dpy, w, gc, points, SIZEOF(points), CoordModeOrigin); // PolyLine XDrawLines(dpy, w, gc, points, SIZEOF(points), CoordModePrevious); // PolySegment XSegment segments[] = { { 7, 8, 9, 10 }, { 11, 12, 13, 14 }, { 15, 16, 17, 18 } }; XDrawSegments(dpy, w, gc, segments, SIZEOF(segments)); // PolyRectangle XDrawRectangles(dpy, w, gc, rectangles, SIZEOF(rectangles)); // PolyArc XArc arcs[] = { { 10, 20, 30, 40, 50, 60 }, { -70, 80, 90, 100, 110, 120 }, { 10, 20, 30, 40, 50, -30 } }; XDrawArcs(dpy, w, gc, arcs, SIZEOF(arcs)); // FillPoly XFillPolygon(dpy, w, gc, points, SIZEOF(points), Convex, CoordModePrevious); // PolyFillRectangle XFillRectangles(dpy, w, gc, rectangles, SIZEOF(rectangles)); // PolyFillArc XFillArcs(dpy, w, gc, arcs, SIZEOF(arcs)); // PutImage // GetImage XImage *image = XGetImage(dpy, w, 10, 20, 40, 30, AllPlanes, ZPixmap); XPutImage(dpy, w, gc, image, 0, 0, 50, 60, 40, 30); XSync(dpy, False); // Make the next request starts at the beginning of a packet // PolyText8 XTextItem textItems[3]; textItems[0].chars = "toto"; textItems[0].nchars = strlen(textItems[0].chars); textItems[0].delta = -3; textItems[0].font = fs->fid; textItems[1].chars = "titi"; textItems[1].nchars = strlen(textItems[1].chars); textItems[1].delta = 3; textItems[1].font = None; textItems[2].chars = "tutu"; textItems[2].nchars = strlen(textItems[2].chars); textItems[2].delta = 0; textItems[2].font = fs->fid; XDrawText(dpy, w, gc, 10, 10, textItems, 3); XTextItem textItems2[3]; textItems2[0].chars = "totox"; textItems2[0].nchars = strlen(textItems2[0].chars); textItems2[0].delta = -3; textItems2[0].font = fs->fid; textItems2[1].chars = "titi"; textItems2[1].nchars = strlen(textItems2[1].chars); textItems2[1].delta = 3; textItems2[1].font = None; textItems2[2].chars = "tutu"; textItems2[2].nchars = strlen(textItems2[2].chars); textItems2[2].delta = 0; textItems2[2].font = fs->fid; XDrawText(dpy, w, gc, 10, 10, textItems2, 3); // PolyText16 XChar2b c2b2[] = { 0, 't', 0, 'x' }; XTextItem16 items16[] = { { &c2bs, 1, -5, None }, { NULL, 0, 0, None }, { c2b2, 2, 0, fs -> fid } }; XDrawText16(dpy, w, gc, 10, 0, items16, SIZEOF(items16)); // ImageText8 XDrawImageString(dpy, w, gc, 10, 10, "toto", 4); // ImageText16 XDrawImageString16(dpy, w, gc, 10, 10, &c2bs, 1); XDrawImageString16(dpy, w, gc, 10, 20, c2b2, 2); // CreateColormap // Don't forget to tell the kids how it was when we had only 8 bits per pixel. Colormap colormap = XCreateColormap(dpy, w, DefaultVisualOfScreen(scr), None); // FreeColormap XFreeColormap(dpy, colormap); colormap = XCreateColormap(dpy, w, DefaultVisualOfScreen(scr), None); // CopyColormapAndFree Colormap colormap2 = XCopyColormapAndFree(dpy, colormap); // InstallColormap XInstallColormap(dpy, colormap2); // UninstallColormap XUninstallColormap(dpy, colormap2); // ListInstalledColormaps int num; Colormap *colormapList = XListInstalledColormaps(dpy, w, &num); // AllocColor XColor screen; screen.red = 0; screen.green = 32767; screen.blue = 65535; screen.flags = DoRed | DoGreen | DoBlue; success = XAllocColor(dpy, colormap, &screen); // AllocNamedColor XColor screen2, exact; success = XAllocNamedColor(dpy, colormap, "Wheat", &screen2, &exact); // AllocColorCells unsigned long plane_masks, pixels; success = XAllocColorCells(dpy, colormap, False, &plane_masks, 1, &pixels, 1); // AllocColorPlanes unsigned long rmask, gmask, bmask; success = XAllocColorPlanes(dpy, colormap, False, &pixels, 1, 0, 0, 0, &rmask, &gmask, &bmask); // FreeColors unsigned long pixels2[2] = { screen.pixel, screen2.pixel }; XFreeColors(dpy, colormap, pixels2, 2, 0); // StoreColors success = XAllocColorCells(dpy, colormap, False, NIL, 0, pixels2, 2); // On many contemporary (that is, year 2000) video cards, you can't allocate read / write cells // I want my requests to be sent, however. if (!success) { XSetErrorHandler(errorHandler); } XColor colors[2]; colors[0] = screen; colors[0].pixel = pixels2[0]; colors[1] = screen2; colors[1].pixel = pixels2[1]; XStoreColors(dpy, colormap, colors, 2); // StoreNamedColor XStoreNamedColor(dpy, colormap, "Wheat", colors[0].pixel, DoBlue); XSync(dpy, False); XSetErrorHandler(NIL); // Restore the default handler // QueryColors screen2.pixel = WhitePixelOfScreen(scr); XQueryColor(dpy, colormap, &screen2); // LookupColor success = XLookupColor(dpy, colormap, "DarkCyan", &exact, &screen); // CreateCursor Cursor cursor = XCreatePixmapCursor(dpy, pixmap, None, &exact, colors, 10, 10); // CreateGlyphCursor Cursor cursor2 = XCreateGlyphCursor(dpy, fs -> fid, fs -> fid, 'X', 0, &exact, colors); // FreeCursor XFreeCursor(dpy, cursor2); // RecolorCursor XRecolorCursor(dpy, cursor, colors, &exact); // QueryBestSize success = XQueryBestSize(dpy, CursorShape, RootWindowOfScreen(scr), 100, 20, &width, &height); // QueryExtension int major_opcode, first_event, first_error; XQueryExtension(dpy, "toto", &major_opcode, &first_event, &first_error); // ListExtensions int nextensions; char **extensionList = XListExtensions(dpy, &nextensions); for(char **p = extensionList; nextensions; nextensions--, p++) std::cout << *p << std::endl; XFree(extensionList); // ChangeKeyboardMapping // GetKeyboardMapping int min_keycodes, max_keycodes; XDisplayKeycodes(dpy, &min_keycodes, &max_keycodes); int keysyms_per_keycode; KeySym *keysyms = XGetKeyboardMapping(dpy, min_keycodes, max_keycodes - min_keycodes + 1, &keysyms_per_keycode); XChangeKeyboardMapping(dpy, min_keycodes, keysyms_per_keycode, keysyms, max_keycodes - min_keycodes + 1); // ChangeKeyboardControl // GetKeyboardControl XKeyboardState keyboardState; XGetKeyboardControl(dpy, &keyboardState); XKeyboardControl keyboardValues; keyboardValues.key_click_percent = keyboardState.key_click_percent; keyboardValues.bell_percent = keyboardState.bell_percent; keyboardValues.bell_pitch = keyboardState.bell_pitch; keyboardValues.bell_duration = keyboardState.bell_duration; keyboardValues.led = 1; keyboardValues.led_mode = LedModeOn; keyboardValues.key = min_keycodes; keyboardValues.auto_repeat_mode = AutoRepeatModeDefault; XChangeKeyboardControl(dpy, KBKeyClickPercent | KBBellPercent | KBBellPitch | KBBellDuration | KBLed | KBLedMode | KBKey | KBAutoRepeatMode, &keyboardValues); // Bell XBell(dpy, 90); // ChangePointerControl // GetPointerControl int accel_numerator, accel_denominator, threshold; XGetPointerControl(dpy, &accel_numerator, &accel_denominator, &threshold); XChangePointerControl(dpy, True, True, accel_numerator, accel_denominator, threshold); // SetScreenSaver // GetScreenSaver int timeout, interval, prefer_blanking, allow_exposures; XGetScreenSaver(dpy, &timeout, &interval, &prefer_blanking, &allow_exposures); XSetScreenSaver(dpy, timeout, interval, prefer_blanking, allow_exposures); // ChangeHosts // ListHosts int nhosts; Bool state; XHostAddress *hostList = XListHosts(dpy, &nhosts, &state); XHostAddress host; host.family = FamilyInternet; host.length = 4; host.address = "\001\002\003\004"; XAddHost(dpy, &host); // SetAccessControl XSetAccessControl(dpy, EnableAccess); // SetCloseDownMode XSetCloseDownMode(dpy, RetainTemporary); // KillClient XKillClient(dpy, AllTemporary); // RotateProperties Atom properties[] = { XInternAtom(dpy, "CUT_BUFFER0", False), XInternAtom(dpy, "CUT_BUFFER1", False), XInternAtom(dpy, "CUT_BUFFER2", False) }; XRotateWindowProperties(dpy, RootWindowOfScreen(scr), properties, SIZEOF(properties), -1); // ForceScreenSaver XForceScreenSaver(dpy, ScreenSaverReset); // SetPointerMapping // GetPointerMapping unsigned char map[64]; int map_length = XGetPointerMapping(dpy, map, 64); XSetPointerMapping(dpy, map, map_length); // SetModifierMapping // GetModifierMapping XModifierKeymap *modmap = XGetModifierMapping(dpy); XSetModifierMapping(dpy, modmap); // NoOperation XNoOp(dpy); for(;;) { XEvent e; XNextEvent(dpy, &e); std::cout << "Got an event of type " << e.type << std::endl; } }
void MouseConfig::GetSettings( void ) { int accel_num, accel_den, threshold; XGetPointerControl( kapp->getDisplay(), &accel_num, &accel_den, &threshold ); accel_num /= accel_den; // integer acceleration only // get settings from X server int h = RIGHT_HANDED; unsigned char map[5]; num_buttons = XGetPointerMapping(kapp->getDisplay(), map, 5); switch (num_buttons) { case 1: /* disable button remapping */ if (GUI) { rightHanded->setEnabled(FALSE); leftHanded->setEnabled(FALSE); handedEnabled = FALSE; } break; case 2: if ( (int)map[0] == 1 && (int)map[1] == 2 ) h = RIGHT_HANDED; else if ( (int)map[0] == 2 && (int)map[1] == 1 ) h = LEFT_HANDED; else { /* custom button setup: disable button remapping */ if (GUI) { rightHanded->setEnabled(FALSE); leftHanded->setEnabled(FALSE); } } break; case 3: middle_button = (int)map[1]; if ( (int)map[0] == 1 && (int)map[2] == 3 ) h = RIGHT_HANDED; else if ( (int)map[0] == 3 && (int)map[2] == 1 ) h = LEFT_HANDED; else { /* custom button setup: disable button remapping */ if (GUI) { rightHanded->setEnabled(FALSE); leftHanded->setEnabled(FALSE); handedEnabled = FALSE; } } break; default: /* custom setup with > 3 buttons: disable button remapping */ if (GUI) { rightHanded->setEnabled(FALSE); leftHanded->setEnabled(FALSE); handedEnabled = FALSE; } break; } config->setGroup("Mouse"); int a = config->readNumEntry("Acceleration",-1); if (a == -1) accelRate = accel_num; else accelRate = a; int t = config->readNumEntry("Threshold",-1); if (t == -1) thresholdMove = threshold; else thresholdMove = t; QString key = config->readEntry("MouseButtonMapping"); if (key == "RightHanded") handed = RIGHT_HANDED; else if (key == "LeftHanded") handed = LEFT_HANDED; else if (key == NULL) handed = h; // the GUI should always show the real values if (GUI) { setAccel(accel_num); setThreshold(threshold); setHandedness(h); } }