summaryrefslogtreecommitdiff
path: root/src/winreflect.h
blob: 30c04835e7bc09cd024e7ff1dde343c65fb35449 (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 *
 * Compiz Window reflection plugin
 *
 * winreflect.h
 *
 * Copyright : (C) 2007 by Sam Spilsbury
 * Email     : <smspillaz@gmail.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#include <core/core.h>
#include <composite/composite.h>
#include <opengl/opengl.h>

#include "winreflect_options.h"

#include <X11/Xatom.h>

class ReflectionRegion :
    public CompRegion
{
    public:
      
      ReflectionRegion (CompRect &r) :
	  CompRegion::CompRegion (r) {};
      
      ReflectionRegion (CompRegion &r) :
	  CompRegion::CompRegion (r) {};

      unsigned int id;
};


class WinreflectScreen :
    public PluginClassHandler <WinreflectScreen, CompScreen>,
    public ScreenInterface,
    public GLScreenInterface,
    public WinreflectOptions
{
    public:

	WinreflectScreen (CompScreen *);
	
    public:
 
	CompositeScreen *cScreen;
	GLScreen	*gScreen;
	
	void
	updateReflectionProperty (Window id);
	
	void
	handleEvent (XEvent *);
	
	void
	optionChange (CompOption *, Options);
	
	bool
	glPaintOutput (const GLScreenPaintAttrib &,
		       const GLMatrix		 &,
		       const CompRegion		 &,
		       CompOutput		 *,
		       unsigned int		   );

	void
	glPaintTransformedOutput (const GLScreenPaintAttrib &,
				  const GLMatrix		 &,
				  const CompRegion		 &,
				  CompOutput		 *,
				  unsigned int		   );

	std::list<ReflectionRegion> mReflectedRegions;
	Atom	   mReflectedRegionAtom;
	
	bool mIsTransformed;
};

#define WINREFLECT_SCREEN(s)						      \
    WinreflectScreen *ws = WinreflectScreen::get (s)

class WinreflectWindow :
    public PluginClassHandler <WinreflectWindow, CompWindow>,
    public CompositeWindowInterface,
    public GLWindowInterface
{
    public:
      
	CompWindow *window;
	CompositeWindow *cWindow;
	GLWindow	*gWindow;
	
	WinreflectWindow (CompWindow *w);
	
	bool
	glPaint (const GLWindowPaintAttrib &,
		 const GLMatrix		&,
		 const CompRegion	&,
		 unsigned int		 );

	bool
	damageRect (bool,
		    const CompRect &);
};

#define WINREFLECT_WINDOW(w)						      \
    WinreflectWindow *ww = WinreflectWindow::get (w)

class WinrelfectPluginVTable :
    public CompPlugin::VTableForScreenAndWindow <WinreflectScreen, WinreflectWindow>
{
    public:
	
      bool init ();
};