Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/nall/compositor.hpp
2 views
1
#ifndef NALL_COMPOSITOR_HPP
2
#define NALL_COMPOSITOR_HPP
3
4
#include <nall/intrinsics.hpp>
5
6
namespace nall {
7
8
struct compositor {
9
inline static bool enabled();
10
inline static bool enable(bool status);
11
12
#if defined(PLATFORM_X)
13
enum class Compositor : unsigned { Unknown, Metacity, Xfwm4 };
14
inline static Compositor detect();
15
16
inline static bool enabled_metacity();
17
inline static bool enable_metacity(bool status);
18
19
inline static bool enabled_xfwm4();
20
inline static bool enable_xfwm4(bool status);
21
#endif
22
};
23
24
#if defined(PLATFORM_X)
25
26
//Metacity
27
28
bool compositor::enabled_metacity() {
29
FILE *fp = popen("gconftool-2 --get /apps/metacity/general/compositing_manager", "r");
30
if(fp == 0) return false;
31
32
char buffer[512];
33
if(fgets(buffer, sizeof buffer, fp) == 0) return false;
34
35
if(!memcmp(buffer, "true", 4)) return true;
36
return false;
37
}
38
39
bool compositor::enable_metacity(bool status) {
40
FILE *fp;
41
if(status) {
42
fp = popen("gconftool-2 --set --type bool /apps/metacity/general/compositing_manager true", "r");
43
} else {
44
fp = popen("gconftool-2 --set --type bool /apps/metacity/general/compositing_manager false", "r");
45
}
46
if(fp == 0) return false;
47
pclose(fp);
48
return true;
49
}
50
51
//Xfwm4
52
53
bool compositor::enabled_xfwm4() {
54
FILE *fp = popen("xfconf-query -c xfwm4 -p '/general/use_compositing'", "r");
55
if(fp == 0) return false;
56
57
char buffer[512];
58
if(fgets(buffer, sizeof buffer, fp) == 0) return false;
59
60
if(!memcmp(buffer, "true", 4)) return true;
61
return false;
62
}
63
64
bool compositor::enable_xfwm4(bool status) {
65
FILE *fp;
66
if(status) {
67
fp = popen("xfconf-query -c xfwm4 -p '/general/use_compositing' -t 'bool' -s 'true'", "r");
68
} else {
69
fp = popen("xfconf-query -c xfwm4 -p '/general/use_compositing' -t 'bool' -s 'false'", "r");
70
}
71
if(fp == 0) return false;
72
pclose(fp);
73
return true;
74
}
75
76
//General
77
78
compositor::Compositor compositor::detect() {
79
Compositor result = Compositor::Unknown;
80
81
FILE *fp;
82
char buffer[512];
83
84
fp = popen("pidof metacity", "r");
85
if(fp && fgets(buffer, sizeof buffer, fp)) result = Compositor::Metacity;
86
pclose(fp);
87
88
fp = popen("pidof xfwm4", "r");
89
if(fp && fgets(buffer, sizeof buffer, fp)) result = Compositor::Xfwm4;
90
pclose(fp);
91
92
return result;
93
}
94
95
bool compositor::enabled() {
96
switch(detect()) {
97
case Compositor::Metacity: return enabled_metacity();
98
case Compositor::Xfwm4: return enabled_xfwm4();
99
default: return false;
100
}
101
}
102
103
bool compositor::enable(bool status) {
104
switch(detect()) {
105
case Compositor::Metacity: return enable_metacity(status);
106
case Compositor::Xfwm4: return enable_xfwm4(status);
107
default: return false;
108
}
109
}
110
111
#elif defined(PLATFORM_WINDOWS)
112
113
bool compositor::enabled() {
114
HMODULE module = GetModuleHandleW(L"dwmapi");
115
if(module == 0) module = LoadLibraryW(L"dwmapi");
116
if(module == 0) return false;
117
118
auto pDwmIsCompositionEnabled = (HRESULT (WINAPI*)(BOOL*))GetProcAddress(module, "DwmIsCompositionEnabled");
119
if(pDwmIsCompositionEnabled == 0) return false;
120
121
BOOL result;
122
if(pDwmIsCompositionEnabled(&result) != S_OK) return false;
123
return result;
124
}
125
126
bool compositor::enable(bool status) {
127
HMODULE module = GetModuleHandleW(L"dwmapi");
128
if(module == 0) module = LoadLibraryW(L"dwmapi");
129
if(module == 0) return false;
130
131
auto pDwmEnableComposition = (HRESULT (WINAPI*)(UINT))GetProcAddress(module, "DwmEnableComposition");
132
if(pDwmEnableComposition == 0) return false;
133
134
if(pDwmEnableComposition(status) != S_OK) return false;
135
return true;
136
}
137
138
#else
139
140
bool compositor::enabled() {
141
return false;
142
}
143
144
bool compositor::enable(bool) {
145
return false;
146
}
147
148
#endif
149
150
}
151
152
#endif
153
154