gosu 0.7.33 → 0.7.35
Sign up to get free protection for your applications and to get access to all the features.
- data/Gosu/Async.hpp +10 -8
- data/Gosu/Audio.hpp +6 -4
- data/Gosu/AutoLink.hpp +0 -0
- data/Gosu/Bitmap.hpp +4 -5
- data/Gosu/ButtonsX.hpp +1 -1
- data/Gosu/Color.hpp +8 -8
- data/Gosu/Font.hpp +2 -2
- data/Gosu/Graphics.hpp +4 -6
- data/Gosu/IO.hpp +11 -4
- data/Gosu/Image.hpp +9 -7
- data/Gosu/ImageData.hpp +10 -4
- data/Gosu/Input.hpp +4 -5
- data/Gosu/Sockets.hpp +10 -12
- data/Gosu/TR1.hpp +44 -0
- data/Gosu/TextInput.hpp +2 -2
- data/Gosu/Version.hpp +2 -2
- data/Gosu/WinUtility.hpp +5 -6
- data/Gosu/Window.hpp +5 -6
- data/GosuImpl/Async.cpp +4 -3
- data/GosuImpl/Audio/ALChannelManagement.hpp +23 -11
- data/GosuImpl/Audio/AudioFile.hpp +11 -3
- data/GosuImpl/Audio/AudioOpenAL.cpp +613 -0
- data/GosuImpl/Audio/AudioOpenAL.mm +1 -605
- data/GosuImpl/Audio/AudioSDL.cpp +12 -14
- data/GosuImpl/Audio/AudioToolboxFile.hpp +0 -1
- data/GosuImpl/Audio/OggFile.hpp +2 -0
- data/GosuImpl/Audio/SndFile.hpp +158 -0
- data/GosuImpl/DirectoriesWin.cpp +18 -18
- data/GosuImpl/Graphics/BitmapApple.mm +17 -19
- data/GosuImpl/Graphics/BitmapBMP.cpp +7 -2
- data/GosuImpl/Graphics/BitmapFreeImage.cpp +11 -12
- data/GosuImpl/Graphics/BitmapGDIplus.cpp +35 -31
- data/GosuImpl/Graphics/BitmapUtils.cpp +1 -1
- data/GosuImpl/Graphics/BlockAllocator.cpp +7 -8
- data/GosuImpl/Graphics/BlockAllocator.hpp +3 -4
- data/GosuImpl/Graphics/Common.hpp +3 -2
- data/GosuImpl/Graphics/DrawOp.hpp +2 -3
- data/GosuImpl/Graphics/DrawOpQueue.hpp +28 -20
- data/GosuImpl/Graphics/Font.cpp +13 -13
- data/GosuImpl/Graphics/FormattedString.hpp +93 -86
- data/GosuImpl/Graphics/Graphics.cpp +16 -14
- data/GosuImpl/Graphics/Image.cpp +7 -3
- data/GosuImpl/Graphics/LargeImageData.hpp +4 -5
- data/GosuImpl/Graphics/Macro.hpp +11 -11
- data/GosuImpl/Graphics/RenderState.hpp +5 -4
- data/GosuImpl/Graphics/TexChunk.cpp +3 -3
- data/GosuImpl/Graphics/TexChunk.hpp +4 -4
- data/GosuImpl/Graphics/Text.cpp +29 -30
- data/GosuImpl/Graphics/TextMac.cpp +9 -7
- data/GosuImpl/Graphics/TextTTFWin.cpp +3 -1
- data/GosuImpl/Graphics/TextTouch.mm +0 -1
- data/GosuImpl/Graphics/TextUnix.cpp +12 -4
- data/GosuImpl/Graphics/TextWin.cpp +4 -2
- data/GosuImpl/Graphics/Texture.cpp +7 -6
- data/GosuImpl/Graphics/Texture.hpp +3 -4
- data/GosuImpl/InputMac.mm +12 -15
- data/GosuImpl/InputTouch.mm +3 -3
- data/GosuImpl/InputWin.cpp +149 -159
- data/GosuImpl/InputX.cpp +0 -0
- data/GosuImpl/MacUtility.hpp +9 -4
- data/GosuImpl/RubyGosu.swg +38 -43
- data/GosuImpl/RubyGosu_wrap.cxx +89 -96
- data/GosuImpl/Sockets/CommSocket.cpp +5 -5
- data/GosuImpl/Sockets/Sockets.hpp +4 -4
- data/GosuImpl/TimingApple.cpp +2 -3
- data/GosuImpl/Utility.cpp +18 -0
- data/GosuImpl/WinMain.cpp +0 -1
- data/GosuImpl/WinUtility.cpp +2 -2
- data/GosuImpl/WindowMac.mm +20 -17
- data/GosuImpl/WindowTouch.mm +8 -7
- data/GosuImpl/WindowWin.cpp +12 -7
- data/GosuImpl/WindowX.cpp +67 -18
- data/lib/gosu.rb +14 -12
- data/linux/extconf.rb +11 -6
- metadata +8 -7
- data/GosuImpl/Audio/AudioAudiere.cpp +0 -448
- data/GosuImpl/RubyGosu_DllMain.cxx +0 -31
@@ -1,6 +1,6 @@
|
|
1
1
|
#include <Gosu/Sockets.hpp>
|
2
|
+
#include <Gosu/TR1.hpp>
|
2
3
|
#include <GosuImpl/Sockets/Sockets.hpp>
|
3
|
-
#include <boost/cstdint.hpp>
|
4
4
|
#include <cassert>
|
5
5
|
#include <cstring>
|
6
6
|
#include <stdexcept>
|
@@ -15,7 +15,7 @@ struct Gosu::CommSocket::Impl
|
|
15
15
|
Buffer inbox, outbox;
|
16
16
|
|
17
17
|
void appendBuffer(const char* buffer, std::size_t size,
|
18
|
-
|
18
|
+
std::tr1::function<void (const void*, std::size_t)>& event)
|
19
19
|
{
|
20
20
|
switch (mode)
|
21
21
|
{
|
@@ -35,7 +35,7 @@ struct Gosu::CommSocket::Impl
|
|
35
35
|
|
36
36
|
for (;;) // IMPR.
|
37
37
|
{
|
38
|
-
const size_t sizeSize =
|
38
|
+
const size_t sizeSize = 4;
|
39
39
|
|
40
40
|
// Not even enough bytes there to determine the size of the
|
41
41
|
// incoming message.
|
@@ -43,7 +43,7 @@ struct Gosu::CommSocket::Impl
|
|
43
43
|
break;
|
44
44
|
|
45
45
|
// Message size is already here, convert it.
|
46
|
-
|
46
|
+
std::tr1::uint32_t msgSize = *reinterpret_cast<std::tr1::uint32_t*>(&inbox[0]);
|
47
47
|
msgSize = ntohl(msgSize);
|
48
48
|
|
49
49
|
// Can't really handle zero-size messages. IMPR?!
|
@@ -241,7 +241,7 @@ void Gosu::CommSocket::send(const void* buffer, std::size_t size)
|
|
241
241
|
// In managed mode, also send the length of the buffer.
|
242
242
|
if (mode() == cmManaged)
|
243
243
|
{
|
244
|
-
|
244
|
+
std::tr1::uint32_t netSize = htonl(size);
|
245
245
|
const char* charBuf = reinterpret_cast<const char*>(&netSize);
|
246
246
|
pimpl->outbox.insert(pimpl->outbox.end(), charBuf,
|
247
247
|
charBuf + sizeof netSize);
|
@@ -2,7 +2,6 @@
|
|
2
2
|
#define GOSUIMPL_SOCKETS_HPP
|
3
3
|
|
4
4
|
#include <Gosu/Platform.hpp>
|
5
|
-
#include <boost/utility.hpp>
|
6
5
|
|
7
6
|
#ifdef GOSU_IS_WIN
|
8
7
|
#include "winsock2.h"
|
@@ -27,10 +26,11 @@
|
|
27
26
|
namespace Gosu
|
28
27
|
{
|
29
28
|
// Owns a socket and manages library initialization.
|
30
|
-
class Socket
|
31
|
-
|
29
|
+
class Socket {
|
30
|
+
Socket(const Socket&);
|
31
|
+
Socket& operator=(const Socket&);
|
32
|
+
|
32
33
|
SocketHandle handle_;
|
33
|
-
|
34
34
|
public:
|
35
35
|
Socket();
|
36
36
|
~Socket();
|
data/GosuImpl/TimingApple.cpp
CHANGED
@@ -9,12 +9,11 @@ void Gosu::sleep(unsigned milliseconds)
|
|
9
9
|
// Thanks to this blog for the unconvoluted code example:
|
10
10
|
// http://shiftedbits.org/2008/10/01/mach_absolute_time-on-the-iphone/
|
11
11
|
|
12
|
-
#include <boost/cstdint.hpp>
|
13
12
|
#include <mach/mach_time.h>
|
14
13
|
|
15
14
|
unsigned long Gosu::milliseconds()
|
16
15
|
{
|
17
|
-
static
|
16
|
+
static uint64_t firstTick = 0;
|
18
17
|
static mach_timebase_info_data_t info;
|
19
18
|
|
20
19
|
if (firstTick == 0)
|
@@ -23,6 +22,6 @@ unsigned long Gosu::milliseconds()
|
|
23
22
|
firstTick = mach_absolute_time();
|
24
23
|
}
|
25
24
|
|
26
|
-
|
25
|
+
uint64_t runtime = mach_absolute_time() - firstTick;
|
27
26
|
return runtime * info.numer / info.denom / 1000000.0;
|
28
27
|
}
|
data/GosuImpl/Utility.cpp
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
#include <Gosu/Platform.hpp>
|
3
3
|
#include <cstddef>
|
4
4
|
#include <cstdlib>
|
5
|
+
#include <cwctype>
|
6
|
+
#include <cwchar>
|
5
7
|
#include <stdexcept>
|
6
8
|
#include <algorithm>
|
7
9
|
#include <vector>
|
@@ -99,3 +101,19 @@ string Gosu::narrow(const wstring& ws)
|
|
99
101
|
|
100
102
|
return string(buf.begin(), buf.end() - 1);
|
101
103
|
}
|
104
|
+
|
105
|
+
// TODO: This function needs to go into some internal header.
|
106
|
+
namespace Gosu
|
107
|
+
{
|
108
|
+
bool isExtension(const wchar_t* str, const wchar_t* ext)
|
109
|
+
{
|
110
|
+
size_t strLen = wcslen(str), extLen = wcslen(ext);
|
111
|
+
if (extLen > strLen)
|
112
|
+
return false;
|
113
|
+
str += strLen, ext += extLen;
|
114
|
+
while (extLen--)
|
115
|
+
if (towlower((wint_t)*--str) != *--ext)
|
116
|
+
return false;
|
117
|
+
return true;
|
118
|
+
}
|
119
|
+
}
|
data/GosuImpl/WinMain.cpp
CHANGED
data/GosuImpl/WinUtility.cpp
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
namespace
|
7
7
|
{
|
8
|
-
typedef std::vector<
|
8
|
+
typedef std::vector<std::tr1::function<bool (MSG&)> > Hooks;
|
9
9
|
Hooks hooks;
|
10
10
|
|
11
11
|
bool handledByHook(MSG& message)
|
@@ -68,7 +68,7 @@ void Gosu::Win::processMessages()
|
|
68
68
|
}
|
69
69
|
}
|
70
70
|
|
71
|
-
void Gosu::Win::registerMessageHook(const
|
71
|
+
void Gosu::Win::registerMessageHook(const std::tr1::function<bool (MSG&)>& hook)
|
72
72
|
{
|
73
73
|
hooks.push_back(hook);
|
74
74
|
}
|
data/GosuImpl/WindowMac.mm
CHANGED
@@ -1,17 +1,20 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
1
|
+
#include <Gosu/Window.hpp>
|
2
|
+
#include <Gosu/Audio.hpp>
|
3
|
+
#include <Gosu/Graphics.hpp>
|
4
|
+
#include <Gosu/Input.hpp>
|
5
|
+
#include <GosuImpl/MacUtility.hpp>
|
6
|
+
#include <Gosu/Timing.hpp>
|
7
|
+
#include <Gosu/TR1.hpp>
|
8
|
+
#include <Gosu/Utility.hpp>
|
9
|
+
#include <OpenGL/OpenGL.h>
|
10
|
+
#include <OpenGL/gl.h>
|
11
|
+
#include <memory>
|
12
|
+
#include <vector>
|
13
|
+
using namespace std::tr1::placeholders;
|
14
|
+
|
8
15
|
#import <AppKit/AppKit.h>
|
9
16
|
#import <ApplicationServices/ApplicationServices.h>
|
10
17
|
#import <Carbon/Carbon.h>
|
11
|
-
#import <OpenGL/OpenGL.h>
|
12
|
-
#import <OpenGL/gl.h>
|
13
|
-
#import <boost/bind.hpp>
|
14
|
-
#import <vector>
|
15
18
|
|
16
19
|
namespace Gosu
|
17
20
|
{
|
@@ -190,8 +193,8 @@ struct Gosu::Window::Impl
|
|
190
193
|
NSRect savedFrame;
|
191
194
|
|
192
195
|
ObjRef<NSOpenGLContext> context;
|
193
|
-
|
194
|
-
|
196
|
+
std::auto_ptr<Graphics> graphics;
|
197
|
+
std::auto_ptr<Input> input;
|
195
198
|
double interval;
|
196
199
|
bool mouseViz;
|
197
200
|
|
@@ -302,8 +305,8 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen,
|
|
302
305
|
pimpl->graphics->setResolution(width, height);
|
303
306
|
|
304
307
|
pimpl->input.reset(new Input(pimpl->window.get()));
|
305
|
-
pimpl->input->onButtonDown =
|
306
|
-
pimpl->input->onButtonUp =
|
308
|
+
pimpl->input->onButtonDown = std::tr1::bind(&Window::buttonDown, this, _1);
|
309
|
+
pimpl->input->onButtonUp = std::tr1::bind(&Window::buttonUp, this, _1);
|
307
310
|
pimpl->input->setMouseFactors(1.0 * width / realWidth, 1.0 * height / realHeight);
|
308
311
|
if (fullscreen)
|
309
312
|
[NSApp setInput: input()];
|
@@ -476,8 +479,8 @@ Gosu::Window::SharedContext Gosu::Window::createSharedContext()
|
|
476
479
|
initWithFormat: pf
|
477
480
|
shareContext: pimpl->context.obj()];
|
478
481
|
|
479
|
-
return SharedContext(new
|
480
|
-
|
482
|
+
return SharedContext(new std::tr1::function<void()>(std::tr1::bind(makeCurrentContext, ctx)),
|
483
|
+
std::tr1::bind(releaseContext, ctx));
|
481
484
|
}
|
482
485
|
|
483
486
|
namespace GosusDarkSide
|
data/GosuImpl/WindowTouch.mm
CHANGED
@@ -4,12 +4,13 @@
|
|
4
4
|
#include <Gosu/Input.hpp>
|
5
5
|
#include <GosuImpl/MacUtility.hpp>
|
6
6
|
#include <GosuImpl/Graphics/GosuView.hpp>
|
7
|
-
#include <boost/bind.hpp>
|
8
7
|
|
9
8
|
#import <CoreGraphics/CoreGraphics.h>
|
10
9
|
#import <UIKit/UIKit.h>
|
11
10
|
#import <OpenGLES/EAGL.h>
|
12
11
|
|
12
|
+
using namespace std::tr1::placeholders;
|
13
|
+
|
13
14
|
namespace Gosu
|
14
15
|
{
|
15
16
|
CGRect screenRect = [[UIScreen mainScreen] bounds];
|
@@ -35,9 +36,9 @@ class Gosu::Audio {};
|
|
35
36
|
struct Gosu::Window::Impl {
|
36
37
|
ObjRef<UIWindow> window;
|
37
38
|
ObjRef<GosuViewController> controller;
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
std::auto_ptr<Graphics> graphics;
|
40
|
+
std::auto_ptr<Audio> audio;
|
41
|
+
std::auto_ptr<Input> input;
|
41
42
|
double interval;
|
42
43
|
};
|
43
44
|
|
@@ -126,9 +127,9 @@ Gosu::Window::Window(unsigned width, unsigned height,
|
|
126
127
|
pimpl->graphics->setResolution(screenHeight(), screenWidth());
|
127
128
|
pimpl->audio.reset(new Audio());
|
128
129
|
pimpl->input.reset(new Input(gosuView, updateInterval));
|
129
|
-
pimpl->input->onTouchBegan =
|
130
|
-
pimpl->input->onTouchMoved =
|
131
|
-
pimpl->input->onTouchEnded =
|
130
|
+
pimpl->input->onTouchBegan = std::tr1::bind(&Window::touchBegan, this, _1);
|
131
|
+
pimpl->input->onTouchMoved = std::tr1::bind(&Window::touchMoved, this, _1);
|
132
|
+
pimpl->input->onTouchEnded = std::tr1::bind(&Window::touchEnded, this, _1);
|
132
133
|
pimpl->interval = updateInterval;
|
133
134
|
|
134
135
|
[pimpl->window.obj() makeKeyAndVisible];
|
data/GosuImpl/WindowWin.cpp
CHANGED
@@ -5,15 +5,19 @@
|
|
5
5
|
#include <Gosu/Window.hpp>
|
6
6
|
#include <Gosu/WinUtility.hpp>
|
7
7
|
#include <Gosu/Timing.hpp>
|
8
|
+
#include <Gosu/Audio.hpp>
|
8
9
|
#include <Gosu/Graphics.hpp>
|
9
10
|
#include <Gosu/Input.hpp>
|
10
11
|
#include <Gosu/TextInput.hpp>
|
12
|
+
#include <Gosu/TR1.hpp>
|
11
13
|
#include <GosuImpl/Graphics/Common.hpp>
|
12
|
-
#include <boost/bind.hpp>
|
13
14
|
#include <cassert>
|
15
|
+
#include <memory>
|
14
16
|
#include <stdexcept>
|
15
17
|
#include <vector>
|
16
18
|
|
19
|
+
using namespace std::tr1::placeholders;
|
20
|
+
|
17
21
|
// TODO: Put fullscreen logic in different file, track fullscreen state and
|
18
22
|
// enable dynamic toggling between fullscreen and window.
|
19
23
|
|
@@ -173,8 +177,8 @@ struct Gosu::Window::Impl
|
|
173
177
|
{
|
174
178
|
HWND handle;
|
175
179
|
HDC hdc;
|
176
|
-
|
177
|
-
|
180
|
+
std::auto_ptr<Graphics> graphics;
|
181
|
+
std::auto_ptr<Input> input;
|
178
182
|
double updateInterval;
|
179
183
|
bool iconified;
|
180
184
|
|
@@ -286,8 +290,8 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen,
|
|
286
290
|
graphics().setResolution(pimpl->originalWidth, pimpl->originalHeight);
|
287
291
|
pimpl->input.reset(new Gosu::Input(handle()));
|
288
292
|
input().setMouseFactors(1.0 * pimpl->originalWidth / width, 1.0 * pimpl->originalHeight / height);
|
289
|
-
input().onButtonDown =
|
290
|
-
input().onButtonUp =
|
293
|
+
input().onButtonDown = std::tr1::bind(&Window::buttonDown, this, _1);
|
294
|
+
input().onButtonUp = std::tr1::bind(&Window::buttonUp, this, _1);
|
291
295
|
|
292
296
|
pimpl->updateInterval = updateInterval;
|
293
297
|
}
|
@@ -357,6 +361,7 @@ void Gosu::Window::show()
|
|
357
361
|
if (ms < lastTick || ms - lastTick >= static_cast<unsigned>(pimpl->updateInterval))
|
358
362
|
{
|
359
363
|
lastTick = ms;
|
364
|
+
Song::update();
|
360
365
|
input().update();
|
361
366
|
// TODO: Bad heuristic -- this causes flickering cursor on right and bottom border of the
|
362
367
|
// window.
|
@@ -463,7 +468,7 @@ LRESULT Gosu::Window::handleMessage(UINT message, WPARAM wparam, LPARAM lparam)
|
|
463
468
|
|
464
469
|
if (message == WM_PAINT)
|
465
470
|
{
|
466
|
-
if (pimpl->graphics && graphics().begin())
|
471
|
+
if (pimpl->graphics.get() && graphics().begin())
|
467
472
|
{
|
468
473
|
try
|
469
474
|
{
|
@@ -496,7 +501,7 @@ LRESULT Gosu::Window::handleMessage(UINT message, WPARAM wparam, LPARAM lparam)
|
|
496
501
|
}
|
497
502
|
}
|
498
503
|
|
499
|
-
if (pimpl->input && input().textInput() && input().textInput()->feedMessage(message, wparam, lparam))
|
504
|
+
if (pimpl->input.get() && input().textInput() && input().textInput()->feedMessage(message, wparam, lparam))
|
500
505
|
return 0;
|
501
506
|
|
502
507
|
return DefWindowProc(handle(), message, wparam, lparam);
|
data/GosuImpl/WindowX.cpp
CHANGED
@@ -4,29 +4,34 @@
|
|
4
4
|
// understand than that! --jlnr
|
5
5
|
|
6
6
|
#include <Gosu/Window.hpp>
|
7
|
-
#include <Gosu/
|
8
|
-
#include <Gosu/Utility.hpp>
|
7
|
+
#include <Gosu/Audio.hpp>
|
9
8
|
#include <Gosu/Input.hpp>
|
10
9
|
#include <Gosu/Graphics.hpp>
|
11
|
-
#include <Gosu/
|
12
|
-
#include <
|
13
|
-
#include <
|
14
|
-
#include <algorithm>
|
10
|
+
#include <Gosu/Timing.hpp>
|
11
|
+
#include <Gosu/TR1.hpp>
|
12
|
+
#include <Gosu/Utility.hpp>
|
15
13
|
#include <cstdio>
|
14
|
+
#include <algorithm>
|
15
|
+
#include <memory>
|
16
|
+
#include <sstream>
|
17
|
+
#include <stdexcept>
|
16
18
|
#include <vector>
|
17
19
|
|
18
20
|
#include <GL/glx.h>
|
19
21
|
#include <X11/Xlib.h>
|
20
22
|
#include <X11/Xutil.h>
|
23
|
+
#include <X11/extensions/Xdamage.h>
|
21
24
|
#include "X11vroot.h"
|
22
25
|
|
26
|
+
using namespace std::tr1::placeholders;
|
27
|
+
|
23
28
|
namespace
|
24
29
|
{
|
25
30
|
template<typename T>
|
26
31
|
class scoped_resource
|
27
32
|
{
|
28
33
|
T* pointer;
|
29
|
-
typedef
|
34
|
+
typedef std::tr1::function<void(T*)> Deleter;
|
30
35
|
Deleter deleter;
|
31
36
|
|
32
37
|
public:
|
@@ -81,8 +86,8 @@ namespace Gosu
|
|
81
86
|
|
82
87
|
struct Gosu::Window::Impl
|
83
88
|
{
|
84
|
-
|
85
|
-
|
89
|
+
std::auto_ptr<Graphics> graphics;
|
90
|
+
std::auto_ptr<Input> input;
|
86
91
|
|
87
92
|
::Display* display;
|
88
93
|
|
@@ -94,6 +99,10 @@ struct Gosu::Window::Impl
|
|
94
99
|
::GLXContext context;
|
95
100
|
::Window window;
|
96
101
|
::XVisualInfo* visual;
|
102
|
+
|
103
|
+
// We use the XDamage extension to detect when we need to redraw ourselves
|
104
|
+
Damage damage;
|
105
|
+
int damageEvent, damageError;
|
97
106
|
|
98
107
|
// Last set title
|
99
108
|
std::wstring title;
|
@@ -113,7 +122,7 @@ struct Gosu::Window::Impl
|
|
113
122
|
|
114
123
|
}
|
115
124
|
|
116
|
-
void executeAndWait(
|
125
|
+
void executeAndWait(std::tr1::function<void(Display*, ::Window)> function, int forMessage)
|
117
126
|
{
|
118
127
|
XSelectInput(display, window, StructureNotifyMask);
|
119
128
|
function(display, window);
|
@@ -133,7 +142,7 @@ struct Gosu::Window::Impl
|
|
133
142
|
{
|
134
143
|
XEvent event;
|
135
144
|
XNextEvent(display, &event);
|
136
|
-
|
145
|
+
|
137
146
|
// Override redirect fix (thanks go to the Pyglet folks again):
|
138
147
|
if (event.type == ButtonPress && fullscreen && !active)
|
139
148
|
XSetInputFocus(display, this->window, RevertToParent, CurrentTime);
|
@@ -156,6 +165,22 @@ struct Gosu::Window::Impl
|
|
156
165
|
else if (event.type == FocusOut)
|
157
166
|
active = false;
|
158
167
|
}
|
168
|
+
|
169
|
+
// Force redraw on window damage; don't check needsRedraw()
|
170
|
+
if (event.type == damageEvent + XDamageNotify)
|
171
|
+
{
|
172
|
+
XDamageNotifyEvent* dev = (XDamageNotifyEvent*)&event;
|
173
|
+
XDamageSubtract(display, dev->damage, None, None);
|
174
|
+
// If there are more events queued up right after this one, we
|
175
|
+
// don't need to redraw just yet
|
176
|
+
if (dev->more == false &&
|
177
|
+
window->graphics().begin(Colors::black))
|
178
|
+
{
|
179
|
+
window->draw();
|
180
|
+
window->graphics().end();
|
181
|
+
glXSwapBuffers(display, this->window);
|
182
|
+
}
|
183
|
+
}
|
159
184
|
}
|
160
185
|
|
161
186
|
if (showingCursor && !window->needsCursor())
|
@@ -169,6 +194,7 @@ struct Gosu::Window::Impl
|
|
169
194
|
showingCursor = true;
|
170
195
|
}
|
171
196
|
|
197
|
+
Song::update();
|
172
198
|
window->input().update();
|
173
199
|
window->update();
|
174
200
|
|
@@ -180,6 +206,18 @@ struct Gosu::Window::Impl
|
|
180
206
|
glXSwapBuffers(display, this->window);
|
181
207
|
}
|
182
208
|
}
|
209
|
+
|
210
|
+
// The ICCCM standard requires that compositing window managers acquire
|
211
|
+
// ownership of a selection named _NET_WM_CM_Sn, where n is the screen
|
212
|
+
// number
|
213
|
+
bool isComposited()
|
214
|
+
{
|
215
|
+
std::ostringstream atomName;
|
216
|
+
atomName << "_NET_WM_CM_S" << XDefaultScreen(display);
|
217
|
+
const std::string& tmp = atomName.str();
|
218
|
+
Atom selection = XInternAtom(display, tmp.c_str(), False);
|
219
|
+
return XGetSelectionOwner(display, selection) != None;
|
220
|
+
}
|
183
221
|
};
|
184
222
|
|
185
223
|
Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen,
|
@@ -267,8 +305,8 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen,
|
|
267
305
|
// Now set up major Gosu components
|
268
306
|
pimpl->graphics.reset(new Graphics(pimpl->width, pimpl->height, fullscreen));
|
269
307
|
pimpl->input.reset(new Input(pimpl->display, pimpl->window));
|
270
|
-
input().onButtonDown =
|
271
|
-
input().onButtonUp =
|
308
|
+
input().onButtonDown = std::tr1::bind(&Window::buttonDown, this, _1);
|
309
|
+
input().onButtonUp = std::tr1::bind(&Window::buttonUp, this, _1);
|
272
310
|
|
273
311
|
// Fix coordinates for fullscreen screen-scaling
|
274
312
|
if (fullscreen)
|
@@ -277,10 +315,21 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen,
|
|
277
315
|
input().setMouseFactors(1.0 * width / pimpl->width,
|
278
316
|
1.0 * height / pimpl->height);
|
279
317
|
}
|
318
|
+
|
319
|
+
// Composited windows, by nature, don't need to monitor XDamage
|
320
|
+
if (!pimpl->isComposited())
|
321
|
+
{
|
322
|
+
// Register our intent to monitor this window for damage
|
323
|
+
XDamageQueryExtension(pimpl->display, &pimpl->damageEvent, &pimpl->damageError);
|
324
|
+
pimpl->damage = XDamageCreate(pimpl->display, pimpl->window,
|
325
|
+
XDamageReportNonEmpty);
|
326
|
+
}
|
280
327
|
}
|
281
328
|
|
282
329
|
Gosu::Window::~Window()
|
283
|
-
{
|
330
|
+
{
|
331
|
+
if (!pimpl->isComposited())
|
332
|
+
XDamageDestroy(pimpl->display, pimpl->damage);
|
284
333
|
XFreeCursor(pimpl->display, pimpl->emptyCursor);
|
285
334
|
XDestroyWindow(pimpl->display, pimpl->window);
|
286
335
|
XSync(pimpl->display, false);
|
@@ -403,13 +452,13 @@ Gosu::Window::SharedContext Gosu::Window::createSharedContext() {
|
|
403
452
|
if (!dpy2)
|
404
453
|
throw std::runtime_error("Could not duplicate X display");
|
405
454
|
|
406
|
-
|
407
|
-
|
455
|
+
GLXContext ctx = glXCreateContext(dpy2, pimpl->visual, pimpl->context, True);
|
456
|
+
if (!ctx)
|
408
457
|
throw std::runtime_error("Could not create shared GLX context");
|
409
458
|
|
410
459
|
return SharedContext(
|
411
|
-
new
|
412
|
-
|
460
|
+
new std::tr1::function<void()>(std::tr1::bind(makeCurrentContext, dpy2, pimpl->window, ctx)),
|
461
|
+
std::tr1::bind(releaseContext, dpy2, ctx));
|
413
462
|
}
|
414
463
|
|
415
464
|
// Deprecated.
|