From 83eda3564373b720309ef5737d01d72bf084f134 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sat, 11 Oct 2025 07:25:16 +0000 Subject: [PATCH] add icons git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@258 b9cfdab3-6d41-4d17-bbe4-086880011989 --- include/Mw/TypeDefs.h | 1 + resource/icon/info.png | Bin 0 -> 397 bytes resource/icon/note.png | Bin 0 -> 444 bytes resource/icon/question.png | Bin 0 -> 492 bytes resource/icon/warning.png | Bin 0 -> 458 bytes src/backend/x11.c | 18 ++++++--- src/draw.c | 37 +++++++++++++------ src/icon/info.c | 72 ++++++++++++++++++------------------ src/icon/note.c | 74 +++++++++++++++++++------------------ src/icon/question.c | 70 ++++++++++++++++++----------------- src/icon/warning.c | 67 ++++++++++++++++----------------- src/messagebox.c | 22 ++++++++++- tools/icon.sh | 2 +- 13 files changed, 205 insertions(+), 158 deletions(-) create mode 100644 resource/icon/info.png create mode 100644 resource/icon/note.png create mode 100644 resource/icon/question.png create mode 100644 resource/icon/warning.png 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 0000000000000000000000000000000000000000..4b42ce5669beea2e018e44e1f90bc7d57a08a22a GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZ&To$sR$z3=CCj3=9n|3=F@3LJcn% z7)lKo7+xhXFj&oCU=S~uvn$XBD8Uop6XFV_85sWS`};q8_G`nXb!UJ)#*!evUYW=L>S6G7^>bP0l+XkK0itVc literal 0 HcmV?d00001 diff --git a/resource/icon/note.png b/resource/icon/note.png new file mode 100644 index 0000000000000000000000000000000000000000..79bfe9911308b5f6788f07c791a18fa3c5100948 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vO2U$sR$z3=CCj3=9n|3=F@3LJcn% z7)lKo7+xhXFj&oCU=S~uvn$XBC?OQ!6XFV_{{zwg{{;;bHYq7Rd-f|iY`-W_l(8hp zFPOpM*^M+1C&}C0h4n}NOOPGxC7!;n>@T^v*~QuawN-%ZDD!l24AD5>dohvgfC2|w zK(lN@d`Y8~;|0Mt|I%lf9=pP}w%+#2m5z791(WO;H#8{)i5}6p5aKq)I>K@0hi5H& zSpPIFng5q1Zb6=csqLKAmW|>UB!iAjn~_lFHCJ}RS%n|*8Xjs%I&*n{*llP%%+o fZULGlM#feK<`6w<)xj5mdKf%i{an^LB{Ts5EUAm+ literal 0 HcmV?d00001 diff --git a/resource/icon/question.png b/resource/icon/question.png new file mode 100644 index 0000000000000000000000000000000000000000..66c7e7b7226e4b21c842c1088dc1d9b15ecc4de0 GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vO2U$sR$z3=CCj3=9n|3=F@3LJcn% z7)lKo7+xhXFj&oCU=S~uvn$XBC?OQ!6XFV_|1V|u&%m%rNvWV=!n0?;swO500Yw>0 zg8YIR9G=}s196hP-CbCJ&pI;i<@1X{a;%J$c|;6E{-7@=W{1sRu4%bi=l zitdMyqv>UrwOL(mEy!!+9rvrEA<-C13S=qxfaH z=#9x7_7T<^Rso9&M1U?21szvSX(7ia(1Rspi0-P6S}MB{w##f!WR3OufXHxE2w zG2=@(#MbsVeN!!KrmEq$e&Kx8#K?bqYd_BEh?}tTNYnSXf10MubT(!z-0S4*zE&BV6k$oBxC)ng|O>+w?ZXcpt7I^=v^3E*G}1LR0ckKXvNAM-Xb_$8 tX+2Pb2Hb{{%-q!ClEmBsG)s((tqjZ|deo|eF9P*2c)I$ztaD0e0s!tek5~Wz literal 0 HcmV?d00001 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