forked from yue/node-gui
-
Notifications
You must be signed in to change notification settings - Fork 0
/
impl_glue_gtk.h
125 lines (98 loc) · 2.89 KB
/
impl_glue_gtk.h
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
#ifndef IMPL_VALUE_GTK_H
#define IMPL_VALUE_GTK_H
#include <node.h>
#include <glib-object.h>
namespace clip {
// Generic v8::Value to GValue
GValue&& glue (v8::Handle<v8::Value> value);
// Generic GValue to v8::Value
v8::Handle<v8::Value> glue (const GValue* value);
// Get GTK+ object from javascript object
template<class T>
inline T* glue (v8::Handle<v8::Value> obj) {
return static_cast<T*> (v8::Handle<v8::Object>::Cast (obj)->GetPointerFromInternalField (0));
}
// Convert GTK+ object to javascript object
template<class T>
inline v8::Handle<v8::Object> glue (void *widget) {
v8::HandleScope scope;
v8::Local<v8::Value> external = v8::External::New (widget);
v8::Handle<v8::Object> obj = T::constructor_template->GetFunction ()->NewInstance (1, &external);
return scope.Close (obj);
}
v8::Handle<v8::Object> glue (void *widget);
v8::Handle<v8::Object> glue (GtkTextBuffer *widget);
// From c type to v8::Value
inline v8::Handle<v8::Value> glue (int i) {
return v8::Integer::New (i);
}
inline v8::Handle<v8::Value> glue (unsigned int i) {
return v8::Integer::NewFromUnsigned (i);
}
inline v8::Handle<v8::Value> glue (char *i) {
g_free (i);
return v8::String::New (i);
}
inline v8::Handle<v8::Value> glue (const char *i) {
return v8::String::New (i);
}
inline v8::Handle<v8::Value> glue (bool i) {
return v8::Boolean::New (i);
}
inline v8::Handle<v8::Value> glue (double i) {
return v8::Number::New (i);
}
// Wrap around generic Gtk object
//template <class T>
//v8::Handle<v8::Value> glue (T *widget);
// Convert GValue to its raw state
template<class T>
T raw (const GValue* value) {
return static_cast<T> (g_value_get_pointer (value));
}
template<class T*>
inline T* raw (const GValue* value) {
return static_cast<T*> (g_value_get_pointer (value));
}
template<>
inline gpointer raw (const GValue* value) {
return g_value_get_pointer (value);
}
template<>
inline unsigned raw (const GValue* value) {
return g_value_get_int (value);
}
template<>
inline const gchar *raw (const GValue* value) {
return g_value_get_string (value);
}
template<>
inline float raw (const GValue* value) {
return static_cast<float> (g_value_get_double (value));
}
template<>
inline double raw (const GValue* value) {
return g_value_get_double (value);
}
template<>
inline const GValue* raw (const GValue* value) {
return value;
}
template<>
inline int raw (const GValue* value) {
// We cannot distinguish between gboolean and int,
// so we have to determin at runtime
if (G_TYPE_FUNDAMENTAL(G_VALUE_TYPE(value)) == G_TYPE_BOOLEAN)
return g_value_get_boolean (value);
else
return g_value_get_int (value);
}
// Copy GValue
inline GValue&& copy (const GValue* value) {
GValue a = { 0 };
g_value_init (&a, G_VALUE_TYPE (value));
g_value_copy (value, &a);
return std::move (a);
}
} /* clip */
#endif /* end of IMPL_VALUE_GTK_H */