Less flickering when switching virt. desktops.
svn path=/trunk/kdebase/kwin/; revision=89410
This commit is contained in:
parent
19b9d1fc57
commit
4c03fa5c6f
1 changed files with 21 additions and 6 deletions
|
@ -105,6 +105,7 @@ extern void kwin_updateTime();
|
||||||
static int kwin_has_shape = 0;
|
static int kwin_has_shape = 0;
|
||||||
static int kwin_shape_event = 0;
|
static int kwin_shape_event = 0;
|
||||||
static bool block_focus = FALSE;
|
static bool block_focus = FALSE;
|
||||||
|
static Window null_focus_window = 0;
|
||||||
// does the window w need a shape combine mask around it?
|
// does the window w need a shape combine mask around it?
|
||||||
bool Shape::hasShape( WId w){
|
bool Shape::hasShape( WId w){
|
||||||
int xws, yws, xbs, ybs;
|
int xws, yws, xbs, ybs;
|
||||||
|
@ -1282,11 +1283,14 @@ void Workspace::clientHidden( Client* c )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if ( desktop_client )
|
if ( desktop_client )
|
||||||
requestFocus( desktop_client );
|
requestFocus( desktop_client );
|
||||||
else
|
else
|
||||||
focusToNull();
|
focusToNull();
|
||||||
|
} // if blocking focus, move focus to desktop_client later if needed
|
||||||
|
// in order to avoid flickering
|
||||||
|
else
|
||||||
|
focusToNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1959,19 +1963,19 @@ ClientList Workspace::constrainedStackingOrder( const ClientList& list )
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Puts the focus on a dummy window
|
Puts the focus on a dummy window
|
||||||
|
Just using XSetInputFocus() with None would block keyboard input
|
||||||
*/
|
*/
|
||||||
void Workspace::focusToNull(){
|
void Workspace::focusToNull(){
|
||||||
static Window w = 0;
|
|
||||||
int mask;
|
int mask;
|
||||||
XSetWindowAttributes attr;
|
XSetWindowAttributes attr;
|
||||||
if (w == 0) {
|
if (null_focus_window == 0) {
|
||||||
mask = CWOverrideRedirect;
|
mask = CWOverrideRedirect;
|
||||||
attr.override_redirect = 1;
|
attr.override_redirect = 1;
|
||||||
w = XCreateWindow(qt_xdisplay(), qt_xrootwin(), -1,-1, 1, 1, 0, CopyFromParent,
|
null_focus_window = XCreateWindow(qt_xdisplay(), qt_xrootwin(), -1,-1, 1, 1, 0, CopyFromParent,
|
||||||
InputOnly, CopyFromParent, mask, &attr);
|
InputOnly, CopyFromParent, mask, &attr);
|
||||||
XMapWindow(qt_xdisplay(), w);
|
XMapWindow(qt_xdisplay(), null_focus_window);
|
||||||
}
|
}
|
||||||
XSetInputFocus(qt_xdisplay(), w, RevertToPointerRoot, kwin_time );
|
XSetInputFocus(qt_xdisplay(), null_focus_window, RevertToPointerRoot, kwin_time );
|
||||||
updateColormap();
|
updateColormap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2109,6 +2113,13 @@ void Workspace::setCurrentDesktop( int new_desktop ){
|
||||||
} else {
|
} else {
|
||||||
focusToNull();
|
focusToNull();
|
||||||
}
|
}
|
||||||
|
if( desktop_client ) {
|
||||||
|
Window w_tmp;
|
||||||
|
int i_tmp;
|
||||||
|
XGetInputFocus( qt_xdisplay(), &w_tmp, &i_tmp );
|
||||||
|
if( w_tmp == null_focus_window )
|
||||||
|
requestFocus( desktop_client );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2993,6 +3004,10 @@ void Workspace::slotResetAllClients()
|
||||||
block_focus = FALSE;
|
block_focus = FALSE;
|
||||||
if ( active )
|
if ( active )
|
||||||
requestFocus( active );
|
requestFocus( active );
|
||||||
|
else if( desktop_client )
|
||||||
|
requestFocus( desktop_client );
|
||||||
|
else
|
||||||
|
focusToNull();
|
||||||
|
|
||||||
// Add a dcop signal to allow other apps to know when the kwin client
|
// Add a dcop signal to allow other apps to know when the kwin client
|
||||||
// has been changed by via the titlebar decoration selection.
|
// has been changed by via the titlebar decoration selection.
|
||||||
|
|
Loading…
Reference in a new issue