The stages of me learning XCB, both in C++ and Rust. There are a couple of side lessons (CMake and vendoring) that are as aside to the whole story, but they're at least important to preserve.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
Elf M. Sternberg e8bd037f61 Got the same functionality out of Rust, only prettier, and learned an important lesson about how much more Rust cares that the info you handled is, in fact, *fully* handled. 2 years ago
docs Friggin' Github Flavored Markdown 2 years ago
studies Innteresting. It seems that the `output` collection is much more 2 years ago
vendor Keeping up-to-date, and preparing for some basic CLI stuff with 2 years ago
xcb_read Added showing the Output name along with the details (if any). 2 years ago
xcb_read_rs Got the same functionality out of Rust, only prettier, and learned an important lesson about how much more Rust cares that the info you handled is, in fact, *fully* handled. 2 years ago
.clang-format Innteresting. It seems that the `output` collection is much more 2 years ago
.gitignore Initial commit: XRandR connects to the server via XCB. 2 years ago
.gitmodules Keeping up-to-date, and preparing for some basic CLI stuff with 2 years ago
LICENSE.md Added README and LICENSE files. 2 years ago
Makefile Innteresting. It seems that the `output` collection is much more 2 years ago
README.md Changed the color on the Xorg logo to the lighter background. 2 years ago
notes.md Moving the 'learning xcb reading' into its own folder. 2 years ago

README.md

SP3tabletd

Rust C++ Linux X11 Status

This is a re-write of my Surface Pro 3 Autorotate 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 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 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 and Krita 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. 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):

$ mkdir build
$ cd build
$ cmake ..
$ make

License

This XRandR experiment is Copyright Elf M. Sternberg (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.