From 28250bbaabc6c1ffc361c97e2ecaf03d86a6cf1e Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 13 Oct 2025 06:30:36 +0000 Subject: [PATCH] borderless git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@303 b9cfdab3-6d41-4d17-bbe4-086880011989 --- doc/index.html | 25 +++++++++++++++++++ include/Mw/LowLevel.h | 1 + include/Mw/Widget/Window.h | 7 ++++++ include/MwOO/Base.h | 1 + include/MwOO/Widget/Window.h | 1 + oosrc/base.cc | 5 ++++ oosrc/widget/window.cc | 3 +++ resource/icon/error.png | Bin 663 -> 663 bytes resource/icon/info.png | Bin 434 -> 434 bytes resource/icon/news.png | Bin 542 -> 542 bytes resource/icon/note.png | Bin 594 -> 594 bytes resource/icon/question.png | Bin 529 -> 529 bytes resource/icon/warning.png | Bin 498 -> 498 bytes src/backend/gdi.c | 14 +++++++++++ src/backend/x11.c | 45 +++++++++++++++++++++++++++++++++-- src/widget/window.c | 4 ++++ 16 files changed, 104 insertions(+), 2 deletions(-) diff --git a/doc/index.html b/doc/index.html index e80e85f..b1850a7 100644 --- a/doc/index.html +++ b/doc/index.html @@ -452,6 +452,9 @@
MwWindowClass
+
+ MwWindowMakeBorderless +

Mw/Constants.h

@@ -2694,6 +2697,28 @@ Window widget class. +
+
MWDECL void MwWindowMakeBorderless (
+	MwWidget handle,
+	int toggle
+);
+
+
+ Makes window borderless. +
+
+ Parameter handle +
+
+ Widget. +
+
+ Parameter toggle +
+
+ Toggle. +
+

