void uninitMenus(void) { uiMenu *m; uiMenuItem *item; size_t i, j; for (i = 0; i < len; i++) { m = menus[i]; uiFree(m->name); for (j = 0; j < m->len; j++) { item = m->items[j]; if (item->len != 0) // LONGTERM userbug()? implbug("menu item %p (%ws) still has uiWindows attached; did you forget to destroy some windows?", item, item->name); if (item->name != NULL) uiFree(item->name); if (item->hmenus != NULL) uiFree(item->hmenus); uiFree(item); } if (m->items != NULL) uiFree(m->items); uiFree(m); } if (menus != NULL) uiFree(menus); }
void runMenuEvent(WORD id, uiWindow *w) { uiMenu *m; uiMenuItem *item; size_t i, j; // this isn't optimal, but it works, and it should be just fine for most cases for (i = 0; i < len; i++) { m = menus[i]; for (j = 0; j < m->len; j++) { item = m->items[j]; if (item->id == id) goto found; } } // no match implbug("unknown menu ID %hu in runMenuEvent()", id); found: // first toggle checkboxes, if any if (item->type == typeCheckbox) uiMenuItemSetChecked(item, !uiMenuItemChecked(item)); // then run the event (*(item->onClicked))(item, w, item->onClickedData); }
void uiControlVerifySetParent(uiControl *c, uiControl *parent) { uiControl *curParent; if (uiControlToplevel(c)) userbug("You cannot give a toplevel uiControl a parent. (control: %p)", c); curParent = uiControlParent(c); if (parent != NULL && curParent != NULL) userbug("You cannot give a uiControl a parent while it already has one. (control: %p; current parent: %p; new parent: %p)", c, curParent, parent); if (parent == NULL && curParent == NULL) implbug("attempt to double unparent uiControl %p", c); }
static void freeMenu(uiMenu *m, HMENU submenu) { size_t i; uiMenuItem *item; size_t j; for (i = 0; i < m->len; i++) { item = m->items[i]; for (j = 0; j < item->len; j++) if (item->hmenus[j] == submenu) break; if (j >= item->len) implbug("submenu handle %p not found in freeMenu()", submenu); for (; j < item->len - 1; j++) item->hmenus[j] = item->hmenus[j + 1]; item->hmenus[j] = NULL; item->len--; } }
static cairo_pattern_t *mkbrush(uiDrawBrush *b) { cairo_pattern_t *pat; size_t i; switch (b->Type) { case uiDrawBrushTypeSolid: pat = cairo_pattern_create_rgba(b->R, b->G, b->B, b->A); break; case uiDrawBrushTypeLinearGradient: pat = cairo_pattern_create_linear(b->X0, b->Y0, b->X1, b->Y1); break; case uiDrawBrushTypeRadialGradient: // make the start circle radius 0 to make it a point pat = cairo_pattern_create_radial( b->X0, b->Y0, 0, b->X1, b->Y1, b->OuterRadius); break; // case uiDrawBrushTypeImage: } if (cairo_pattern_status(pat) != CAIRO_STATUS_SUCCESS) implbug("error creating pattern in mkbrush(): %s", cairo_status_to_string(cairo_pattern_status(pat))); switch (b->Type) { case uiDrawBrushTypeLinearGradient: case uiDrawBrushTypeRadialGradient: for (i = 0; i < b->NumStops; i++) cairo_pattern_add_color_stop_rgba(pat, b->Stops[i].Pos, b->Stops[i].R, b->Stops[i].G, b->Stops[i].B, b->Stops[i].A); } return pat; }