aboutsummaryrefslogtreecommitdiff
path: root/lumina-desktop/LXcbEventFilter.h
blob: c56471c9b00796a374653d711120f64ec5eb7a2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//===========================================
//  Lumina-DE source code
//  Copyright (c) 2012, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
// This class provides the XCB ->Xlib conversion necessary for Qt5 usage
//===========================================
#ifndef _LUMINA_DESKTOP_XCB_FILTER_H
#define _LUMINA_DESKTOP_XCB_FILTER_H

#include <QAbstractNativeEventFilter>
#include <QList>
#include <QStringList>
#include <QX11Info>

#include <xcb/xcb.h>
#include <xcb/xproto.h>
#include <xcb/damage.h>
#include <xcb/xcb_atom.h>
#include "LSession.h"

/*
List of XCB response types (since almost impossible to find good docs on XCB)
switch (xcb_generic_event_t*->response_type  & ~0x80)
case values:
XCB_KEY_[PRESS | RELEASE]
XCB_BUTTON_[PRESS | RELEASE]
XCB_MOTION_NOTIFY
XCB_ENTER_NOTIFY
XCB_LEAVE_NOTIFY
XCB_FOCUS_[IN | OUT]
XCB_KEYMAP_NOTIFY
XCB_EXPOSE
XCB_GRAPHICS_EXPOSURE
XCB_VISIBILITY_NOTIFY
XCB_CREATE_NOTIFY
XCB_DESTROY_NOTIFY
XCB_UNMAP_NOTIFY
XCB_MAP_[NOTIFY | REQUEST]
XCB_REPARENT_NOTIFY
XCB_CONFIGURE_[NOTIFY | REQUEST]
XCB_GRAVITY_NOTIFY
XCB_RESIZE_REQUEST
XCB_CIRCULATE_[NOTIFY | REQUEST]
XCB_PROPERTY_NOTIFY
XCB_SELECTION_[CLEAR | REQUEST | NOTIFY]
XCB_COLORMAP_NOTIFY
XCB_CLIENT_MESSAGE

*/

//SYSTEM TRAY STANDARD DEFINITIONS
#define SYSTEM_TRAY_REQUEST_DOCK 0
#define SYSTEM_TRAY_BEGIN_MESSAGE 1
#define SYSTEM_TRAY_CANCEL_MESSAGE 2

class XCBEventFilter : public QAbstractNativeEventFilter{
private:
	LSession *session;
	xcb_atom_t _NET_SYSTEM_TRAY_OPCODE;
	QList<xcb_atom_t> WinNotifyAtoms, SysNotifyAtoms;
	int TrayDmgFlag; //internal damage event offset value for the system tray
	bool stopping;
	
	void InitAtoms(){
	  //Initialize any special atoms that we need to save/use regularly
	  //NOTE: All the EWMH atoms are already saved in session->XCB->EWMH
	  WinNotifyAtoms.clear();
	    WinNotifyAtoms << session->XCB->EWMH._NET_WM_NAME \
					<< session->XCB->EWMH._NET_WM_VISIBLE_NAME \
					<< session->XCB->EWMH._NET_WM_ICON_NAME \
					<< session->XCB->EWMH._NET_WM_VISIBLE_ICON_NAME \
					<< session->XCB->EWMH._NET_WM_ICON \
					<< session->XCB->EWMH._NET_WM_ICON_GEOMETRY;
		
	  SysNotifyAtoms.clear();
	    SysNotifyAtoms << session->XCB->EWMH._NET_CLIENT_LIST \
					<< session->XCB->EWMH._NET_CLIENT_LIST_STACKING \
					<< session->XCB->EWMH._NET_CURRENT_DESKTOP \
					<< session->XCB->EWMH._NET_WM_STATE \
					<< session->XCB->EWMH._NET_ACTIVE_WINDOW \
					<< session->XCB->EWMH._NET_WM_ICON \
					<< session->XCB->EWMH._NET_WM_ICON_GEOMETRY;
	  //_NET_SYSTEM_TRAY_OPCODE
	  xcb_intern_atom_cookie_t cookie = xcb_intern_atom(QX11Info::connection(), 0, 23,"_NET_SYSTEM_TRAY_OPCODE");
	    xcb_intern_atom_reply_t *r = xcb_intern_atom_reply(QX11Info::connection(), cookie, NULL);
	    if(r){ 
	      _NET_SYSTEM_TRAY_OPCODE = r->atom; 
	      free(r);
	    }
	}
	
public:
	XCBEventFilter(LSession *sessionhandle);
	void setTrayDamageFlag(int flag);
	void StopEventHandling(){ stopping = true; }

	//This function format taken directly from the Qt5.3 documentation
	virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE;
	
};

#endif
bgstack15