ui/common/document.c

changeset 110
c00e968d018b
parent 108
77254bd6dccb
equal deleted inserted replaced
109:c3dfcb8f0be7 110:c00e968d018b
34 34
35 #include <cx/hash_map.h> 35 #include <cx/hash_map.h>
36 #include <cx/mempool.h> 36 #include <cx/mempool.h>
37 37
38 38
39 static CxMap *documents;
40 39
41 void uic_docmgr_init() {
42 if (!documents) {
43 documents = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 32);
44 }
45 }
46 40
47 void* ui_document_new(size_t size) { 41 void* ui_document_new(size_t size) {
48 CxMempool *mp = cxMempoolCreateSimple(256); 42 CxMempool *mp = cxMempoolCreateSimple(256);
49 const CxAllocator *a = mp->allocator; 43 const CxAllocator *a = mp->allocator;
50 UiContext *ctx = uic_context(NULL, mp); 44 UiContext *ctx = uic_context(NULL, mp);
51 45
52 void *document = cxCalloc(a, size, 1); 46 UiDoc *document = cxCalloc(a, sizeof(UiDoc) + size, 1);
53 cxMapPut(documents, cx_hash_key(&document, sizeof(void*)), ctx); 47 document->ctx = ctx;
54 return document; 48 return &document->doc;
55 } 49 }
56 50
57 void ui_document_destroy(void *doc) { 51 void ui_document_destroy(void *doc) {
58 UiContext *ctx = ui_document_context(doc); 52 UiContext *ctx = ui_document_context(doc);
59 if(ctx) { 53 if(ctx) {
72 } 66 }
73 } 67 }
74 68
75 UiContext* ui_document_context(void *doc) { 69 UiContext* ui_document_context(void *doc) {
76 if(doc) { 70 if(doc) {
77 return cxMapGet(documents, cx_hash_key(&doc, sizeof(void*))); 71 char *docPtr = doc;
72 UiDoc *document = (UiDoc*)(docPtr - sizeof(void*));
73 return document->ctx;
78 } else { 74 } else {
79 return NULL; 75 return NULL;
80 } 76 }
81 } 77 }

mercurial