node-gtk 0.10.0 → 0.12.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/README.md +54 -53
- package/binding.gyp +36 -18
- package/lib/binding/node-v102-linux-x64/node_gtk.node +0 -0
- package/lib/binding/node-v108-linux-x64/node_gtk.node +0 -0
- package/lib/binding/node-v115-linux-x64/node_gtk.node +0 -0
- package/lib/binding/node-v93-linux-x64/node_gtk.node +0 -0
- package/lib/overrides/Gtk-3.0.js +8 -0
- package/lib/overrides/Gtk-4.0.js +16 -0
- package/package.json +8 -8
- package/scripts/ci.sh +5 -1
- package/src/boxed.cc +3 -3
- package/src/callback.cc +10 -12
- package/src/closure.cc +5 -5
- package/src/closure.h +2 -2
- package/src/debug.cc +2 -2
- package/src/function.cc +41 -26
- package/src/function.h +1 -1
- package/src/gi.cc +17 -17
- package/src/gobject.cc +9 -5
- package/src/loop.cc +5 -0
- package/src/modules/cairo/context.cc +102 -106
- package/src/modules/cairo/generator.js +1 -5
- package/src/type.cc +5 -5
- package/src/util.h +1 -3
- package/src/value.cc +108 -35
- package/src/value.h +1 -1
package/src/value.cc
CHANGED
|
@@ -68,8 +68,8 @@ Local<Value> GIArgumentToV8(GITypeInfo *type_info, GIArgument *arg, long length,
|
|
|
68
68
|
case GI_TYPE_TAG_UINT64:
|
|
69
69
|
return New<Number> (arg->v_uint64);
|
|
70
70
|
|
|
71
|
-
case GI_TYPE_TAG_GTYPE: /* c++:
|
|
72
|
-
return v8::BigInt::NewFromUnsigned(Isolate::GetCurrent(), arg->
|
|
71
|
+
case GI_TYPE_TAG_GTYPE: /* c++: gsize */
|
|
72
|
+
return v8::BigInt::NewFromUnsigned(Isolate::GetCurrent(), arg->v_size);
|
|
73
73
|
|
|
74
74
|
case GI_TYPE_TAG_UNICHAR:
|
|
75
75
|
{
|
|
@@ -238,6 +238,55 @@ Local<Value> GErrorToV8 (GITypeInfo *type_info, GError *err) {
|
|
|
238
238
|
return obj;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
+
template<typename T>
|
|
242
|
+
static bool isZero(void* value) {
|
|
243
|
+
return *(reinterpret_cast<T*>(value)) == 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
static bool isZero(GIArgument &value, GITypeInfo *type_info) {
|
|
247
|
+
GITypeTag type_tag = g_type_info_get_tag (type_info);
|
|
248
|
+
|
|
249
|
+
switch (type_tag) {
|
|
250
|
+
case GI_TYPE_TAG_BOOLEAN:
|
|
251
|
+
ERROR("Boolean zero-terminated array not supported");
|
|
252
|
+
return false;
|
|
253
|
+
case GI_TYPE_TAG_INT8:
|
|
254
|
+
return isZero<gint8>(&value);
|
|
255
|
+
case GI_TYPE_TAG_UINT8:
|
|
256
|
+
return isZero<guint8>(&value);
|
|
257
|
+
case GI_TYPE_TAG_INT16:
|
|
258
|
+
return isZero<gint16>(&value);
|
|
259
|
+
case GI_TYPE_TAG_UINT16:
|
|
260
|
+
return isZero<guint16>(&value);
|
|
261
|
+
case GI_TYPE_TAG_INT32:
|
|
262
|
+
return isZero<gint32>(&value);
|
|
263
|
+
case GI_TYPE_TAG_UINT32:
|
|
264
|
+
return isZero<guint32>(&value);
|
|
265
|
+
case GI_TYPE_TAG_INT64:
|
|
266
|
+
return isZero<gint64>(&value);
|
|
267
|
+
case GI_TYPE_TAG_UINT64:
|
|
268
|
+
return isZero<guint64>(&value);
|
|
269
|
+
case GI_TYPE_TAG_FLOAT:
|
|
270
|
+
return isZero<float>(&value);
|
|
271
|
+
case GI_TYPE_TAG_DOUBLE:
|
|
272
|
+
return isZero<double>(&value);
|
|
273
|
+
case GI_TYPE_TAG_UNICHAR:
|
|
274
|
+
return isZero<gunichar>(&value);
|
|
275
|
+
|
|
276
|
+
case GI_TYPE_TAG_GTYPE:
|
|
277
|
+
case GI_TYPE_TAG_INTERFACE:
|
|
278
|
+
case GI_TYPE_TAG_ARRAY:
|
|
279
|
+
case GI_TYPE_TAG_VOID:
|
|
280
|
+
case GI_TYPE_TAG_UTF8:
|
|
281
|
+
case GI_TYPE_TAG_FILENAME:
|
|
282
|
+
case GI_TYPE_TAG_GLIST:
|
|
283
|
+
case GI_TYPE_TAG_GSLIST:
|
|
284
|
+
case GI_TYPE_TAG_GHASH:
|
|
285
|
+
case GI_TYPE_TAG_ERROR:
|
|
286
|
+
return isZero<gpointer>(&value);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
241
290
|
Local<Value> ArrayToV8 (GITypeInfo *type_info, void* data, long length) {
|
|
242
291
|
|
|
243
292
|
auto array = New<Array>();
|
|
@@ -253,20 +302,15 @@ Local<Value> ArrayToV8 (GITypeInfo *type_info, void* data, long length) {
|
|
|
253
302
|
switch (array_type) {
|
|
254
303
|
case GI_ARRAY_TYPE_C:
|
|
255
304
|
{
|
|
256
|
-
if (length == -1) {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if (G_UNLIKELY (length == -1)) {
|
|
263
|
-
g_critical ("Unable to determine array length for %p", data);
|
|
264
|
-
length = 0;
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
305
|
+
if (length == -1 && !g_type_info_is_zero_terminated (type_info)) {
|
|
306
|
+
length = g_type_info_get_array_fixed_size (type_info);
|
|
307
|
+
if (G_UNLIKELY (length == -1)) {
|
|
308
|
+
g_critical ("Unable to determine array length for %p", data);
|
|
309
|
+
length = 0;
|
|
310
|
+
break;
|
|
267
311
|
}
|
|
268
312
|
}
|
|
269
|
-
|
|
313
|
+
// length remains -1 for zero-terminated array.
|
|
270
314
|
break;
|
|
271
315
|
}
|
|
272
316
|
case GI_ARRAY_TYPE_ARRAY:
|
|
@@ -301,9 +345,16 @@ Local<Value> ArrayToV8 (GITypeInfo *type_info, void* data, long length) {
|
|
|
301
345
|
|
|
302
346
|
GIArgument value;
|
|
303
347
|
|
|
304
|
-
for (int i = 0;
|
|
305
|
-
|
|
348
|
+
for (int i = 0; ; i++) {
|
|
349
|
+
if (length != -1 && i >= length)
|
|
350
|
+
break;
|
|
351
|
+
|
|
352
|
+
void** pointer = (void**)((size_t)data + i * item_size);
|
|
306
353
|
memcpy(&value, pointer, item_size);
|
|
354
|
+
|
|
355
|
+
if (length == -1 && isZero(value, item_type_info))
|
|
356
|
+
break;
|
|
357
|
+
|
|
307
358
|
Nan::Set(array, i, GIArgumentToV8(item_type_info, &value));
|
|
308
359
|
}
|
|
309
360
|
|
|
@@ -407,7 +458,7 @@ static void *V8ArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
407
458
|
GITypeInfo* element_info = g_type_info_get_param_type (type_info, 0);
|
|
408
459
|
gsize element_size = GetTypeSize(element_info);
|
|
409
460
|
|
|
410
|
-
void *result =
|
|
461
|
+
void *result = g_malloc0(element_size * (length + (isZeroTerminated ? 1 : 0)));
|
|
411
462
|
|
|
412
463
|
for (int i = 0; i < length; i++) {
|
|
413
464
|
auto value = Nan::Get(array, i).ToLocalChecked();
|
|
@@ -415,7 +466,7 @@ static void *V8ArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
415
466
|
GIArgument arg;
|
|
416
467
|
|
|
417
468
|
if (V8ToGIArgument(element_info, &arg, value, true)) {
|
|
418
|
-
void* pointer = (void*)((
|
|
469
|
+
void* pointer = (void*)((size_t)result + i * element_size);
|
|
419
470
|
memcpy(pointer, &arg, element_size);
|
|
420
471
|
} else {
|
|
421
472
|
WARN("couldnt convert value: %s", *Nan::Utf8String(TO_STRING (value)));
|
|
@@ -423,7 +474,10 @@ static void *V8ArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
423
474
|
}
|
|
424
475
|
|
|
425
476
|
if (isZeroTerminated) {
|
|
426
|
-
|
|
477
|
+
// TODO:
|
|
478
|
+
// Since g_malloc0 above already zeros the memory
|
|
479
|
+
// it's better to assert the last element is zero
|
|
480
|
+
void* pointer = (void*)((size_t)result + length * element_size);
|
|
427
481
|
memset(pointer, 0, element_size);
|
|
428
482
|
}
|
|
429
483
|
|
|
@@ -439,12 +493,15 @@ static void *V8TypedArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
439
493
|
GITypeInfo* element_info = g_type_info_get_param_type (type_info, 0);
|
|
440
494
|
gsize element_size = GetTypeSize(element_info);
|
|
441
495
|
|
|
442
|
-
void *result =
|
|
496
|
+
void *result = g_malloc0(element_size * (length + (isZeroTerminated ? 1 : 0)));
|
|
443
497
|
|
|
444
498
|
array->CopyContents(result, length);
|
|
445
499
|
|
|
446
500
|
if (isZeroTerminated) {
|
|
447
|
-
|
|
501
|
+
// TODO:
|
|
502
|
+
// Since g_malloc0 above already zeros the memory
|
|
503
|
+
// it's better to assert the last element is zero
|
|
504
|
+
void* pointer = (void*)((size_t)result + length * element_size);
|
|
448
505
|
memset(pointer, 0, element_size);
|
|
449
506
|
}
|
|
450
507
|
|
|
@@ -597,14 +654,14 @@ gpointer V8ToGHash (GITypeInfo *type_info, Local<Value> value) {
|
|
|
597
654
|
if (!V8ToGIArgument(key_type_info, &key_arg, key, false)) {
|
|
598
655
|
char* message = g_strdup_printf("Couldn't convert key '%s'", *Nan::Utf8String(key));
|
|
599
656
|
Nan::ThrowError(message);
|
|
600
|
-
|
|
657
|
+
g_free(message);
|
|
601
658
|
goto item_error;
|
|
602
659
|
}
|
|
603
660
|
|
|
604
661
|
if (!V8ToGIArgument(value_type_info, &value_arg, value, false)) {
|
|
605
662
|
char* message = g_strdup_printf("Couldn't convert value for key '%s'", *Nan::Utf8String(key));
|
|
606
663
|
Nan::ThrowError(message);
|
|
607
|
-
|
|
664
|
+
g_free(message);
|
|
608
665
|
goto item_error;
|
|
609
666
|
}
|
|
610
667
|
|
|
@@ -628,6 +685,8 @@ item_error:
|
|
|
628
685
|
bool V8ToGIArgument(GIBaseInfo *gi_info, GIArgument *arg, Local<Value> value) {
|
|
629
686
|
GIInfoType type = g_base_info_get_type (gi_info);
|
|
630
687
|
|
|
688
|
+
memset(arg, 0, sizeof(GIArgument));
|
|
689
|
+
|
|
631
690
|
switch (type) {
|
|
632
691
|
case GI_INFO_TYPE_BOXED:
|
|
633
692
|
case GI_INFO_TYPE_STRUCT:
|
|
@@ -665,6 +724,8 @@ bool V8ToGIArgument(GIBaseInfo *gi_info, GIArgument *arg, Local<Value> value) {
|
|
|
665
724
|
bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value, bool may_be_null) {
|
|
666
725
|
GITypeTag type_tag = g_type_info_get_tag (type_info);
|
|
667
726
|
|
|
727
|
+
memset(arg, 0, sizeof(GIArgument));
|
|
728
|
+
|
|
668
729
|
if (value->IsUndefined () || value->IsNull ()) {
|
|
669
730
|
arg->v_pointer = NULL;
|
|
670
731
|
|
|
@@ -697,7 +758,10 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
|
|
|
697
758
|
arg->v_int = Nan::To<int32_t> (value).ToChecked();
|
|
698
759
|
break;
|
|
699
760
|
case GI_TYPE_TAG_INT64:
|
|
700
|
-
|
|
761
|
+
if (value->IsBigInt())
|
|
762
|
+
arg->v_int64 = value.As<v8::BigInt>()->Int64Value();
|
|
763
|
+
else
|
|
764
|
+
arg->v_int64 = Nan::To<int64_t> (value).ToChecked();
|
|
701
765
|
break;
|
|
702
766
|
case GI_TYPE_TAG_UINT8:
|
|
703
767
|
arg->v_uint8 = Nan::To<uint32_t> (value).ToChecked();
|
|
@@ -709,7 +773,10 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
|
|
|
709
773
|
arg->v_uint = Nan::To<uint32_t> (value).ToChecked();
|
|
710
774
|
break;
|
|
711
775
|
case GI_TYPE_TAG_UINT64:
|
|
712
|
-
|
|
776
|
+
if (value->IsBigInt())
|
|
777
|
+
arg->v_uint64 = value.As<v8::BigInt>()->Uint64Value();
|
|
778
|
+
else
|
|
779
|
+
arg->v_uint64 = Nan::To<int64_t> (value).ToChecked();
|
|
713
780
|
break;
|
|
714
781
|
case GI_TYPE_TAG_FLOAT:
|
|
715
782
|
arg->v_float = Nan::To<double> (value).ToChecked();
|
|
@@ -719,9 +786,9 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
|
|
|
719
786
|
break;
|
|
720
787
|
case GI_TYPE_TAG_GTYPE:
|
|
721
788
|
if (value->IsBigInt())
|
|
722
|
-
arg->
|
|
789
|
+
arg->v_size = value.As<v8::BigInt>()->Uint64Value();
|
|
723
790
|
else
|
|
724
|
-
arg->
|
|
791
|
+
arg->v_size = Nan::To<int64_t> (value).ToChecked();
|
|
725
792
|
break;
|
|
726
793
|
|
|
727
794
|
case GI_TYPE_TAG_UTF8:
|
|
@@ -835,7 +902,10 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
|
|
|
835
902
|
*(gint*)arg->v_pointer = Nan::To<int32_t> (value).ToChecked();
|
|
836
903
|
break;
|
|
837
904
|
case GI_TYPE_TAG_INT64:
|
|
838
|
-
|
|
905
|
+
if (value->IsBigInt())
|
|
906
|
+
*(gint64*)arg->v_pointer = value.As<v8::BigInt>()->Int64Value();
|
|
907
|
+
else
|
|
908
|
+
*(gint64*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
|
|
839
909
|
break;
|
|
840
910
|
case GI_TYPE_TAG_UINT8:
|
|
841
911
|
*(guint8*)arg->v_pointer = Nan::To<uint32_t> (value).ToChecked();
|
|
@@ -847,7 +917,10 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
|
|
|
847
917
|
*(guint*)arg->v_pointer = Nan::To<uint32_t> (value).ToChecked();
|
|
848
918
|
break;
|
|
849
919
|
case GI_TYPE_TAG_UINT64:
|
|
850
|
-
|
|
920
|
+
if (value->IsBigInt())
|
|
921
|
+
*(guint64*)arg->v_pointer = value.As<v8::BigInt>()->Uint64Value();
|
|
922
|
+
else
|
|
923
|
+
*(guint64*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
|
|
851
924
|
break;
|
|
852
925
|
case GI_TYPE_TAG_FLOAT:
|
|
853
926
|
*(gfloat*)arg->v_pointer = Nan::To<double> (value).ToChecked();
|
|
@@ -857,9 +930,9 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
|
|
|
857
930
|
break;
|
|
858
931
|
case GI_TYPE_TAG_GTYPE:
|
|
859
932
|
if (value->IsBigInt())
|
|
860
|
-
*(
|
|
933
|
+
*(gsize*)arg->v_pointer = value.As<v8::BigInt>()->Uint64Value();
|
|
861
934
|
else
|
|
862
|
-
*(
|
|
935
|
+
*(gsize*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
|
|
863
936
|
break;
|
|
864
937
|
|
|
865
938
|
case GI_TYPE_TAG_UTF8:
|
|
@@ -913,15 +986,15 @@ bool CanConvertV8ToGIArgument(GITypeInfo *type_info, Local<Value> value, bool ma
|
|
|
913
986
|
case GI_TYPE_TAG_INT8:
|
|
914
987
|
case GI_TYPE_TAG_INT16:
|
|
915
988
|
case GI_TYPE_TAG_INT32:
|
|
916
|
-
case GI_TYPE_TAG_INT64:
|
|
917
989
|
case GI_TYPE_TAG_UINT8:
|
|
918
990
|
case GI_TYPE_TAG_UINT16:
|
|
919
991
|
case GI_TYPE_TAG_UINT32:
|
|
920
|
-
case GI_TYPE_TAG_UINT64:
|
|
921
992
|
case GI_TYPE_TAG_FLOAT:
|
|
922
993
|
case GI_TYPE_TAG_DOUBLE:
|
|
923
994
|
return value->IsNumber ();
|
|
924
995
|
|
|
996
|
+
case GI_TYPE_TAG_INT64:
|
|
997
|
+
case GI_TYPE_TAG_UINT64:
|
|
925
998
|
case GI_TYPE_TAG_GTYPE:
|
|
926
999
|
return value->IsNumber () || value->IsBigInt ();
|
|
927
1000
|
|
|
@@ -1251,7 +1324,7 @@ void FreeGIArgumentArray(GITypeInfo *type_info, GIArgument *arg, GITransfer tran
|
|
|
1251
1324
|
|
|
1252
1325
|
for (int i = 0; i < length; i++) {
|
|
1253
1326
|
GIArgument item;
|
|
1254
|
-
memcpy (&item, (void*)((
|
|
1327
|
+
memcpy (&item, (void*)((size_t)data + element_size * i), sizeof (GIArgument));
|
|
1255
1328
|
FreeGIArgument (element_info, &item, item_transfer, direction);
|
|
1256
1329
|
}
|
|
1257
1330
|
|
|
@@ -1270,7 +1343,7 @@ void FreeGIArgumentArray(GITypeInfo *type_info, GIArgument *arg, GITransfer tran
|
|
|
1270
1343
|
switch (array_type) {
|
|
1271
1344
|
case GI_ARRAY_TYPE_C:
|
|
1272
1345
|
{
|
|
1273
|
-
|
|
1346
|
+
g_free (data);
|
|
1274
1347
|
break;
|
|
1275
1348
|
}
|
|
1276
1349
|
case GI_ARRAY_TYPE_ARRAY:
|
package/src/value.h
CHANGED
|
@@ -26,7 +26,7 @@ void FreeGIArgument (GITypeInfo *type_info, GIArgument *argument, GITran
|
|
|
26
26
|
void FreeGIArgumentArray (GITypeInfo *type_info, GIArgument *arg, GITransfer transfer = GI_TRANSFER_EVERYTHING, GIDirection direction = GI_DIRECTION_OUT, long length = -1);
|
|
27
27
|
bool CanConvertV8ToGIArgument (GITypeInfo *type_info, Local<Value> value, bool may_be_null);
|
|
28
28
|
|
|
29
|
-
bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy = false)
|
|
29
|
+
bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy = false);
|
|
30
30
|
Local<Value> GValueToV8(const GValue *gvalue, bool mustCopy = false);
|
|
31
31
|
bool CanConvertV8ToGValue(GValue *gvalue, Local<Value> value);
|
|
32
32
|
|