remove unmapped attribute
this fix a bug when fast-switching between tags and dropping some windows management as we should not. Use window_getstate() (moved from awesome.c's getstate()) instead.
This commit is contained in:
parent
9b60eb3d06
commit
e47e1a4a23
28
awesome.c
28
awesome.c
|
@ -101,30 +101,6 @@ cleanup(awesome_config *awesomeconf)
|
||||||
p_delete(&awesomeconf);
|
p_delete(&awesomeconf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get a window state (WM_STATE)
|
|
||||||
* \param disp Display ref
|
|
||||||
* \param w Client window
|
|
||||||
* \return state
|
|
||||||
*/
|
|
||||||
static long
|
|
||||||
getstate(Display *disp, Window w)
|
|
||||||
{
|
|
||||||
int format, status;
|
|
||||||
long result = -1;
|
|
||||||
unsigned char *p = NULL;
|
|
||||||
unsigned long n, extra;
|
|
||||||
Atom real;
|
|
||||||
status = XGetWindowProperty(disp, w, XInternAtom(disp, "WM_STATE", False),
|
|
||||||
0L, 2L, False, XInternAtom(disp, "WM_STATE", False),
|
|
||||||
&real, &format, &n, &extra, (unsigned char **) &p);
|
|
||||||
if(status != Success)
|
|
||||||
return -1;
|
|
||||||
if(n != 0)
|
|
||||||
result = *p;
|
|
||||||
p_delete(&p);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Scan X to find windows to manage
|
/** Scan X to find windows to manage
|
||||||
* \param screen Screen number
|
* \param screen Screen number
|
||||||
* \param awesomeconf awesome config
|
* \param awesomeconf awesome config
|
||||||
|
@ -148,7 +124,7 @@ scan(awesome_config *awesomeconf)
|
||||||
|| wa.override_redirect
|
|| wa.override_redirect
|
||||||
|| XGetTransientForHint(awesomeconf->display, wins[i], &d1))
|
|| XGetTransientForHint(awesomeconf->display, wins[i], &d1))
|
||||||
continue;
|
continue;
|
||||||
if(wa.map_state == IsViewable || getstate(awesomeconf->display, wins[i]) == IconicState)
|
if(wa.map_state == IsViewable || window_getstate(awesomeconf->display, wins[i]) == IconicState)
|
||||||
{
|
{
|
||||||
if(screen == 0)
|
if(screen == 0)
|
||||||
real_screen = get_screen_bycoord(awesomeconf->display, wa.x, wa.y);
|
real_screen = get_screen_bycoord(awesomeconf->display, wa.x, wa.y);
|
||||||
|
@ -161,7 +137,7 @@ scan(awesome_config *awesomeconf)
|
||||||
if(!XGetWindowAttributes(awesomeconf->display, wins[i], &wa))
|
if(!XGetWindowAttributes(awesomeconf->display, wins[i], &wa))
|
||||||
continue;
|
continue;
|
||||||
if(XGetTransientForHint(awesomeconf->display, wins[i], &d1)
|
if(XGetTransientForHint(awesomeconf->display, wins[i], &d1)
|
||||||
&& (wa.map_state == IsViewable || getstate(awesomeconf->display, wins[i]) == IconicState))
|
&& (wa.map_state == IsViewable || window_getstate(awesomeconf->display, wins[i]) == IconicState))
|
||||||
{
|
{
|
||||||
if(screen == 0)
|
if(screen == 0)
|
||||||
real_screen = get_screen_bycoord(awesomeconf->display, wa.x, wa.y);
|
real_screen = get_screen_bycoord(awesomeconf->display, wa.x, wa.y);
|
||||||
|
|
27
client.c
27
client.c
|
@ -243,7 +243,6 @@ ban(Client * c)
|
||||||
{
|
{
|
||||||
XUnmapWindow(c->display, c->win);
|
XUnmapWindow(c->display, c->win);
|
||||||
window_setstate(c->display, c->win, IconicState);
|
window_setstate(c->display, c->win, IconicState);
|
||||||
c->unmapped = True;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configure client
|
/** Configure client
|
||||||
|
@ -268,6 +267,30 @@ window_configure(Display *disp, Window win, int x, int y, int w, int h, int bord
|
||||||
XSendEvent(disp, win, False, StructureNotifyMask, (XEvent *) & ce);
|
XSendEvent(disp, win, False, StructureNotifyMask, (XEvent *) & ce);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get a window state (WM_STATE)
|
||||||
|
* \param disp Display ref
|
||||||
|
* \param w Client window
|
||||||
|
* \return state
|
||||||
|
*/
|
||||||
|
long
|
||||||
|
window_getstate(Display *disp, Window w)
|
||||||
|
{
|
||||||
|
int format, status;
|
||||||
|
long result = -1;
|
||||||
|
unsigned char *p = NULL;
|
||||||
|
unsigned long n, extra;
|
||||||
|
Atom real;
|
||||||
|
status = XGetWindowProperty(disp, w, XInternAtom(disp, "WM_STATE", False),
|
||||||
|
0L, 2L, False, XInternAtom(disp, "WM_STATE", False),
|
||||||
|
&real, &format, &n, &extra, (unsigned char **) &p);
|
||||||
|
if(status != Success)
|
||||||
|
return -1;
|
||||||
|
if(n != 0)
|
||||||
|
result = *p;
|
||||||
|
p_delete(&p);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/** Attach client after another one
|
/** Attach client after another one
|
||||||
* \param client to attach to
|
* \param client to attach to
|
||||||
* \param c the client
|
* \param c the client
|
||||||
|
@ -613,7 +636,6 @@ unban(Client *c)
|
||||||
{
|
{
|
||||||
XMapWindow(c->display, c->win);
|
XMapWindow(c->display, c->win);
|
||||||
window_setstate(c->display, c->win, NormalState);
|
window_setstate(c->display, c->win, NormalState);
|
||||||
c->unmapped = False;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -622,7 +644,6 @@ unmanage(Client *c, long state, awesome_config *awesomeconf)
|
||||||
XWindowChanges wc;
|
XWindowChanges wc;
|
||||||
|
|
||||||
client_untab(c);
|
client_untab(c);
|
||||||
c->unmapped = True;
|
|
||||||
wc.border_width = c->oldborder;
|
wc.border_width = c->oldborder;
|
||||||
/* The server grab construct avoids race conditions. */
|
/* The server grab construct avoids race conditions. */
|
||||||
XGrabServer(c->display);
|
XGrabServer(c->display);
|
||||||
|
|
1
client.h
1
client.h
|
@ -34,6 +34,7 @@ inline void client_detach(Client **, Client *);
|
||||||
void client_reattach_after(Client *, Client *);
|
void client_reattach_after(Client *, Client *);
|
||||||
void ban(Client *); /* bans c */
|
void ban(Client *); /* bans c */
|
||||||
void window_configure(Display *, Window, int, int, int, int, int);
|
void window_configure(Display *, Window, int, int, int, int, int);
|
||||||
|
long window_getstate(Display *, Window);
|
||||||
void focus(Client *, Bool, awesome_config *);
|
void focus(Client *, Bool, awesome_config *);
|
||||||
void manage(Window, XWindowAttributes *, awesome_config *);
|
void manage(Window, XWindowAttributes *, awesome_config *);
|
||||||
void resize(Client *, int, int, int, int, awesome_config *, Bool); /* resize with given coordinates c */
|
void resize(Client *, int, int, int, int, awesome_config *, Bool); /* resize with given coordinates c */
|
||||||
|
|
2
config.h
2
config.h
|
@ -104,8 +104,6 @@ struct Client
|
||||||
int rx, ry, rw, rh;
|
int rx, ry, rw, rh;
|
||||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
||||||
int minax, maxax, minay, maxay;
|
int minax, maxax, minay, maxay;
|
||||||
/** True if client is unmapped */
|
|
||||||
Bool unmapped;
|
|
||||||
long flags;
|
long flags;
|
||||||
int border, oldborder;
|
int border, oldborder;
|
||||||
/** Store previous floating state before maximizing */
|
/** Store previous floating state before maximizing */
|
||||||
|
|
3
event.c
3
event.c
|
@ -501,7 +501,8 @@ handle_event_unmapnotify(XEvent * e, awesome_config *awesomeconf)
|
||||||
XUnmapEvent *ev = &e->xunmap;
|
XUnmapEvent *ev = &e->xunmap;
|
||||||
|
|
||||||
if((c = get_client_bywin(*awesomeconf->clients, ev->window))
|
if((c = get_client_bywin(*awesomeconf->clients, ev->window))
|
||||||
&& ev->event == RootWindow(e->xany.display, c->phys_screen) && (ev->send_event || !c->unmapped))
|
&& ev->event == RootWindow(e->xany.display, c->phys_screen)
|
||||||
|
&& ev->send_event && window_getstate(c->display, c->win) == NormalState)
|
||||||
unmanage(c, WithdrawnState, &awesomeconf[c->screen]);
|
unmanage(c, WithdrawnState, &awesomeconf[c->screen]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue