bare-gtk 0.2.1 → 0.3.0
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.
- package/CMakeLists.txt +16 -2
- package/README.md +35 -1
- package/binding.c +350 -1
- package/index.d.ts +65 -0
- package/index.js +32 -0
- package/lib/adjustment.d.ts +21 -0
- package/lib/adjustment.h +112 -0
- package/lib/adjustment.js +24 -0
- package/lib/bridging.h +347 -0
- package/lib/clipboard.d.ts +22 -0
- package/lib/clipboard.h +176 -0
- package/lib/clipboard.js +18 -0
- package/lib/constants.d.ts +40 -0
- package/lib/constants.js +51 -0
- package/lib/css-provider.d.ts +13 -0
- package/lib/css-provider.h +56 -0
- package/lib/css-provider.js +14 -0
- package/lib/cursor.d.ts +35 -0
- package/lib/cursor.h +220 -0
- package/lib/cursor.js +45 -0
- package/lib/device.d.ts +13 -0
- package/lib/device.h +35 -0
- package/lib/device.js +8 -0
- package/lib/dialog.d.ts +41 -0
- package/lib/dialog.js +37 -0
- package/lib/display.d.ts +25 -0
- package/lib/display.h +86 -0
- package/lib/display.js +23 -0
- package/lib/editable.h +160 -0
- package/lib/entry.d.ts +93 -0
- package/lib/entry.h +340 -0
- package/lib/entry.js +118 -0
- package/lib/event-controller-focus.d.ts +17 -0
- package/lib/event-controller-focus.h +55 -0
- package/lib/event-controller-focus.js +13 -0
- package/lib/event-controller-motion.d.ts +18 -0
- package/lib/event-controller-motion.h +66 -0
- package/lib/event-controller-motion.js +14 -0
- package/lib/event-controller.d.ts +17 -0
- package/lib/event-controller.h +103 -0
- package/lib/event-controller.js +22 -0
- package/lib/events.js +23 -0
- package/lib/fixed.d.ts +10 -0
- package/lib/fixed.h +28 -0
- package/lib/fixed.js +8 -0
- package/lib/frame-fixed.d.ts +10 -0
- package/lib/frame-fixed.js +12 -0
- package/lib/frame-layout-child.d.ts +17 -0
- package/lib/frame-layout-child.js +16 -0
- package/lib/frame-layout.d.ts +27 -0
- package/lib/frame-layout.h +291 -0
- package/lib/frame-layout.js +19 -0
- package/lib/gesture-click.d.ts +19 -0
- package/lib/gesture-click.h +66 -0
- package/lib/gesture-click.js +14 -0
- package/lib/gesture-drag.d.ts +25 -0
- package/lib/gesture-drag.h +165 -0
- package/lib/gesture-drag.js +23 -0
- package/lib/gesture-single.d.ts +13 -0
- package/lib/gesture-single.js +12 -0
- package/lib/gesture.d.ts +13 -0
- package/lib/gesture.h +73 -0
- package/lib/gesture.js +8 -0
- package/lib/handle.d.ts +5 -0
- package/lib/handle.js +6 -0
- package/lib/label.d.ts +36 -0
- package/lib/label.h +269 -0
- package/lib/label.js +78 -0
- package/lib/layout-child.d.ts +13 -0
- package/lib/layout-child.h +35 -0
- package/lib/layout-child.js +10 -0
- package/lib/layout-manager.d.ts +15 -0
- package/lib/layout-manager.h +42 -0
- package/lib/layout-manager.js +15 -0
- package/lib/message-dialog.d.ts +26 -0
- package/lib/message-dialog.h +190 -0
- package/lib/message-dialog.js +22 -0
- package/lib/monitor.d.ts +32 -0
- package/lib/monitor.h +143 -0
- package/lib/monitor.js +40 -0
- package/lib/native.h +31 -0
- package/lib/object.d.ts +18 -0
- package/lib/object.js +38 -0
- package/lib/paintable.d.ts +10 -0
- package/lib/paintable.js +3 -0
- package/lib/picture.d.ts +22 -0
- package/lib/picture.h +127 -0
- package/lib/picture.js +35 -0
- package/lib/reachable.js +11 -0
- package/lib/runtime.c +21 -4
- package/lib/scrolled-window.d.ts +22 -0
- package/lib/scrolled-window.h +142 -0
- package/lib/scrolled-window.js +37 -0
- package/lib/settings.d.ts +25 -0
- package/lib/settings.h +163 -0
- package/lib/settings.js +34 -0
- package/lib/spinner.d.ts +12 -0
- package/lib/spinner.h +61 -0
- package/lib/spinner.js +22 -0
- package/lib/style-context.d.ts +15 -0
- package/lib/style-context.h +67 -0
- package/lib/style-context.js +9 -0
- package/lib/surface.d.ts +19 -0
- package/lib/surface.h +61 -0
- package/lib/surface.js +22 -0
- package/lib/switch.d.ts +19 -0
- package/lib/switch.h +114 -0
- package/lib/switch.js +30 -0
- package/lib/text-buffer.d.ts +31 -0
- package/lib/text-buffer.h +246 -0
- package/lib/text-buffer.js +33 -0
- package/lib/text-view.d.ts +39 -0
- package/lib/text-view.h +247 -0
- package/lib/text-view.js +63 -0
- package/lib/text.d.ts +18 -0
- package/lib/text.h +189 -0
- package/lib/text.js +31 -0
- package/lib/texture.d.ts +20 -0
- package/lib/texture.h +100 -0
- package/lib/texture.js +17 -0
- package/lib/viewport.d.ts +22 -0
- package/lib/viewport.h +151 -0
- package/lib/viewport.js +38 -0
- package/lib/widget.d.ts +102 -0
- package/lib/widget.h +695 -17
- package/lib/widget.js +176 -11
- package/lib/window.d.ts +31 -0
- package/lib/window.h +142 -61
- package/lib/window.js +32 -11
- package/lib/wrap.js +7 -0
- package/package.json +12 -3
- package/prebuilds/linux-arm64/bare +2 -2
- package/prebuilds/linux-arm64/bare-gtk.bare +0 -0
- package/prebuilds/linux-x64/bare +2 -2
- package/prebuilds/linux-x64/bare-gtk.bare +0 -0
package/lib/display.h
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#ifndef BARE_GTK_DISPLAY_H
|
|
2
|
+
#define BARE_GTK_DISPLAY_H
|
|
3
|
+
|
|
4
|
+
#include <assert.h>
|
|
5
|
+
#include <js.h>
|
|
6
|
+
|
|
7
|
+
#include <gtk/gtk.h>
|
|
8
|
+
|
|
9
|
+
#include "bridging.h"
|
|
10
|
+
|
|
11
|
+
static js_value_t *
|
|
12
|
+
bare_gtk_display_get_default(js_env_t *env, js_callback_info_t *info) {
|
|
13
|
+
int err;
|
|
14
|
+
|
|
15
|
+
bare_gtk_state_t *state;
|
|
16
|
+
err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
|
|
17
|
+
assert(err == 0);
|
|
18
|
+
|
|
19
|
+
return bare_gtk__create_tag(env, state, gdk_display_get_default());
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static js_value_t *
|
|
23
|
+
bare_gtk_display_get_clipboard(js_env_t *env, js_callback_info_t *info) {
|
|
24
|
+
int err;
|
|
25
|
+
|
|
26
|
+
size_t argc = 1;
|
|
27
|
+
js_value_t *argv[1];
|
|
28
|
+
|
|
29
|
+
bare_gtk_state_t *state;
|
|
30
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
31
|
+
assert(err == 0);
|
|
32
|
+
|
|
33
|
+
assert(argc == 1);
|
|
34
|
+
|
|
35
|
+
GdkDisplay *display;
|
|
36
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "display", (gpointer *) &display);
|
|
37
|
+
if (err < 0) return NULL;
|
|
38
|
+
|
|
39
|
+
return bare_gtk__create_tag(env, state, gdk_display_get_clipboard(display));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static js_value_t *
|
|
43
|
+
bare_gtk_display_get_primary_clipboard(js_env_t *env, js_callback_info_t *info) {
|
|
44
|
+
int err;
|
|
45
|
+
|
|
46
|
+
size_t argc = 1;
|
|
47
|
+
js_value_t *argv[1];
|
|
48
|
+
|
|
49
|
+
bare_gtk_state_t *state;
|
|
50
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
51
|
+
assert(err == 0);
|
|
52
|
+
|
|
53
|
+
assert(argc == 1);
|
|
54
|
+
|
|
55
|
+
GdkDisplay *display;
|
|
56
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "display", (gpointer *) &display);
|
|
57
|
+
if (err < 0) return NULL;
|
|
58
|
+
|
|
59
|
+
return bare_gtk__create_tag(env, state, gdk_display_get_primary_clipboard(display));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static js_value_t *
|
|
63
|
+
bare_gtk_display_get_monitor_at_surface(js_env_t *env, js_callback_info_t *info) {
|
|
64
|
+
int err;
|
|
65
|
+
|
|
66
|
+
size_t argc = 2;
|
|
67
|
+
js_value_t *argv[2];
|
|
68
|
+
|
|
69
|
+
bare_gtk_state_t *state;
|
|
70
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
71
|
+
assert(err == 0);
|
|
72
|
+
|
|
73
|
+
assert(argc == 2);
|
|
74
|
+
|
|
75
|
+
GdkDisplay *display;
|
|
76
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "display", (gpointer *) &display);
|
|
77
|
+
if (err < 0) return NULL;
|
|
78
|
+
|
|
79
|
+
GdkSurface *surface;
|
|
80
|
+
err = bare_gobject_read_tag(env, state->registry, argv[1], "surface", (gpointer *) &surface);
|
|
81
|
+
if (err < 0) return NULL;
|
|
82
|
+
|
|
83
|
+
return bare_gtk__create_tag(env, state, gdk_display_get_monitor_at_surface(display, surface));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#endif // BARE_GTK_DISPLAY_H
|
package/lib/display.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const binding = require('../binding')
|
|
2
|
+
const GObject = require('./object')
|
|
3
|
+
const GDKMonitor = require('./monitor')
|
|
4
|
+
const GDKClipboard = require('./clipboard')
|
|
5
|
+
const wrap = require('./wrap')
|
|
6
|
+
|
|
7
|
+
module.exports = exports = class GDKDisplay extends GObject {
|
|
8
|
+
static getDefault() {
|
|
9
|
+
return wrap(GDKDisplay, binding.displayGetDefault())
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
getMonitorAtSurface(surface) {
|
|
13
|
+
return wrap(GDKMonitor, binding.displayGetMonitorAtSurface(this._tag, surface._tag))
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getClipboard() {
|
|
17
|
+
return wrap(GDKClipboard, binding.displayGetClipboard(this._tag))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
getPrimaryClipboard() {
|
|
21
|
+
return wrap(GDKClipboard, binding.displayGetPrimaryClipboard(this._tag))
|
|
22
|
+
}
|
|
23
|
+
}
|
package/lib/editable.h
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#ifndef BARE_GTK_EDITABLE_H
|
|
2
|
+
#define BARE_GTK_EDITABLE_H
|
|
3
|
+
|
|
4
|
+
#include <assert.h>
|
|
5
|
+
#include <js.h>
|
|
6
|
+
#include <utf.h>
|
|
7
|
+
|
|
8
|
+
#include <gtk/gtk.h>
|
|
9
|
+
|
|
10
|
+
#include "bridging.h"
|
|
11
|
+
|
|
12
|
+
// `GtkEditable` is an interface that an entry implements and a text view does
|
|
13
|
+
// not.
|
|
14
|
+
static js_value_t *
|
|
15
|
+
bare_gtk_editable_text(js_env_t *env, js_callback_info_t *info) {
|
|
16
|
+
int err;
|
|
17
|
+
|
|
18
|
+
size_t argc = 2;
|
|
19
|
+
js_value_t *argv[2];
|
|
20
|
+
|
|
21
|
+
bare_gtk_state_t *state;
|
|
22
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
23
|
+
assert(err == 0);
|
|
24
|
+
|
|
25
|
+
assert(argc == 1 || argc == 2);
|
|
26
|
+
|
|
27
|
+
GtkEditable *editable;
|
|
28
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "editable", (gpointer *) &editable);
|
|
29
|
+
if (err < 0) return NULL;
|
|
30
|
+
|
|
31
|
+
js_value_t *result = NULL;
|
|
32
|
+
|
|
33
|
+
if (argc == 1) {
|
|
34
|
+
const char *text = gtk_editable_get_text(editable);
|
|
35
|
+
|
|
36
|
+
err = js_create_string_utf8(env, (const utf8_t *) (text == NULL ? "" : text), (size_t) -1, &result);
|
|
37
|
+
assert(err == 0);
|
|
38
|
+
} else {
|
|
39
|
+
char *text;
|
|
40
|
+
err = bare_gtk__read_string(env, argv[1], "text", &text);
|
|
41
|
+
if (err < 0) return NULL;
|
|
42
|
+
|
|
43
|
+
gtk_editable_set_text(editable, text);
|
|
44
|
+
|
|
45
|
+
g_free(text);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static js_value_t *
|
|
52
|
+
bare_gtk_editable_editable(js_env_t *env, js_callback_info_t *info) {
|
|
53
|
+
int err;
|
|
54
|
+
|
|
55
|
+
size_t argc = 2;
|
|
56
|
+
js_value_t *argv[2];
|
|
57
|
+
|
|
58
|
+
bare_gtk_state_t *state;
|
|
59
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
60
|
+
assert(err == 0);
|
|
61
|
+
|
|
62
|
+
assert(argc == 1 || argc == 2);
|
|
63
|
+
|
|
64
|
+
GtkEditable *editable;
|
|
65
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "editable", (gpointer *) &editable);
|
|
66
|
+
if (err < 0) return NULL;
|
|
67
|
+
|
|
68
|
+
js_value_t *result = NULL;
|
|
69
|
+
|
|
70
|
+
if (argc == 1) {
|
|
71
|
+
err = js_get_boolean(env, gtk_editable_get_editable(editable), &result);
|
|
72
|
+
assert(err == 0);
|
|
73
|
+
} else {
|
|
74
|
+
bool value;
|
|
75
|
+
err = bare_gtk__read_bool(env, argv[1], "editable", &value);
|
|
76
|
+
if (err < 0) return NULL;
|
|
77
|
+
|
|
78
|
+
gtk_editable_set_editable(editable, value);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// With nothing selected, both ends are at the caret.
|
|
85
|
+
static js_value_t *
|
|
86
|
+
bare_gtk_editable_selection_bounds(js_env_t *env, js_callback_info_t *info) {
|
|
87
|
+
int err;
|
|
88
|
+
|
|
89
|
+
size_t argc = 1;
|
|
90
|
+
js_value_t *argv[1];
|
|
91
|
+
|
|
92
|
+
bare_gtk_state_t *state;
|
|
93
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
94
|
+
assert(err == 0);
|
|
95
|
+
|
|
96
|
+
assert(argc == 1);
|
|
97
|
+
|
|
98
|
+
GtkEditable *editable;
|
|
99
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "editable", (gpointer *) &editable);
|
|
100
|
+
if (err < 0) return NULL;
|
|
101
|
+
|
|
102
|
+
int start = 0;
|
|
103
|
+
int end = 0;
|
|
104
|
+
|
|
105
|
+
if (!gtk_editable_get_selection_bounds(editable, &start, &end)) {
|
|
106
|
+
start = end = gtk_editable_get_position(editable);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
js_value_t *result;
|
|
110
|
+
err = js_create_object(env, &result);
|
|
111
|
+
assert(err == 0);
|
|
112
|
+
|
|
113
|
+
js_value_t *value;
|
|
114
|
+
|
|
115
|
+
err = js_create_int32(env, start, &value);
|
|
116
|
+
assert(err == 0);
|
|
117
|
+
|
|
118
|
+
err = js_set_named_property(env, result, "start", value);
|
|
119
|
+
assert(err == 0);
|
|
120
|
+
|
|
121
|
+
err = js_create_int32(env, end, &value);
|
|
122
|
+
assert(err == 0);
|
|
123
|
+
|
|
124
|
+
err = js_set_named_property(env, result, "end", value);
|
|
125
|
+
assert(err == 0);
|
|
126
|
+
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static js_value_t *
|
|
131
|
+
bare_gtk_editable_select_region(js_env_t *env, js_callback_info_t *info) {
|
|
132
|
+
int err;
|
|
133
|
+
|
|
134
|
+
size_t argc = 3;
|
|
135
|
+
js_value_t *argv[3];
|
|
136
|
+
|
|
137
|
+
bare_gtk_state_t *state;
|
|
138
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
139
|
+
assert(err == 0);
|
|
140
|
+
|
|
141
|
+
assert(argc == 3);
|
|
142
|
+
|
|
143
|
+
GtkEditable *editable;
|
|
144
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "editable", (gpointer *) &editable);
|
|
145
|
+
if (err < 0) return NULL;
|
|
146
|
+
|
|
147
|
+
int32_t start;
|
|
148
|
+
err = bare_gtk__read_int32(env, argv[1], "start", &start);
|
|
149
|
+
if (err < 0) return NULL;
|
|
150
|
+
|
|
151
|
+
int32_t end;
|
|
152
|
+
err = bare_gtk__read_int32(env, argv[2], "end", &end);
|
|
153
|
+
if (err < 0) return NULL;
|
|
154
|
+
|
|
155
|
+
gtk_editable_select_region(editable, start, end);
|
|
156
|
+
|
|
157
|
+
return NULL;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
#endif // BARE_GTK_EDITABLE_H
|
package/lib/entry.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import GTKWidget = require('./widget')
|
|
2
|
+
|
|
3
|
+
/** A single line of editable text, as a `GtkEntry`. */
|
|
4
|
+
interface GTKEntry extends GTKWidget<GTKEntry.Events> {
|
|
5
|
+
text: string
|
|
6
|
+
|
|
7
|
+
/** Whether the user can change the text. */
|
|
8
|
+
editable: boolean
|
|
9
|
+
|
|
10
|
+
/** The selected range, as character offsets. With nothing selected, both are at the caret. */
|
|
11
|
+
readonly selectionBounds: { start: number; end: number }
|
|
12
|
+
|
|
13
|
+
/** Select the characters from `start` to `end`. -1 means the end of the text. */
|
|
14
|
+
selectRegion(start: number, end: number): this
|
|
15
|
+
|
|
16
|
+
/** Take the keyboard focus without selecting all the text, as `grabFocus()` does. */
|
|
17
|
+
grabFocusWithoutSelecting(): boolean
|
|
18
|
+
|
|
19
|
+
/** Text shown while the entry is empty, or `null`. */
|
|
20
|
+
placeholderText: string | null
|
|
21
|
+
|
|
22
|
+
/** Whether the text is shown. Set it to `false` for a password. */
|
|
23
|
+
visibility: boolean
|
|
24
|
+
|
|
25
|
+
/** What the text is for, as an `INPUT_PURPOSE` constant. */
|
|
26
|
+
inputPurpose: number
|
|
27
|
+
|
|
28
|
+
/** Hints for input methods, as `INPUT_HINTS` flags combined with `|`. */
|
|
29
|
+
inputHints: number
|
|
30
|
+
|
|
31
|
+
/** Where the text sits when it is shorter than the entry, from 0 (start) to 1 (end). */
|
|
32
|
+
alignment: number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
declare class GTKEntry {
|
|
36
|
+
constructor()
|
|
37
|
+
|
|
38
|
+
static readonly INPUT_PURPOSE: {
|
|
39
|
+
readonly FREE_FORM: 0
|
|
40
|
+
readonly ALPHA: 1
|
|
41
|
+
readonly DIGITS: 2
|
|
42
|
+
readonly NUMBER: 3
|
|
43
|
+
readonly PHONE: 4
|
|
44
|
+
readonly URL: 5
|
|
45
|
+
readonly EMAIL: 6
|
|
46
|
+
readonly NAME: 7
|
|
47
|
+
readonly PASSWORD: 8
|
|
48
|
+
readonly PIN: 9
|
|
49
|
+
readonly TERMINAL: 10
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static readonly INPUT_HINTS: {
|
|
53
|
+
readonly NONE: number
|
|
54
|
+
readonly SPELLCHECK: number
|
|
55
|
+
readonly NO_SPELLCHECK: number
|
|
56
|
+
readonly WORD_COMPLETION: number
|
|
57
|
+
readonly LOWERCASE: number
|
|
58
|
+
readonly UPPERCASE_CHARS: number
|
|
59
|
+
readonly UPPERCASE_WORDS: number
|
|
60
|
+
readonly UPPERCASE_SENTENCES: number
|
|
61
|
+
readonly INHIBIT_OSK: number
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
declare namespace GTKEntry {
|
|
66
|
+
export interface Events {
|
|
67
|
+
/** The text changed. */
|
|
68
|
+
changed: []
|
|
69
|
+
|
|
70
|
+
/** The user pressed Enter. */
|
|
71
|
+
activate: []
|
|
72
|
+
|
|
73
|
+
/** The caret moved. */
|
|
74
|
+
'cursor-position': []
|
|
75
|
+
|
|
76
|
+
/** Text is about to be inserted at `start`. `end` is the same as `start`. */
|
|
77
|
+
'insert-text': [text: string, start: number, end: number]
|
|
78
|
+
|
|
79
|
+
/** The text from `start` to `end` is about to be deleted. `text` is empty. */
|
|
80
|
+
'delete-text': [text: string, start: number, end: number]
|
|
81
|
+
|
|
82
|
+
/** The entry got or lost the keyboard. `focused` is 1 or 0. */
|
|
83
|
+
'has-focus': [focused: number]
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The entry became or stopped being the focus widget of its window. `focused` is 1 or 0.
|
|
87
|
+
* A window that is not active still has a focus widget.
|
|
88
|
+
*/
|
|
89
|
+
'is-focus': [focused: number]
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export = GTKEntry
|
package/lib/entry.h
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
#ifndef BARE_GTK_ENTRY_H
|
|
2
|
+
#define BARE_GTK_ENTRY_H
|
|
3
|
+
|
|
4
|
+
#include <assert.h>
|
|
5
|
+
#include <js.h>
|
|
6
|
+
#include <utf.h>
|
|
7
|
+
|
|
8
|
+
#include <gtk/gtk.h>
|
|
9
|
+
|
|
10
|
+
#include "bridging.h"
|
|
11
|
+
|
|
12
|
+
enum {
|
|
13
|
+
bare_gtk_entry_event_changed = 1 << 0,
|
|
14
|
+
bare_gtk_entry_event_activate = 1 << 1,
|
|
15
|
+
bare_gtk_entry_event_cursor_position = 1 << 2,
|
|
16
|
+
bare_gtk_entry_event_insert_text = 1 << 3,
|
|
17
|
+
bare_gtk_entry_event_delete_text = 1 << 4,
|
|
18
|
+
bare_gtk_entry_event_has_focus = 1 << 5,
|
|
19
|
+
bare_gtk_entry_event_is_focus = 1 << 6,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
typedef struct {
|
|
23
|
+
GtkEntry handle;
|
|
24
|
+
|
|
25
|
+
bare_gtk_state_t *state;
|
|
26
|
+
|
|
27
|
+
uint32_t events;
|
|
28
|
+
|
|
29
|
+
gulong on_changed;
|
|
30
|
+
gulong on_activate;
|
|
31
|
+
gulong on_cursor_position;
|
|
32
|
+
gulong on_insert_text;
|
|
33
|
+
gulong on_delete_text;
|
|
34
|
+
gulong on_has_focus;
|
|
35
|
+
gulong on_is_focus;
|
|
36
|
+
} BareEntry;
|
|
37
|
+
|
|
38
|
+
typedef struct {
|
|
39
|
+
GtkEntryClass parent;
|
|
40
|
+
} BareEntryClass;
|
|
41
|
+
|
|
42
|
+
G_DEFINE_TYPE(BareEntry, bare_entry, GTK_TYPE_ENTRY)
|
|
43
|
+
|
|
44
|
+
static void
|
|
45
|
+
bare_entry_init(BareEntry *self) {}
|
|
46
|
+
|
|
47
|
+
static void
|
|
48
|
+
bare_entry_class_init(BareEntryClass *class) {}
|
|
49
|
+
|
|
50
|
+
BareEntry *
|
|
51
|
+
bare_entry_new(void) {
|
|
52
|
+
return g_object_new(bare_entry_get_type(), NULL);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static void
|
|
56
|
+
bare_gtk_entry__on_changed(GtkEditable *editable, gpointer data) {
|
|
57
|
+
BareEntry *self = (BareEntry *) editable;
|
|
58
|
+
|
|
59
|
+
bare_gtk__emit(self->state, editable, "changed", 0, NULL);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static void
|
|
63
|
+
bare_gtk_entry__on_activate(GtkEntry *entry, gpointer data) {
|
|
64
|
+
BareEntry *self = (BareEntry *) entry;
|
|
65
|
+
|
|
66
|
+
bare_gtk__emit(self->state, entry, "activate", 0, NULL);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
static void
|
|
70
|
+
bare_gtk_entry__on_cursor_position(GObject *object, GParamSpec *spec, gpointer data) {
|
|
71
|
+
BareEntry *self = (BareEntry *) object;
|
|
72
|
+
|
|
73
|
+
bare_gtk__emit(self->state, object, "cursor-position", 0, NULL);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static void
|
|
77
|
+
bare_gtk_entry__on_has_focus(GObject *object, GParamSpec *spec, gpointer data) {
|
|
78
|
+
BareEntry *self = (BareEntry *) object;
|
|
79
|
+
|
|
80
|
+
bare_gtk__emit(self->state, object, "has-focus", 1, (const double[]) {gtk_widget_has_focus(GTK_WIDGET(object)) ? 1 : 0});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Whether this is the focus widget of its window. That is not the same as
|
|
84
|
+
// having the keyboard: a window that is not active still has a focus widget.
|
|
85
|
+
static void
|
|
86
|
+
bare_gtk_entry__on_is_focus(GObject *object, GParamSpec *spec, gpointer data) {
|
|
87
|
+
BareEntry *self = (BareEntry *) object;
|
|
88
|
+
|
|
89
|
+
bare_gtk__emit(self->state, object, "is-focus", 1, (const double[]) {gtk_widget_is_focus(GTK_WIDGET(object)) ? 1 : 0});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// GTK reports an insertion and a deletion separately, where other toolkits
|
|
93
|
+
// report one replacement, so both are sent as a replacement.
|
|
94
|
+
static void
|
|
95
|
+
bare_gtk_entry__on_insert_text(GtkEditable *editable, const char *text, int length, int *position, gpointer data) {
|
|
96
|
+
BareEntry *self = (BareEntry *) editable;
|
|
97
|
+
|
|
98
|
+
bare_gtk__emit_replacement(self->state, editable, "insert-text", text, *position, *position);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static void
|
|
102
|
+
bare_gtk_entry__on_delete_text(GtkEditable *editable, int start, int end, gpointer data) {
|
|
103
|
+
BareEntry *self = (BareEntry *) editable;
|
|
104
|
+
|
|
105
|
+
bare_gtk__emit_replacement(self->state, editable, "delete-text", "", start, end);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static js_value_t *
|
|
109
|
+
bare_gtk_entry_init(js_env_t *env, js_callback_info_t *info) {
|
|
110
|
+
int err;
|
|
111
|
+
|
|
112
|
+
bare_gtk_state_t *state;
|
|
113
|
+
err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
|
|
114
|
+
assert(err == 0);
|
|
115
|
+
|
|
116
|
+
BareEntry *entry = bare_entry_new();
|
|
117
|
+
|
|
118
|
+
entry->state = state;
|
|
119
|
+
|
|
120
|
+
js_value_t *result;
|
|
121
|
+
err = js_create_uint32(env, bare_gobject_tag(state->registry, entry), &result);
|
|
122
|
+
assert(err == 0);
|
|
123
|
+
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
static js_value_t *
|
|
128
|
+
bare_gtk_entry_event_mask(js_env_t *env, js_callback_info_t *info) {
|
|
129
|
+
int err;
|
|
130
|
+
|
|
131
|
+
size_t argc = 2;
|
|
132
|
+
js_value_t *argv[2];
|
|
133
|
+
|
|
134
|
+
bare_gtk_state_t *state;
|
|
135
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
136
|
+
assert(err == 0);
|
|
137
|
+
|
|
138
|
+
assert(argc == 2);
|
|
139
|
+
|
|
140
|
+
BareEntry *entry;
|
|
141
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "entry", (gpointer *) &entry);
|
|
142
|
+
if (err < 0) return NULL;
|
|
143
|
+
|
|
144
|
+
uint32_t events;
|
|
145
|
+
err = bare_gtk__read_uint32(env, argv[1], "events", &events);
|
|
146
|
+
if (err < 0) return NULL;
|
|
147
|
+
|
|
148
|
+
uint32_t changed = entry->events ^ events;
|
|
149
|
+
|
|
150
|
+
entry->events = events;
|
|
151
|
+
|
|
152
|
+
#define V(bit, field, signal, callback) \
|
|
153
|
+
if ((changed & (bit)) != 0) { \
|
|
154
|
+
if ((events & (bit)) != 0) { \
|
|
155
|
+
entry->field = g_signal_connect(entry, signal, G_CALLBACK(callback), state); \
|
|
156
|
+
} else { \
|
|
157
|
+
g_signal_handler_disconnect(entry, entry->field); \
|
|
158
|
+
} \
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
V(bare_gtk_entry_event_changed, on_changed, "changed", bare_gtk_entry__on_changed)
|
|
162
|
+
V(bare_gtk_entry_event_activate, on_activate, "activate", bare_gtk_entry__on_activate)
|
|
163
|
+
V(bare_gtk_entry_event_cursor_position, on_cursor_position, "notify::cursor-position", bare_gtk_entry__on_cursor_position)
|
|
164
|
+
V(bare_gtk_entry_event_insert_text, on_insert_text, "insert-text", bare_gtk_entry__on_insert_text)
|
|
165
|
+
V(bare_gtk_entry_event_delete_text, on_delete_text, "delete-text", bare_gtk_entry__on_delete_text)
|
|
166
|
+
V(bare_gtk_entry_event_has_focus, on_has_focus, "notify::has-focus", bare_gtk_entry__on_has_focus)
|
|
167
|
+
V(bare_gtk_entry_event_is_focus, on_is_focus, "notify::is-focus", bare_gtk_entry__on_is_focus)
|
|
168
|
+
#undef V
|
|
169
|
+
|
|
170
|
+
return NULL;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
static js_value_t *
|
|
174
|
+
bare_gtk_entry_placeholder_text(js_env_t *env, js_callback_info_t *info) {
|
|
175
|
+
int err;
|
|
176
|
+
|
|
177
|
+
size_t argc = 2;
|
|
178
|
+
js_value_t *argv[2];
|
|
179
|
+
|
|
180
|
+
bare_gtk_state_t *state;
|
|
181
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
182
|
+
assert(err == 0);
|
|
183
|
+
|
|
184
|
+
assert(argc == 1 || argc == 2);
|
|
185
|
+
|
|
186
|
+
GtkEntry *entry;
|
|
187
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "entry", (gpointer *) &entry);
|
|
188
|
+
if (err < 0) return NULL;
|
|
189
|
+
|
|
190
|
+
js_value_t *result = NULL;
|
|
191
|
+
|
|
192
|
+
if (argc == 1) {
|
|
193
|
+
const char *text = gtk_entry_get_placeholder_text(entry);
|
|
194
|
+
|
|
195
|
+
err = js_create_string_utf8(env, (const utf8_t *) (text == NULL ? "" : text), (size_t) -1, &result);
|
|
196
|
+
assert(err == 0);
|
|
197
|
+
} else {
|
|
198
|
+
char *text;
|
|
199
|
+
err = bare_gtk__read_string(env, argv[1], "text", &text);
|
|
200
|
+
if (err < 0) return NULL;
|
|
201
|
+
|
|
202
|
+
gtk_entry_set_placeholder_text(entry, text);
|
|
203
|
+
|
|
204
|
+
g_free(text);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
static js_value_t *
|
|
211
|
+
bare_gtk_entry_visibility(js_env_t *env, js_callback_info_t *info) {
|
|
212
|
+
int err;
|
|
213
|
+
|
|
214
|
+
size_t argc = 2;
|
|
215
|
+
js_value_t *argv[2];
|
|
216
|
+
|
|
217
|
+
bare_gtk_state_t *state;
|
|
218
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
219
|
+
assert(err == 0);
|
|
220
|
+
|
|
221
|
+
assert(argc == 1 || argc == 2);
|
|
222
|
+
|
|
223
|
+
GtkEntry *entry;
|
|
224
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "entry", (gpointer *) &entry);
|
|
225
|
+
if (err < 0) return NULL;
|
|
226
|
+
|
|
227
|
+
js_value_t *result = NULL;
|
|
228
|
+
|
|
229
|
+
if (argc == 1) {
|
|
230
|
+
err = js_get_boolean(env, gtk_entry_get_visibility(entry), &result);
|
|
231
|
+
assert(err == 0);
|
|
232
|
+
} else {
|
|
233
|
+
bool visibility;
|
|
234
|
+
err = bare_gtk__read_bool(env, argv[1], "visibility", &visibility);
|
|
235
|
+
if (err < 0) return NULL;
|
|
236
|
+
|
|
237
|
+
gtk_entry_set_visibility(entry, visibility);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
#define BARE_GTK_ENTRY_ENUM(name, getter, setter, type) \
|
|
244
|
+
static js_value_t * \
|
|
245
|
+
bare_gtk_entry_##name(js_env_t *env, js_callback_info_t *info) { \
|
|
246
|
+
int err; \
|
|
247
|
+
\
|
|
248
|
+
size_t argc = 2; \
|
|
249
|
+
js_value_t *argv[2]; \
|
|
250
|
+
\
|
|
251
|
+
bare_gtk_state_t *state; \
|
|
252
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state); \
|
|
253
|
+
assert(err == 0); \
|
|
254
|
+
\
|
|
255
|
+
assert(argc == 1 || argc == 2); \
|
|
256
|
+
\
|
|
257
|
+
GtkEntry *entry; \
|
|
258
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "entry", (gpointer *) &entry); \
|
|
259
|
+
if (err < 0) return NULL; \
|
|
260
|
+
\
|
|
261
|
+
js_value_t *result = NULL; \
|
|
262
|
+
\
|
|
263
|
+
if (argc == 1) { \
|
|
264
|
+
err = js_create_int32(env, (int32_t) getter(entry), &result); \
|
|
265
|
+
assert(err == 0); \
|
|
266
|
+
} else { \
|
|
267
|
+
int32_t value; \
|
|
268
|
+
err = bare_gtk__read_int32(env, argv[1], #name, &value); \
|
|
269
|
+
if (err < 0) return NULL; \
|
|
270
|
+
\
|
|
271
|
+
setter(entry, (type) value); \
|
|
272
|
+
} \
|
|
273
|
+
\
|
|
274
|
+
return result; \
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
BARE_GTK_ENTRY_ENUM(input_purpose, gtk_entry_get_input_purpose, gtk_entry_set_input_purpose, GtkInputPurpose)
|
|
278
|
+
BARE_GTK_ENTRY_ENUM(input_hints, gtk_entry_get_input_hints, gtk_entry_set_input_hints, GtkInputHints)
|
|
279
|
+
#undef BARE_GTK_ENTRY_ENUM
|
|
280
|
+
|
|
281
|
+
// An entry selects all its text when it gets focus, which would undo a
|
|
282
|
+
// selection the caller made. This grab does not.
|
|
283
|
+
static js_value_t *
|
|
284
|
+
bare_gtk_entry_grab_focus_without_selecting(js_env_t *env, js_callback_info_t *info) {
|
|
285
|
+
int err;
|
|
286
|
+
|
|
287
|
+
size_t argc = 1;
|
|
288
|
+
js_value_t *argv[1];
|
|
289
|
+
|
|
290
|
+
bare_gtk_state_t *state;
|
|
291
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
292
|
+
assert(err == 0);
|
|
293
|
+
|
|
294
|
+
assert(argc == 1);
|
|
295
|
+
|
|
296
|
+
GtkEntry *entry;
|
|
297
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "entry", (gpointer *) &entry);
|
|
298
|
+
if (err < 0) return NULL;
|
|
299
|
+
|
|
300
|
+
js_value_t *result;
|
|
301
|
+
err = js_get_boolean(env, gtk_entry_grab_focus_without_selecting(entry), &result);
|
|
302
|
+
assert(err == 0);
|
|
303
|
+
|
|
304
|
+
return result;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
static js_value_t *
|
|
308
|
+
bare_gtk_entry_alignment(js_env_t *env, js_callback_info_t *info) {
|
|
309
|
+
int err;
|
|
310
|
+
|
|
311
|
+
size_t argc = 2;
|
|
312
|
+
js_value_t *argv[2];
|
|
313
|
+
|
|
314
|
+
bare_gtk_state_t *state;
|
|
315
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
316
|
+
assert(err == 0);
|
|
317
|
+
|
|
318
|
+
assert(argc == 1 || argc == 2);
|
|
319
|
+
|
|
320
|
+
GtkEntry *entry;
|
|
321
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "entry", (gpointer *) &entry);
|
|
322
|
+
if (err < 0) return NULL;
|
|
323
|
+
|
|
324
|
+
js_value_t *result = NULL;
|
|
325
|
+
|
|
326
|
+
if (argc == 1) {
|
|
327
|
+
err = js_create_double(env, gtk_entry_get_alignment(entry), &result);
|
|
328
|
+
assert(err == 0);
|
|
329
|
+
} else {
|
|
330
|
+
double alignment;
|
|
331
|
+
err = bare_gtk__read_double(env, argv[1], "alignment", &alignment);
|
|
332
|
+
if (err < 0) return NULL;
|
|
333
|
+
|
|
334
|
+
gtk_entry_set_alignment(entry, (float) alignment);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return result;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
#endif // BARE_GTK_ENTRY_H
|