WMSplitView *WMCreateSplitView(WMWidget * parent) { WMSplitView *sPtr; sPtr = wmalloc(sizeof(WMSplitView)); sPtr->widgetClass = WC_SplitView; sPtr->view = W_CreateView(W_VIEW(parent)); if (!sPtr->view) { wfree(sPtr); return NULL; } sPtr->view->self = sPtr; WMSetViewNotifySizeChanges(sPtr->view, True); WMCreateEventHandler(sPtr->view, ExposureMask | StructureNotifyMask | ClientMessageMask, handleEvents, sPtr); WMCreateEventHandler(sPtr->view, ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask, handleActionEvents, sPtr); WMAddNotificationObserver(handleViewResized, sPtr, WMViewSizeDidChangeNotification, sPtr->view); sPtr->subviews = WMCreateArrayWithDestructor(8, wfree); return sPtr; }
static W_View *createView(W_Screen * screen, W_View * parent) { W_View *view; if (ViewContext == 0) ViewContext = XUniqueContext(); view = wmalloc(sizeof(W_View)); view->screen = screen; if (parent != NULL) { /* attributes are not valid for root window */ view->attribFlags = CWEventMask | CWBitGravity; view->attribs = defAtts; view->attribFlags |= CWBackPixel | CWColormap | CWBorderPixel; view->attribs.background_pixel = W_PIXEL(screen->gray); view->attribs.border_pixel = W_PIXEL(screen->black); view->attribs.colormap = screen->colormap; view->backColor = WMRetainColor(screen->gray); adoptChildView(parent, view); } view->xic = 0; view->refCount = 1; view->eventHandlers = WMCreateArrayWithDestructor(4, wfree); return view; }
/* * WMArray *array; * WDMCheckPLArray(pl, spec, &array); */ Bool WDMCheckPLArray(WMPropList * pl, void *def, void *target) { WMArray **array_target = (WMArray **) target; WDMArraySpec *spec = (WDMArraySpec *) def; void *entry = NULL; int i, count; WDMDebug("WDMCheckPLArray(%p, %p, %p)\n", (void *)pl, def, target); if (!pl || !WMIsPLArray(pl)) return False; count = WMGetPropListItemCount(pl); *array_target = WMCreateArrayWithDestructor(count, spec->destructor); for (i = 0; i < count; ++i) { if (!(*spec->checker) (WMGetFromPLArray(pl, i), spec->data, &entry)) { WMFreeArray(*array_target); *array_target = NULL; return False; } if (spec->addnull == True || entry != NULL) { WMAddToArray(*array_target, entry); } } return True; }
WMBox *WMCreateBox(WMWidget * parent) { Box *bPtr; bPtr = wmalloc(sizeof(Box)); bPtr->widgetClass = WC_Box; bPtr->view = W_CreateView(W_VIEW(parent)); if (!bPtr->view) { wfree(bPtr); return NULL; } bPtr->view->self = bPtr; bPtr->view->delegate = &delegate; bPtr->subviews = WMCreateArrayWithDestructor(2, wfree); WMCreateEventHandler(bPtr->view, StructureNotifyMask, handleEvents, bPtr); WMResizeWidget(bPtr, DEFAULT_WIDTH, DEFAULT_HEIGHT); return bPtr; }
/* * This function will check if pl is string or array of strings. * It always returns WMArray. In case of string, new array will be * created and that string will be added to it. * def is ignored here. */ Bool WDMCheckPLStringOrArray(WMPropList * pl, void *def, void *target) { char *text; WMArray **array_target = (WMArray **) target; static WDMArraySpec array_of_strings = { WDMCheckPLString, NULL, wfree, False }; if (pl && WMIsPLString(pl)) { if (WDMCheckPLString(pl, NULL, &text) && text) { *array_target = WMCreateArrayWithDestructor(1, wfree); WMAddToArray(*array_target, text); return True; } } return WDMCheckPLArray(pl, &array_of_strings, target); }
WMHandlerID WMAddInputHandler(int fd, int condition, WMInputProc *proc, void *clientData) { InputHandler *handler; handler = wmalloc(sizeof(InputHandler)); handler->fd = fd; handler->mask = condition; handler->callback = proc; handler->clientData = clientData; if (!inputHandler) inputHandler = WMCreateArrayWithDestructor(16, wfree); WMAddToArray(inputHandler, handler); return handler; }
WMTreeNode *WMInsertNodeInTree(WMTreeNode * parent, int index, WMTreeNode * aNode) { wassertrv(parent != NULL, NULL); wassertrv(aNode != NULL, NULL); aNode->parent = parent; updateNodeDepth(aNode, parent->depth + 1); if (!parent->leaves) { parent->leaves = WMCreateArrayWithDestructor(1, destroyNode); } if (index < 0) { WMAddToArray(parent->leaves, aNode); } else { WMInsertInArray(parent->leaves, index, aNode); } return aNode; }
WMHandlerID WMAddIdleHandler(WMCallback *callback, void *cdata) { IdleHandler *handler; handler = malloc(sizeof(IdleHandler)); if (!handler) return NULL; handler->callback = callback; handler->clientData = cdata; /* add handler at end of queue */ if (!idleHandler) { idleHandler = WMCreateArrayWithDestructor(16, wfree); } WMAddToArray(idleHandler, handler); return handler; }
WMTreeNode *WMInsertItemInTree(WMTreeNode * parent, int index, void *item) { WMTreeNode *aNode; wassertrv(parent != NULL, NULL); aNode = WMCreateTreeNodeWithDestructor(item, parent->destructor); aNode->parent = parent; aNode->depth = parent->depth + 1; if (!parent->leaves) { parent->leaves = WMCreateArrayWithDestructor(1, destroyNode); } if (index < 0) { WMAddToArray(parent->leaves, aNode); } else { WMInsertInArray(parent->leaves, index, aNode); } return aNode; }
WMArray *WMGetBrowserPaths(WMBrowser * bPtr) { int column, i, k, size, selNo; char *path; size_t slen; WMListItem *item, *lastItem; WMArray *paths, *items; column = bPtr->usedColumnCount - 1; if (column < 0) { paths = WMCreateArrayWithDestructor(1, wfree); WMAddToArray(paths, wstrdup(bPtr->pathSeparator)); return paths; } items = WMGetListSelectedItems(bPtr->columns[column]); selNo = WMGetArrayItemCount(items); paths = WMCreateArrayWithDestructor(selNo, wfree); if (selNo <= 1) { WMAddToArray(paths, WMGetBrowserPath(bPtr)); return paths; } /* calculate size of buffer */ size = 0; for (i = 0; i < column; i++) { item = WMGetListSelectedItem(bPtr->columns[i]); if (!item) break; size += strlen(item->text); } size += (column + 1) * strlen(bPtr->pathSeparator) + 1; for (k = 0; k < selNo; k++) { /* get the path */ lastItem = WMGetFromArray(items, k); slen = size + (lastItem != NULL ? strlen(lastItem->text) : 0); path = wmalloc(slen); /* ignore first `/' */ for (i = 0; i <= column; i++) { if (wstrlcat(path, bPtr->pathSeparator, slen) >= slen) { wfree(path); WMFreeArray(paths); return NULL; } if (i == column) { item = lastItem; } else { item = WMGetListSelectedItem(bPtr->columns[i]); } if (!item) break; if (wstrlcat(path, item->text, slen) >= slen) { wfree(path); return NULL; } } WMAddToArray(paths, path); } return paths; }