From 73aebf23f3a8f569a708d1b8266ede5ea49e8395 Mon Sep 17 00:00:00 2001 From: Arnout Engelen Date: Tue, 29 Apr 2014 22:24:07 +0200 Subject: [PATCH] Reset sizehints when notified they're deleted --- ioncore/clientwin.c | 22 +++++++++++++++------- ioncore/clientwin.h | 2 ++ ioncore/eventh.c | 8 +++++--- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/ioncore/clientwin.c b/ioncore/clientwin.c index eef10629..17bbebfc 100644 --- a/ioncore/clientwin.c +++ b/ioncore/clientwin.c @@ -153,15 +153,10 @@ static void clientwin_get_winprops(WClientWin *cwin) } } - -int clientwin_get_size_hints(WClientWin *cwin) +void clientwin_apply_size_hint_winprops(WClientWin *cwin) { XSizeHints tmp=cwin->size_hints; - int ret; - - ret=xwindow_get_sizehints(cwin->win, &(cwin->size_hints)); - - /** Apply winprop settings (even when xwindow_get_sizehints failed) */ + if(cwin->flags&CLIENTWIN_PROP_I_MAXSIZE){ cwin->size_hints.flags&=~PMaxSize; }else if(cwin->flags&CLIENTWIN_PROP_MAXSIZE){ @@ -193,10 +188,23 @@ int clientwin_get_size_hints(WClientWin *cwin) cwin->size_hints.height_inc=tmp.height_inc; cwin->size_hints.flags|=PResizeInc; } +} +int clientwin_get_size_hints(WClientWin *cwin) +{ + int ret=xwindow_get_sizehints(cwin->win, &(cwin->size_hints)); + + clientwin_apply_size_hint_winprops(cwin); + return ret; } +void clientwin_reset_size_hints(WClientWin *cwin) +{ + memset(&(cwin->size_hints), 0, sizeof(cwin->size_hints)); + clientwin_apply_size_hint_winprops(cwin); +} + void clientwin_get_input_wm_hint(WClientWin *cwin) { XWMHints *hints; diff --git a/ioncore/clientwin.h b/ioncore/clientwin.h index 09c38f43..40b5d7b6 100644 --- a/ioncore/clientwin.h +++ b/ioncore/clientwin.h @@ -73,6 +73,8 @@ extern void clientwin_get_protocols(WClientWin *cwin); * and returns a nonnegative value. */ extern int clientwin_get_size_hints(WClientWin *cwin); +/** Resets cwin->sizehints based on winprops. */ +extern void clientwin_reset_size_hints(WClientWin *cwin); extern void clientwin_unmapped(WClientWin *cwin); extern void clientwin_destroyed(WClientWin *cwin); extern void clientwin_kill(WClientWin *cwin); diff --git a/ioncore/eventh.c b/ioncore/eventh.c index 7f58c4bf..bcc6f4c0 100644 --- a/ioncore/eventh.c +++ b/ioncore/eventh.c @@ -236,9 +236,11 @@ void ioncore_handle_property(const XPropertyEvent *ev) } XFree(hints); }else if(ev->atom==XA_WM_NORMAL_HINTS){ - int ret=clientwin_get_size_hints(cwin); - if(ret<0&&ev->state==PropertyNewValue) - LOG(WARN, GENERAL, "Retrieving sizehints failed for cwin '%s'", cwin->region.ni.name); + if(ev->state==PropertyNewValue){ + if(clientwin_get_size_hints(cwin)<0) + LOG(WARN, GENERAL, "Retrieving sizehints failed for cwin '%s'", cwin->region.ni.name); + }else if(ev->state==PropertyDelete) + clientwin_reset_size_hints(cwin); }else if(ev->atom==XA_WM_NAME){ if(!(cwin->flags&CLIENTWIN_USE_NET_WM_NAME)) clientwin_get_set_name(cwin); -- 2.11.4.GIT