reflexion 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.doc/ext/reflex/application.cpp +13 -0
- data/ChangeLog.md +8 -0
- data/VERSION +1 -1
- data/ext/reflex/application.cpp +14 -0
- data/ext/reflex/extconf.rb +3 -3
- data/include/reflex/application.h +16 -0
- data/lib/reflex/application.rb +4 -0
- data/lib/reflexion.rb +1 -2
- data/reflex.gemspec +3 -4
- data/src/application.cpp +88 -0
- data/src/application.h +28 -0
- data/src/ios/app_delegate.mm +7 -5
- data/src/ios/application.h +8 -5
- data/src/ios/application.mm +16 -43
- data/src/ios/view_controller.mm +4 -0
- data/src/osx/app_delegate.mm +7 -5
- data/src/osx/application.h +8 -5
- data/src/osx/application.mm +16 -43
- data/src/osx/native_window.mm +4 -0
- data/src/win32/application.cpp +48 -50
- data/src/win32/window.cpp +7 -43
- data/src/win32/window.h +20 -0
- data/src/window.cpp +31 -0
- data/src/window.h +8 -0
- metadata +17 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fecd1db4ed537d71ce28cfcfd6d6556e2a7d39c108db0bfff677155bdb399fb6
|
4
|
+
data.tar.gz: 22ea1366244b563a0ea67db01b8b18c89a25e273f781c78f11bab186761f3b90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d01aa555b6a680c53b4c88ac0a8eabca0beec42fe0db6a173e45d4d405f4baa4fa4c43e44ce57fdc24a86bb85dfedd7f103c5a5a250377e5a71992817b49060
|
7
|
+
data.tar.gz: 706935d574fd567b9a597643f4797e93718baf1e8f8ef1fca2ae183982e6b6e50c9936dbe2ef5d7ca274f9221fc83e4814a9fa071f00413b1cc26b545c0bd971
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "reflex/ruby/application.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include "reflex/ruby/window.h"
|
4
5
|
#include "defs.h"
|
5
6
|
|
6
7
|
|
@@ -51,6 +52,17 @@ VALUE get_name(VALUE self)
|
|
51
52
|
return value(THIS->name());
|
52
53
|
}
|
53
54
|
|
55
|
+
static
|
56
|
+
VALUE each_window(VALUE self)
|
57
|
+
{
|
58
|
+
CHECK;
|
59
|
+
|
60
|
+
Value ret;
|
61
|
+
for (auto it = THIS->window_begin(), end = THIS->window_end(); it != end; ++it)
|
62
|
+
ret = rb_yield(value(it->get()));
|
63
|
+
return ret;
|
64
|
+
}
|
65
|
+
|
54
66
|
static
|
55
67
|
VALUE on_start(VALUE self, VALUE event)
|
56
68
|
{
|
@@ -110,6 +122,7 @@ Init_reflex_application ()
|
|
110
122
|
rb_define_method(cApplication, "quit", RUBY_METHOD_FUNC(quit), 0);
|
111
123
|
rb_define_method(cApplication, "name=", RUBY_METHOD_FUNC(set_name), 1);
|
112
124
|
rb_define_method(cApplication, "name", RUBY_METHOD_FUNC(get_name), 0);
|
125
|
+
rb_define_method(cApplication, "each_window", RUBY_METHOD_FUNC(each_window), 0);
|
113
126
|
rb_define_method(cApplication, "on_start", RUBY_METHOD_FUNC(on_start), 1);
|
114
127
|
rb_define_method(cApplication, "on_quit", RUBY_METHOD_FUNC(on_quit), 1);
|
115
128
|
rb_define_method(cApplication, "on_motion", RUBY_METHOD_FUNC(on_motion), 1);
|
data/ChangeLog.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.3
|
data/ext/reflex/application.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "reflex/ruby/application.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include "reflex/ruby/window.h"
|
4
5
|
#include "defs.h"
|
5
6
|
|
6
7
|
|
@@ -56,6 +57,18 @@ RUCY_DEF0(get_name)
|
|
56
57
|
}
|
57
58
|
RUCY_END
|
58
59
|
|
60
|
+
static
|
61
|
+
RUCY_DEF0(each_window)
|
62
|
+
{
|
63
|
+
CHECK;
|
64
|
+
|
65
|
+
Value ret;
|
66
|
+
for (auto it = THIS->window_begin(), end = THIS->window_end(); it != end; ++it)
|
67
|
+
ret = rb_yield(value(it->get()));
|
68
|
+
return ret;
|
69
|
+
}
|
70
|
+
RUCY_END
|
71
|
+
|
59
72
|
static
|
60
73
|
RUCY_DEF1(on_start, event)
|
61
74
|
{
|
@@ -121,6 +134,7 @@ Init_reflex_application ()
|
|
121
134
|
cApplication.define_method("quit", quit);
|
122
135
|
cApplication.define_method("name=", set_name);
|
123
136
|
cApplication.define_method("name", get_name);
|
137
|
+
cApplication.define_method("each_window", each_window);
|
124
138
|
cApplication.define_method("on_start", on_start);
|
125
139
|
cApplication.define_method("on_quit", on_quit);
|
126
140
|
cApplication.define_method("on_motion", on_motion);
|
data/ext/reflex/extconf.rb
CHANGED
@@ -13,9 +13,9 @@ require 'reflex/extension'
|
|
13
13
|
Xot::ExtConf.new Xot, Rucy, Rays, Reflex do
|
14
14
|
setup do
|
15
15
|
headers << 'ruby.h'
|
16
|
-
libs.unshift 'gdi32', 'opengl32', 'glew32'
|
17
|
-
frameworks << 'Cocoa'
|
18
|
-
$LDFLAGS << ' -Wl,--out-implib=native.dll.a'
|
16
|
+
libs.unshift 'gdi32', 'winmm', 'opengl32', 'glew32' if win32?
|
17
|
+
frameworks << 'Cocoa' if osx?
|
18
|
+
$LDFLAGS << ' -Wl,--out-implib=native.dll.a' if mingw? || cygwin?
|
19
19
|
|
20
20
|
unless osx?
|
21
21
|
lib_dirs << Rays::Extension.ext_dir
|
@@ -4,9 +4,11 @@
|
|
4
4
|
#define __REFLEX_APPLICATION_H__
|
5
5
|
|
6
6
|
|
7
|
+
#include <vector>
|
7
8
|
#include <xot/ref.h>
|
8
9
|
#include <xot/pimpl.h>
|
9
10
|
#include <reflex/defs.h>
|
11
|
+
#include <reflex/window.h>
|
10
12
|
#include <reflex/event.h>
|
11
13
|
|
12
14
|
|
@@ -23,6 +25,12 @@ namespace Reflex
|
|
23
25
|
|
24
26
|
typedef Xot::Ref<This> Ref;
|
25
27
|
|
28
|
+
typedef std::vector<Window::Ref> WindowList;
|
29
|
+
|
30
|
+
typedef WindowList:: iterator window_iterator;
|
31
|
+
|
32
|
+
typedef WindowList::const_iterator const_window_iterator;
|
33
|
+
|
26
34
|
Application ();
|
27
35
|
|
28
36
|
virtual void start ();
|
@@ -33,6 +41,14 @@ namespace Reflex
|
|
33
41
|
|
34
42
|
virtual const char* name () const;
|
35
43
|
|
44
|
+
virtual window_iterator window_begin ();
|
45
|
+
|
46
|
+
virtual const_window_iterator window_begin () const;
|
47
|
+
|
48
|
+
virtual window_iterator window_end ();
|
49
|
+
|
50
|
+
virtual const_window_iterator window_end () const;
|
51
|
+
|
36
52
|
virtual void on_start (Event* e);
|
37
53
|
|
38
54
|
virtual void on_quit (Event* e);
|
data/lib/reflex/application.rb
CHANGED
data/lib/reflexion.rb
CHANGED
data/reflex.gemspec
CHANGED
@@ -25,10 +25,9 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.platform = Gem::Platform::RUBY
|
26
26
|
s.required_ruby_version = '>= 3.0.0'
|
27
27
|
|
28
|
-
s.add_dependency 'xot', '~> 0.3.
|
29
|
-
s.add_dependency 'rucy', '~> 0.3.
|
30
|
-
s.add_dependency '
|
31
|
-
s.add_dependency 'rays', '~> 0.3.2', '>= 0.3.2'
|
28
|
+
s.add_dependency 'xot', '~> 0.3.3', '>= 0.3.3'
|
29
|
+
s.add_dependency 'rucy', '~> 0.3.3', '>= 0.3.3'
|
30
|
+
s.add_dependency 'rays', '~> 0.3.3', '>= 0.3.3'
|
32
31
|
|
33
32
|
s.files = `git ls-files`.split $/
|
34
33
|
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
|
data/src/application.cpp
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
#include "application.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include "reflex/exception.h"
|
5
|
+
#include "reflex/debug.h"
|
6
|
+
#include "window.h"
|
7
|
+
|
8
|
+
|
9
|
+
namespace Reflex
|
10
|
+
{
|
11
|
+
|
12
|
+
|
13
|
+
namespace global
|
14
|
+
{
|
15
|
+
|
16
|
+
static Application* instance = NULL;
|
17
|
+
|
18
|
+
}// global
|
19
|
+
|
20
|
+
|
21
|
+
Application*
|
22
|
+
app ()
|
23
|
+
{
|
24
|
+
return global::instance;
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
Application::Application ()
|
29
|
+
: self(Application_create_data())
|
30
|
+
{
|
31
|
+
if (global::instance)
|
32
|
+
reflex_error(__FILE__, __LINE__, "multiple application instances.");
|
33
|
+
|
34
|
+
global::instance = this;
|
35
|
+
}
|
36
|
+
|
37
|
+
Application::~Application ()
|
38
|
+
{
|
39
|
+
global::instance = NULL;
|
40
|
+
}
|
41
|
+
|
42
|
+
void
|
43
|
+
Application::set_name (const char* name)
|
44
|
+
{
|
45
|
+
if (!name)
|
46
|
+
argument_error(__FILE__, __LINE__);
|
47
|
+
|
48
|
+
self->name = name;
|
49
|
+
}
|
50
|
+
|
51
|
+
const char*
|
52
|
+
Application::name () const
|
53
|
+
{
|
54
|
+
return self->name.c_str();
|
55
|
+
}
|
56
|
+
|
57
|
+
Application::window_iterator
|
58
|
+
Application::window_begin ()
|
59
|
+
{
|
60
|
+
return Window_all().begin();
|
61
|
+
}
|
62
|
+
|
63
|
+
Application::const_window_iterator
|
64
|
+
Application::window_begin () const
|
65
|
+
{
|
66
|
+
return Window_all().begin();
|
67
|
+
}
|
68
|
+
|
69
|
+
Application::window_iterator
|
70
|
+
Application::window_end ()
|
71
|
+
{
|
72
|
+
return Window_all().end();
|
73
|
+
}
|
74
|
+
|
75
|
+
Application::const_window_iterator
|
76
|
+
Application::window_end () const
|
77
|
+
{
|
78
|
+
return Window_all().end();
|
79
|
+
}
|
80
|
+
|
81
|
+
bool
|
82
|
+
Application::operator ! () const
|
83
|
+
{
|
84
|
+
return !operator bool();
|
85
|
+
}
|
86
|
+
|
87
|
+
|
88
|
+
}// Reflex
|
data/src/application.h
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
// -*- c++ -*-
|
2
|
+
#pragma once
|
3
|
+
#ifndef __REFLEX_SRC_APPLICATION_H__
|
4
|
+
#define __REFLEX_SRC_APPLICATION_H__
|
5
|
+
|
6
|
+
|
7
|
+
#include "reflex/application.h"
|
8
|
+
|
9
|
+
|
10
|
+
namespace Reflex
|
11
|
+
{
|
12
|
+
|
13
|
+
|
14
|
+
struct Application::Data
|
15
|
+
{
|
16
|
+
|
17
|
+
String name;
|
18
|
+
|
19
|
+
};// Application::Data
|
20
|
+
|
21
|
+
|
22
|
+
Application::Data* Application_create_data ();
|
23
|
+
|
24
|
+
|
25
|
+
}// Reflex
|
26
|
+
|
27
|
+
|
28
|
+
#endif//EOH
|
data/src/ios/app_delegate.mm
CHANGED
@@ -45,10 +45,11 @@
|
|
45
45
|
if (!app)
|
46
46
|
Reflex::argument_error(__FILE__, __LINE__);
|
47
47
|
|
48
|
-
|
48
|
+
Reflex::ApplicationData& data = Reflex::Application_get_data(app);
|
49
|
+
if (data.delegate)
|
49
50
|
Reflex::invalid_state_error(__FILE__, __LINE__);
|
50
51
|
|
51
|
-
|
52
|
+
data.delegate = [self retain];
|
52
53
|
app->retain();
|
53
54
|
|
54
55
|
application = app;
|
@@ -58,10 +59,11 @@
|
|
58
59
|
{
|
59
60
|
if (!application) return;
|
60
61
|
|
61
|
-
|
62
|
+
Reflex::ApplicationData& data = Reflex::Application_get_data(application);
|
63
|
+
if (data.delegate)
|
62
64
|
{
|
63
|
-
[
|
64
|
-
|
65
|
+
[data.delegate release];
|
66
|
+
data.delegate = nil;
|
65
67
|
}
|
66
68
|
|
67
69
|
application->release();
|
data/src/ios/application.h
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
#define __REFLEX_SRC_IOS_APPLICATION_H__
|
5
5
|
|
6
6
|
|
7
|
-
#include "
|
7
|
+
#include "../application.h"
|
8
8
|
|
9
9
|
|
10
10
|
@class ReflexAppDelegate;
|
@@ -14,16 +14,19 @@ namespace Reflex
|
|
14
14
|
{
|
15
15
|
|
16
16
|
|
17
|
-
struct Application::Data
|
17
|
+
struct ApplicationData : public Application::Data
|
18
18
|
{
|
19
19
|
|
20
20
|
ReflexAppDelegate* delegate;
|
21
21
|
|
22
|
-
|
22
|
+
ApplicationData ();
|
23
23
|
|
24
|
-
|
24
|
+
};// ApplicationData
|
25
25
|
|
26
|
-
|
26
|
+
|
27
|
+
ApplicationData& Application_get_data ( Application* app);
|
28
|
+
|
29
|
+
const ApplicationData& Application_get_data (const Application* app);
|
27
30
|
|
28
31
|
|
29
32
|
}// Reflex
|
data/src/ios/application.mm
CHANGED
@@ -22,33 +22,33 @@ namespace Reflex
|
|
22
22
|
{
|
23
23
|
|
24
24
|
|
25
|
-
|
25
|
+
Application::Data*
|
26
|
+
Application_create_data ()
|
26
27
|
{
|
28
|
+
return new ApplicationData();
|
29
|
+
}
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
+
ApplicationData&
|
32
|
+
Application_get_data (Application* app)
|
33
|
+
{
|
34
|
+
if (!app)
|
35
|
+
argument_error(__FILE__, __LINE__);
|
31
36
|
|
37
|
+
return (ApplicationData&) *app->self;
|
38
|
+
}
|
32
39
|
|
33
|
-
|
34
|
-
|
40
|
+
const ApplicationData&
|
41
|
+
Application_get_data (const Application* app)
|
35
42
|
{
|
36
|
-
return
|
43
|
+
return Application_get_data(const_cast<Application*>(app));
|
37
44
|
}
|
38
45
|
|
39
46
|
|
40
|
-
|
47
|
+
ApplicationData::ApplicationData ()
|
48
|
+
: delegate(nil)
|
41
49
|
{
|
42
|
-
if (global::instance)
|
43
|
-
reflex_error(__FILE__, __LINE__, "multiple application instances.");
|
44
|
-
|
45
|
-
global::instance = this;
|
46
50
|
}
|
47
51
|
|
48
|
-
Application::~Application ()
|
49
|
-
{
|
50
|
-
global::instance = NULL;
|
51
|
-
}
|
52
52
|
|
53
53
|
void
|
54
54
|
Application::start ()
|
@@ -75,21 +75,6 @@ namespace Reflex
|
|
75
75
|
not_implemented_error(__FILE__, __LINE__);
|
76
76
|
}
|
77
77
|
|
78
|
-
void
|
79
|
-
Application::set_name (const char* name)
|
80
|
-
{
|
81
|
-
if (!name)
|
82
|
-
argument_error(__FILE__, __LINE__);
|
83
|
-
|
84
|
-
self->name = name;
|
85
|
-
}
|
86
|
-
|
87
|
-
const char*
|
88
|
-
Application::name () const
|
89
|
-
{
|
90
|
-
return self->name.c_str();
|
91
|
-
}
|
92
|
-
|
93
78
|
void
|
94
79
|
Application::on_start (Event* e)
|
95
80
|
{
|
@@ -120,17 +105,5 @@ namespace Reflex
|
|
120
105
|
return true;
|
121
106
|
}
|
122
107
|
|
123
|
-
bool
|
124
|
-
Application::operator ! () const
|
125
|
-
{
|
126
|
-
return !operator bool();
|
127
|
-
}
|
128
|
-
|
129
|
-
|
130
|
-
Application::Data::Data ()
|
131
|
-
: delegate(nil)
|
132
|
-
{
|
133
|
-
}
|
134
|
-
|
135
108
|
|
136
109
|
}// Reflex
|
data/src/ios/view_controller.mm
CHANGED
@@ -195,6 +195,8 @@ ReflexViewController_get_show_fun ()
|
|
195
195
|
|
196
196
|
ptr_for_rebind->Xot::template RefCountable<>::release();
|
197
197
|
ptr_for_rebind = NULL;
|
198
|
+
|
199
|
+
Window_register(pwindow);
|
198
200
|
}
|
199
201
|
}
|
200
202
|
|
@@ -203,6 +205,8 @@ ReflexViewController_get_show_fun ()
|
|
203
205
|
[self rebind];
|
204
206
|
if (!pwindow) return;
|
205
207
|
|
208
|
+
Window_unregister(pwindow);
|
209
|
+
|
206
210
|
Window_get_data(pwindow).view_controller = nil;
|
207
211
|
|
208
212
|
pwindow->release();
|
data/src/osx/app_delegate.mm
CHANGED
@@ -38,10 +38,11 @@
|
|
38
38
|
if (!app)
|
39
39
|
Reflex::argument_error(__FILE__, __LINE__);
|
40
40
|
|
41
|
-
|
41
|
+
Reflex::ApplicationData& data = Reflex::Application_get_data(app);
|
42
|
+
if (data.delegate)
|
42
43
|
Reflex::invalid_state_error(__FILE__, __LINE__);
|
43
44
|
|
44
|
-
|
45
|
+
data.delegate = [self retain];
|
45
46
|
app->retain();
|
46
47
|
|
47
48
|
application = app;
|
@@ -51,10 +52,11 @@
|
|
51
52
|
{
|
52
53
|
if (!application) return;
|
53
54
|
|
54
|
-
|
55
|
+
Reflex::ApplicationData& data = Reflex::Application_get_data(application);
|
56
|
+
if (data.delegate)
|
55
57
|
{
|
56
|
-
[
|
57
|
-
|
58
|
+
[data.delegate release];
|
59
|
+
data.delegate = nil;
|
58
60
|
}
|
59
61
|
|
60
62
|
application->release();
|
data/src/osx/application.h
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
#define __REFLEX_SRC_OSX_APPLICATION_H__
|
5
5
|
|
6
6
|
|
7
|
-
#include "
|
7
|
+
#include "../application.h"
|
8
8
|
|
9
9
|
|
10
10
|
@class ReflexAppDelegate;
|
@@ -14,16 +14,19 @@ namespace Reflex
|
|
14
14
|
{
|
15
15
|
|
16
16
|
|
17
|
-
struct Application::Data
|
17
|
+
struct ApplicationData : public Application::Data
|
18
18
|
{
|
19
19
|
|
20
20
|
ReflexAppDelegate* delegate;
|
21
21
|
|
22
|
-
|
22
|
+
ApplicationData ();
|
23
23
|
|
24
|
-
|
24
|
+
};// ApplicationData
|
25
25
|
|
26
|
-
|
26
|
+
|
27
|
+
ApplicationData& Application_get_data ( Application* app);
|
28
|
+
|
29
|
+
const ApplicationData& Application_get_data (const Application* app);
|
27
30
|
|
28
31
|
|
29
32
|
}// Reflex
|
data/src/osx/application.mm
CHANGED
@@ -12,33 +12,33 @@ namespace Reflex
|
|
12
12
|
{
|
13
13
|
|
14
14
|
|
15
|
-
|
15
|
+
Application::Data*
|
16
|
+
Application_create_data ()
|
16
17
|
{
|
18
|
+
return new ApplicationData();
|
19
|
+
}
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
ApplicationData&
|
22
|
+
Application_get_data (Application* app)
|
23
|
+
{
|
24
|
+
if (!app)
|
25
|
+
argument_error(__FILE__, __LINE__);
|
21
26
|
|
27
|
+
return (ApplicationData&) *app->self;
|
28
|
+
}
|
22
29
|
|
23
|
-
|
24
|
-
|
30
|
+
const ApplicationData&
|
31
|
+
Application_get_data (const Application* app)
|
25
32
|
{
|
26
|
-
return
|
33
|
+
return Application_get_data(const_cast<Application*>(app));
|
27
34
|
}
|
28
35
|
|
29
36
|
|
30
|
-
|
37
|
+
ApplicationData::ApplicationData ()
|
38
|
+
: delegate(nil)
|
31
39
|
{
|
32
|
-
if (global::instance)
|
33
|
-
reflex_error(__FILE__, __LINE__, "multiple application instances.");
|
34
|
-
|
35
|
-
global::instance = this;
|
36
40
|
}
|
37
41
|
|
38
|
-
Application::~Application ()
|
39
|
-
{
|
40
|
-
global::instance = NULL;
|
41
|
-
}
|
42
42
|
|
43
43
|
static ReflexAppDelegate*
|
44
44
|
setup_app_delegate (NSApplication* app)
|
@@ -75,21 +75,6 @@ namespace Reflex
|
|
75
75
|
[NSApp terminate: nil];
|
76
76
|
}
|
77
77
|
|
78
|
-
void
|
79
|
-
Application::set_name (const char* name)
|
80
|
-
{
|
81
|
-
if (!name)
|
82
|
-
argument_error(__FILE__, __LINE__);
|
83
|
-
|
84
|
-
self->name = name;
|
85
|
-
}
|
86
|
-
|
87
|
-
const char*
|
88
|
-
Application::name () const
|
89
|
-
{
|
90
|
-
return self->name.c_str();
|
91
|
-
}
|
92
|
-
|
93
78
|
void
|
94
79
|
Application::on_start (Event* e)
|
95
80
|
{
|
@@ -121,17 +106,5 @@ namespace Reflex
|
|
121
106
|
return true;
|
122
107
|
}
|
123
108
|
|
124
|
-
bool
|
125
|
-
Application::operator ! () const
|
126
|
-
{
|
127
|
-
return !operator bool();
|
128
|
-
}
|
129
|
-
|
130
|
-
|
131
|
-
Application::Data::Data ()
|
132
|
-
: delegate(nil)
|
133
|
-
{
|
134
|
-
}
|
135
|
-
|
136
109
|
|
137
110
|
}// Reflex
|
data/src/osx/native_window.mm
CHANGED
@@ -119,6 +119,8 @@ move_to_main_screen_origin (NativeWindow* window)
|
|
119
119
|
|
120
120
|
ptr_for_rebind->Xot::template RefCountable<>::release();
|
121
121
|
ptr_for_rebind = NULL;
|
122
|
+
|
123
|
+
Window_register(pwindow);
|
122
124
|
}
|
123
125
|
}
|
124
126
|
|
@@ -127,6 +129,8 @@ move_to_main_screen_origin (NativeWindow* window)
|
|
127
129
|
[self rebind];
|
128
130
|
if (!pwindow) return;
|
129
131
|
|
132
|
+
Window_unregister(pwindow);
|
133
|
+
|
130
134
|
Window_get_data(pwindow).native = nil;
|
131
135
|
|
132
136
|
pwindow->release();
|
data/src/win32/application.cpp
CHANGED
@@ -1,48 +1,41 @@
|
|
1
|
-
#include "
|
1
|
+
#include "../application.h"
|
2
2
|
|
3
3
|
|
4
4
|
#include <xot/windows.h>
|
5
5
|
#include "reflex/exception.h"
|
6
|
+
#include "window.h"
|
6
7
|
|
7
8
|
|
8
9
|
namespace Reflex
|
9
10
|
{
|
10
11
|
|
11
12
|
|
12
|
-
|
13
|
+
Application::Data*
|
14
|
+
Application_create_data ()
|
13
15
|
{
|
14
|
-
|
15
|
-
static Application* instance = NULL;
|
16
|
-
|
17
|
-
}// global
|
18
|
-
|
19
|
-
|
20
|
-
Application*
|
21
|
-
app ()
|
22
|
-
{
|
23
|
-
return global::instance;
|
16
|
+
return new Application::Data();
|
24
17
|
}
|
25
18
|
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
String name;
|
31
|
-
|
32
|
-
};// Application::Data
|
33
|
-
|
34
|
-
|
35
|
-
Application::Application ()
|
20
|
+
static double
|
21
|
+
get_time ()
|
36
22
|
{
|
37
|
-
|
38
|
-
|
23
|
+
static const double FREQUENCY_INV = []() {
|
24
|
+
LARGE_INTEGER freq;
|
25
|
+
QueryPerformanceFrequency(&freq);
|
26
|
+
return 1.0 / (double) freq.QuadPart;
|
27
|
+
}();
|
39
28
|
|
40
|
-
|
29
|
+
LARGE_INTEGER counter;
|
30
|
+
QueryPerformanceCounter(&counter);
|
31
|
+
return (double) counter.QuadPart * FREQUENCY_INV;
|
41
32
|
}
|
42
33
|
|
43
|
-
|
34
|
+
static void
|
35
|
+
update_all_windows (Application* app)
|
44
36
|
{
|
45
|
-
|
37
|
+
for (auto it = app->window_begin(), end = app->window_end(); it != end; ++it)
|
38
|
+
Window_update(it->get());
|
46
39
|
}
|
47
40
|
|
48
41
|
void
|
@@ -51,13 +44,39 @@ namespace Reflex
|
|
51
44
|
Event e;
|
52
45
|
on_start(&e);
|
53
46
|
|
47
|
+
timeBeginPeriod(1);
|
48
|
+
|
49
|
+
double prev = get_time();
|
50
|
+
|
54
51
|
MSG msg;
|
55
|
-
while (
|
52
|
+
while (true)
|
56
53
|
{
|
57
|
-
|
58
|
-
|
54
|
+
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
55
|
+
{
|
56
|
+
if (msg.message == WM_QUIT) break;
|
57
|
+
TranslateMessage(&msg);
|
58
|
+
DispatchMessage(&msg);
|
59
|
+
}
|
60
|
+
else
|
61
|
+
{
|
62
|
+
static const double INTERVAL = 1.0 / 60.0;
|
63
|
+
static const double SLEEPABLE = INTERVAL * 0.9;
|
64
|
+
|
65
|
+
double now = get_time();
|
66
|
+
double dt = now - prev;
|
67
|
+
if (dt < INTERVAL)
|
68
|
+
{
|
69
|
+
if (dt < SLEEPABLE) Sleep(1);
|
70
|
+
continue;
|
71
|
+
}
|
72
|
+
|
73
|
+
update_all_windows(this);
|
74
|
+
prev = now;
|
75
|
+
}
|
59
76
|
}
|
60
77
|
|
78
|
+
timeEndPeriod(1);
|
79
|
+
|
61
80
|
if (msg.wParam != 0)
|
62
81
|
reflex_error(__FILE__, __LINE__, "WM_QUIT with wParam %d.", msg.wParam);
|
63
82
|
}
|
@@ -68,21 +87,6 @@ namespace Reflex
|
|
68
87
|
PostQuitMessage(0);
|
69
88
|
}
|
70
89
|
|
71
|
-
void
|
72
|
-
Application::set_name (const char* name)
|
73
|
-
{
|
74
|
-
if (!name)
|
75
|
-
argument_error(__FILE__, __LINE__);
|
76
|
-
|
77
|
-
self->name = name;
|
78
|
-
}
|
79
|
-
|
80
|
-
const char*
|
81
|
-
Application::name () const
|
82
|
-
{
|
83
|
-
return self->name.c_str();
|
84
|
-
}
|
85
|
-
|
86
90
|
void
|
87
91
|
Application::on_start (Event* e)
|
88
92
|
{
|
@@ -113,11 +117,5 @@ namespace Reflex
|
|
113
117
|
return true;
|
114
118
|
}
|
115
119
|
|
116
|
-
bool
|
117
|
-
Application::operator ! () const
|
118
|
-
{
|
119
|
-
return !operator bool();
|
120
|
-
}
|
121
|
-
|
122
120
|
|
123
121
|
}// Reflex
|
data/src/win32/window.cpp
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#include "
|
1
|
+
#include "window.h"
|
2
2
|
|
3
3
|
|
4
4
|
#include <assert.h>
|
@@ -8,7 +8,6 @@
|
|
8
8
|
#include <xot/windows.h>
|
9
9
|
#include <rays/rays.h>
|
10
10
|
#include "reflex/defs.h"
|
11
|
-
#include "reflex/application.h"
|
12
11
|
#include "reflex/exception.h"
|
13
12
|
#include "reflex/debug.h"
|
14
13
|
#include "../view.h"
|
@@ -28,8 +27,6 @@ namespace Reflex
|
|
28
27
|
|
29
28
|
static const char* USERDATA_PROP = "Reflex:Window:HWND";
|
30
29
|
|
31
|
-
enum {UPDATE_TIMER_ID = 99999};
|
32
|
-
|
33
30
|
|
34
31
|
struct WindowData : public Window::Data
|
35
32
|
{
|
@@ -152,8 +149,8 @@ namespace Reflex
|
|
152
149
|
win->release();
|
153
150
|
}
|
154
151
|
|
155
|
-
|
156
|
-
|
152
|
+
void
|
153
|
+
Window_update (Window* win)
|
157
154
|
{
|
158
155
|
WindowData* self = get_data(win);
|
159
156
|
|
@@ -435,13 +432,6 @@ namespace Reflex
|
|
435
432
|
break;
|
436
433
|
}
|
437
434
|
|
438
|
-
case WM_TIMER:
|
439
|
-
{
|
440
|
-
if (wp == UPDATE_TIMER_ID)
|
441
|
-
update(win);
|
442
|
-
return 0;
|
443
|
-
}
|
444
|
-
|
445
435
|
case WM_SYSCOMMAND:
|
446
436
|
{
|
447
437
|
#if 0
|
@@ -458,8 +448,6 @@ namespace Reflex
|
|
458
448
|
static LRESULT CALLBACK
|
459
449
|
wndproc (HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
|
460
450
|
{
|
461
|
-
static int window_total = 0;
|
462
|
-
|
463
451
|
Window* win = NULL;
|
464
452
|
if (msg == WM_NCCREATE)
|
465
453
|
{
|
@@ -467,7 +455,7 @@ namespace Reflex
|
|
467
455
|
win = (Window*) cs->lpCreateParams;
|
468
456
|
setup_window(win, hwnd);
|
469
457
|
|
470
|
-
|
458
|
+
Window_register(win);
|
471
459
|
}
|
472
460
|
|
473
461
|
if (!win)
|
@@ -477,9 +465,11 @@ namespace Reflex
|
|
477
465
|
|
478
466
|
if (msg == WM_NCDESTROY)
|
479
467
|
{
|
468
|
+
Window_unregister(win);
|
469
|
+
|
480
470
|
cleanup_window(win);
|
481
471
|
|
482
|
-
if (
|
472
|
+
if (Window_all().empty())
|
483
473
|
Reflex::app()->quit();
|
484
474
|
}
|
485
475
|
|
@@ -556,28 +546,6 @@ namespace Reflex
|
|
556
546
|
create_window(window);
|
557
547
|
}
|
558
548
|
|
559
|
-
static void
|
560
|
-
start_timer (HWND hwnd, UINT id, UINT interval)
|
561
|
-
{
|
562
|
-
if (!hwnd)
|
563
|
-
argument_error(__FILE__, __LINE__);
|
564
|
-
|
565
|
-
if (!SetTimer(hwnd, id, interval, NULL))
|
566
|
-
system_error(__FILE__, __LINE__);
|
567
|
-
}
|
568
|
-
|
569
|
-
static void
|
570
|
-
stop_timer (HWND hwnd, UINT id)
|
571
|
-
{
|
572
|
-
if (!hwnd)
|
573
|
-
argument_error(__FILE__, __LINE__);
|
574
|
-
|
575
|
-
if (id == 0) return;
|
576
|
-
|
577
|
-
if (!KillTimer(hwnd, id))
|
578
|
-
system_error(__FILE__, __LINE__);
|
579
|
-
}
|
580
|
-
|
581
549
|
void
|
582
550
|
Window_show (Window* window)
|
583
551
|
{
|
@@ -590,8 +558,6 @@ namespace Reflex
|
|
590
558
|
self->hwnd, HWND_TOP, 0, 0, 0, 0,
|
591
559
|
SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
|
592
560
|
UpdateWindow(self->hwnd);
|
593
|
-
|
594
|
-
start_timer(self->hwnd, UPDATE_TIMER_ID, 1000 / 60);
|
595
561
|
}
|
596
562
|
|
597
563
|
void
|
@@ -605,8 +571,6 @@ namespace Reflex
|
|
605
571
|
SetWindowPos(
|
606
572
|
self->hwnd, NULL, 0, 0, 0, 0,
|
607
573
|
SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE);
|
608
|
-
|
609
|
-
stop_timer(self->hwnd, UPDATE_TIMER_ID);
|
610
574
|
}
|
611
575
|
|
612
576
|
void
|
data/src/win32/window.h
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
// -*- c++ -*-
|
2
|
+
#pragma once
|
3
|
+
#ifndef __REFLEX_SRC_WIN32_WINDOW_H__
|
4
|
+
#define __REFLEX_SRC_WIN32_WINDOW_H__
|
5
|
+
|
6
|
+
|
7
|
+
#include "../window.h"
|
8
|
+
|
9
|
+
|
10
|
+
namespace Reflex
|
11
|
+
{
|
12
|
+
|
13
|
+
|
14
|
+
void Window_update (Window* win);
|
15
|
+
|
16
|
+
|
17
|
+
}// Reflex
|
18
|
+
|
19
|
+
|
20
|
+
#endif//EOH
|
data/src/window.cpp
CHANGED
@@ -22,6 +22,37 @@ namespace Reflex
|
|
22
22
|
using CaptureTargetIDList = Window::Data::CaptureTargetIDList;
|
23
23
|
|
24
24
|
|
25
|
+
void
|
26
|
+
Window_register (Window* win)
|
27
|
+
{
|
28
|
+
auto& all = Window_all();
|
29
|
+
|
30
|
+
auto it = std::find(all.begin(), all.end(), win);
|
31
|
+
if (it != all.end())
|
32
|
+
invalid_state_error(__FILE__, __LINE__);
|
33
|
+
|
34
|
+
all.push_back(win);
|
35
|
+
}
|
36
|
+
|
37
|
+
void
|
38
|
+
Window_unregister (Window* win)
|
39
|
+
{
|
40
|
+
auto& all = Window_all();
|
41
|
+
|
42
|
+
auto it = std::find(all.begin(), all.end(), win);
|
43
|
+
if (it == all.end()) return;
|
44
|
+
|
45
|
+
all.erase(it);
|
46
|
+
}
|
47
|
+
|
48
|
+
Application::WindowList&
|
49
|
+
Window_all ()
|
50
|
+
{
|
51
|
+
static Application::WindowList windows;
|
52
|
+
return windows;
|
53
|
+
}
|
54
|
+
|
55
|
+
|
25
56
|
Window::Data::Data ()
|
26
57
|
: flags(Window_default_flags())
|
27
58
|
{
|
data/src/window.h
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
#include <rays/painter.h>
|
13
13
|
#include "reflex/window.h"
|
14
14
|
#include "reflex/view.h"
|
15
|
+
#include "application.h"
|
15
16
|
#include "pointer.h"
|
16
17
|
|
17
18
|
|
@@ -75,6 +76,13 @@ namespace Reflex
|
|
75
76
|
|
76
77
|
Window::Data* Window_create_data ();
|
77
78
|
|
79
|
+
void Window_register (Window* win);
|
80
|
+
|
81
|
+
void Window_unregister (Window* win);
|
82
|
+
|
83
|
+
Application::WindowList& Window_all ();
|
84
|
+
|
85
|
+
|
78
86
|
uint Window_default_flags ();
|
79
87
|
|
80
88
|
void Window_initialize (Window* window);
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reflexion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-01-
|
11
|
+
date: 2025-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xot
|
@@ -16,80 +16,60 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.3.
|
19
|
+
version: 0.3.3
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.3.
|
22
|
+
version: 0.3.3
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.3.
|
29
|
+
version: 0.3.3
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.3.
|
32
|
+
version: 0.3.3
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: rucy
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.3.
|
39
|
+
version: 0.3.3
|
40
40
|
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 0.3.
|
42
|
+
version: 0.3.3
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 0.3.
|
49
|
+
version: 0.3.3
|
50
50
|
- - ">="
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: 0.3.
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: beeps
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: 0.3.2
|
60
|
-
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 0.3.2
|
63
|
-
type: :runtime
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - "~>"
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 0.3.2
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: 0.3.2
|
52
|
+
version: 0.3.3
|
73
53
|
- !ruby/object:Gem::Dependency
|
74
54
|
name: rays
|
75
55
|
requirement: !ruby/object:Gem::Requirement
|
76
56
|
requirements:
|
77
57
|
- - "~>"
|
78
58
|
- !ruby/object:Gem::Version
|
79
|
-
version: 0.3.
|
59
|
+
version: 0.3.3
|
80
60
|
- - ">="
|
81
61
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.3.
|
62
|
+
version: 0.3.3
|
83
63
|
type: :runtime
|
84
64
|
prerelease: false
|
85
65
|
version_requirements: !ruby/object:Gem::Requirement
|
86
66
|
requirements:
|
87
67
|
- - "~>"
|
88
68
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.3.
|
69
|
+
version: 0.3.3
|
90
70
|
- - ">="
|
91
71
|
- !ruby/object:Gem::Version
|
92
|
-
version: 0.3.
|
72
|
+
version: 0.3.3
|
93
73
|
description: This library helps you to develop interactive graphical user interface.
|
94
74
|
email: xordog@gmail.com
|
95
75
|
executables: []
|
@@ -341,6 +321,8 @@ files:
|
|
341
321
|
- samples/tree.rb
|
342
322
|
- samples/views.rb
|
343
323
|
- samples/visuals.rb
|
324
|
+
- src/application.cpp
|
325
|
+
- src/application.h
|
344
326
|
- src/body.cpp
|
345
327
|
- src/body.h
|
346
328
|
- src/event.cpp
|
@@ -402,6 +384,7 @@ files:
|
|
402
384
|
- src/win32/screen.cpp
|
403
385
|
- src/win32/screen.h
|
404
386
|
- src/win32/window.cpp
|
387
|
+
- src/win32/window.h
|
405
388
|
- src/window.cpp
|
406
389
|
- src/window.h
|
407
390
|
- src/world.cpp
|