src/X11Command.h
author František Kučera <franta-hg@frantovo.cz>
Mon, 05 Apr 2021 18:09:25 +0200
branchv_0
changeset 8 b498160cc2ab
parent 7 039b3f8a3442
child 9 c8d681753bc2
permissions -rw-r--r--
list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     1
/**
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     2
 * Relational pipes
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     3
 * Copyright © 2021 František Kučera (Frantovo.cz, GlobalCode.info)
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     4
 *
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     5
 * This program is free software: you can redistribute it and/or modify
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     7
 * the Free Software Foundation, version 3 of the License.
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     8
 *
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    12
 * GNU General Public License for more details.
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    13
 *
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    15
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    16
 */
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    17
#pragma once
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    18
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    19
#include <codecvt>
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    20
#include <memory>
2
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    21
#include <algorithm>
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    22
#include <iostream>
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    23
#include <stdexcept>
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    24
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    25
#include <X11/extensions/XInput.h>
7
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
    26
#include <X11/Xutil.h>
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    27
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    28
#include "Configuration.h"
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    29
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    30
namespace relpipe {
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    31
namespace in {
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    32
namespace x11 {
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    33
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    34
class X11Command {
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    35
private:
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    36
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    37
	class Display {
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    38
	public:
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    39
		::Display* display = nullptr;
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    40
		// TODO: more OOP
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    41
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    42
		virtual ~Display() {
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    43
			if (display) XCloseDisplay(display);
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    44
		}
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    45
	};
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    46
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    47
	class Device {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    48
	public:
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    49
		XDevice* device = nullptr;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    50
		// TODO: more OOP
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    51
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    52
		virtual ~Device() {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    53
			if (device) XFree(device);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    54
		}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    55
	};
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    56
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    57
	class DeviceInfoList {
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    58
	public:
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    59
		XDeviceInfo* items = nullptr;
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    60
		int size = 0;
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    61
		// TODO: more OOP
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    62
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    63
		XDeviceInfo* operator[](int index) const {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    64
			if (index < size) return items + index;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    65
			else throw std::out_of_range("invalid index of XDeviceInfo");
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    66
		}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    67
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    68
		virtual ~DeviceInfoList() {
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    69
			if (items) XFreeDeviceList(items);
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    70
		}
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    71
	};
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    72
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    73
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    74
	std::wstring_convert<codecvt_utf8<wchar_t>> convertor; // TODO: use platform encoding as default
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    75
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    76
	relpipe::common::type::StringX getDeviceType(const Display& display, const XDeviceInfo* device) {
2
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    77
		if (device && device->type) {
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    78
			char* raw = XGetAtomName(display.display, device->type);
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    79
			if (raw) {
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    80
				relpipe::common::type::StringX type = convertor.from_bytes(raw);
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    81
				XFree(raw);
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    82
				transform(type.begin(), type.end(), type.begin(), ::tolower);
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    83
				return type;
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    84
			}
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    85
		}
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    86
		return L"";
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    87
	}
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    88
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    89
	void listInputDevices(const Display& display, Configuration& configuration, std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    90
		writer->startRelation(L"x11_input_device",{
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    91
			{L"id", relpipe::writer::TypeId::INTEGER},
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    92
			{L"name", relpipe::writer::TypeId::STRING},
2
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    93
			{L"type", relpipe::writer::TypeId::STRING},
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
    94
		}, true);
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    95
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    96
		DeviceInfoList devices;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    97
		devices.items = XListInputDevices(display.display, &devices.size);
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    98
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    99
		for (int i = 0; i < devices.size; i++) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   100
			relpipe::common::type::Integer id = devices[i]->id;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   101
			relpipe::common::type::StringX name = convertor.from_bytes(devices[i]->name);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   102
			relpipe::common::type::StringX type = getDeviceType(display, devices[i]);
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   103
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   104
			writer->writeAttribute(&id, typeid (id));
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   105
			writer->writeAttribute(&name, typeid (name));
2
8d44cba0a3d1 list input devices: add type
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
   106
			writer->writeAttribute(&type, typeid (type));
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   107
		}
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   108
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   109
		relationalWriterFlush();
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   110
	}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   111
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   112
	/**
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   113
	 * Fields of this structure are filled in DeviceKeyPress(), DeviceButtonPress() … macros.
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   114
	 */
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   115
	class EventType {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   116
	private:
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   117
		const static int UNUSED = -1;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   118
	public:
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   119
		int motion = UNUSED;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   120
		int buttonPress = UNUSED;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   121
		int buttonRelease = UNUSED;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   122
		int keyPress = UNUSED;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   123
		int keyRelease = UNUSED;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   124
		int proximityIn = UNUSED;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   125
		int proximityOut = UNUSED;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   126
	} eventType;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   127
8
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   128
	void registerEvents(const Display& display, int screen, const XDeviceInfo* deviceInfo) {
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   129
		bool registerProximityEvents = false; // TODO: proximity?
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   130
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   131
		Device device;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   132
		Window window;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   133
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   134
		int eventCount = 0;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   135
		XEventClass events[7]; // TODO: check array size
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   136
		XInputClassInfo* classInfo;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   137
		int classIndex;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   138
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   139
		window = RootWindow(display.display, screen);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   140
		// TODO: configurable window from which we capture the events or optionally open our own window (can also provide some visual feedback/info)
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   141
		// Currently we can do something like:
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   142
		//   Xephyr  :5 -screen 1920x1080
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   143
		//   DISPLAY=:5 relpipe-in-x11 --list-input-devices false --list-input-events true | …
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   144
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   145
		device.device = XOpenDevice(display.display, deviceInfo->id);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   146
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   147
		if (device.device) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   148
			if (device.device->num_classes > 0) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   149
				for (classInfo = device.device->classes, classIndex = 0; classIndex < deviceInfo->num_classes; classInfo++, classIndex++) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   150
					if (classInfo->input_class == KeyClass) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   151
						DeviceKeyPress(device.device, eventType.keyPress, events[eventCount]);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   152
						eventCount++;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   153
						DeviceKeyRelease(device.device, eventType.keyRelease, events[eventCount]);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   154
						eventCount++;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   155
					} else if (classInfo->input_class == ButtonClass) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   156
						DeviceButtonPress(device.device, eventType.buttonPress, events[eventCount]);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   157
						eventCount++;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   158
						DeviceButtonRelease(device.device, eventType.buttonRelease, events[eventCount]);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   159
						eventCount++;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   160
					} else if (classInfo->input_class == ValuatorClass) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   161
						DeviceMotionNotify(device.device, eventType.motion, events[eventCount]);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   162
						eventCount++;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   163
						if (registerProximityEvents) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   164
							ProximityIn(device.device, eventType.proximityIn, events[eventCount]);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   165
							eventCount++;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   166
							ProximityOut(device.device, eventType.proximityOut, events[eventCount]);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   167
							eventCount++;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   168
						}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   169
					}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   170
				}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   171
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   172
				int result = XSelectExtensionEvent(display.display, window, events, eventCount);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   173
				if (result != Success) throw std::logic_error("Unable to register events from device: " + std::to_string(deviceInfo->id) + " Result: " + std::to_string(result));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   174
			}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   175
		} else {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   176
			throw std::invalid_argument("Unable to open the device: " + std::to_string(deviceInfo->id));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   177
		}
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   178
	}
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   179
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   180
	void listInputEvents(Display& display, Configuration& configuration, std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   181
		writer->startRelation(L"x11_input_event",{
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   182
			{L"device", relpipe::writer::TypeId::INTEGER},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   183
			{L"type", relpipe::writer::TypeId::STRING},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   184
			{L"state", relpipe::writer::TypeId::STRING},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   185
			{L"key", relpipe::writer::TypeId::INTEGER},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   186
			{L"button", relpipe::writer::TypeId::INTEGER},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   187
			{L"x", relpipe::writer::TypeId::INTEGER},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   188
			{L"y", relpipe::writer::TypeId::INTEGER},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   189
			// {L"x_root", relpipe::writer::TypeId::INTEGER},
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   190
			// {L"y_root", relpipe::writer::TypeId::INTEGER},
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   191
		}, true);
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   192
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   193
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   194
		{
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   195
			DeviceInfoList devices;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   196
			devices.items = XListInputDevices(display.display, &devices.size);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   197
			for (int i = 0; i < devices.size; i++) {
4
820c4a4a3ed8 register events only for supported devices
František Kučera <franta-hg@frantovo.cz>
parents: 3
diff changeset
   198
				if (devices[i]->type) {
8
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   199
					for (int screenCount = XScreenCount(display.display), screen = 0; screen < screenCount; screen++)
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   200
						registerEvents(display, screen, devices[i]);
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   201
				}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   202
			}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   203
		}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   204
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   205
		for (XEvent event; true;) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   206
			XNextEvent(display.display, &event);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   207
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   208
			relpipe::common::type::Integer device = -1; // TODO: null
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   209
			relpipe::common::type::StringX type;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   210
			relpipe::common::type::StringX state;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   211
			relpipe::common::type::Integer button = -1; // TODO: null
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   212
			relpipe::common::type::Integer key = -1; // TODO: null
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   213
			relpipe::common::type::Integer x = -1; // TODO: null
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   214
			relpipe::common::type::Integer y = -1; // TODO: null
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   215
			// relpipe::common::type::Integer xRoot = -1; // TODO: null
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   216
			// relpipe::common::type::Integer yRoot = -1; // TODO: null
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   217
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   218
			if (event.type == eventType.motion) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   219
				XDeviceMotionEvent* e = (XDeviceMotionEvent*) & event;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   220
				device = e->deviceid;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   221
				type = L"motion";
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   222
				x = e->x;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   223
				y = e->y;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   224
				// xRoot = e->x_root;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   225
				// yRoot = e->y_root;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   226
			} else if (event.type == eventType.buttonPress || event.type == eventType.buttonRelease) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   227
				XDeviceButtonEvent* e = (XDeviceButtonEvent*) & event;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   228
				device = e->deviceid;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   229
				type = L"button";
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   230
				state = event.type == eventType.buttonPress ? L"pressed" : L"released";
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   231
				button = e->button;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   232
				x = e->x;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   233
				y = e->y;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   234
				// xRoot = e->x_root;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   235
				// yRoot = e->y_root;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   236
			} else if (event.type == eventType.keyPress || event.type == eventType.keyRelease) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   237
				XDeviceKeyEvent* e = (XDeviceKeyEvent*) & event;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   238
				device = e->deviceid;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   239
				type = L"key";
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   240
				state = event.type == eventType.keyPress ? L"pressed" : L"released";
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   241
				key = e->keycode;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   242
				x = e->x;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   243
				y = e->y;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   244
				// xRoot = e->x_root;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   245
				// yRoot = e->y_root;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   246
			} else if (event.type == eventType.proximityIn || event.type == eventType.proximityOut) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   247
				XProximityNotifyEvent* e = (XProximityNotifyEvent*) & event;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   248
				device = e->deviceid;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   249
				type = L"proximity";
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   250
			}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   251
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   252
			writer->writeAttribute(&device, typeid (device));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   253
			writer->writeAttribute(type);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   254
			writer->writeAttribute(state);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   255
			writer->writeAttribute(&key, typeid (key));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   256
			writer->writeAttribute(&button, typeid (button));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   257
			writer->writeAttribute(&x, typeid (x));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   258
			writer->writeAttribute(&y, typeid (y));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   259
			// writer->writeAttribute(&xRoot, typeid (xRoot));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   260
			// writer->writeAttribute(&yRoot, typeid (yRoot));
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   261
			relationalWriterFlush();
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   262
		}
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   263
	}
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   264
7
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   265
	relpipe::common::type::StringX fetchWindowName(const Display& display, Window window) {
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   266
		relpipe::common::type::StringX name;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   267
		// TODO: this does not work → use XGetWMName(), XmbTextPropertyToTextList(), XFreeStringList() instead of XFetchName()
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   268
		// char* rawName = nullptr;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   269
		// if (XFetchName(display.display, window, &rawName) && rawName) 
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   270
		// name = convertor.from_bytes(rawName); // bad encoding, std::range_error – wstring_convert::from_bytes
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   271
		// std::cout << "\n\n\n>>> " << rawName << " <<<\n\n\n"; // bad encoding, not UTF-8
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   272
		//XFree(rawName);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   273
		return name;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   274
	}
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   275
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   276
	void listWindow(const Display& display, Window window, relpipe::common::type::Integer level, Configuration& configuration, std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   277
		Window rootWindow;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   278
		Window parentWindow;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   279
		unsigned int childrenCount;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   280
		Window* childrenList;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   281
		if (!XQueryTree(display.display, window, &rootWindow, &parentWindow, &childrenList, &childrenCount))
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   282
			throw std::invalid_argument("Unable to query the tree for window: " + std::to_string(window));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   283
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   284
		XWindowAttributes windowAttributes;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   285
		if (!XGetWindowAttributes(display.display, window, &windowAttributes))
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   286
			throw std::invalid_argument("Unable to get attributes for window: " + std::to_string(window));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   287
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   288
		XClassHint classHint;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   289
		relpipe::common::type::StringX resClass;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   290
		relpipe::common::type::StringX resName;
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   291
		if (XGetClassHint(display.display, window, &classHint)) {
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   292
			if (classHint.res_class) resClass = convertor.from_bytes(classHint.res_class);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   293
			if (classHint.res_name) resName = convertor.from_bytes(classHint.res_name);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   294
			XFree(classHint.res_class);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   295
			XFree(classHint.res_name);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   296
		}
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   297
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   298
		writer->writeAttribute(std::to_wstring(window));
8
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   299
		writer->writeAttribute(std::to_wstring(windowAttributes.root));
7
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   300
		writer->writeAttribute(std::to_wstring(parentWindow));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   301
		writer->writeAttribute(&level, typeid (level));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   302
		writer->writeAttribute(fetchWindowName(display, window));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   303
		writer->writeAttribute(resClass);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   304
		writer->writeAttribute(resName);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   305
		writer->writeAttribute(std::to_wstring(windowAttributes.x));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   306
		writer->writeAttribute(std::to_wstring(windowAttributes.y));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   307
		writer->writeAttribute(std::to_wstring(windowAttributes.width));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   308
		writer->writeAttribute(std::to_wstring(windowAttributes.height));
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   309
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   310
		for (unsigned int i = 0; i < childrenCount; i++) listWindow(display, childrenList[i], level + 1, configuration, writer, relationalWriterFlush);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   311
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   312
		XFree(childrenList);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   313
	}
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   314
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   315
	void listWindows(const Display& display, Configuration& configuration, std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   316
		writer->startRelation(L"x11_window",{
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   317
			{L"id", relpipe::writer::TypeId::INTEGER},
8
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   318
			{L"root", relpipe::writer::TypeId::INTEGER},
7
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   319
			{L"parent", relpipe::writer::TypeId::INTEGER},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   320
			{L"level", relpipe::writer::TypeId::INTEGER},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   321
			{L"name", relpipe::writer::TypeId::STRING},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   322
			{L"res_class", relpipe::writer::TypeId::STRING},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   323
			{L"res_name", relpipe::writer::TypeId::STRING},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   324
			{L"x", relpipe::writer::TypeId::INTEGER},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   325
			{L"y", relpipe::writer::TypeId::INTEGER},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   326
			{L"width", relpipe::writer::TypeId::INTEGER},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   327
			{L"height", relpipe::writer::TypeId::INTEGER},
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   328
		}, true);
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   329
8
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   330
		for (int screenCount = XScreenCount(display.display), screen = 0; screen < screenCount; screen++) {
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   331
			Window root = RootWindow(display.display, screen);
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   332
			listWindow(display, root, 0, configuration, writer, relationalWriterFlush);
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   333
		}
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   334
	}
