Object types

There are mainly 4 types of objects in Chrohime, the design was made with API/ABI stability in mind.

Geometry

Geometry types like Rect and Size, are simple C structures. For APIs that take and return them, they are all passed by value.

hime_rect_t rect = {0, 0, 100, 100};
hime_window_set_bounds(win, rect);
hime_size_t size = hime_window_get_size(win);

Struct

Objects that do not have methods belong to struct types, for example window options and table columns. It is developer's responsibility to allocate memory for them, and APIs always take pointer as parameters for struct types.

The difference between struct and geometry types is, struct types may have new properties added in future, but gemotry types will never change.

After allocating memory for struct types (usually on stack), developer must call the corresponding xxx_init functions to initialize them, which set the hidden struct_size property and assign default values for properties.

hime_window_options_t options;
hime_window_options_init(&options);
hime_window_t window = hime_window_create(&options);

RefCounted

Objects that have methods and inherit from the Object class are refcounted types. Their lifetime are managed by ref-counting and for each refcounted object created you must call hime_object_unref to deference them once you are done with them.

hime_view_t view = hime_view_create();
hime_object_unref((hime_object_t)view);

Unlike geometry and struct types, the memory of refcounted types are always allocated in heap by Chrohime APIs, i.e. types like hime_view_t and hime_window_t are opaque pointers.

When passing refcounted types as arguments in function calls, the callee is free to retain a reference to the passed object.

hime_view_t child = hime_view_create();
hime_view_add_child_view(view, child);
hime_object_unref((hime_object_t)child);
// `child` is still alive due to being retained by `view`.

Class

Class types are very similar to refcounted types, except that class objects do not inherit from Object and are not ref-counted. For each object created with xxx_create API you can call xxx_destroy to release their memory.

hime_state_t state = hime_state_create();
hime_state_destroy(state);