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.
Files changed (135) hide show
  1. package/CMakeLists.txt +16 -2
  2. package/README.md +35 -1
  3. package/binding.c +350 -1
  4. package/index.d.ts +65 -0
  5. package/index.js +32 -0
  6. package/lib/adjustment.d.ts +21 -0
  7. package/lib/adjustment.h +112 -0
  8. package/lib/adjustment.js +24 -0
  9. package/lib/bridging.h +347 -0
  10. package/lib/clipboard.d.ts +22 -0
  11. package/lib/clipboard.h +176 -0
  12. package/lib/clipboard.js +18 -0
  13. package/lib/constants.d.ts +40 -0
  14. package/lib/constants.js +51 -0
  15. package/lib/css-provider.d.ts +13 -0
  16. package/lib/css-provider.h +56 -0
  17. package/lib/css-provider.js +14 -0
  18. package/lib/cursor.d.ts +35 -0
  19. package/lib/cursor.h +220 -0
  20. package/lib/cursor.js +45 -0
  21. package/lib/device.d.ts +13 -0
  22. package/lib/device.h +35 -0
  23. package/lib/device.js +8 -0
  24. package/lib/dialog.d.ts +41 -0
  25. package/lib/dialog.js +37 -0
  26. package/lib/display.d.ts +25 -0
  27. package/lib/display.h +86 -0
  28. package/lib/display.js +23 -0
  29. package/lib/editable.h +160 -0
  30. package/lib/entry.d.ts +93 -0
  31. package/lib/entry.h +340 -0
  32. package/lib/entry.js +118 -0
  33. package/lib/event-controller-focus.d.ts +17 -0
  34. package/lib/event-controller-focus.h +55 -0
  35. package/lib/event-controller-focus.js +13 -0
  36. package/lib/event-controller-motion.d.ts +18 -0
  37. package/lib/event-controller-motion.h +66 -0
  38. package/lib/event-controller-motion.js +14 -0
  39. package/lib/event-controller.d.ts +17 -0
  40. package/lib/event-controller.h +103 -0
  41. package/lib/event-controller.js +22 -0
  42. package/lib/events.js +23 -0
  43. package/lib/fixed.d.ts +10 -0
  44. package/lib/fixed.h +28 -0
  45. package/lib/fixed.js +8 -0
  46. package/lib/frame-fixed.d.ts +10 -0
  47. package/lib/frame-fixed.js +12 -0
  48. package/lib/frame-layout-child.d.ts +17 -0
  49. package/lib/frame-layout-child.js +16 -0
  50. package/lib/frame-layout.d.ts +27 -0
  51. package/lib/frame-layout.h +291 -0
  52. package/lib/frame-layout.js +19 -0
  53. package/lib/gesture-click.d.ts +19 -0
  54. package/lib/gesture-click.h +66 -0
  55. package/lib/gesture-click.js +14 -0
  56. package/lib/gesture-drag.d.ts +25 -0
  57. package/lib/gesture-drag.h +165 -0
  58. package/lib/gesture-drag.js +23 -0
  59. package/lib/gesture-single.d.ts +13 -0
  60. package/lib/gesture-single.js +12 -0
  61. package/lib/gesture.d.ts +13 -0
  62. package/lib/gesture.h +73 -0
  63. package/lib/gesture.js +8 -0
  64. package/lib/handle.d.ts +5 -0
  65. package/lib/handle.js +6 -0
  66. package/lib/label.d.ts +36 -0
  67. package/lib/label.h +269 -0
  68. package/lib/label.js +78 -0
  69. package/lib/layout-child.d.ts +13 -0
  70. package/lib/layout-child.h +35 -0
  71. package/lib/layout-child.js +10 -0
  72. package/lib/layout-manager.d.ts +15 -0
  73. package/lib/layout-manager.h +42 -0
  74. package/lib/layout-manager.js +15 -0
  75. package/lib/message-dialog.d.ts +26 -0
  76. package/lib/message-dialog.h +190 -0
  77. package/lib/message-dialog.js +22 -0
  78. package/lib/monitor.d.ts +32 -0
  79. package/lib/monitor.h +143 -0
  80. package/lib/monitor.js +40 -0
  81. package/lib/native.h +31 -0
  82. package/lib/object.d.ts +18 -0
  83. package/lib/object.js +38 -0
  84. package/lib/paintable.d.ts +10 -0
  85. package/lib/paintable.js +3 -0
  86. package/lib/picture.d.ts +22 -0
  87. package/lib/picture.h +127 -0
  88. package/lib/picture.js +35 -0
  89. package/lib/reachable.js +11 -0
  90. package/lib/runtime.c +21 -4
  91. package/lib/scrolled-window.d.ts +22 -0
  92. package/lib/scrolled-window.h +142 -0
  93. package/lib/scrolled-window.js +37 -0
  94. package/lib/settings.d.ts +25 -0
  95. package/lib/settings.h +163 -0
  96. package/lib/settings.js +34 -0
  97. package/lib/spinner.d.ts +12 -0
  98. package/lib/spinner.h +61 -0
  99. package/lib/spinner.js +22 -0
  100. package/lib/style-context.d.ts +15 -0
  101. package/lib/style-context.h +67 -0
  102. package/lib/style-context.js +9 -0
  103. package/lib/surface.d.ts +19 -0
  104. package/lib/surface.h +61 -0
  105. package/lib/surface.js +22 -0
  106. package/lib/switch.d.ts +19 -0
  107. package/lib/switch.h +114 -0
  108. package/lib/switch.js +30 -0
  109. package/lib/text-buffer.d.ts +31 -0
  110. package/lib/text-buffer.h +246 -0
  111. package/lib/text-buffer.js +33 -0
  112. package/lib/text-view.d.ts +39 -0
  113. package/lib/text-view.h +247 -0
  114. package/lib/text-view.js +63 -0
  115. package/lib/text.d.ts +18 -0
  116. package/lib/text.h +189 -0
  117. package/lib/text.js +31 -0
  118. package/lib/texture.d.ts +20 -0
  119. package/lib/texture.h +100 -0
  120. package/lib/texture.js +17 -0
  121. package/lib/viewport.d.ts +22 -0
  122. package/lib/viewport.h +151 -0
  123. package/lib/viewport.js +38 -0
  124. package/lib/widget.d.ts +102 -0
  125. package/lib/widget.h +695 -17
  126. package/lib/widget.js +176 -11
  127. package/lib/window.d.ts +31 -0
  128. package/lib/window.h +142 -61
  129. package/lib/window.js +32 -11
  130. package/lib/wrap.js +7 -0
  131. package/package.json +12 -3
  132. package/prebuilds/linux-arm64/bare +2 -2
  133. package/prebuilds/linux-arm64/bare-gtk.bare +0 -0
  134. package/prebuilds/linux-x64/bare +2 -2
  135. 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
+ }
@@ -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
+ }
@@ -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