static void _GuiWindow_child_resizeCallback (GtkWidget *childWidget, gpointer data) { GtkAllocation *allocation = (GtkAllocation *) data; GtkWidget *parentWidget = gtk_widget_get_parent (childWidget); Thing_cast (GuiThing, child, _GuiObject_getUserData (childWidget)); if (child) { GuiControl control = nullptr; if (Thing_isa (child, classGuiControl)) { control = static_cast <GuiControl> (child); } else if (Thing_isa (child, classGuiMenu)) { Thing_cast (GuiMenu, menu, child); control = menu -> d_cascadeButton; } if (control) { /* * Move and resize. */ trace (U"moving child of class ", Thing_className (control)); int left = control -> d_left, right = control -> d_right, top = control -> d_top, bottom = control -> d_bottom; if (left < 0) left += allocation -> width; // this replicates structGuiControl :: v_positionInForm () if (right <= 0) right += allocation -> width; if (top < 0) top += allocation -> height; if (bottom <= 0) bottom += allocation -> height; trace (U"moving child to (", left, U",", top, U")"); gtk_fixed_move (GTK_FIXED (parentWidget), GTK_WIDGET (childWidget), left, top); gtk_widget_set_size_request (GTK_WIDGET (childWidget), right - left, bottom - top); trace (U"moved child of class ", Thing_className (control)); } } }
void _CollectionOfDaata_v_readText (_CollectionOfDaata* me, MelderReadText text, int formatVersion) { if (formatVersion < 0) { long l_size; autostring8 line = Melder_32to8 (MelderReadText_readLine (text)); if (! line.peek() || ! sscanf (line.peek(), "%ld", & l_size) || l_size < 0) Melder_throw (U"Collection::readText: cannot read size."); my _grow (l_size); for (long i = 1; i <= l_size; i ++) { long itemNumberRead; int n = 0, length, stringsRead; char klas [200], nameTag [2000]; do { line.reset (Melder_32to8 (MelderReadText_readLine (text))); if (! line.peek()) Melder_throw (U"Missing object line."); } while (strncmp (line.peek(), "Object ", 7)); stringsRead = sscanf (line.peek(), "Object %ld: class %s %s%n", & itemNumberRead, klas, nameTag, & n); if (stringsRead < 2) Melder_throw (U"Collection::readText: cannot read header of object ", i, U"."); if (itemNumberRead != i) Melder_throw (U"Collection::readText: read item number ", itemNumberRead, U" while expecting ", i, U"."); if (stringsRead == 3 && ! strequ (nameTag, "name")) Melder_throw (U"Collection::readText: wrong header at object ", i, U"."); my at [i] = (Daata) Thing_newFromClassName (Melder_peek8to32 (klas), nullptr).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata) || ! Data_canReadText (my at [i])) Melder_throw (U"Cannot read item of class ", Thing_className (my at [i]), U" in collection."); Data_readText (my at [i], text, -1); if (stringsRead == 3) { if (line [n] == U' ') n ++; // skip space character length = strlen (line.peek()+n); if (length > 0 && (line.peek()+n) [length - 1] == '\n') (line.peek()+n) [length - 1] = '\0'; Thing_setName (my at [i], Melder_peek8to32 (line.peek()+n)); } } } else { int32_t l_size = texgeti4 (text); my _grow (l_size); for (int32_t i = 1; i <= l_size; i ++) { autostring32 className = texgetw2 (text); int elementFormatVersion; my at [i] = (Daata) Thing_newFromClassName (className.peek(), & elementFormatVersion).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata) || ! Data_canReadText (my at [i])) Melder_throw (U"Cannot read item of class ", Thing_className (my at [i]), U" in collection."); autostring32 objectName = texgetw2 (text); Thing_setName (my at [i], objectName.peek()); Data_readText (my at [i], text, elementFormatVersion); } } }
static gboolean _GuiWindow_resizeCallback (GuiObject widget, GtkAllocation *allocation, gpointer void_me) { (void) widget; iam (GuiWindow); trace ("fixed received size allocation: (%ld, %ld), %ld x %ld.", (long) allocation -> x, (long) allocation -> y, (long) allocation -> width, (long) allocation -> height); if (allocation -> width != my d_width || allocation -> height != my d_height) { trace ("user changed the size of the window?"); /* * Apparently, GTK sends the size allocation message both to the shell and to its fixed-container child. * we could capture the message either from the shell or from the fixed; we choose to do it from the fixed. */ Melder_assert (GTK_IS_FIXED (widget)); /* * We move and resize all the children of the fixed. */ GList *children = GTK_FIXED (widget) -> children; for (GList *l = g_list_first (children); l != NULL; l = g_list_next (l)) { GtkFixedChild *listElement = (GtkFixedChild *) l -> data; GtkWidget *childWidget = listElement -> widget; Melder_assert (childWidget); Thing_cast (GuiThing, child, _GuiObject_getUserData (childWidget)); if (child) { GuiControl control = NULL; if (Thing_member (child, classGuiControl)) { control = static_cast <GuiControl> (child); } else if (Thing_member (child, classGuiMenu)) { Thing_cast (GuiMenu, menu, child); control = menu -> d_cascadeButton; } if (control) { /* * Move and resize. */ trace ("moving child of class %ls", Thing_className (control)); int left = control -> d_left, right = control -> d_right, top = control -> d_top, bottom = control -> d_bottom; if (left < 0) left += allocation -> width; // this replicates structGuiControl :: v_positionInForm () if (right <= 0) right += allocation -> width; if (top < 0) top += allocation -> height; if (bottom <= 0) bottom += allocation -> height; trace ("moving child to (%d,%d)", left, top); gtk_fixed_move (GTK_FIXED (widget), GTK_WIDGET (childWidget), left, top); gtk_widget_set_size_request (GTK_WIDGET (childWidget), right - left, bottom - top); trace ("moved child of class %ls", Thing_className (control)); } } } my d_width = allocation -> width; my d_height = allocation -> height; gtk_widget_set_size_request (GTK_WIDGET (widget), allocation -> width, allocation -> height); } trace ("end"); return FALSE; }
void structThing :: v_info () { MelderInfo_writeLine (U"Object type: ", Thing_className (this)); MelderInfo_writeLine (U"Object name: ", this -> name ? this -> name : U"<no name>"); time_t today = time (nullptr); MelderInfo_writeLine (U"Date: ", Melder_peek8to32 (ctime (& today))); // includes a newline }
static void info (I) { iam (Thing); MelderInfo_writeLine2 (L"Object type: ", Thing_className (me)); MelderInfo_writeLine2 (L"Object name: ", my name ? my name : L"<no name>"); time_t today = time (NULL); MelderInfo_writeLine2 (L"Date: ", Melder_peekUtf8ToWcs (ctime (& today))); /* Includes a newline. */ }
void Data_readText (Data me, MelderReadText text) { try { my v_readText (text); } catch (MelderError) { Melder_throw (Thing_className (me), " not read."); } }
void Data_readText (Daata me, MelderReadText text, int formatVersion) { try { my v_readText (text, formatVersion); my v_repair (); } catch (MelderError) { Melder_throw (Thing_className (me), U" not read."); } }
bool _CollectionOfDaata_v_equal (_CollectionOfDaata* me, _CollectionOfDaata* thee) { if (! my structDaata :: v_equal (thee)) return false; if (my size != thy size) return false; for (long i = 1; i <= my size; i ++) { if (! Thing_isa (my at [i], classDaata)) Melder_throw (U"Collection::equal: " U"cannot compare items of class ", Thing_className (my at [i]), U"."); if (! Thing_isa (thy at [i], classDaata)) Melder_throw (U"Collection::equal: " U"cannot compare items of class ", Thing_className (thy at [i]), U"."); bool equal = Data_equal (my at [i], thy at [i]); //Melder_casual (U"classCollection_equal: ", equal, // U", item ", i, // U", types ", Thing_className (my item [i]), U" and ", Thing_className (thy item [i])); if (! equal) return false; } return true; }
void _CollectionOfDaata_v_readBinary (_CollectionOfDaata* me, FILE *f, int formatVersion) { if (formatVersion < 0) { int32 l_size = bingeti4 (f); if (l_size < 0) Melder_throw (U"Empty collection."); my _grow (l_size); for (int32_t i = 1; i <= l_size; i ++) { char klas [200], name [2000]; if (fscanf (f, "%s%s", klas, name) < 2) // BUG Melder_throw (U"Cannot read class and name."); my at [i] = (Daata) Thing_newFromClassName (Melder_peek8to32 (klas), nullptr).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata)) Melder_throw (U"Cannot read item of class ", Thing_className (my at [i]), U"."); if (fgetc (f) != ' ') Melder_throw (U"Cannot read space."); Data_readBinary (my at [i], f, -1); if (strcmp (name, "?")) Thing_setName (my at [i], Melder_peek8to32 (name)); } } else { int32_t l_size = bingeti4 (f); if (Melder_debug == 44) Melder_casual (U"structCollection :: v_readBinary: Reading ", l_size, U" objects"); my _grow (l_size); for (int32_t i = 1; i <= l_size; i ++) { autostring8 klas = bingets1 (f); if (Melder_debug == 44) Melder_casual (U"structCollection :: v_readBinary: Reading object of type ", Melder_peek8to32 (klas.peek())); int elementFormatVersion; my at [i] = (Daata) Thing_newFromClassName (Melder_peek8to32 (klas.peek()), & elementFormatVersion).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata) || ! Data_canReadBinary (my at [i])) Melder_throw (U"Objects of class ", Thing_className (my at [i]), U" cannot be read."); autostring32 name = bingetw2 (f); if (Melder_debug == 44) Melder_casual (U"structCollection :: v_readBinary: Reading object with name ", name.peek()); Thing_setName (my at [i], name.peek()); Data_readBinary (my at [i], f, elementFormatVersion); } } }
void Data_readBinary (Data me, FILE *f) { try { my v_readBinary (f); if (feof (f)) Melder_throw ("Early end of file."); if (ferror (f)) Melder_throw ("I/O error."); } catch (MelderError) { Melder_throw (Thing_className (me), " not read."); } }
void Data_readBinary (Daata me, FILE *f, int formatVersion) { try { my v_readBinary (f, formatVersion); if (feof (f)) Melder_throw (U"Early end of file."); if (ferror (f)) Melder_throw (U"I/O error."); my v_repair (); } catch (MelderError) { Melder_throw (Thing_className (me), U" not read."); } }
int Sampled_shortTermAnalysis (I, double windowDuration, double timeStep, long *numberOfFrames, double *firstTime) { iam (Sampled); double myDuration, thyDuration, ourMidTime; Melder_assert (windowDuration > 0.0); Melder_assert (timeStep > 0.0); myDuration = my dx * my nx; if (windowDuration > myDuration) return Melder_error2 (Thing_className (me), L" shorter than window length."); *numberOfFrames = floor ((myDuration - windowDuration) / timeStep) + 1; Melder_assert (*numberOfFrames >= 1); ourMidTime = my x1 - 0.5 * my dx + 0.5 * myDuration; thyDuration = *numberOfFrames * timeStep; *firstTime = ourMidTime - 0.5 * thyDuration + 0.5 * timeStep; return 1; }
void _CollectionOfDaata_v_copy (_CollectionOfDaata* me, _CollectionOfDaata* thee) { thy at._elements = nullptr; // set to null in case the inherited v_copy crashes my structDaata :: v_copy (thee); thy _ownershipInitialized = my _ownershipInitialized; thy _ownItems = my _ownItems; thy _capacity = my _capacity; thy size = my size; if (my _capacity > 0) { thy at._elements = Melder_calloc (Daata, my _capacity); // filled with null pointers thy at._elements --; // immediately turn from base-0 into base-1 // BUG use NUMvector } for (long i = 1; i <= my size; i ++) { Daata itempie = my at [i]; if (my _ownItems) { if (! Thing_isa (itempie, classDaata)) Melder_throw (U"Cannot copy item of class ", Thing_className (itempie), U"."); thy at [i] = Data_copy (itempie).releaseToAmbiguousOwner(); } else { thy at [i] = itempie; // reference copy: if me doesn't own the items, then thee shouldn't either // NOTE: the items don't have to be Daata } } }
static void readSound (ExperimentMFC me, const char32 *fileNameHead, const char32 *fileNameTail, double medialSilenceDuration, char32 **name, autoSound *sound) { char32 fileNameBuffer [256], *fileNames = & fileNameBuffer [0]; Melder_sprint (fileNameBuffer,256, *name); structMelderFile file = { 0 }; /* * The following conversion is needed when fileNameHead is an absolute path, * and the stimulus names contain slashes for relative paths. * An ugly case, but allowed. */ #if defined (_WIN32) for (;;) { char32 *slash = str32chr (fileNames, U'/'); if (! slash) break; *slash = U'\\'; } #endif sound->reset(); char32 pathName [kMelder_MAXPATH+1]; /* * 'fileNames' can contain commas, which separate partial file names. * The separate files should be concatenated. */ for (;;) { /* * Determine partial file name. */ char32 *comma = str32chr (fileNames, U','); if (comma) *comma = '\0'; /* * Determine complete (relative) file name. */ Melder_sprint (pathName,kMelder_MAXPATH+1, fileNameHead, fileNames, fileNameTail); /* * Make sure we are in the correct directory. */ if (MelderDir_isNull (& my rootDirectory)) { /* * Absolute file name. */ Melder_pathToFile (pathName, & file); } else { /* * Relative or absolute file name. */ MelderDir_relativePathToFile (& my rootDirectory, pathName, & file); if (Melder_debug == 32) { MelderInfo_open (); MelderInfo_writeLine (U"Path name <", pathName, U">"); MelderInfo_writeLine (U"Root directory <", my rootDirectory.path, U">"); MelderInfo_writeLine (U"Full path name <", file.path, U">"); MelderInfo_close (); } } /* * Read the substimulus. */ autoSound substimulus = Data_readFromFile (& file). static_cast_move<structSound>(); if (substimulus -> classInfo != classSound) Melder_throw (U"File ", & file, U" contains a ", Thing_className (substimulus.get()), U" instead of a sound."); /* * Check whether all sounds have the same number of channels. */ if (my numberOfChannels == 0) { my numberOfChannels = substimulus -> ny; } else if (substimulus -> ny != my numberOfChannels) { Melder_throw (U"The sound in file ", & file, U" has a different number of channels than some other sound."); } /* * Check whether all sounds have the same sampling frequency. */ if (my samplePeriod == 0.0) { my samplePeriod = substimulus -> dx; /* This must be the first sound read. */ } else if (substimulus -> dx != my samplePeriod) { Melder_throw (U"The sound in file ", & file, U" has a different sampling frequency than some other sound."); } /* * Append the substimuli, perhaps with silent intervals. */ if (*sound) { *sound = Sounds_append (sound->get(), medialSilenceDuration, substimulus.get()); } else { *sound = substimulus.move(); } /* * Cycle. */ if (! comma) break; fileNames = & comma [1]; } }