gosu 0.7.33 → 0.7.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|