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
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