rev |
line source |
nuclear@3
|
1 #include <string.h>
|
nuclear@0
|
2 #include <vector>
|
nuclear@1
|
3 #include <algorithm>
|
nuclear@7
|
4 #include <X11/Xlib.h>
|
nuclear@12
|
5 #include <X11/extensions/Xcomposite.h>
|
nuclear@7
|
6 #include <X11/extensions/Xdamage.h>
|
nuclear@0
|
7 #include "cwin.h"
|
nuclear@0
|
8 #include "logger.h"
|
nuclear@0
|
9
|
nuclear@7
|
10 extern Display *dpy;
|
nuclear@7
|
11
|
nuclear@1
|
12 static std::vector<CompWindow*> cwinlist;
|
nuclear@0
|
13
|
nuclear@2
|
14 CompWindow::CompWindow(Window xid)
|
nuclear@2
|
15 {
|
nuclear@2
|
16 xwin = xid;
|
nuclear@2
|
17 xpixmap = 0;
|
nuclear@12
|
18 pixmap_valid = false;
|
nuclear@3
|
19 memset(&attr, 0, sizeof attr);
|
nuclear@3
|
20 mapped = false;
|
nuclear@7
|
21 damage = 0;
|
nuclear@12
|
22 damaged = false;
|
nuclear@12
|
23 tex_valid = false;
|
nuclear@7
|
24 }
|
nuclear@7
|
25
|
nuclear@7
|
26 CompWindow::~CompWindow()
|
nuclear@7
|
27 {
|
nuclear@7
|
28 if(xpixmap) {
|
nuclear@7
|
29 XFreePixmap(dpy, xpixmap);
|
nuclear@7
|
30 }
|
nuclear@7
|
31 if(damage) {
|
nuclear@7
|
32 XDamageDestroy(dpy, damage);
|
nuclear@7
|
33 }
|
nuclear@2
|
34 }
|
nuclear@2
|
35
|
nuclear@12
|
36 bool CompWindow::update_attr()
|
nuclear@12
|
37 {
|
nuclear@12
|
38 if(!xwin) return false;
|
nuclear@12
|
39
|
nuclear@12
|
40 XGetWindowAttributes(dpy, xwin, &attr);
|
nuclear@12
|
41 return true;
|
nuclear@12
|
42 }
|
nuclear@12
|
43
|
nuclear@12
|
44 bool CompWindow::update_pixmap()
|
nuclear@12
|
45 {
|
nuclear@12
|
46 if(!xwin) return false;
|
nuclear@12
|
47
|
nuclear@12
|
48 Pixmap pix = XCompositeNameWindowPixmap(dpy, xwin);
|
nuclear@12
|
49 if(!pix) {
|
nuclear@12
|
50 log_error("failed to get window %x pixmap\n", xwin);
|
nuclear@12
|
51 return false;
|
nuclear@12
|
52 }
|
nuclear@12
|
53
|
nuclear@12
|
54 if(pix != xpixmap) {
|
nuclear@12
|
55 if(xpixmap) {
|
nuclear@12
|
56 XFreePixmap(dpy, xpixmap);
|
nuclear@12
|
57 }
|
nuclear@12
|
58 xpixmap = pix;
|
nuclear@12
|
59 tex_valid = false;
|
nuclear@12
|
60 }
|
nuclear@12
|
61 pixmap_valid = true;
|
nuclear@12
|
62 return true;
|
nuclear@12
|
63 }
|
nuclear@12
|
64
|
nuclear@12
|
65 bool CompWindow::update_texture()
|
nuclear@12
|
66 {
|
nuclear@12
|
67 if(!xwin || !xpixmap) return false;
|
nuclear@12
|
68 tex.set_image(dpy, xpixmap);
|
nuclear@12
|
69 tex_valid = true;
|
nuclear@12
|
70 return true;
|
nuclear@12
|
71 }
|
nuclear@12
|
72
|
nuclear@0
|
73 void add_window(CompWindow *cwin)
|
nuclear@0
|
74 {
|
nuclear@0
|
75 if(have_window(cwin)) {
|
nuclear@0
|
76 log_warning("add_window trying to add duplicate, ignoring\n");
|
nuclear@0
|
77 return;
|
nuclear@0
|
78 }
|
nuclear@0
|
79
|
nuclear@8
|
80 XGetWindowAttributes(dpy, cwin->xwin, &cwin->attr);
|
nuclear@8
|
81
|
nuclear@7
|
82 // create the damage structure to track dirty regions in this window
|
nuclear@8
|
83 if(!cwin->damage && cwin->attr.c_class != InputOnly) {
|
nuclear@7
|
84 cwin->damage = XDamageCreate(dpy, cwin->xwin, XDamageReportNonEmpty);
|
nuclear@7
|
85 }
|
nuclear@7
|
86
|
nuclear@0
|
87 cwinlist.push_back(cwin);
|
nuclear@0
|
88 }
|
nuclear@0
|
89
|
nuclear@2
|
90 bool remove_window(CompWindow *cwin)
|
nuclear@1
|
91 {
|
nuclear@1
|
92 auto it = std::find(cwinlist.begin(), cwinlist.end(), cwin);
|
nuclear@1
|
93 if(it != cwinlist.end()) {
|
nuclear@1
|
94 cwinlist.erase(it);
|
nuclear@1
|
95 return true;
|
nuclear@1
|
96 }
|
nuclear@1
|
97 return false;
|
nuclear@1
|
98 }
|
nuclear@1
|
99
|
nuclear@1
|
100 bool have_window(CompWindow *cwin)
|
nuclear@1
|
101 {
|
nuclear@1
|
102 return std::find(cwinlist.begin(), cwinlist.end(), cwin) != cwinlist.end();
|
nuclear@1
|
103 }
|
nuclear@1
|
104
|
nuclear@1
|
105 CompWindow *find_window_xid(Window xid)
|
nuclear@1
|
106 {
|
nuclear@1
|
107 if(!xid) return 0;
|
nuclear@1
|
108
|
nuclear@1
|
109 for(size_t i=0; i<cwinlist.size(); i++) {
|
nuclear@1
|
110 if(cwinlist[i]->xwin == xid) {
|
nuclear@1
|
111 return cwinlist[i];
|
nuclear@1
|
112 }
|
nuclear@1
|
113 }
|
nuclear@1
|
114 return 0;
|
nuclear@1
|
115 }
|
nuclear@1
|
116
|
nuclear@1
|
117 CompWindow *find_window_pixmap(Pixmap pix)
|
nuclear@1
|
118 {
|
nuclear@1
|
119 if(!pix) return 0;
|
nuclear@1
|
120
|
nuclear@1
|
121 for(size_t i=0; i<cwinlist.size(); i++) {
|
nuclear@1
|
122 if(cwinlist[i]->xpixmap == pix) {
|
nuclear@1
|
123 return cwinlist[i];
|
nuclear@1
|
124 }
|
nuclear@1
|
125 }
|
nuclear@1
|
126 return 0;
|
nuclear@1
|
127 }
|
nuclear@1
|
128
|
nuclear@1
|
129 int get_window_count()
|
nuclear@1
|
130 {
|
nuclear@1
|
131 return (int)cwinlist.size();
|
nuclear@1
|
132 }
|
nuclear@1
|
133
|
nuclear@1
|
134 CompWindow *get_window(int idx)
|
nuclear@1
|
135 {
|
nuclear@1
|
136 if(idx < 0 || idx >= (int)cwinlist.size()) {
|
nuclear@1
|
137 return 0;
|
nuclear@1
|
138 }
|
nuclear@1
|
139 return cwinlist[idx];
|
nuclear@1
|
140 }
|