7
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   335
8
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   336
	void listScreens(const Display& display, Configuration& configuration, std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   337
		writer->startRelation(L"x11_screen",{
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   338
			{L"id", relpipe::writer::TypeId::INTEGER},
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   339
			{L"root", relpipe::writer::TypeId::INTEGER},
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   340
			{L"width", relpipe::writer::TypeId::INTEGER},
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   341
			{L"height", relpipe::writer::TypeId::INTEGER},
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   342
			// {L"width_mm", relpipe::writer::TypeId::INTEGER},
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   343
			// {L"height_mm", relpipe::writer::TypeId::INTEGER},
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   344
		}, true);
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   345
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   346
		for (int screenCount = XScreenCount(display.display), screen = 0; screen < screenCount; screen++) {
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   347
			Window root = RootWindow(display.display, screen);
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   348
			XWindowAttributes attributes;
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   349
			if (!XGetWindowAttributes(display.display, root, &attributes))
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   350
				throw std::invalid_argument("Unable to get attributes for window: " + std::to_string(root));
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   351
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   352
			writer->writeAttribute(std::to_wstring(screen));
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   353
			writer->writeAttribute(std::to_wstring(root));
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   354
			writer->writeAttribute(std::to_wstring(attributes.width));
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   355
			writer->writeAttribute(std::to_wstring(attributes.height));
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   356
			// writer->writeAttribute(std::to_wstring(attributes.screen->mwidth));
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   357
			// writer->writeAttribute(std::to_wstring(attributes.screen->mheight));
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   358
		}
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   359
7
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   360
	}
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   361
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   362
	static int handleXError(::Display* display, XErrorEvent* errorEvent) {
5
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   363
		std::wcerr << L"X11 error:"
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   364
				<< L" display=" << errorEvent->display
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   365
				<< L" error_code=" << errorEvent->error_code
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   366
				<< L" minor_code=" << errorEvent->minor_code
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   367
				<< L" request_code=" << errorEvent->request_code
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   368
				<< L" resourceid=" << errorEvent->resourceid
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   369
				<< L" serial=" << errorEvent->serial
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   370
				<< L" type=" << errorEvent->type
7afa994c98f0 print X11 errors
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
   371
				<< std::endl;
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   372
		return 0;
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   373
	}
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   374
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   375
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   376
public:
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   377
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   378
	void process(Configuration& configuration, std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   379
		XSetErrorHandler(handleXError);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   380
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   381
		Display display;
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   382
		display.display = XOpenDisplay(nullptr);
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   383
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   384
		if (display.display) {
3
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   385
			if (configuration.listInputDevices) listInputDevices(display, configuration, writer, relationalWriterFlush);
72384bb5c66e list input events: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
   386
			if (configuration.listInputEvents) listInputEvents(display, configuration, writer, relationalWriterFlush);
7
039b3f8a3442 list windows: first version, --list-windows
František Kučera <franta-hg@frantovo.cz>
parents: 5
diff changeset
   387
			if (configuration.listWindows) listWindows(display, configuration, writer, relationalWriterFlush);
8
b498160cc2ab list screens: --list-screens + support multiple screens in --list-windows and --list-input-events
František Kučera <franta-hg@frantovo.cz>
parents: 7
diff changeset
   388
			if (configuration.listScreens) listScreens(display, configuration, writer, relationalWriterFlush);
1
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   389
		} else {
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   390
			throw std::invalid_argument("Unable to open display. Please check the $DISPLAY variable.");
3bbf848b3565 Configuration + CLIParser + command for listing X11 devices
František Kučera <franta-hg@frantovo.cz>
parents: 0
diff changeset
   391
		}
0
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   392
	}
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   393
};
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   394
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   395
}
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   396
}
3493d6e7016e project skeleton
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   397
}