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
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#ifndef BARE_GTK_STYLE_CONTEXT_H
|
|
2
|
+
#define BARE_GTK_STYLE_CONTEXT_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_style_context_add_provider_for_display(js_env_t *env, js_callback_info_t *info) {
|
|
13
|
+
int err;
|
|
14
|
+
|
|
15
|
+
size_t argc = 3;
|
|
16
|
+
js_value_t *argv[3];
|
|
17
|
+
|
|
18
|
+
bare_gtk_state_t *state;
|
|
19
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
20
|
+
assert(err == 0);
|
|
21
|
+
|
|
22
|
+
assert(argc == 3);
|
|
23
|
+
|
|
24
|
+
GdkDisplay *display;
|
|
25
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "display", (gpointer *) &display);
|
|
26
|
+
if (err < 0) return NULL;
|
|
27
|
+
|
|
28
|
+
GtkStyleProvider *provider;
|
|
29
|
+
err = bare_gobject_read_tag(env, state->registry, argv[1], "provider", (gpointer *) &provider);
|
|
30
|
+
if (err < 0) return NULL;
|
|
31
|
+
|
|
32
|
+
int32_t priority;
|
|
33
|
+
err = bare_gtk__read_int32(env, argv[2], "priority", &priority);
|
|
34
|
+
if (err < 0) return NULL;
|
|
35
|
+
|
|
36
|
+
gtk_style_context_add_provider_for_display(display, provider, priority);
|
|
37
|
+
|
|
38
|
+
return NULL;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static js_value_t *
|
|
42
|
+
bare_gtk_style_context_remove_provider_for_display(js_env_t *env, js_callback_info_t *info) {
|
|
43
|
+
int err;
|
|
44
|
+
|
|
45
|
+
size_t argc = 2;
|
|
46
|
+
js_value_t *argv[2];
|
|
47
|
+
|
|
48
|
+
bare_gtk_state_t *state;
|
|
49
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
50
|
+
assert(err == 0);
|
|
51
|
+
|
|
52
|
+
assert(argc == 2);
|
|
53
|
+
|
|
54
|
+
GdkDisplay *display;
|
|
55
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "display", (gpointer *) &display);
|
|
56
|
+
if (err < 0) return NULL;
|
|
57
|
+
|
|
58
|
+
GtkStyleProvider *provider;
|
|
59
|
+
err = bare_gobject_read_tag(env, state->registry, argv[1], "provider", (gpointer *) &provider);
|
|
60
|
+
if (err < 0) return NULL;
|
|
61
|
+
|
|
62
|
+
gtk_style_context_remove_provider_for_display(display, provider);
|
|
63
|
+
|
|
64
|
+
return NULL;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
#endif // BARE_GTK_STYLE_CONTEXT_H
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const binding = require('../binding')
|
|
2
|
+
|
|
3
|
+
exports.addProviderForDisplay = function addProviderForDisplay(display, provider, priority) {
|
|
4
|
+
binding.styleContextAddProviderForDisplay(display._tag, provider._tag, priority)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
exports.removeProviderForDisplay = function removeProviderForDisplay(display, provider) {
|
|
8
|
+
binding.styleContextRemoveProviderForDisplay(display._tag, provider._tag)
|
|
9
|
+
}
|
package/lib/surface.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import GObject = require('./object')
|
|
2
|
+
import GDKDisplay = require('./display')
|
|
3
|
+
|
|
4
|
+
/** What a window draws on, as a `GdkSurface`. */
|
|
5
|
+
interface GDKSurface extends GObject {
|
|
6
|
+
readonly width: number
|
|
7
|
+
|
|
8
|
+
readonly height: number
|
|
9
|
+
|
|
10
|
+
readonly scaleFactor: number
|
|
11
|
+
|
|
12
|
+
readonly display: GDKDisplay | null
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
declare class GDKSurface {
|
|
16
|
+
protected constructor()
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export = GDKSurface
|
package/lib/surface.h
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#ifndef BARE_GTK_SURFACE_H
|
|
2
|
+
#define BARE_GTK_SURFACE_H
|
|
3
|
+
|
|
4
|
+
#include <assert.h>
|
|
5
|
+
#include <js.h>
|
|
6
|
+
|
|
7
|
+
#include <gtk/gtk.h>
|
|
8
|
+
|
|
9
|
+
#include "bridging.h"
|
|
10
|
+
|
|
11
|
+
#define V(name, fn) \
|
|
12
|
+
static js_value_t * \
|
|
13
|
+
name(js_env_t *env, js_callback_info_t *info) { \
|
|
14
|
+
int err; \
|
|
15
|
+
\
|
|
16
|
+
size_t argc = 1; \
|
|
17
|
+
js_value_t *argv[1]; \
|
|
18
|
+
\
|
|
19
|
+
bare_gtk_state_t *state; \
|
|
20
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state); \
|
|
21
|
+
assert(err == 0); \
|
|
22
|
+
\
|
|
23
|
+
assert(argc == 1); \
|
|
24
|
+
\
|
|
25
|
+
GdkSurface *surface; \
|
|
26
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "surface", (gpointer *) &surface); \
|
|
27
|
+
if (err < 0) return NULL; \
|
|
28
|
+
\
|
|
29
|
+
js_value_t *result; \
|
|
30
|
+
err = js_create_int32(env, fn(surface), &result); \
|
|
31
|
+
assert(err == 0); \
|
|
32
|
+
\
|
|
33
|
+
return result; \
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
V(bare_gtk_surface_width, gdk_surface_get_width)
|
|
37
|
+
V(bare_gtk_surface_height, gdk_surface_get_height)
|
|
38
|
+
V(bare_gtk_surface_scale_factor, gdk_surface_get_scale_factor)
|
|
39
|
+
#undef V
|
|
40
|
+
|
|
41
|
+
static js_value_t *
|
|
42
|
+
bare_gtk_surface_display(js_env_t *env, js_callback_info_t *info) {
|
|
43
|
+
int err;
|
|
44
|
+
|
|
45
|
+
size_t argc = 1;
|
|
46
|
+
js_value_t *argv[1];
|
|
47
|
+
|
|
48
|
+
bare_gtk_state_t *state;
|
|
49
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
50
|
+
assert(err == 0);
|
|
51
|
+
|
|
52
|
+
assert(argc == 1);
|
|
53
|
+
|
|
54
|
+
GdkSurface *surface;
|
|
55
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "surface", (gpointer *) &surface);
|
|
56
|
+
if (err < 0) return NULL;
|
|
57
|
+
|
|
58
|
+
return bare_gtk__create_tag(env, state, gdk_surface_get_display(surface));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#endif // BARE_GTK_SURFACE_H
|
package/lib/surface.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const binding = require('../binding')
|
|
2
|
+
const wrap = require('./wrap')
|
|
3
|
+
const GObject = require('./object')
|
|
4
|
+
const GDKDisplay = require('./display')
|
|
5
|
+
|
|
6
|
+
module.exports = exports = class GDKSurface extends GObject {
|
|
7
|
+
get width() {
|
|
8
|
+
return binding.surfaceWidth(this._tag)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
get height() {
|
|
12
|
+
return binding.surfaceHeight(this._tag)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get scaleFactor() {
|
|
16
|
+
return binding.surfaceScaleFactor(this._tag)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get display() {
|
|
20
|
+
return wrap(GDKDisplay, binding.surfaceDisplay(this._tag))
|
|
21
|
+
}
|
|
22
|
+
}
|
package/lib/switch.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import GTKWidget = require('./widget')
|
|
2
|
+
|
|
3
|
+
/** An on and off switch, as a `GtkSwitch`. */
|
|
4
|
+
interface GTKSwitch extends GTKWidget<GTKSwitch.Events> {
|
|
5
|
+
active: boolean
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
declare class GTKSwitch {
|
|
9
|
+
constructor()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare namespace GTKSwitch {
|
|
13
|
+
export interface Events {
|
|
14
|
+
/** `active` changed, whether the user or the program changed it. */
|
|
15
|
+
active: []
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export = GTKSwitch
|
package/lib/switch.h
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#ifndef BARE_GTK_SWITCH_H
|
|
2
|
+
#define BARE_GTK_SWITCH_H
|
|
3
|
+
|
|
4
|
+
#include <assert.h>
|
|
5
|
+
#include <js.h>
|
|
6
|
+
|
|
7
|
+
#include <gtk/gtk.h>
|
|
8
|
+
|
|
9
|
+
#include "bridging.h"
|
|
10
|
+
|
|
11
|
+
enum {
|
|
12
|
+
bare_gtk_switch_event_active = 1 << 0,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// `GtkSwitch` cannot be subclassed, so the handler is kept in the data table of
|
|
16
|
+
// the object and the signal carries the state.
|
|
17
|
+
#define BARE_GTK_SWITCH_ACTIVE "bare.switch.active"
|
|
18
|
+
|
|
19
|
+
// This fires whoever changed the property, including the program itself. A
|
|
20
|
+
// controlled switch has to tell those apart in the layers above.
|
|
21
|
+
static void
|
|
22
|
+
bare_gtk_switch__on_active(GObject *object, GParamSpec *spec, gpointer data) {
|
|
23
|
+
bare_gtk__emit(data, object, "active", 0, NULL);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static js_value_t *
|
|
27
|
+
bare_gtk_switch_init(js_env_t *env, js_callback_info_t *info) {
|
|
28
|
+
int err;
|
|
29
|
+
|
|
30
|
+
bare_gtk_state_t *state;
|
|
31
|
+
err = js_get_callback_info(env, info, NULL, NULL, NULL, (void **) &state);
|
|
32
|
+
assert(err == 0);
|
|
33
|
+
|
|
34
|
+
GtkWidget *handle = gtk_switch_new();
|
|
35
|
+
|
|
36
|
+
js_value_t *result;
|
|
37
|
+
err = js_create_uint32(env, bare_gobject_tag(state->registry, handle), &result);
|
|
38
|
+
assert(err == 0);
|
|
39
|
+
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static js_value_t *
|
|
44
|
+
bare_gtk_switch_event_mask(js_env_t *env, js_callback_info_t *info) {
|
|
45
|
+
int err;
|
|
46
|
+
|
|
47
|
+
size_t argc = 2;
|
|
48
|
+
js_value_t *argv[2];
|
|
49
|
+
|
|
50
|
+
bare_gtk_state_t *state;
|
|
51
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
52
|
+
assert(err == 0);
|
|
53
|
+
|
|
54
|
+
assert(argc == 2);
|
|
55
|
+
|
|
56
|
+
GtkSwitch *handle;
|
|
57
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "switch", (gpointer *) &handle);
|
|
58
|
+
if (err < 0) return NULL;
|
|
59
|
+
|
|
60
|
+
uint32_t events;
|
|
61
|
+
err = bare_gtk__read_uint32(env, argv[1], "events", &events);
|
|
62
|
+
if (err < 0) return NULL;
|
|
63
|
+
|
|
64
|
+
gulong id = (gulong) (uintptr_t) g_object_get_data(G_OBJECT(handle), BARE_GTK_SWITCH_ACTIVE);
|
|
65
|
+
|
|
66
|
+
if ((events & bare_gtk_switch_event_active) != 0) {
|
|
67
|
+
if (id == 0) {
|
|
68
|
+
id = g_signal_connect(handle, "notify::active", G_CALLBACK(bare_gtk_switch__on_active), state);
|
|
69
|
+
|
|
70
|
+
g_object_set_data(G_OBJECT(handle), BARE_GTK_SWITCH_ACTIVE, (gpointer) (uintptr_t) id);
|
|
71
|
+
}
|
|
72
|
+
} else if (id != 0) {
|
|
73
|
+
g_signal_handler_disconnect(handle, id);
|
|
74
|
+
|
|
75
|
+
g_object_set_data(G_OBJECT(handle), BARE_GTK_SWITCH_ACTIVE, NULL);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return NULL;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static js_value_t *
|
|
82
|
+
bare_gtk_switch_active(js_env_t *env, js_callback_info_t *info) {
|
|
83
|
+
int err;
|
|
84
|
+
|
|
85
|
+
size_t argc = 2;
|
|
86
|
+
js_value_t *argv[2];
|
|
87
|
+
|
|
88
|
+
bare_gtk_state_t *state;
|
|
89
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
90
|
+
assert(err == 0);
|
|
91
|
+
|
|
92
|
+
assert(argc == 1 || argc == 2);
|
|
93
|
+
|
|
94
|
+
GtkSwitch *handle;
|
|
95
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "switch", (gpointer *) &handle);
|
|
96
|
+
if (err < 0) return NULL;
|
|
97
|
+
|
|
98
|
+
js_value_t *result = NULL;
|
|
99
|
+
|
|
100
|
+
if (argc == 1) {
|
|
101
|
+
err = js_get_boolean(env, gtk_switch_get_active(handle), &result);
|
|
102
|
+
assert(err == 0);
|
|
103
|
+
} else {
|
|
104
|
+
bool active;
|
|
105
|
+
err = bare_gtk__read_bool(env, argv[1], "active", &active);
|
|
106
|
+
if (err < 0) return NULL;
|
|
107
|
+
|
|
108
|
+
gtk_switch_set_active(handle, active);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
#endif // BARE_GTK_SWITCH_H
|
package/lib/switch.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const binding = require('../binding')
|
|
2
|
+
const GTKWidget = require('./widget')
|
|
3
|
+
|
|
4
|
+
module.exports = exports = class GTKSwitch extends GTKWidget {
|
|
5
|
+
static _events = {
|
|
6
|
+
active: binding.SWITCH_EVENT_ACTIVE
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
_init() {
|
|
10
|
+
return binding.switchInit()
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
_eventMask(mask) {
|
|
14
|
+
binding.switchEventMask(this._tag, mask)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get active() {
|
|
18
|
+
return binding.switchActive(this._tag)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
set active(value) {
|
|
22
|
+
binding.switchActive(this._tag, value)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
[Symbol.for('bare.inspect')]() {
|
|
26
|
+
return {
|
|
27
|
+
__proto__: { constructor: GTKSwitch }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import GObject = require('./object')
|
|
2
|
+
|
|
3
|
+
/** The text of a `GTKTextView`, as a `GtkTextBuffer`. Positions are character offsets. */
|
|
4
|
+
interface GTKTextBuffer extends GObject<GTKTextBuffer.Events> {
|
|
5
|
+
text: string
|
|
6
|
+
|
|
7
|
+
/** The selected range. With nothing selected, both are at the caret. */
|
|
8
|
+
readonly selectionBounds: { start: number; end: number }
|
|
9
|
+
|
|
10
|
+
/** Select the characters from `start` to `end`. */
|
|
11
|
+
selectRange(start: number, end: number): this
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare class GTKTextBuffer {
|
|
15
|
+
protected constructor()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare namespace GTKTextBuffer {
|
|
19
|
+
export interface Events {
|
|
20
|
+
changed: []
|
|
21
|
+
'cursor-position': []
|
|
22
|
+
|
|
23
|
+
/** Text is about to be inserted at `start`. `end` is the same as `start`. */
|
|
24
|
+
'insert-text': [text: string, start: number, end: number]
|
|
25
|
+
|
|
26
|
+
/** The text from `start` to `end` is about to be deleted. `text` is empty. */
|
|
27
|
+
'delete-range': [text: string, start: number, end: number]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export = GTKTextBuffer
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#ifndef BARE_GTK_TEXT_BUFFER_H
|
|
2
|
+
#define BARE_GTK_TEXT_BUFFER_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_text_buffer_event_changed = 1 << 0,
|
|
14
|
+
bare_gtk_text_buffer_event_cursor_position = 1 << 1,
|
|
15
|
+
bare_gtk_text_buffer_event_insert_text = 1 << 2,
|
|
16
|
+
bare_gtk_text_buffer_event_delete_range = 1 << 3,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// A text view makes its own buffer, so there is no subclass to keep the mask
|
|
20
|
+
// on. It is kept beside the buffer instead.
|
|
21
|
+
typedef struct {
|
|
22
|
+
uint32_t events;
|
|
23
|
+
|
|
24
|
+
gulong on_changed;
|
|
25
|
+
gulong on_cursor_position;
|
|
26
|
+
gulong on_insert_text;
|
|
27
|
+
gulong on_delete_range;
|
|
28
|
+
} bare_gtk_text_buffer_t;
|
|
29
|
+
|
|
30
|
+
static void
|
|
31
|
+
bare_gtk_text_buffer__free(gpointer data, GClosure *closure) {
|
|
32
|
+
g_free(data);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static bare_gtk_text_buffer_t *
|
|
36
|
+
bare_gtk_text_buffer__signals(GtkTextBuffer *buffer) {
|
|
37
|
+
bare_gtk_text_buffer_t *signals = g_object_get_data(G_OBJECT(buffer), "bare");
|
|
38
|
+
|
|
39
|
+
if (signals == NULL) {
|
|
40
|
+
signals = g_new0(bare_gtk_text_buffer_t, 1);
|
|
41
|
+
|
|
42
|
+
g_object_set_data_full(G_OBJECT(buffer), "bare", signals, g_free);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return signals;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static void
|
|
49
|
+
bare_gtk_text_buffer__on_changed(GtkTextBuffer *buffer, gpointer data) {
|
|
50
|
+
bare_gtk__emit(data, buffer, "changed", 0, NULL);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static void
|
|
54
|
+
bare_gtk_text_buffer__on_cursor_position(GObject *object, GParamSpec *spec, gpointer data) {
|
|
55
|
+
bare_gtk__emit(data, object, "cursor-position", 0, NULL);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static void
|
|
59
|
+
bare_gtk_text_buffer__on_insert_text(GtkTextBuffer *buffer, GtkTextIter *position, const char *text, int length, gpointer data) {
|
|
60
|
+
int offset = gtk_text_iter_get_offset(position);
|
|
61
|
+
|
|
62
|
+
bare_gtk__emit_replacement(data, buffer, "insert-text", text, offset, offset);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static void
|
|
66
|
+
bare_gtk_text_buffer__on_delete_range(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end, gpointer data) {
|
|
67
|
+
bare_gtk__emit_replacement(
|
|
68
|
+
data,
|
|
69
|
+
buffer,
|
|
70
|
+
"delete-range",
|
|
71
|
+
"",
|
|
72
|
+
gtk_text_iter_get_offset(start),
|
|
73
|
+
gtk_text_iter_get_offset(end)
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static js_value_t *
|
|
78
|
+
bare_gtk_text_buffer_event_mask(js_env_t *env, js_callback_info_t *info) {
|
|
79
|
+
int err;
|
|
80
|
+
|
|
81
|
+
size_t argc = 2;
|
|
82
|
+
js_value_t *argv[2];
|
|
83
|
+
|
|
84
|
+
bare_gtk_state_t *state;
|
|
85
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
86
|
+
assert(err == 0);
|
|
87
|
+
|
|
88
|
+
assert(argc == 2);
|
|
89
|
+
|
|
90
|
+
GtkTextBuffer *buffer;
|
|
91
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "buffer", (gpointer *) &buffer);
|
|
92
|
+
if (err < 0) return NULL;
|
|
93
|
+
|
|
94
|
+
uint32_t events;
|
|
95
|
+
err = bare_gtk__read_uint32(env, argv[1], "events", &events);
|
|
96
|
+
if (err < 0) return NULL;
|
|
97
|
+
|
|
98
|
+
bare_gtk_text_buffer_t *signals = bare_gtk_text_buffer__signals(buffer);
|
|
99
|
+
|
|
100
|
+
uint32_t changed = signals->events ^ events;
|
|
101
|
+
|
|
102
|
+
signals->events = events;
|
|
103
|
+
|
|
104
|
+
#define V(bit, field, signal, callback) \
|
|
105
|
+
if ((changed & (bit)) != 0) { \
|
|
106
|
+
if ((events & (bit)) != 0) { \
|
|
107
|
+
signals->field = g_signal_connect(buffer, signal, G_CALLBACK(callback), state); \
|
|
108
|
+
} else { \
|
|
109
|
+
g_signal_handler_disconnect(buffer, signals->field); \
|
|
110
|
+
} \
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
V(bare_gtk_text_buffer_event_changed, on_changed, "changed", bare_gtk_text_buffer__on_changed)
|
|
114
|
+
V(bare_gtk_text_buffer_event_cursor_position, on_cursor_position, "notify::cursor-position", bare_gtk_text_buffer__on_cursor_position)
|
|
115
|
+
V(bare_gtk_text_buffer_event_insert_text, on_insert_text, "insert-text", bare_gtk_text_buffer__on_insert_text)
|
|
116
|
+
V(bare_gtk_text_buffer_event_delete_range, on_delete_range, "delete-range", bare_gtk_text_buffer__on_delete_range)
|
|
117
|
+
#undef V
|
|
118
|
+
|
|
119
|
+
return NULL;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// A `GtkTextIter` has no identity, so it crosses as its offset.
|
|
123
|
+
static js_value_t *
|
|
124
|
+
bare_gtk_text_buffer_text(js_env_t *env, js_callback_info_t *info) {
|
|
125
|
+
int err;
|
|
126
|
+
|
|
127
|
+
size_t argc = 2;
|
|
128
|
+
js_value_t *argv[2];
|
|
129
|
+
|
|
130
|
+
bare_gtk_state_t *state;
|
|
131
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
132
|
+
assert(err == 0);
|
|
133
|
+
|
|
134
|
+
assert(argc == 1 || argc == 2);
|
|
135
|
+
|
|
136
|
+
GtkTextBuffer *buffer;
|
|
137
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "buffer", (gpointer *) &buffer);
|
|
138
|
+
if (err < 0) return NULL;
|
|
139
|
+
|
|
140
|
+
js_value_t *result = NULL;
|
|
141
|
+
|
|
142
|
+
if (argc == 1) {
|
|
143
|
+
GtkTextIter start;
|
|
144
|
+
GtkTextIter end;
|
|
145
|
+
|
|
146
|
+
gtk_text_buffer_get_bounds(buffer, &start, &end);
|
|
147
|
+
|
|
148
|
+
char *text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
|
|
149
|
+
|
|
150
|
+
err = js_create_string_utf8(env, (const utf8_t *) text, (size_t) -1, &result);
|
|
151
|
+
assert(err == 0);
|
|
152
|
+
|
|
153
|
+
g_free(text);
|
|
154
|
+
} else {
|
|
155
|
+
char *text;
|
|
156
|
+
err = bare_gtk__read_string(env, argv[1], "text", &text);
|
|
157
|
+
if (err < 0) return NULL;
|
|
158
|
+
|
|
159
|
+
gtk_text_buffer_set_text(buffer, text, -1);
|
|
160
|
+
|
|
161
|
+
g_free(text);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
static js_value_t *
|
|
168
|
+
bare_gtk_text_buffer_selection_bounds(js_env_t *env, js_callback_info_t *info) {
|
|
169
|
+
int err;
|
|
170
|
+
|
|
171
|
+
size_t argc = 1;
|
|
172
|
+
js_value_t *argv[1];
|
|
173
|
+
|
|
174
|
+
bare_gtk_state_t *state;
|
|
175
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
|
|
176
|
+
assert(err == 0);
|
|
177
|
+
|
|
178
|
+
assert(argc == 1);
|
|
179
|
+
|
|
180
|
+
GtkTextBuffer *buffer;
|
|
181
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "buffer", (gpointer *) &buffer);
|
|
182
|
+
if (err < 0) return NULL;
|
|
183
|
+
|
|
184
|
+
GtkTextIter start;
|
|
185
|
+
GtkTextIter end;
|
|
186
|
+
|
|
187
|
+
gtk_text_buffer_get_selection_bounds(buffer, &start, &end);
|
|
188
|
+
|
|
189
|
+
js_value_t *result;
|
|
190
|
+
err = js_create_object(env, &result);
|
|
191
|
+
assert(err == 0);
|
|
192
|
+
|
|
193
|
+
js_value_t *value;
|
|
194
|
+
|
|
195
|
+
err = js_create_int32(env, gtk_text_iter_get_offset(&start), &value);
|
|
196
|
+
assert(err == 0);
|
|
197
|
+
|
|
198
|
+
err = js_set_named_property(env, result, "start", value);
|
|
199
|
+
assert(err == 0);
|
|
200
|
+
|
|
201
|
+
err = js_create_int32(env, gtk_text_iter_get_offset(&end), &value);
|
|
202
|
+
assert(err == 0);
|
|
203
|
+
|
|
204
|
+
err = js_set_named_property(env, result, "end", value);
|
|
205
|
+
assert(err == 0);
|
|
206
|
+
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
static js_value_t *
|
|
211
|
+
bare_gtk_text_buffer_select_range(js_env_t *env, js_callback_info_t *info) {
|
|
212
|
+
int err;
|
|
213
|
+
|
|
214
|
+
size_t argc = 3;
|
|
215
|
+
js_value_t *argv[3];
|
|
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 == 3);
|
|
222
|
+
|
|
223
|
+
GtkTextBuffer *buffer;
|
|
224
|
+
err = bare_gobject_read_tag(env, state->registry, argv[0], "buffer", (gpointer *) &buffer);
|
|
225
|
+
if (err < 0) return NULL;
|
|
226
|
+
|
|
227
|
+
int32_t start;
|
|
228
|
+
err = bare_gtk__read_int32(env, argv[1], "start", &start);
|
|
229
|
+
if (err < 0) return NULL;
|
|
230
|
+
|
|
231
|
+
int32_t end;
|
|
232
|
+
err = bare_gtk__read_int32(env, argv[2], "end", &end);
|
|
233
|
+
if (err < 0) return NULL;
|
|
234
|
+
|
|
235
|
+
GtkTextIter from;
|
|
236
|
+
GtkTextIter to;
|
|
237
|
+
|
|
238
|
+
gtk_text_buffer_get_iter_at_offset(buffer, &from, start);
|
|
239
|
+
gtk_text_buffer_get_iter_at_offset(buffer, &to, end);
|
|
240
|
+
|
|
241
|
+
gtk_text_buffer_select_range(buffer, &to, &from);
|
|
242
|
+
|
|
243
|
+
return NULL;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
#endif // BARE_GTK_TEXT_BUFFER_H
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const binding = require('../binding')
|
|
2
|
+
const GObject = require('./object')
|
|
3
|
+
|
|
4
|
+
module.exports = exports = class GTKTextBuffer extends GObject {
|
|
5
|
+
static _events = {
|
|
6
|
+
changed: binding.TEXT_BUFFER_EVENT_CHANGED,
|
|
7
|
+
'cursor-position': binding.TEXT_BUFFER_EVENT_CURSOR_POSITION,
|
|
8
|
+
'insert-text': binding.TEXT_BUFFER_EVENT_INSERT_TEXT,
|
|
9
|
+
'delete-range': binding.TEXT_BUFFER_EVENT_DELETE_RANGE
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
_eventMask(mask) {
|
|
13
|
+
binding.textBufferEventMask(this._tag, mask)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
get text() {
|
|
17
|
+
return binding.textBufferText(this._tag)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
set text(value) {
|
|
21
|
+
binding.textBufferText(this._tag, value)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get selectionBounds() {
|
|
25
|
+
return binding.textBufferSelectionBounds(this._tag)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
selectRange(start, end) {
|
|
29
|
+
binding.textBufferSelectRange(this._tag, start, end)
|
|
30
|
+
|
|
31
|
+
return this
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import GTKWidget = require('./widget')
|
|
2
|
+
import GTKTextBuffer = require('./text-buffer')
|
|
3
|
+
|
|
4
|
+
/** Several lines of editable text, as a `GtkTextView`. */
|
|
5
|
+
interface GTKTextView extends GTKWidget<GTKTextView.Events> {
|
|
6
|
+
/** The text the view shows. */
|
|
7
|
+
readonly buffer: GTKTextBuffer
|
|
8
|
+
|
|
9
|
+
/** Whether the user can change the text. */
|
|
10
|
+
editable: boolean
|
|
11
|
+
|
|
12
|
+
/** How lines wrap, as a `WRAP_*` constant. */
|
|
13
|
+
wrapMode: number
|
|
14
|
+
|
|
15
|
+
/** What the text is for, as a `GTKEntry.INPUT_PURPOSE` constant. */
|
|
16
|
+
inputPurpose: number
|
|
17
|
+
|
|
18
|
+
/** Hints for input methods, as `GTKEntry.INPUT_HINTS` flags combined with `|`. */
|
|
19
|
+
inputHints: number
|
|
20
|
+
|
|
21
|
+
/** How lines line up with each other, as a `JUSTIFY_*` constant. */
|
|
22
|
+
justification: number
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare class GTKTextView {
|
|
26
|
+
constructor()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare namespace GTKTextView {
|
|
30
|
+
export interface Events {
|
|
31
|
+
/** The view got or lost the keyboard. `focused` is 1 or 0. */
|
|
32
|
+
'has-focus': [focused: number]
|
|
33
|
+
|
|
34
|
+
/** The view became or stopped being the focus widget of its window. `focused` is 1 or 0. */
|
|
35
|
+
'is-focus': [focused: number]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export = GTKTextView
|