xglcomp

annotate src/cwin.cc @ 12:1c0d056ec360

moving slowly
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 05 Feb 2016 03:33:18 +0200
parents b0081a0c211f
children
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 }