diff --git a/app/src/gambas3/.lang/.pot b/app/src/gambas3/.lang/.pot index f45ca9980..84eb80374 100644 --- a/app/src/gambas3/.lang/.pot +++ b/app/src/gambas3/.lang/.pot @@ -134,7 +134,7 @@ msgstr "" msgid "Image routines from the Imlib2 library" msgstr "" -#: CComponent.class:108 FPropertyComponent.class:388 +#: CComponent.class:108 FPropertyComponent.class:390 msgid "Image loading and saving" msgstr "" @@ -242,15 +242,15 @@ msgstr "" msgid "Web applications tools" msgstr "" -#: CComponent.class:140 FPropertyComponent.class:376 +#: CComponent.class:140 FPropertyComponent.class:378 msgid "Graphical form management" msgstr "" -#: CComponent.class:141 FPropertyComponent.class:382 +#: CComponent.class:141 FPropertyComponent.class:384 msgid "Event loop management" msgstr "" -#: CComponent.class:143 FPropertyComponent.class:394 +#: CComponent.class:143 FPropertyComponent.class:396 msgid "OpenGL display" msgstr "" @@ -262,7 +262,7 @@ msgstr "" msgid "Experimental" msgstr "" -#: CComponentBox.class:215 FPropertyComponent.class:323 +#: CComponentBox.class:215 FPropertyComponent.class:325 msgid "Not finished but stable" msgstr "" @@ -270,7 +270,7 @@ msgstr "" msgid "Authors" msgstr "" -#: CComponentBox.class:230 FPropertyComponent.class:356 +#: CComponentBox.class:230 FPropertyComponent.class:358 msgid "Requires" msgstr "" @@ -393,7 +393,7 @@ msgstr "" #: FConnectionEditor.class:411 FCreateFile.class:922 FFontChooser.class:79 #: FGotoLine.class:57 FList.class:331 FMain.class:1677 FMenu.class:1238 #: FNewConnection.class:573 FNewTable.class:159 FNewTranslation.class:64 -#: FOpenProject.class:496 FPasteSpecial.class:273 FPropertyComponent.class:465 +#: FOpenProject.class:496 FPasteSpecial.class:273 FPropertyComponent.class:467 #: FPropertyProject.class:252 FReportBorderChooser.class:213 #: FReportCoordChooser.class:120 FSaveProjectAs.class:124 #: FSelectExtraFile.class:72 FSelectIcon.class:268 FSnippet.class:136 @@ -479,7 +479,7 @@ msgstr "" #: FImportTable.class:39 FList.class:155 FMain.class:193 #: FMakeInstall.class:326 FMenu.class:1243 FNewConnection.class:317 #: FNewTable.class:165 FNewTranslation.class:70 FOpenProject.class:502 -#: FOption.class:600 FPasteSpecial.class:279 FPropertyComponent.class:471 +#: FOption.class:600 FPasteSpecial.class:279 FPropertyComponent.class:473 #: FPropertyProject.class:801 FReportBorderChooser.class:207 #: FReportCoordChooser.class:114 FSave.class:118 FSaveProjectAs.class:130 #: FSelectExtraFile.class:78 FSelectIcon.class:273 FSnippet.class:142 @@ -951,7 +951,7 @@ msgid "Style sheet" msgstr "" #: FCreateFile.class:791 FCreateProject.class:535 FImportTable.class:526 -#: FPropertyComponent.class:306 FPropertyProject.class:1372 +#: FPropertyComponent.class:308 FPropertyProject.class:1372 msgid "Options" msgstr "" @@ -1208,7 +1208,7 @@ msgstr "" msgid "Add expression" msgstr "" -#: FDebugInfo.class:1231 FMakeInstall.class:1655 FPropertyComponent.class:434 +#: FDebugInfo.class:1231 FMakeInstall.class:1655 FPropertyComponent.class:436 msgid "&Add" msgstr "" @@ -1217,7 +1217,7 @@ msgid "Remove current expression" msgstr "" #: FDebugInfo.class:1239 FMain.class:2661 FMakeInstall.class:1661 -#: FOption.class:1581 FPropertyComponent.class:440 FPropertyProject.class:1586 +#: FOption.class:1581 FPropertyComponent.class:442 FPropertyProject.class:1586 msgid "&Remove" msgstr "" @@ -1973,7 +1973,7 @@ msgstr "" msgid "This file has not been modified since the last commit." msgstr "" -#: FInfo.class:305 FOption.class:948 FPropertyComponent.class:293 +#: FInfo.class:305 FOption.class:948 FPropertyComponent.class:295 #: FPropertyProject.class:1283 msgid "General" msgstr "" @@ -2386,7 +2386,7 @@ msgstr "" msgid "Project properties" msgstr "" -#: FMain.class:2796 FPropertyComponent.class:279 +#: FMain.class:2796 FPropertyComponent.class:281 msgid "Component properties" msgstr "" @@ -3091,11 +3091,11 @@ msgstr "" msgid "Sort properties" msgstr "" -#: FOption.class:1028 FPropertyComponent.class:340 FPropertyProject.class:1425 +#: FOption.class:1028 FPropertyComponent.class:342 FPropertyProject.class:1425 msgid "No" msgstr "" -#: FOption.class:1028 FPropertyComponent.class:340 FPropertyProject.class:1425 +#: FOption.class:1028 FPropertyComponent.class:342 FPropertyProject.class:1425 msgid "Yes" msgstr "" @@ -3350,35 +3350,35 @@ msgstr "" msgid "Cannot write component description file." msgstr "" -#: FPropertyComponent.class:316 +#: FPropertyComponent.class:318 msgid "Component advancement" msgstr "" -#: FPropertyComponent.class:323 +#: FPropertyComponent.class:325 msgid "Finished and stable" msgstr "" -#: FPropertyComponent.class:323 +#: FPropertyComponent.class:325 msgid "Beta version" msgstr "" -#: FPropertyComponent.class:334 +#: FPropertyComponent.class:336 msgid "This component is hidden" msgstr "" -#: FPropertyComponent.class:347 +#: FPropertyComponent.class:349 msgid "Exported classes" msgstr "" -#: FPropertyComponent.class:361 +#: FPropertyComponent.class:363 msgid "Features" msgstr "" -#: FPropertyComponent.class:402 FPropertyProject.class:1637 +#: FPropertyComponent.class:404 FPropertyProject.class:1637 msgid "Components" msgstr "" -#: FPropertyComponent.class:446 +#: FPropertyComponent.class:448 msgid "Remove All" msgstr "" diff --git a/app/src/gambas3/.src/Project/FPropertyComponent.class b/app/src/gambas3/.src/Project/FPropertyComponent.class index 6b86c54f8..57ab83505 100644 --- a/app/src/gambas3/.src/Project/FPropertyComponent.class +++ b/app/src/gambas3/.src/Project/FPropertyComponent.class @@ -162,6 +162,8 @@ Private Sub ReadComponent() ReadComponentFile For Each hComp In CComponent.All + If hComp.Hidden Then Continue + If hComp.Key = CComponent.PROJECT_NAME Then Continue If hComp.Key = Project.Name Then Continue If hComp.Key = "gb" Then Continue aComp.Add(hComp.Key) diff --git a/gb.qt4/src/main.cpp b/gb.qt4/src/main.cpp index 6c30aaabb..22d2088bb 100644 --- a/gb.qt4/src/main.cpp +++ b/gb.qt4/src/main.cpp @@ -775,7 +775,6 @@ static void hook_post(void) static void hook_quit() { QWidgetList list; - QWidget *w; int i; //qApp->closeAllWindows(); @@ -783,10 +782,10 @@ static void hook_quit() list = QApplication::topLevelWidgets(); for (i = 0; i < list.count(); i++) - { - w = list.at(i); - w->close(); - } + list.at(i)->close(); + + for (i = 0; i < list.count(); i++) + list.at(i)->deleteLater(); } diff --git a/main/gbx/gbx_api.c b/main/gbx/gbx_api.c index 9f36141b5..901ff6fba 100644 --- a/main/gbx/gbx_api.c +++ b/main/gbx/gbx_api.c @@ -86,6 +86,7 @@ void *GAMBAS_Api[] = (void *)WATCH_one_loop, (void *)EVENT_post, (void *)EVENT_post2, + (void *)CTIMER_every, (void *)GB_Raise, (void *)EVENT_post_event, (void *)EVENT_check_post, diff --git a/main/gbx/gbx_c_timer.c b/main/gbx/gbx_c_timer.c index 2ce2a6066..673ea1919 100644 --- a/main/gbx/gbx_c_timer.c +++ b/main/gbx/gbx_c_timer.c @@ -44,11 +44,32 @@ static void enable_timer(CTIMER *_object, bool on) GB_Error("Too many active timers"); } +CTIMER *CTIMER_every(int delay, GB_TIMER_CALLBACK callback) +{ + CTIMER *timer; + + timer = OBJECT_create_native(CLASS_Timer, NULL); + OBJECT_REF(timer, "CTIMER_every"); + timer->callback = callback; + timer->delay = delay; + enable_timer(timer, TRUE); + return timer; +} void CTIMER_raise(void *_object) { - if (GB_Raise(THIS, EVENT_Timer, 0)) - enable_timer(THIS, FALSE); + if (THIS->callback) + { + if (!(*(THIS->callback))()) + return; + } + else + { + if (!GB_Raise(THIS, EVENT_Timer, 0)) + return; + } + + enable_timer(THIS, FALSE); } diff --git a/main/gbx/gbx_c_timer.h b/main/gbx/gbx_c_timer.h index 24340ef30..eafa81a33 100644 --- a/main/gbx/gbx_c_timer.h +++ b/main/gbx/gbx_c_timer.h @@ -39,5 +39,6 @@ extern GB_DESC NATIVE_Timer[]; #endif void CTIMER_raise(void *_object); +CTIMER *CTIMER_every(int delay, GB_TIMER_CALLBACK callback); #endif diff --git a/main/gbx/gbx_class.h b/main/gbx/gbx_class.h index 4ef3c47b1..f412d4570 100644 --- a/main/gbx/gbx_class.h +++ b/main/gbx/gbx_class.h @@ -378,6 +378,7 @@ EXTERN CLASS *CLASS_Application; EXTERN CLASS *CLASS_Process; EXTERN CLASS *CLASS_Component; EXTERN CLASS *CLASS_Observer; +EXTERN CLASS *CLASS_Timer; EXTERN CLASS *CLASS_BooleanArray; EXTERN CLASS *CLASS_ByteArray; diff --git a/main/gbx/gbx_class_init.c b/main/gbx/gbx_class_init.c index 298b7b96c..f6148f085 100644 --- a/main/gbx/gbx_class_init.c +++ b/main/gbx/gbx_class_init.c @@ -57,7 +57,7 @@ CLASS *CLASS_AppEnv = NULL; CLASS *CLASS_Process = NULL; CLASS *CLASS_Component = NULL; CLASS *CLASS_Observer = NULL; -//CLASS *CLASS_Proxy = NULL; +CLASS *CLASS_Timer = NULL; CLASS *CLASS_Array = NULL; CLASS *CLASS_BooleanArray = NULL; @@ -110,7 +110,7 @@ static const CLASS_INIT init_list[] = { NATIVE_System, NULL }, { NATIVE_User, NULL }, { NATIVE_String, NULL }, - { NATIVE_Timer, NULL }, + { NATIVE_Timer, &CLASS_Timer }, { NATIVE_Observer, &CLASS_Observer }, //{ NATIVE_Proxy, &CLASS_Proxy }, diff --git a/main/lib/debug/CDebug.c b/main/lib/debug/CDebug.c index 406dc4356..25b97d6b9 100644 --- a/main/lib/debug/CDebug.c +++ b/main/lib/debug/CDebug.c @@ -235,12 +235,25 @@ END_METHOD BEGIN_METHOD(CDEBUG_write, GB_STRING data) + const char *data = STRING(data); + int len = LENGTH(data); + if (_fdw < 0) return; - if (STRING(data)) - write(_fdw, STRING(data), LENGTH(data)); - write(_fdw, "\n", 1); + if (data && len > 0) + { + if (write(_fdw, data, len) != len) + goto __ERROR; + } + if (write(_fdw, "\n", 1) != 1) + goto __ERROR; + + return; + +__ERROR: + + fprintf(stderr, "gb.debug: warning: unable to send data to the debugger: %s\n", strerror(errno)); END_METHOD diff --git a/main/share/gambas.h b/main/share/gambas.h index 3f1ef6854..a5646cbad 100644 --- a/main/share/gambas.h +++ b/main/share/gambas.h @@ -566,6 +566,12 @@ typedef #define GB_WATCH_WRITE 2 +/* Type of a generic callback */ + +typedef + void (*GB_CALLBACK)(); + + /* Type of a watch callback function */ typedef @@ -590,6 +596,12 @@ typedef void (*GB_BROWSE_CALLBACK)(const char *, int64_t); +/* Type of a timer callback */ + +typedef + int (*GB_TIMER_CALLBACK)(); + + /* Type of a posted function */ typedef @@ -751,6 +763,7 @@ typedef intptr_t id; intptr_t tag; int delay; + GB_TIMER_CALLBACK callback; } GB_TIMER; @@ -781,8 +794,9 @@ typedef void *(*GetClassInterface)(GB_CLASS, const char *); int (*Loop)(int); - void (*Post)(void (*)(), intptr_t); - void (*Post2)(void (*)(), intptr_t, intptr_t); + void (*Post)(GB_CALLBACK, intptr_t); + void (*Post2)(GB_CALLBACK, intptr_t, intptr_t); + GB_TIMER *(*Every)(int, GB_TIMER_CALLBACK); int (*Raise)(void *, int, int, ...); void (*RaiseLater)(void *, int); void (*CheckPost)(void);