diff --git a/include/Mw/LowLevel.h b/include/Mw/LowLevel.h index 3d83a89..6007d69 100644 --- a/include/Mw/LowLevel.h +++ b/include/Mw/LowLevel.h @@ -110,6 +110,7 @@ MWDECL void MwLLShow(MwLL handle, int show); MWDECL void MwLLMakePopup(MwLL handle, MwLL parent); MWDECL void MwLLSetSizeHints(MwLL handle, int minx, int miny, int maxx, int maxy); +MWDECL void MwLLMakeBorderless(MwLL handle, int toggle); #ifdef __cplusplus } diff --git a/include/Mw/Widget/Window.h b/include/Mw/Widget/Window.h index a229c95..abc7e69 100644 --- a/include/Mw/Widget/Window.h +++ b/include/Mw/Widget/Window.h @@ -19,6 +19,13 @@ extern "C" { */ MWDECL MwClass MwWindowClass; +/*! + * %brief Makes window borderless + * %param handle Widget + * %param toggle Toggle + */ +MWDECL void MwWindowMakeBorderless(MwWidget handle, int toggle); + #ifdef __cplusplus } #endif diff --git a/include/MwOO/Base.h b/include/MwOO/Base.h index f929729..f5302d6 100644 --- a/include/MwOO/Base.h +++ b/include/MwOO/Base.h @@ -36,6 +36,7 @@ class Base { virtual void OnMenu(void*) {}; virtual void OnMouseDownHandler(void*) {}; virtual void OnMouseUpHandler(void*) {}; + virtual void OnMouseMoveHandler(void*) {}; virtual void OnChangedHandler(void*) {}; virtual void OnKeyHandler(void*) {}; virtual void OnKeyReleaseHandler(void*) {}; diff --git a/include/MwOO/Widget/Window.h b/include/MwOO/Widget/Window.h index 1f17f34..a248028 100644 --- a/include/MwOO/Widget/Window.h +++ b/include/MwOO/Widget/Window.h @@ -8,6 +8,7 @@ namespace MwOO { class Window : public MwOO::Base { public: Window(const char* widget_name, MwOO::Base* parent, int x, int y, int w, int h); + void MakeBorderless(int toggle); void SetTitle(const char* value); const char* GetTitle(void); void SetBackground(const char* value); diff --git a/oosrc/base.cc b/oosrc/base.cc index 0684bdc..d213613 100644 --- a/oosrc/base.cc +++ b/oosrc/base.cc @@ -92,6 +92,10 @@ static void __OnMouseUpHandler(MwWidget widget, void* user, void* call){ MwOO::Base* c = (MwOO::Base*)user; (void)widget; c->OnMouseUpHandler(call); } +static void __OnMouseMoveHandler(MwWidget widget, void* user, void* call){ + MwOO::Base* c = (MwOO::Base*)user; + (void)widget; c->OnMouseMoveHandler(call); +} static void __OnChangedHandler(MwWidget widget, void* user, void* call){ MwOO::Base* c = (MwOO::Base*)user; (void)widget; c->OnChangedHandler(call); @@ -116,6 +120,7 @@ void MwOO::Base::SetHandler(void){ MwAddUserHandler(this->widget, MwNmenuHandler, __OnMenu, this); MwAddUserHandler(this->widget, MwNmouseDownHandler, __OnMouseDownHandler, this); MwAddUserHandler(this->widget, MwNmouseUpHandler, __OnMouseUpHandler, this); + MwAddUserHandler(this->widget, MwNmouseMoveHandler, __OnMouseMoveHandler, this); MwAddUserHandler(this->widget, MwNchangedHandler, __OnChangedHandler, this); MwAddUserHandler(this->widget, MwNkeyHandler, __OnKeyHandler, this); MwAddUserHandler(this->widget, MwNkeyReleaseHandler, __OnKeyReleaseHandler, this); diff --git a/oosrc/widget/window.cc b/oosrc/widget/window.cc index 2ae9a26..3d215f1 100644 --- a/oosrc/widget/window.cc +++ b/oosrc/widget/window.cc @@ -5,6 +5,9 @@ MwOO::Window::Window(const char* widget_name, MwOO::Base* parent, int x, int y, int w, int h) : MwOO::Base(MwWindowClass, widget_name, parent, x, y, w, h){ } +void MwOO::Window::MakeBorderless(int toggle){ + MwWindowMakeBorderless(this->widget, toggle); +} void MwOO::Window::SetTitle(const char* value){ MwSetText(this->widget, MwNtitle, value); } diff --git a/resource/icon/error.png b/resource/icon/error.png index f1712c4997cedcdb9c8adf4cb82539a90b9af684..7ef3ff2cd8c12bdba4e3ae2689b137380c357130 100644 GIT binary patch delta 52 zcmbQvI-PaGG!9-iIhILJmOt7!?q4bo*UW-mdKI;Vst E0G%NZ5dZ)H delta 51 zcmdnQyoq^27YC0JxB8N$F}@2YF)A2^7+P2v8d@1!Y8x0>85n%amVCqj1fH&bF6*2U FngE1<4#xlh diff --git a/resource/icon/news.png b/resource/icon/news.png index 9157f9d23d31df73f6541b63045ba84a4718b94e..8d5eb4abf1fd0924e90572b17132636dbbedbbac 100644 GIT binary patch delta 52 zcmbQoGLL1#1P)#{IhILJmOt7!BaKnPIK;rr%Gkilz(m^sNE)QeT+Czu0#8>zmvv4F FO#rU74{ZPd delta 52 zcmbQoGLL1#1P&e{ZuKQgV|+KxNMlqm3Nf^>GBmU@w$wH-ure_CmM!^+0SG)@{an^L HB{Ts5l_3u! diff --git a/resource/icon/note.png b/resource/icon/note.png index 76cd0805d718780c4b29008ebe859f204b06933f..f63620122c7ca67bdb3b9b823f36aaf506f857a6 100644 GIT binary patch delta 52 zcmcb_a*1WaG!9-iIhILJmOt7!ZwjM=afpGLm9c@9fr+*OkTgh_xtPfS1fH&bF6*2U FngGkG5Dx$V delta 52 zcmcb_a*1WaG!7miZuKQgV|+Kxo5HAI6k=#$WoT$+Y^iNvU}a$NEnD&t0}yz+`njxg HN@xNAvK0@- diff --git a/resource/icon/question.png b/resource/icon/question.png index ccd9ac97e774e02b55217305216e28ff4e51a377..2599ac2682f18bf50c3e541cd1681054c1b4777e 100644 GIT binary patch delta 52 zcmbQpGLdD%1P)#{IhILJmOt7!Ba%_UIK;rr%Gkilz(m^sNE)QeT+Czu0#8>zmvv4F FO#r9B4@Lk0 delta 52 zcmbQpGLdD%1P&e{ZuKQgV|+Kxh-6eS3Nf^>GBmU@w$wH-ure_CmM!^+0SG)@{an^L HB{Ts5jw}xR diff --git a/resource/icon/warning.png b/resource/icon/warning.png index d74b0115daf45b2bf915ee9dc161951d9fe1fe88..d1ebad9484e535dbb7782f069691995a6781d2e3 100644 GIT binary patch delta 52 zcmeyw{E2zO1P)#{IhILJmOt7!!-`SCIK;rr%Gkilz(m^sNE)QeT+Czu0#8>zmvv4F FO#sQo59a^? delta 52 zcmeyw{E2zO1P&e{ZuKQgV|+Kxuwqm&3Nf^>GBmU@w$wH-ure_CmM!^+0SG)@{an^L HB{Ts5urUvv diff --git a/src/backend/gdi.c b/src/backend/gdi.c index d24373e..ebaaed7 100644 --- a/src/backend/gdi.c +++ b/src/backend/gdi.c @@ -488,3 +488,17 @@ void MwLLSetSizeHints(MwLL handle, int minx, int miny, int maxx, int maxy) { u->max.x = maxx; u->max.y = maxy; } + +void MwLLMakeBorderless(MwLL handle, int toggle) { + LPARAM lp = GetWindowLongPtr(handle->hWnd, GWL_STYLE); + + if(toggle) { + lp &= ~WS_CAPTION; + } else { + lp |= WS_CAPTION; + } + + SetWindowLongPtr(handle->hWnd, GWL_STYLE, lp); + + SetWindowPos(handle->hWnd, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); +} diff --git a/src/backend/x11.c b/src/backend/x11.c index 65a9857..adcf28c 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -1,6 +1,25 @@ /* $Id$ */ #include +typedef struct mwm_hints { + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long input_mode; + unsigned long status; +} mwm_hints_t; +enum mwm_hints_enum { + MWM_HINTS_FUNCTIONS = (1L << 0), + MWM_HINTS_DECORATIONS = (1L << 1), + + MWM_FUNC_ALL = (1L << 0), + MWM_FUNC_RESIZE = (1L << 1), + MWM_FUNC_MOVE = (1L << 2), + MWM_FUNC_MINIMIZE = (1L << 3), + MWM_FUNC_MAXIMIZE = (1L << 4), + MWM_FUNC_CLOSE = (1L << 5) +}; + static unsigned long mask = ExposureMask | StructureNotifyMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | KeymapNotify; static void create_pixmap(MwLL handle) { @@ -180,9 +199,9 @@ void MwLLNextEvent(MwLL handle) { p.button = MwLLMouseWheelDown; } - MwLLDispatch(handle, down, &p); - XSetInputFocus(handle->display, handle->window, RevertToNone, CurrentTime); + + MwLLDispatch(handle, down, &p); } else if(ev.type == ButtonRelease) { MwLLMouse p; p.point.x = ev.xbutton.x; @@ -562,3 +581,25 @@ void MwLLSetSizeHints(MwLL handle, int minx, int miny, int maxx, int maxy) { XSetWMSizeHints(handle->display, handle->window, hints, XA_WM_NORMAL_HINTS); XFree(hints); } + +void MwLLMakeBorderless(MwLL handle, int toggle) { + Atom atom = XInternAtom(handle->display, "_MOTIF_WM_HINTS", 0); + mwm_hints_t hints; + int x = 0, y = 0; + Window child, root, parent; + Window* children; + unsigned int nchild; + + XQueryTree(handle->display, handle->window, &root, &parent, &children, &nchild); + if(children != NULL) XFree(children); + + XTranslateCoordinates(handle->display, parent, RootWindow(handle->display, DefaultScreen(handle->display)), 0, 0, &x, &y, &child); + + hints.flags = MWM_HINTS_DECORATIONS; + hints.decorations = toggle ? 0 : 1; + XChangeProperty(handle->display, handle->window, atom, atom, 32, PropModeReplace, (unsigned char*)&hints, 5); + + XUnmapWindow(handle->display, handle->window); + XMapWindow(handle->display, handle->window); + XMoveWindow(handle->display, handle->window, x, y); +} diff --git a/src/widget/window.c b/src/widget/window.c index 462f856..53b046b 100644 --- a/src/widget/window.c +++ b/src/widget/window.c @@ -42,3 +42,7 @@ MwClass MwWindowClass = &MwWindowClassRec; void MwWindowSetIcon(MwWidget handle, MwLLPixmap pixmap) { MwLLSetIcon(handle->lowlevel, pixmap); } + +void MwWindowMakeBorderless(MwWidget handle, int toggle) { + MwLLMakeBorderless(handle->lowlevel, toggle); +}