xcb-studies/README.md

84 lines
3.1 KiB
Markdown

# SP3tabletd
![Rust](https://img.shields.io/badge/rust-%23000000.svg?style=flat&logo=rust&logoColor=white)
![C++](https://img.shields.io/badge/c++-%2300599C.svg?style=flat&logo=c%2B%2B&logoColor=white)
![Linux](https://img.shields.io/badge/Linux-FCC624?style=flat&logo=linux&logoColor=black)
![X11](https://img.shields.io/badge/X11-FEC350?style=flat&logo=xdotorg&logoColor=black)
![Status](https://img.shields.io/badge/Status-Incomplete-red)
This is a re-write of my [Surface Pro 3
Autorotate](https://github.com/elfsternberg/surface3-scripts)
program. Note that what you have here is just part of the learning
curve.
This program autorotates the screen of a Microsoft Surface Pro 3 Tablet
running Linux. It correctly performs the autorotation for all major
pointer devices, including the stylus and eraser devices. It also
enables palm rejection (meaning you can rest your hand on the screen
while drawing) when the stylus and eraser devices are "in use" (which is
defined by the digitizer as "within approximately 4cm of the screen").
This program is written in Python 2, which is included in all major
Linux distributions by default. It has no additional dependencies.
It may run on other versions of the Microsoft Surface, but I haven't
tested it on anything other than my own Surface Pro 3.
## Progress
The intent of this exercise is to eventually
[RIIR](https://adventures.michaelfbryan.com/posts/how-to-riir/) the
code. Right now, I'm actively learning how the X11/XCB library works
to encode and transmit monitor and rotation information for the root
screen, so what you'll find in the [`src`](./src) tree is a C++
program where I'm slowly, one painful step at a time, figuring out how
to efficiently retrieve information from the X11 server and then send
commands to rotate the screen.
It's not enough to rotate the screen, and eventually I'm going to have
to figure out how to use XInput as well to map the pen/pointer device,
so that I can use [Gimp](https://www.gimp.org/) and
[Krita](https://krita.org/en/) effectively.
My only observation so far is that, after having a run in with
`std::unique_ptr`, the ergonomics of Rust make me very happy indeed.
I can only hope the Rust/XCB interface adheres close enough to the C
version that the port is trivial.
## Credits
The original geometry detection algorithms that this script will use
were written by [Ayko
Poel](https://github.com/AykoPoel/surface3-scripts). My contribution
consists of more robust device and device driver identification
algorithms for the stylus and eraser, and a general modernization of
the transform algorithm.
## Requirements
This code has been tested with gcc-7.3, and should work on any
C++17-compliant compiler with the relevant standard library, and
obviously X Windows.
## Building
From the base directory of the project (not that there's much there):
``` shell
$ mkdir build
$ cd build
$ cmake ..
$ make
```
## License
This XRandR experiment is Copyright [Elf
M. Sternberg](https://elfsternberg.com) (c) 2019, and licensed with
the Mozilla Public License vers. 2.0. A copy of the license file is
included in the root folder.
## Code of Conduct
Don't be a douchebag. That is all.