diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h index 1e35d1b..673dde5 100644 --- a/include/Mw/TypeDefs.h +++ b/include/Mw/TypeDefs.h @@ -84,6 +84,7 @@ struct _MwWidget { int prop_event; void* internal; + void* opaque; MwIntegerKeyValue* integer; MwTextKeyValue* text; diff --git a/resource/icon/info.png b/resource/icon/info.png new file mode 100644 index 0000000..4b42ce5 Binary files /dev/null and b/resource/icon/info.png differ diff --git a/resource/icon/note.png b/resource/icon/note.png new file mode 100644 index 0000000..79bfe99 Binary files /dev/null and b/resource/icon/note.png differ diff --git a/resource/icon/question.png b/resource/icon/question.png new file mode 100644 index 0000000..66c7e7b Binary files /dev/null and b/resource/icon/question.png differ diff --git a/resource/icon/warning.png b/resource/icon/warning.png new file mode 100644 index 0000000..60b6054 Binary files /dev/null and b/resource/icon/warning.png differ diff --git a/src/backend/x11.c b/src/backend/x11.c index cb254a4..ab59308 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -275,13 +275,19 @@ MwLLPixmap MwLLCreatePixmap(MwLL handle, unsigned char* data, int width, int hei if(r->use_shm) { r->image = XShmCreateImage(handle->display, DefaultVisual(handle->display, DefaultScreen(handle->display)), 24, ZPixmap, NULL, &r->shm, width, height); - free(d); - r->shm.shmid = shmget(IPC_PRIVATE, r->image->bytes_per_line * height, IPC_CREAT | 0777); - r->shm.shmaddr = d = r->image->data = shmat(r->shm.shmid, 0, 0); - r->shm.readOnly = False; - XShmAttach(handle->display, &r->shm); - } else { + r->shm.shmid = shmget(IPC_PRIVATE, r->image->bytes_per_line * height, IPC_CREAT | 0777); + if(r->shm.shmid == -1) { + XDestroyImage(r->image); + r->use_shm = 0; + } else { + free(d); + r->shm.shmaddr = d = r->image->data = shmat(r->shm.shmid, 0, 0); + r->shm.readOnly = False; + XShmAttach(handle->display, &r->shm); + } + } + if(!r->use_shm) { r->image = XCreateImage(handle->display, DefaultVisual(handle->display, DefaultScreen(handle->display)), 24, ZPixmap, 0, d, width, height, 32, width * 4); } diff --git a/src/draw.c b/src/draw.c index 540e0cd..7d47fd5 100644 --- a/src/draw.c +++ b/src/draw.c @@ -368,7 +368,7 @@ void MwDrawText(MwWidget handle, MwPoint* point, const char* text, int bold, int MwRect r; sx = point->x; - sy = point->y - FontHeight * FontScale / 2; + sy = point->y - MwTextHeight(handle, text) / 2; if(align == MwALIGNMENT_CENTER) { sx -= strlen(text) * FontWidth * FontScale / 2; @@ -382,19 +382,24 @@ void MwDrawText(MwWidget handle, MwPoint* point, const char* text, int bold, int if(out >= 0x80) out = 0; - for(y = 0; y < FontHeight; y++) { - for(x = 0; x < FontWidth; x++) { - r.x = sx + x * FontScale; - r.y = sy + y * FontScale; - r.width = FontScale; - r.height = FontScale; + if(out == '\n') { + sx = 0; + sy += FontHeight * FontScale; + } else { + for(y = 0; y < FontHeight; y++) { + for(x = 0; x < FontWidth; x++) { + r.x = sx + x * FontScale; + r.y = sy + y * FontScale; + r.width = FontScale; + r.height = FontScale; - if((bold ? MwBoldFontData : MwFontData)[out].data[y] & (1 << ((FontWidth - 1) - x))) { - MwDrawRect(handle, &r, color); + if((bold ? MwBoldFontData : MwFontData)[out].data[y] & (1 << ((FontWidth - 1) - x))) { + MwDrawRect(handle, &r, color); + } } } + sx += FontWidth * FontScale; } - sx += FontWidth * FontScale; } } @@ -405,10 +410,20 @@ int MwTextWidth(MwWidget handle, const char* text) { } int MwTextHeight(MwWidget handle, const char* text) { + int c = 1; + int i = 0; + (void)handle; (void)text; - return FontHeight * FontScale; + while(text[i] != 0) { + int out; + i += MwUTF8ToUTF32(text + i, &out); + + if(out == '\n') c++; + } + + return FontHeight * FontScale * c; } #ifndef USE_STB_IMAGE diff --git a/src/icon/info.c b/src/icon/info.c index f76e189..d2b8df8 100644 --- a/src/icon/info.c +++ b/src/icon/info.c @@ -5,40 +5,40 @@ char* MwIconInfo[] = { /* columns rows colors chars-per-pixel */ "32 32 4 1 ", - " c black", - ". c #6632F7", - "X c white", - "o c None", + " c None", + ". c blue", + "X c DarkSlateGray", + "o c lavender", /* pixels */ - "oooooooooooooooooooooooooooooooo", - "ooooooooooo oooooooooooo", - "ooooooooo ooooooooo", - "ooooooo ......... oooooooo", - "oooooo ............. oooooo", - "ooooo ................ ooooo", - "oooo ........XX........ ooooo", - "ooo ........XXXX........ oooo", - "ooo .........XXXX......... ooo", - "oo ..........XXXX......... ooo", - "oo ...........XX........... oo", - "o ......................... oo", - "o ...........XXXX.......... oo", - "o ...........XXXX........... o", - "o ...........XXXX........... o", - "o ...........XXXX........... o", - "o ...........XXXX........... o", - "o ...........XXXX........... o", - "o ...........XXXX.......... oo", - "o ...........XXXX.......... oo", - "oo ..........XXXX.......... oo", - "oo ..........XXXX......... oo", - "oo .........XXXX......... ooo", - "ooo .........XXXX........ ooo", - "oooo ........XXXX....... oooo", - "oooo ........XX....... ooooo", - "ooooo ............... oooooo", - "ooooooo ........... ooooooo", - "oooooooo ..... oooooooo", - "oooooooooo oooooooooo", - "ooooooooooooo oooooooooooooo", - "oooooooooooooooooooooooooooooooo"}; + " ", + " ", + " ", + " ", + " ", + " ..... ", + " ....... ", + " .....XX ", + " XXXXX ", + " ", + " ", + " ...... ", + " .......XX ", + " ..........XX ", + " XXX.....XX ", + " .....XX ", + " .....XX ", + " .....XX ", + " .....XX ", + " .....XX ", + " .....XX ", + " ....XX ", + " ....XX ", + " ....XX . ", + " ....X ...XX ", + " .......XXX ", + " XXXXXXX ", + " ", + " ", + " ", + " ", + " "}; diff --git a/src/icon/note.c b/src/icon/note.c index be69a53..95c6fc1 100644 --- a/src/icon/note.c +++ b/src/icon/note.c @@ -4,41 +4,43 @@ /* XPM */ char* MwIconNote[] = { /* columns rows colors chars-per-pixel */ - "32 32 4 1 ", + "32 32 6 1 ", " c None", - ". c black", - "X c #FCFC00", - "o c black", + ". c red", + "X c white", + "o c SlateGray", + "O c firebrick", + "+ c lavender", /* pixels */ - " ", - " ..... ", - " ............ ", - " ......XXXXX..... ", - " ....XXXXXXXXXXX... ", - " ...XXXXXXXXXXXXXXX... ", - " ...XXXXXXX..XXXXXXXX... ", - " ...XXXXXXX....XXXXXXXX.. ", - " ...XXXXXXXX....XXXXXXXXX.. ", - " ..XXXXXXXXX....XXXXXXXXX... ", - " ...XXXXXXXXX....XXXXXXXXXX.. ", - " ..XXXXXXXXXX....XXXXXXXXXX.. ", - " ..XXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXX....XXXXXXXXXXX.. ", - " ..XXXXXXXXXXXXXXXXXXXXXXXXX.. ", - " ..XXXXXXXXXXX..XXXXXXXXXXX.. ", - " ..XXXXXXXXX....XXXXXXXXXX.. ", - " ..XXXXXXXXX....XXXXXXXXX.. ", - " ..XXXXXXXX....XXXXXXXX... ", - " ..XXXXXXXX..XXXXXXXX... ", - " ...XXXXXXXXXXXXXXXX... ", - " ....XXXXXXXXXXXXX... ", - " ....XXXXXXXXX.... ", - " .............. ", - " ......... ", - " "}; + " .... ", + " ........ ", + " ..XX......o ", + " .XX.......oo ", + " ..X........Oo ", + " .XX........Ooo ", + " .X.........Ooo ", + " .X.........Ooo ", + " ...........Ooo ", + " ...........Ooo ", + " ..........Ooo ", + " ..........Ooo ", + " .........Oooo ", + " .........Ooo ", + " .........Ooo ", + " ........Oooo ", + " .......Ooo ", + " ......Oooo ", + " ......Ooo ", + " ....Oooo ", + " ....Ooo ", + " OOOooo ", + " ooo ", + " ..... ", + " .XX...Oo ", + " .XX.....Oo ", + " .X......Ooo ", + " ........Ooo ", + " ........Ooo ", + " O.....Oooo ", + " OOOOOooo ", + " ooooo "}; diff --git a/src/icon/question.c b/src/icon/question.c index c381e5d..ec32b1b 100644 --- a/src/icon/question.c +++ b/src/icon/question.c @@ -4,39 +4,43 @@ /* XPM */ char* MwIconQuestion[] = { /* columns rows colors chars-per-pixel */ - "32 32 2 1 ", + "32 32 6 1 ", " c None", - ". c red", + ". c orange", + "X c red", + "o c firebrick", + "O c SlateGray", + "+ c lavender", /* pixels */ " ", - " ....... ", - " ............. ", - " ..... ...... ", - " .... ...... ", - " ... ...... ", - " .... ...... ", - " ..... ...... ", - " ..... ...... ", - " .. ...... ", - " ....... ", - " ...... ", - " ....... ", - " ....... ", - " ....... ", - " ...... ", - " ..... ", - " .... ", - " ... ", - " .... ", - " .... ", - " ..... ", - " ...... ", - " ...... ", - " .... ", - " ", - " .. ", - " ...... ", - " ...... ", - " ...... ", - " .... ", - " "}; + " ........... ", + " ..XXXXXXXXXXXXX ", + " .XXXXXoooooooooXXO ", + " .XXXXoooooooooooooXO ", + " .XXXXooooXXXXoooooooXO ", + " .XXXXooooOOO XXooooooooO ", + " .XXXXooooOOO XXoooooooOO ", + " .XXXoooooOO .XXooooooOO ", + " .XXXooooooO .XXooooooOO ", + " XXXooooooOO .XXooooooOO ", + " XXooooooOO .XXXooooooOO ", + " XXooooOOO .XXooooooOOO ", + " XXooOOO .XXooooooOOO ", + " OOOOO .XXooooooOOOO ", + " OOO .XXooooooOOOO ", + " .XXoooooOOOOO ", + " .XXoooooOOOO ", + " .XXoooooOOOO ", + " .XXooooOOOO ", + " XXoooOOOO ", + " XXoOOOO ", + " OOOOO ", + " .XXooO ", + " .X.XXoo ", + " .X.X.XXoo ", + " .XX.XXXooO ", + " XXXXXXooOO ", + " XXXXooOOO ", + " XoooOOOO ", + " OOOOOO ", + " OOOO "}; diff --git a/src/icon/warning.c b/src/icon/warning.c index 06fed22..c056e6d 100644 --- a/src/icon/warning.c +++ b/src/icon/warning.c @@ -4,41 +4,42 @@ /* XPM */ char* MwIconWarning[] = { /* columns rows colors chars-per-pixel */ - "32 32 4 1 ", + "32 32 5 1 ", " c None", - ". c #FC0000", - "X c gray", - "o c black", + ". c red", + "X c yellow", + "o c DarkSlateGray", + "O c black", /* pixels */ " ", " ", - " . ", - " ... ", - " ..X.. ", - " .XXX. ", - " ..XXX.. ", - " .XXXXX. ", - " ..XXoXX.. ", - " .XXoooXX. ", - " ..XXoooXX.. ", - " .XXXoooXXX. ", - " ..XXXoooXXX.. ", - " .XXXXoooXXXX. ", - " ..XXXXoooXXXX.. ", - " .XXXXXoooXXXXX. ", - " ..XXXXXoooXXXXX.. ", - " .XXXXXXoooXXXXXX. ", - " ..XXXXXXoooXXXXXX.. ", - " .XXXXXXXoooXXXXXXX. ", - " ..XXXXXXXoooXXXXXXX.. ", - " .XXXXXXXXXoXXXXXXXXX. ", - " ..XXXXXXXXXXXXXXXXXXX.. ", - " .XXXXXXXXXXoXXXXXXXXXX. ", - " ..XXXXXXXXXoooXXXXXXXXX.. ", - " .XXXXXXXXXoooooXXXXXXXXX. ", - " ..XXXXXXXXXXoooXXXXXXXXXX.. ", - " .XXXXXXXXXXXXoXXXXXXXXXXXX. ", - " ..XXXXXXXXXXXXXXXXXXXXXXXXX.. ", - " ............................. ", - " ........................... ", + " ... ", + " ..... ", + " ..X..oo ", + " ..XXX..oo ", + " ..XXX..oo ", + " ..XXXXX..oo ", + " ..XXXXX..oo ", + " ..XXOOOXX..oo ", + " ..XOOOOOX..oo ", + " ..XXOOOOOXX..oo ", + " ..XXOOOOOXX..oo ", + " ..XXXOOOOOXXX..oo ", + " ..XXXOOOOOXXX..oo ", + " ..XXXXOOOOOXXXX..oo ", + " ..XXXXOOOOOXXXX..oo ", + " ..XXXXXOOOOOXXXXX..oo ", + " ..XXXXXXOOOXXXXXX..oo ", + " ..XXXXXXXOOOXXXXXXX..oo ", + " ..XXXXXXXOOOXXXXXXX..oo ", + " ..XXXXXXXXOOOXXXXXXXX..oo ", + " ..XXXXXXXXXXXXXXXXXXX..oo ", + " ..XXXXXXXXXOOOXXXXXXXXX..oo ", + " ..XXXXXXXXOOOOOXXXXXXXX..oo ", + " ..XXXXXXXXXOOOOOXXXXXXXXX..oo ", + " ..XXXXXXXXXXOOOXXXXXXXXXX..oo ", + " ..XXXXXXXXXXXXXXXXXXXXXXXXX..oo", + " .............................oo", + " ...........................ooo", + " ooooooooooooooooooooooooooo ", " "}; diff --git a/src/messagebox.c b/src/messagebox.c index 9ab673a..a0fecd1 100644 --- a/src/messagebox.c +++ b/src/messagebox.c @@ -1,10 +1,18 @@ /* $Id$ */ #include +void msgbox_ok_handler(MwWidget handle, void* user, void* call) { + MwWidget win = user; + + MwDestroyWidget(win); +} + MwWidget MwMessageBox(MwWidget handle, const char* text, const char* title, unsigned int flag) { MwWidget window, ok; MwPoint p; int w, h; + int left = 8; + int th; p.x = 0; p.y = 0; @@ -12,16 +20,18 @@ MwWidget MwMessageBox(MwWidget handle, const char* text, const char* title, unsi window = MwVaCreateWidget(MwWindowClass, "messagebox", handle, 0, 0, (w = 512), (h = 32 * 4), MwNtitle, title, NULL); - ok = MwVaCreateWidget(MwButtonClass, "ok", window, w - 8 - 64, h - 8 - 24, 64, 24, + ok = MwVaCreateWidget(MwButtonClass, "ok", window, w - 8 - 80, h - 8 - 24, 80, 24, MwNtext, "OK", NULL); + MwAddUserHandler(ok, MwNactivateHandler, msgbox_ok_handler, window); + if((flag & MwMB_ICONMASK) != 0) { MwWidget icon; MwLLPixmap px; char** data = NULL; - icon = MwCreateWidget(MwImageClass, "image", window, 16, (h - 48) / 2, 48, 48); + icon = MwCreateWidget(MwImageClass, "image", window, 8, (h - 48) / 2, 48, 48); switch(flag & MwMB_ICONMASK) { case MwMB_ICONWARNING: { @@ -45,8 +55,16 @@ MwWidget MwMessageBox(MwWidget handle, const char* text, const char* title, unsi px = MwLoadXPM(icon, data); MwSetVoid(icon, MwNpixmap, px); + + left = 8 + 48 + 8; } + th = MwTextHeight(handle, text); + (void)MwVaCreateWidget(MwLabelClass, "label", window, left, (h - th) / 2, w - left - 8, th, + MwNtext, text, + MwNalignment, MwALIGNMENT_BEGINNING, + NULL); + MwLLDetach(window->lowlevel, &p); MwLLSetSizeHints(window->lowlevel, w, h, w, h); MwLLMakePopup(window->lowlevel, handle->lowlevel); diff --git a/tools/icon.sh b/tools/icon.sh index 31a0c7c..77e977d 100755 --- a/tools/icon.sh +++ b/tools/icon.sh @@ -14,7 +14,7 @@ echo '#ifdef __cplusplus' >> include/Mw/Icon.h echo 'extern "C" {' >> include/Mw/Icon.h echo '#endif' >> include/Mw/Icon.h echo '' >> include/Mw/Icon.h -for i in doc/*.gif; do +for i in resource/icon/*.png; do LOWER=`echo $i | rev | cut -d"/" -f1 | rev | cut -d"." -f1` if [ "$LOWER" = "unsure" ]; then LOWER=question