It wasn't a very good idea to do even compositing-unrelated

work in the work/kwin_composite branch.
svn merge revs 558154,558180,558236,558243,558258,562201


svn path=/trunk/KDE/kdebase/workspace/; revision=571776
This commit is contained in:
Luboš Luňák 2006-08-10 17:00:14 +00:00
parent 293f093ea1
commit fa8cd7541f
16 changed files with 342 additions and 740 deletions

View file

@ -8,10 +8,6 @@ add_subdirectory( pics )
add_subdirectory( clients ) add_subdirectory( clients )
add_subdirectory( data ) add_subdirectory( data )
if(X11_kompmgr_FOUND)
add_subdirectory(kompmgr)
endif(X11_kompmgr_FOUND)
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/lib ${CMAKE_CURRENT_SOURCE_DIR}/lib ) include_directories( ${CMAKE_CURRENT_BINARY_DIR}/lib ${CMAKE_CURRENT_SOURCE_DIR}/lib )
@ -70,11 +66,7 @@ kde4_install_icons( ${ICON_INSTALL_DIR} crystalsvg )
#INCLUDES = -I$(srcdir)/lib $(all_includes) #INCLUDES = -I$(srcdir)/lib $(all_includes)
# #
#if include_kompmgr #SUBDIRS = lib . killer kcmkwin pics clients oldheaders data
#KOMPMGR=kompmgr
#endif
#
#SUBDIRS = lib . killer kcmkwin pics clients oldheaders data $(KOMPMGR)
# #
#bin_PROGRAMS = #bin_PROGRAMS =
#lib_LTLIBRARIES = #lib_LTLIBRARIES =

View file

@ -697,7 +697,7 @@ void Client::demandAttentionKNotify()
} }
// TODO I probably shouldn't be lazy here and do it without the macro, so that people can read it // TODO I probably shouldn't be lazy here and do it without the macro, so that people can read it
KWIN_COMPARE_PREDICATE( SameApplicationActiveHackPredicate, Client, const Client*, KWIN_COMPARE_PREDICATE( SameApplicationActiveHackPredicate, const Client*,
// ignore already existing splashes, toolbars, utilities, menus and topmenus, // ignore already existing splashes, toolbars, utilities, menus and topmenus,
// as the app may show those before the main window // as the app may show those before the main window
!cl->isSplash() && !cl->isToolbar() && !cl->isTopMenu() && !cl->isUtility() && !cl->isMenu() !cl->isSplash() && !cl->isToolbar() && !cl->isTopMenu() && !cl->isUtility() && !cl->isMenu()

View file

@ -145,9 +145,6 @@ Client::Client( Workspace *ws )
frame_geometry = QRect( 0, 0, 100, 100 ); // so that decorations don't start with size being (0,0) frame_geometry = QRect( 0, 0, 100, 100 ); // so that decorations don't start with size being (0,0)
client_size = QSize( 100, 100 ); client_size = QSize( 100, 100 );
custom_opacity = false;
rule_opacity_active = 0;; //translucency rules
rule_opacity_inactive = 0; //dito.
// SELI initialize xsizehints?? // SELI initialize xsizehints??
} }
@ -182,7 +179,6 @@ void Client::releaseWindow( bool on_shutdown )
deleting = true; deleting = true;
workspace()->discardUsedWindowRules( this, true ); // remove ForceTemporarily rules workspace()->discardUsedWindowRules( this, true ); // remove ForceTemporarily rules
StackingUpdatesBlocker blocker( workspace()); StackingUpdatesBlocker blocker( workspace());
if (!custom_opacity) setOpacity(false);
if (moveResizeMode) if (moveResizeMode)
leaveMoveResize(); leaveMoveResize();
finishWindowRules(); finishWindowRules();
@ -192,7 +188,7 @@ void Client::releaseWindow( bool on_shutdown )
hidden = true; // so that it's not considered visible anymore (can't use hideClient(), it would set flags) hidden = true; // so that it's not considered visible anymore (can't use hideClient(), it would set flags)
if( !on_shutdown ) if( !on_shutdown )
workspace()->clientHidden( this ); workspace()->clientHidden( this );
XUnmapWindow( QX11Info::display(), frameId()); // destroying decoration would cause ugly visual effect XUnmapWindow( display(), frameId()); // destroying decoration would cause ugly visual effect
destroyDecoration(); destroyDecoration();
cleanGrouping(); cleanGrouping();
if( !on_shutdown ) if( !on_shutdown )
@ -204,27 +200,27 @@ void Client::releaseWindow( bool on_shutdown )
desk = 0; desk = 0;
info->setState( 0, info->state()); // reset all state flags info->setState( 0, info->state()); // reset all state flags
} }
XDeleteProperty( QX11Info::display(), client, atoms->kde_net_wm_user_creation_time); XDeleteProperty( display(), client, atoms->kde_net_wm_user_creation_time);
XDeleteProperty( QX11Info::display(), client, atoms->net_frame_extents ); XDeleteProperty( display(), client, atoms->net_frame_extents );
XDeleteProperty( QX11Info::display(), client, atoms->kde_net_wm_frame_strut ); XDeleteProperty( display(), client, atoms->kde_net_wm_frame_strut );
XReparentWindow( QX11Info::display(), client, workspace()->rootWin(), x(), y()); XReparentWindow( display(), client, workspace()->rootWin(), x(), y());
XRemoveFromSaveSet( QX11Info::display(), client ); XRemoveFromSaveSet( display(), client );
XSelectInput( QX11Info::display(), client, NoEventMask ); XSelectInput( display(), client, NoEventMask );
if( on_shutdown ) if( on_shutdown )
{ // map the window, so it can be found after another WM is started { // map the window, so it can be found after another WM is started
XMapWindow( QX11Info::display(), client ); XMapWindow( display(), client );
// TODO preserve minimized, shaded etc. state? // TODO preserve minimized, shaded etc. state?
} }
else else
{ {
// Make sure it's not mapped if the app unmapped it (#65279). The app // Make sure it's not mapped if the app unmapped it (#65279). The app
// may do map+unmap before we initially map the window by calling rawShow() from manage(). // may do map+unmap before we initially map the window by calling rawShow() from manage().
XUnmapWindow( QX11Info::display(), client ); XUnmapWindow( display(), client );
} }
client = None; client = None;
XDestroyWindow( QX11Info::display(), wrapper ); XDestroyWindow( display(), wrapper );
wrapper = None; wrapper = None;
XDestroyWindow( QX11Info::display(), frame ); XDestroyWindow( display(), frame );
frame = None; frame = None;
--postpone_geometry_updates; // don't use GeometryUpdatesBlocker, it would now set the geometry --postpone_geometry_updates; // don't use GeometryUpdatesBlocker, it would now set the geometry
deleteClient( this, Allowed ); deleteClient( this, Allowed );
@ -249,9 +245,9 @@ void Client::destroyClient()
cleanGrouping(); cleanGrouping();
workspace()->removeClient( this, Allowed ); workspace()->removeClient( this, Allowed );
client = None; // invalidate client = None; // invalidate
XDestroyWindow( QX11Info::display(), wrapper ); XDestroyWindow( display(), wrapper );
wrapper = None; wrapper = None;
XDestroyWindow( QX11Info::display(), frame ); XDestroyWindow( display(), frame );
frame = None; frame = None;
--postpone_geometry_updates; // don't use GeometryUpdatesBlocker, it would now set the geometry --postpone_geometry_updates; // don't use GeometryUpdatesBlocker, it would now set the geometry
deleteClient( this, Allowed ); deleteClient( this, Allowed );
@ -272,12 +268,9 @@ void Client::updateDecoration( bool check_workspace_pos, bool force )
// TODO check decoration's minimum size? // TODO check decoration's minimum size?
decoration->init(); decoration->init();
decoration->widget()->installEventFilter( this ); decoration->widget()->installEventFilter( this );
XReparentWindow( QX11Info::display(), decoration->widget()->winId(), frameId(), 0, 0 ); XReparentWindow( display(), decoration->widget()->winId(), frameId(), 0, 0 );
decoration->widget()->lower(); decoration->widget()->lower();
decoration->borders( border_left, border_right, border_top, border_bottom ); decoration->borders( border_left, border_right, border_top, border_bottom );
options->onlyDecoTranslucent ?
setDecoHashProperty(border_top, border_right, border_bottom, border_left):
unsetDecoHashProperty();
int save_workarea_diff_x = workarea_diff_x; int save_workarea_diff_x = workarea_diff_x;
int save_workarea_diff_y = workarea_diff_y; int save_workarea_diff_y = workarea_diff_y;
move( calculateGravitation( false )); move( calculateGravitation( false ));
@ -333,9 +326,6 @@ void Client::checkBorderSizes()
border_right != new_right || border_right != new_right ||
border_top != new_top || border_top != new_top ||
border_bottom != new_bottom) border_bottom != new_bottom)
options->onlyDecoTranslucent ?
setDecoHashProperty(new_top, new_right, new_bottom, new_left):
unsetDecoHashProperty();
move( calculateGravitation( false )); move( calculateGravitation( false ));
plainResize( sizeForClientSize( clientSize()), ForceGeometrySet ); plainResize( sizeForClientSize( clientSize()), ForceGeometrySet );
checkWorkspacePosition(); checkWorkspacePosition();
@ -374,30 +364,6 @@ void Client::detectNoBorder()
noborder = true; noborder = true;
} }
void Client::detectShapable()
{
if( Shape::hasShape( window()))
return;
switch( windowType())
{
case NET::Desktop :
case NET::Dock :
case NET::TopMenu :
case NET::Splash :
break;
case NET::Unknown :
case NET::Normal :
case NET::Toolbar :
case NET::Menu :
case NET::Dialog :
case NET::Utility :
setShapable(false);
break;
default:
assert( false );
}
}
void Client::updateFrameExtents() void Client::updateFrameExtents()
{ {
NETStrut strut; NETStrut strut;
@ -463,25 +429,25 @@ void Client::updateShape()
} }
if( shape()) if( shape())
{ {
XShapeCombineShape(QX11Info::display(), frameId(), ShapeBounding, XShapeCombineShape(display(), frameId(), ShapeBounding,
clientPos().x(), clientPos().y(), clientPos().x(), clientPos().y(),
window(), ShapeBounding, ShapeSet); window(), ShapeBounding, ShapeSet);
} }
else else
{ {
XShapeCombineMask( QX11Info::display(), frameId(), ShapeBounding, 0, 0, XShapeCombineMask( display(), frameId(), ShapeBounding, 0, 0,
None, ShapeSet); None, ShapeSet);
} }
if( Shape::major() > 1 || Shape::minor() >= 1 ) // has input shape support if( Shape::major() > 1 || Shape::minor() >= 1 ) // has input shape support
{ // there appears to be no way to find out if a window has input { // there appears to be no way to find out if a window has input
// shape set or not, so always set propagate the input shape // shape set or not, so always set propagate the input shape
// (it's the same like the bounding shape by default) // (it's the same like the bounding shape by default)
XShapeCombineMask( QX11Info::display(), frameId(), ShapeInput, 0, 0, XShapeCombineMask( display(), frameId(), ShapeInput, 0, 0,
None, ShapeSet ); None, ShapeSet );
XShapeCombineShape( QX11Info::display(), frameId(), ShapeInput, XShapeCombineShape( display(), frameId(), ShapeInput,
clientPos().x(), clientPos().y(), clientPos().x(), clientPos().y(),
window(), ShapeBounding, ShapeSubtract ); window(), ShapeBounding, ShapeSubtract );
XShapeCombineShape( QX11Info::display(), frameId(), ShapeInput, XShapeCombineShape( display(), frameId(), ShapeInput,
clientPos().x(), clientPos().y(), clientPos().x(), clientPos().y(),
window(), ShapeInput, ShapeUnion ); window(), ShapeInput, ShapeUnion );
} }
@ -491,10 +457,10 @@ void Client::setMask( const QRegion& reg, int mode )
{ {
_mask = reg; _mask = reg;
if( reg.isEmpty()) if( reg.isEmpty())
XShapeCombineMask( QX11Info::display(), frameId(), ShapeBounding, 0, 0, XShapeCombineMask( display(), frameId(), ShapeBounding, 0, 0,
None, ShapeSet ); None, ShapeSet );
else if( mode == X::Unsorted ) else if( mode == X::Unsorted )
XShapeCombineRegion( QX11Info::display(), frameId(), ShapeBounding, 0, 0, XShapeCombineRegion( display(), frameId(), ShapeBounding, 0, 0,
reg.handle(), ShapeSet ); reg.handle(), ShapeSet );
else else
{ {
@ -509,7 +475,7 @@ void Client::setMask( const QRegion& reg, int mode )
xrects[ i ].width = rects[ i ].width(); xrects[ i ].width = rects[ i ].width();
xrects[ i ].height = rects[ i ].height(); xrects[ i ].height = rects[ i ].height();
} }
XShapeCombineRectangles( QX11Info::display(), frameId(), ShapeBounding, 0, 0, XShapeCombineRectangles( display(), frameId(), ShapeBounding, 0, 0,
xrects, rects.count(), ShapeSet, mode ); xrects, rects.count(), ShapeSet, mode );
delete[] xrects; delete[] xrects;
} }
@ -522,12 +488,6 @@ QRegion Client::mask() const
return _mask; return _mask;
} }
void Client::setShapable(bool b)
{
long tmp = b?1:0;
XChangeProperty(QX11Info::display(), frameId(), atoms->net_wm_window_shapable, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &tmp, 1L);
}
void Client::hideClient( bool hide ) void Client::hideClient( bool hide )
{ {
if( hidden == hide ) if( hidden == hide )
@ -679,7 +639,7 @@ void Client::animateMinimizeOrUnminimize( bool minimize )
if (area2 != area) if (area2 != area)
{ {
pm = animationPixmap( area.width() ); pm = animationPixmap( area.width() );
pm2 = QPixmap::grabWindow( QX11Info::appRootWindow(), area.x(), area.y(), area.width(), area.height() ); pm2 = QPixmap::grabWindow( rootWindow(), area.x(), area.y(), area.width(), area.height() );
p.drawPixmap( area.x(), area.y(), pm ); p.drawPixmap( area.x(), area.y(), pm );
if ( need_to_clear ) if ( need_to_clear )
{ {
@ -688,8 +648,8 @@ void Client::animateMinimizeOrUnminimize( bool minimize )
} }
area2 = area; area2 = area;
} }
XFlush(QX11Info::display()); XFlush(display());
XSync( QX11Info::display(), false ); XSync( display(), false );
diff = t.elapsed(); diff = t.elapsed();
if (diff > step) if (diff > step)
diff = step; diff = step;
@ -777,16 +737,16 @@ void Client::setShade( ShadeMode mode )
{ // shade_mode == ShadeNormal { // shade_mode == ShadeNormal
// we're about to shade, texx xcompmgr to prepare // we're about to shade, texx xcompmgr to prepare
long _shade = 1; long _shade = 1;
XChangeProperty(QX11Info::display(), frameId(), atoms->net_wm_window_shade, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &_shade, 1L); XChangeProperty(display(), frameId(), atoms->net_wm_window_shade, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &_shade, 1L);
// shade // shade
int h = height(); int h = height();
shade_geometry_change = true; shade_geometry_change = true;
QSize s( sizeForClientSize( QSize( clientSize()))); QSize s( sizeForClientSize( QSize( clientSize())));
s.setHeight( border_top + border_bottom ); s.setHeight( border_top + border_bottom );
XSelectInput( QX11Info::display(), wrapper, ClientWinMask ); // avoid getting UnmapNotify XSelectInput( display(), wrapper, ClientWinMask ); // avoid getting UnmapNotify
XUnmapWindow( QX11Info::display(), wrapper ); XUnmapWindow( display(), wrapper );
XUnmapWindow( QX11Info::display(), client ); XUnmapWindow( display(), client );
XSelectInput( QX11Info::display(), wrapper, ClientWinMask | SubstructureNotifyMask ); XSelectInput( display(), wrapper, ClientWinMask | SubstructureNotifyMask );
//as we hid the unmap event, xcompmgr didn't recognize the client wid has vanished, so we'll extra inform it //as we hid the unmap event, xcompmgr didn't recognize the client wid has vanished, so we'll extra inform it
//done xcompmgr workaround //done xcompmgr workaround
// FRAME repaint( false ); // FRAME repaint( false );
@ -796,7 +756,7 @@ void Client::setShade( ShadeMode mode )
do do
{ {
h -= step; h -= step;
XResizeWindow( QX11Info::display(), frameId(), s.width(), h ); XResizeWindow( display(), frameId(), s.width(), h );
resizeDecoration( QSize( s.width(), h )); resizeDecoration( QSize( s.width(), h ));
QApplication::syncX(); QApplication::syncX();
} while ( h > s.height() + step ); } while ( h > s.height() + step );
@ -813,7 +773,7 @@ void Client::setShade( ShadeMode mode )
} }
// tell xcompmgr shade's done // tell xcompmgr shade's done
_shade = 2; _shade = 2;
XChangeProperty(QX11Info::display(), frameId(), atoms->net_wm_window_shade, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &_shade, 1L); XChangeProperty(display(), frameId(), atoms->net_wm_window_shade, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &_shade, 1L);
} }
else else
{ {
@ -826,7 +786,7 @@ void Client::setShade( ShadeMode mode )
do do
{ {
h += step; h += step;
XResizeWindow( QX11Info::display(), frameId(), s.width(), h ); XResizeWindow( display(), frameId(), s.width(), h );
resizeDecoration( QSize( s.width(), h )); resizeDecoration( QSize( s.width(), h ));
// assume a border // assume a border
// we do not have time to wait for X to send us paint events // we do not have time to wait for X to send us paint events
@ -839,9 +799,9 @@ void Client::setShade( ShadeMode mode )
plainResize( s ); plainResize( s );
if( shade_mode == ShadeHover || shade_mode == ShadeActivated ) if( shade_mode == ShadeHover || shade_mode == ShadeActivated )
setActive( true ); setActive( true );
XMapWindow( QX11Info::display(), wrapperId()); XMapWindow( display(), wrapperId());
XMapWindow( QX11Info::display(), window()); XMapWindow( display(), window());
XDeleteProperty (QX11Info::display(), client, atoms->net_wm_window_shade); XDeleteProperty (display(), client, atoms->net_wm_window_shade);
if ( isActive() ) if ( isActive() )
workspace()->requestFocus( this ); workspace()->requestFocus( this );
} }
@ -940,7 +900,7 @@ void Client::setMappingState(int s)
mapping_state = s; mapping_state = s;
if( mapping_state == WithdrawnState ) if( mapping_state == WithdrawnState )
{ {
XDeleteProperty( QX11Info::display(), window(), atoms->wm_state ); XDeleteProperty( display(), window(), atoms->wm_state );
return; return;
} }
assert( s == NormalState || s == IconicState ); assert( s == NormalState || s == IconicState );
@ -948,7 +908,7 @@ void Client::setMappingState(int s)
unsigned long data[2]; unsigned long data[2];
data[0] = (unsigned long) s; data[0] = (unsigned long) s;
data[1] = (unsigned long) None; data[1] = (unsigned long) None;
XChangeProperty(QX11Info::display(), window(), atoms->wm_state, atoms->wm_state, 32, XChangeProperty(display(), window(), atoms->wm_state, atoms->wm_state, 32,
PropModeReplace, (unsigned char *)data, 2); PropModeReplace, (unsigned char *)data, 2);
if( was_unmanaged ) // manage() did postpone_geometry_updates = 1, now it's ok to finally set the geometry if( was_unmanaged ) // manage() did postpone_geometry_updates = 1, now it's ok to finally set the geometry
@ -963,11 +923,11 @@ void Client::rawShow()
{ {
if( decoration != NULL ) if( decoration != NULL )
decoration->widget()->show(); // not really necessary, but let it know the state decoration->widget()->show(); // not really necessary, but let it know the state
XMapWindow( QX11Info::display(), frame ); XMapWindow( display(), frame );
if( !isShade()) if( !isShade())
{ {
XMapWindow( QX11Info::display(), wrapper ); XMapWindow( display(), wrapper );
XMapWindow( QX11Info::display(), client ); XMapWindow( display(), client );
} }
} }
@ -984,11 +944,11 @@ void Client::rawHide()
// which won't be missed, so this shouldn't be a problem. The chance the real UnmapNotify // which won't be missed, so this shouldn't be a problem. The chance the real UnmapNotify
// will be missed is also very minimal, so I don't think it's needed to grab the server // will be missed is also very minimal, so I don't think it's needed to grab the server
// here. // here.
XSelectInput( QX11Info::display(), wrapper, ClientWinMask ); // avoid getting UnmapNotify XSelectInput( display(), wrapper, ClientWinMask ); // avoid getting UnmapNotify
XUnmapWindow( QX11Info::display(), frame ); XUnmapWindow( display(), frame );
XUnmapWindow( QX11Info::display(), wrapper ); XUnmapWindow( display(), wrapper );
XUnmapWindow( QX11Info::display(), client ); XUnmapWindow( display(), client );
XSelectInput( QX11Info::display(), wrapper, ClientWinMask | SubstructureNotifyMask ); XSelectInput( display(), wrapper, ClientWinMask | SubstructureNotifyMask );
if( decoration != NULL ) if( decoration != NULL )
decoration->widget()->hide(); // not really necessary, but let it know the state decoration->widget()->hide(); // not really necessary, but let it know the state
workspace()->clientHidden( this ); workspace()->clientHidden( this );
@ -1005,14 +965,14 @@ void Client::sendClientMessage(Window w, Atom a, Atom protocol, long data1, long
ev.xclient.message_type = a; ev.xclient.message_type = a;
ev.xclient.format = 32; ev.xclient.format = 32;
ev.xclient.data.l[0] = protocol; ev.xclient.data.l[0] = protocol;
ev.xclient.data.l[1] = QX11Info::appTime(); ev.xclient.data.l[1] = xTime();
ev.xclient.data.l[2] = data1; ev.xclient.data.l[2] = data1;
ev.xclient.data.l[3] = data2; ev.xclient.data.l[3] = data2;
ev.xclient.data.l[4] = data3; ev.xclient.data.l[4] = data3;
mask = 0L; mask = 0L;
if (w == QX11Info::appRootWindow()) if (w == rootWindow())
mask = SubstructureRedirectMask; /* magic! */ mask = SubstructureRedirectMask; /* magic! */
XSendEvent(QX11Info::display(), w, False, mask, &ev); XSendEvent(display(), w, False, mask, &ev);
} }
/* /*
@ -1064,7 +1024,7 @@ void Client::killWindow()
Notify::raise( Notify::Delete ); Notify::raise( Notify::Delete );
killProcess( false ); killProcess( false );
// always kill this client at the server // always kill this client at the server
XKillClient(QX11Info::display(), window() ); XKillClient(display(), window() );
destroyClient(); destroyClient();
} }
@ -1083,7 +1043,7 @@ void Client::pingWindow()
connect( ping_timer, SIGNAL( timeout()), SLOT( pingTimeout())); connect( ping_timer, SIGNAL( timeout()), SLOT( pingTimeout()));
ping_timer->setSingleShot( true ); ping_timer->setSingleShot( true );
ping_timer->start( options->killPingTimeout ); ping_timer->start( options->killPingTimeout );
ping_timestamp = QX11Info::appTime(); ping_timestamp = xTime();
workspace()->sendPingToWindow( window(), ping_timestamp ); workspace()->sendPingToWindow( window(), ping_timestamp );
} }
@ -1250,15 +1210,15 @@ void Client::takeActivity( int flags, bool handled, allowed_t )
#ifndef NDEBUG #ifndef NDEBUG
static Time previous_activity_timestamp; static Time previous_activity_timestamp;
static Client* previous_client; static Client* previous_client;
if( previous_activity_timestamp == QX11Info::appTime() && previous_client != this ) if( previous_activity_timestamp == xTime() && previous_client != this )
{ {
kDebug( 1212 ) << "Repeated use of the same X timestamp for activity" << endl; kDebug( 1212 ) << "Repeated use of the same X timestamp for activity" << endl;
kDebug( 1212 ) << kBacktrace() << endl; kDebug( 1212 ) << kBacktrace() << endl;
} }
previous_activity_timestamp = QX11Info::appTime(); previous_activity_timestamp = xTime();
previous_client = this; previous_client = this;
#endif #endif
workspace()->sendTakeActivity( this, QX11Info::appTime(), flags ); workspace()->sendTakeActivity( this, xTime(), flags );
} }
// performs the actual focusing of the window using XSetInputFocus and WM_TAKE_FOCUS // performs the actual focusing of the window using XSetInputFocus and WM_TAKE_FOCUS
@ -1267,17 +1227,17 @@ void Client::takeFocus( allowed_t )
#ifndef NDEBUG #ifndef NDEBUG
static Time previous_focus_timestamp; static Time previous_focus_timestamp;
static Client* previous_client; static Client* previous_client;
if( previous_focus_timestamp == QX11Info::appTime() && previous_client != this ) if( previous_focus_timestamp == xTime() && previous_client != this )
{ {
kDebug( 1212 ) << "Repeated use of the same X timestamp for focus" << endl; kDebug( 1212 ) << "Repeated use of the same X timestamp for focus" << endl;
kDebug( 1212 ) << kBacktrace() << endl; kDebug( 1212 ) << kBacktrace() << endl;
} }
previous_focus_timestamp = QX11Info::appTime(); previous_focus_timestamp = xTime();
previous_client = this; previous_client = this;
#endif #endif
if ( rules()->checkAcceptFocus( input )) if ( rules()->checkAcceptFocus( input ))
{ {
XSetInputFocus( QX11Info::display(), window(), RevertToPointerRoot, QX11Info::appTime() ); XSetInputFocus( display(), window(), RevertToPointerRoot, xTime() );
} }
if ( Ptakefocus ) if ( Ptakefocus )
sendClientMessage(window(), atoms->wm_protocols, atoms->wm_take_focus); sendClientMessage(window(), atoms->wm_protocols, atoms->wm_take_focus);
@ -1410,7 +1370,7 @@ QString Client::caption( bool full ) const
void Client::getWMHints() void Client::getWMHints()
{ {
XWMHints *hints = XGetWMHints(QX11Info::display(), window() ); XWMHints *hints = XGetWMHints(display(), window() );
input = true; input = true;
window_group = None; window_group = None;
urgency = false; urgency = false;
@ -1499,7 +1459,7 @@ void Client::getWindowProtocols()
Pcontexthelp = 0; Pcontexthelp = 0;
Pping = 0; Pping = 0;
if (XGetWMProtocols(QX11Info::display(), window(), &p, &n)) if (XGetWMProtocols(display(), window(), &p, &n))
{ {
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
if (p[i] == atoms->wm_delete_window) if (p[i] == atoms->wm_delete_window)
@ -1558,7 +1518,7 @@ Window Client::staticWmClientLeader(WId w)
unsigned char *data = 0; unsigned char *data = 0;
Window result = w; Window result = w;
XErrorHandler oldHandler = XSetErrorHandler(nullErrorHandler); XErrorHandler oldHandler = XSetErrorHandler(nullErrorHandler);
status = XGetWindowProperty( QX11Info::display(), w, atoms->wm_client_leader, 0, 10000, status = XGetWindowProperty( display(), w, atoms->wm_client_leader, 0, 10000,
false, XA_WINDOW, &type, &format, false, XA_WINDOW, &type, &format,
&nitems, &extra, &data ); &nitems, &extra, &data );
XSetErrorHandler(oldHandler); XSetErrorHandler(oldHandler);
@ -1775,7 +1735,7 @@ void Client::setCursor( const QCursor& c )
cursor = c; cursor = c;
if( decoration != NULL ) if( decoration != NULL )
decoration->widget()->setCursor( cursor ); decoration->widget()->setCursor( cursor );
XDefineCursor( QX11Info::display(), frameId(), cursor.handle()); XDefineCursor( display(), frameId(), cursor.handle());
} }
Client::Position Client::mousePosition( const QPoint& p ) const Client::Position Client::mousePosition( const QPoint& p ) const
@ -1826,272 +1786,6 @@ void Client::cancelAutoRaise()
autoRaiseTimer = 0; autoRaiseTimer = 0;
} }
void Client::setOpacity(bool translucent, uint opacity)
{
if (isDesktop())
return; // xcompmgr does not like non solid desktops and the user could set it accidently by mouse scrolling
// qWarning("setting opacity for %d",QX11Info::display());
//rule out activated translulcency with 100% opacity
if (!translucent || opacity == 0xFFFFFFFF)
{
opacity_ = 0xFFFFFFFF;
XDeleteProperty (QX11Info::display(), frameId(), atoms->net_wm_window_opacity);
XDeleteProperty (QX11Info::display(), window(), atoms->net_wm_window_opacity); // ??? frameId() is necessary for visible changes, window() is the winId() that would be set by apps - we set both to be sure the app knows what's currently displayd
}
else{
if(opacity == opacity_)
return;
opacity_ = opacity;
long data = opacity; // 32bit XChangeProperty needs long
XChangeProperty(QX11Info::display(), frameId(), atoms->net_wm_window_opacity, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1L);
XChangeProperty(QX11Info::display(), window(), atoms->net_wm_window_opacity, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1L);
}
}
void Client::setShadowSize(uint shadowSize)
{
// ignoring all individual settings - if we control a window, we control it's shadow
// TODO somehow handle individual settings for docks (besides custom sizes)
long data = shadowSize;
XChangeProperty(QX11Info::display(), frameId(), atoms->net_wm_window_shadow, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1L);
}
void Client::updateOpacity()
// extra syncscreen flag allows to avoid double syncs when active state changes (as it will usually change for two windows)
{
if (!(isNormalWindow() || isDialog() || isUtility() )|| custom_opacity)
return;
if (isActive())
{
if( ruleOpacityActive() )
setOpacity(rule_opacity_active < 0xFFFFFFFF, rule_opacity_active);
else
setOpacity(options->translucentActiveWindows, options->activeWindowOpacity);
if (isBMP())
// beep-media-player, only undecorated windows (gtk2 xmms, xmms doesn't work with compmgr at all - s.e.p. :P )
{
ClientList tmpGroupMembers = group()->members();
ClientList activeGroupMembers;
activeGroupMembers.append(this);
tmpGroupMembers.removeAll(this);
ClientList::Iterator it = tmpGroupMembers.begin();
while (it != tmpGroupMembers.end())
// search for next attached and not activated client and repeat if found
{
if ((*it) != this && (*it)->isBMP())
// potential "to activate" client found
{
// qWarning("client found");
if ((*it)->touches(this)) // first test, if the new client touches the just activated one
{
// qWarning("found client touches me");
if( ruleOpacityActive() )
(*it)->setOpacity(rule_opacity_active < 0xFFFFFFFF, rule_opacity_active);
else
(*it)->setOpacity(options->translucentActiveWindows, options->activeWindowOpacity);
// qWarning("activated, search restarted (1)");
(*it)->setShadowSize(options->activeWindowShadowSize);
activeGroupMembers.append(*it);
tmpGroupMembers.erase(it);
it = tmpGroupMembers.begin(); // restart, search next client
continue;
}
else
{ // pot. client does not touch c, so we have to search if it touches some other activated client
bool found = false;
for( ClientList::ConstIterator it2 = activeGroupMembers.begin(); it2 != activeGroupMembers.end(); it2++ )
{
if ((*it2) != this && (*it2) != (*it) && (*it)->touches(*it2))
{
// qWarning("found client touches other active client");
if( ruleOpacityActive() )
(*it)->setOpacity(rule_opacity_active < 0xFFFFFFFF, rule_opacity_active);
else
(*it)->setOpacity(options->translucentActiveWindows, options->activeWindowOpacity);
(*it)->setShadowSize(options->activeWindowShadowSize);
activeGroupMembers.append(*it);
tmpGroupMembers.erase(it);
it = tmpGroupMembers.begin(); // reset potential client search
found = true;
// qWarning("activated, search restarted (2)");
break; // skip this loop
}
}
if (found) continue;
}
}
it++;
}
}
else if (isNormalWindow())
// activate dependent minor windows as well
{
for( ClientList::ConstIterator it = group()->members().begin(); it != group()->members().end(); it++ )
if ((*it)->isDialog() || (*it)->isUtility())
if( (*it)->ruleOpacityActive() )
(*it)->setOpacity((*it)->ruleOpacityActive() < 0xFFFFFFFF, (*it)->ruleOpacityActive());
else
(*it)->setOpacity(options->translucentActiveWindows, options->activeWindowOpacity);
}
}
else
{
if( ruleOpacityInactive() )
setOpacity(rule_opacity_inactive < 0xFFFFFFFF, rule_opacity_inactive);
else
setOpacity(options->translucentInactiveWindows && !(keepAbove() && options->keepAboveAsActive),
options->inactiveWindowOpacity);
// deactivate dependent minor windows as well
if (isBMP())
// beep-media-player, only undecorated windows (gtk2 xmms, xmms doesn't work with compmgr at all - s.e.p. :P )
{
ClientList tmpGroupMembers = group()->members();
ClientList inactiveGroupMembers;
inactiveGroupMembers.append(this);
tmpGroupMembers.removeAll(this);
ClientList::Iterator it = tmpGroupMembers.begin();
while ( it != tmpGroupMembers.end() )
// search for next attached and not activated client and repeat if found
{
if ((*it) != this && (*it)->isBMP())
// potential "to activate" client found
{
// qWarning("client found");
if ((*it)->touches(this)) // first test, if the new client touches the just activated one
{
// qWarning("found client touches me");
if( (*it)->ruleOpacityInactive() )
(*it)->setOpacity((*it)->ruleOpacityInactive() < 0xFFFFFFFF, (*it)->ruleOpacityInactive());
else
(*it)->setOpacity(options->translucentInactiveWindows && !((*it)->keepAbove() && options->keepAboveAsActive), options->inactiveWindowOpacity);
(*it)->setShadowSize(options->inactiveWindowShadowSize);
// qWarning("deactivated, search restarted (1)");
inactiveGroupMembers.append(*it);
tmpGroupMembers.erase(it);
it = tmpGroupMembers.begin(); // restart, search next client
continue;
}
else // pot. client does not touch c, so we have to search if it touches some other activated client
{
bool found = false;
for( ClientList::ConstIterator it2 = inactiveGroupMembers.begin(); it2 != inactiveGroupMembers.end(); it2++ )
{
if ((*it2) != this && (*it2) != (*it) && (*it)->touches(*it2))
{
// qWarning("found client touches other inactive client");
if( (*it)->ruleOpacityInactive() )
(*it)->setOpacity((*it)->ruleOpacityInactive() < 0xFFFFFFFF, (*it)->ruleOpacityInactive());
else
(*it)->setOpacity(options->translucentInactiveWindows && !((*it)->keepAbove() && options->keepAboveAsActive), options->inactiveWindowOpacity);
(*it)->setShadowSize(options->inactiveWindowShadowSize);
// qWarning("deactivated, search restarted (2)");
inactiveGroupMembers.append(*it);
tmpGroupMembers.erase(it);
it = tmpGroupMembers.begin(); // reset potential client search
found = true;
break; // skip this loop
}
}
if (found) continue;
}
}
it++;
}
}
else if (isNormalWindow())
{
for( ClientList::ConstIterator it = group()->members().begin(); it != group()->members().end(); it++ )
if ((*it)->isUtility()) //don't deactivate dialogs...
if( (*it)->ruleOpacityInactive() )
(*it)->setOpacity((*it)->ruleOpacityInactive() < 0xFFFFFFFF, (*it)->ruleOpacityInactive());
else
(*it)->setOpacity(options->translucentInactiveWindows && !((*it)->keepAbove() && options->keepAboveAsActive), options->inactiveWindowOpacity);
}
}
}
void Client::updateShadowSize()
// extra syncscreen flag allows to avoid double syncs when active state changes (as it will usually change for two windows)
{
if (!(isNormalWindow() || isDialog() || isUtility() ))
return;
if (isActive())
setShadowSize(options->activeWindowShadowSize);
else
setShadowSize(options->inactiveWindowShadowSize);
}
uint Client::ruleOpacityInactive()
{
return rule_opacity_inactive;// != 0 ;
}
uint Client::ruleOpacityActive()
{
return rule_opacity_active;// != 0;
}
bool Client::getWindowOpacity() //query translucency settings from X, returns true if window opacity is set
{
unsigned char *data = 0;
Atom actual;
int format, result;
unsigned long n, left;
result = XGetWindowProperty(QX11Info::display(), window(), atoms->net_wm_window_opacity, 0L, 1L, False, XA_CARDINAL, &actual, &format, &n, &left, /*(unsigned char **)*/ &data);
if (result == Success && data != None && format == 32 )
{
opacity_ = *reinterpret_cast< long* >( data );
custom_opacity = true;
// setOpacity(opacity_ < 0xFFFFFFFF, opacity_);
XFree ((char*)data);
return true;
}
return false;
}
void Client::setCustomOpacityFlag(bool custom)
{
custom_opacity = custom;
}
uint Client::opacity()
{
return opacity_;
}
int Client::opacityPercentage()
{
return int(100*((double)opacity_/0xffffffff));
}
bool Client::touches(const Client* c)
// checks if this client borders c, needed to test beep media player window state
{
if (y() == c->y() + c->height()) // this bottom to c
return true;
if (y() + height() == c->y()) // this top to c
return true;
if (x() == c->x() + c->width()) // this right to c
return true;
if (x() + width() == c->x()) // this left to c
return true;
return false;
}
void Client::setDecoHashProperty(uint topHeight, uint rightWidth, uint bottomHeight, uint leftWidth)
{
long data = (topHeight < 255 ? topHeight : 255) << 24 |
(rightWidth < 255 ? rightWidth : 255) << 16 |
(bottomHeight < 255 ? bottomHeight : 255) << 8 |
(leftWidth < 255 ? leftWidth : 255);
XChangeProperty(QX11Info::display(), frameId(), atoms->net_wm_window_decohash, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1L);
}
void Client::unsetDecoHashProperty()
{
XDeleteProperty( QX11Info::display(), frameId(), atoms->net_wm_window_decohash);
}
#ifndef NDEBUG #ifndef NDEBUG
kdbgstream& operator<<( kdbgstream& stream, const Client* cl ) kdbgstream& operator<<( kdbgstream& stream, const Client* cl )
{ {

136
client.h
View file

@ -28,7 +28,6 @@ License. See the file "COPYING" for the exact licensing terms.
#include "workspace.h" #include "workspace.h"
#include "kdecoration.h" #include "kdecoration.h"
#include "rules.h" #include "rules.h"
#include "toplevel.h"
class QTimer; class QTimer;
class KProcess; class KProcess;
@ -43,8 +42,7 @@ class WinInfo;
class SessionInfo; class SessionInfo;
class Bridge; class Bridge;
class Client class Client : public QObject, public KDecorationDefines
: public Toplevel
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -54,6 +52,7 @@ class Client
Window wrapperId() const; Window wrapperId() const;
Window decorationId() const; Window decorationId() const;
Workspace* workspace() const;
const Client* transientFor() const; const Client* transientFor() const;
Client* transientFor(); Client* transientFor();
bool isTransient() const; bool isTransient() const;
@ -67,20 +66,23 @@ class Client
const Group* group() const; const Group* group() const;
Group* group(); Group* group();
void checkGroup( Group* gr = NULL, bool force = false ); void checkGroup( Group* gr = NULL, bool force = false );
// prefer isXXX() instead
NET::WindowType windowType( bool direct = false, int supported_types = SUPPORTED_WINDOW_TYPES_MASK ) const;
const WindowRules* rules() const; const WindowRules* rules() const;
void removeRule( Rules* r ); void removeRule( Rules* r );
void setupWindowRules( bool ignore_temporary ); void setupWindowRules( bool ignore_temporary );
void applyWindowRules(); void applyWindowRules();
virtual NET::WindowType windowType( bool direct = false, int supported_types = SUPPORTED_WINDOW_TYPES_MASK ) const;
// returns true for "special" windows and false for windows which are "normal"
// (normal=window which has a border, can be moved by the user, can be closed, etc.)
// true for Desktop, Dock, Splash, Override and TopMenu (and Toolbar??? - for now)
// false for Normal, Dialog, Utility and Menu (and Toolbar??? - not yet) TODO
bool isSpecialWindow() const;
bool hasNETSupport() const;
QRect geometry() const;
QSize size() const;
QSize minSize() const; QSize minSize() const;
QSize maxSize() const; QSize maxSize() const;
QPoint pos() const;
QRect rect() const;
int x() const;
int y() const;
int width() const;
int height() const;
QPoint clientPos() const; // inside of geometry() QPoint clientPos() const; // inside of geometry()
QSize clientSize() const; QSize clientSize() const;
@ -163,9 +165,24 @@ class Client
// auxiliary functions, depend on the windowType // auxiliary functions, depend on the windowType
bool wantsTabFocus() const; bool wantsTabFocus() const;
bool wantsInput() const; bool wantsInput() const;
bool hasNETSupport() const;
bool isMovable() const;
bool isDesktop() const;
bool isDock() const;
bool isToolbar() const;
bool isTopMenu() const;
bool isMenu() const;
bool isNormalWindow() const; // normal as in 'NET::Normal or NET::Unknown non-transient'
bool isDialog() const;
bool isSplash() const;
bool isUtility() const;
// returns true for "special" windows and false for windows which are "normal"
// (normal=window which has a border, can be moved by the user, can be closed, etc.)
// true for Desktop, Dock, Splash, Override and TopMenu (and Toolbar??? - for now)
// false for Normal, Dialog, Utility and Menu (and Toolbar??? - not yet) TODO
bool isSpecialWindow() const;
bool isResizable() const; bool isResizable() const;
bool isMovable() const;
bool isCloseable() const; // may be closed by the user (may have a close button) bool isCloseable() const; // may be closed by the user (may have a close button)
void takeActivity( int flags, bool handled, allowed_t ); // takes ActivityFlags as arg (in utils.h) void takeActivity( int flags, bool handled, allowed_t ); // takes ActivityFlags as arg (in utils.h)
@ -181,9 +198,6 @@ class Client
// shape extensions // shape extensions
bool shape() const; bool shape() const;
void updateShape(); void updateShape();
virtual double opacity() const;
void setOpacity( double opacity );
void setGeometry( int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet ); void setGeometry( int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet );
void setGeometry( const QRect& r, ForceGeometry_t force = NormalGeometrySet ); void setGeometry( const QRect& r, ForceGeometry_t force = NormalGeometrySet );
@ -273,15 +287,6 @@ class Client
void checkActiveModal(); void checkActiveModal();
bool hasStrut() const; bool hasStrut() const;
bool isMove() const
{
return moveResizeMode && mode == PositionCenter;
}
bool isResize() const
{
return moveResizeMode && mode != PositionCenter;
}
private slots: private slots:
void autoRaise(); void autoRaise();
void shadeHover(); void shadeHover();
@ -325,9 +330,6 @@ class Client
void processDecorationButtonPress( int button, int state, int x, int y, int x_root, int y_root ); void processDecorationButtonPress( int button, int state, int x, int y, int x_root, int y_root );
protected:
virtual void debug( kdbgstream& stream ) const;
private slots: private slots:
void pingTimeout(); void pingTimeout();
void processKillerExited(); void processKillerExited();
@ -398,11 +400,12 @@ class Client
Time readUserCreationTime() const; Time readUserCreationTime() const;
static bool sameAppWindowRoleMatch( const Client* c1, const Client* c2, bool active_hack ); static bool sameAppWindowRoleMatch( const Client* c1, const Client* c2, bool active_hack );
void startupIdChanged(); void startupIdChanged();
static bool hasShape( Window w );
Window client; Window client;
Window wrapper; Window wrapper;
Window frame;
KDecoration* decoration; KDecoration* decoration;
Workspace* wspace;
Bridge* bridge; Bridge* bridge;
int desk; int desk;
bool buttonDown; bool buttonDown;
@ -410,6 +413,14 @@ class Client
bool move_faked_activity; bool move_faked_activity;
Window move_resize_grab_window; Window move_resize_grab_window;
bool unrestrictedMoveResize; bool unrestrictedMoveResize;
bool isMove() const
{
return moveResizeMode && mode == PositionCenter;
}
bool isResize() const
{
return moveResizeMode && mode != PositionCenter;
}
Position mode; Position mode;
QPoint moveOffset; QPoint moveOffset;
@ -493,6 +504,7 @@ class Client
Time ping_timestamp; Time ping_timestamp;
Time user_time; Time user_time;
unsigned long allowed_actions; unsigned long allowed_actions;
QRect frame_geometry;
QSize client_size; QSize client_size;
int postpone_geometry_updates; // >0 - new geometry is remembered, but not actually set int postpone_geometry_updates; // >0 - new geometry is remembered, but not actually set
bool pending_geometry_update; bool pending_geometry_update;
@ -545,7 +557,7 @@ inline Window Client::window() const
inline Window Client::frameId() const inline Window Client::frameId() const
{ {
return handle(); return frame;
} }
inline Window Client::wrapperId() const inline Window Client::wrapperId() const
@ -558,6 +570,11 @@ inline Window Client::decorationId() const
return decoration != NULL ? decoration->widget()->winId() : None; return decoration != NULL ? decoration->widget()->winId() : None;
} }
inline Workspace* Client::workspace() const
{
return wspace;
}
inline const Client* Client::transientFor() const inline const Client* Client::transientFor() const
{ {
return transient_for; return transient_for;
@ -774,6 +791,46 @@ inline QByteArray Client::windowRole() const
return window_role; return window_role;
} }
inline QRect Client::geometry() const
{
return frame_geometry;
}
inline QSize Client::size() const
{
return frame_geometry.size();
}
inline QPoint Client::pos() const
{
return frame_geometry.topLeft();
}
inline int Client::x() const
{
return frame_geometry.x();
}
inline int Client::y() const
{
return frame_geometry.y();
}
inline int Client::width() const
{
return frame_geometry.width();
}
inline int Client::height() const
{
return frame_geometry.height();
}
inline QRect Client::rect() const
{
return QRect( 0, 0, width(), height());
}
inline QPoint Client::clientPos() const inline QPoint Client::clientPos() const
{ {
return QPoint( border_left, border_top ); return QPoint( border_left, border_top );
@ -819,7 +876,7 @@ inline const WindowRules* Client::rules() const
return &client_rules; return &client_rules;
} }
KWIN_PROCEDURE( CheckIgnoreFocusStealingProcedure, Client, cl->ignore_focus_stealing = options->checkIgnoreFocusStealing( cl )); KWIN_PROCEDURE( CheckIgnoreFocusStealingProcedure, cl->ignore_focus_stealing = options->checkIgnoreFocusStealing( cl ));
inline Window Client::moveResizeGrabWindow() const inline Window Client::moveResizeGrabWindow() const
{ {
@ -836,9 +893,22 @@ inline void Client::removeRule( Rules* rule )
client_rules.remove( rule ); client_rules.remove( rule );
} }
KWIN_COMPARE_PREDICATE( WindowMatchPredicate, Client, Window, cl->window() == value ); #ifdef NDEBUG
KWIN_COMPARE_PREDICATE( FrameIdMatchPredicate, Client, Window, cl->frameId() == value ); inline
KWIN_COMPARE_PREDICATE( WrapperIdMatchPredicate, Client, Window, cl->wrapperId() == value ); kndbgstream& operator<<( kndbgstream& stream, const Client* ) { return stream; }
inline
kndbgstream& operator<<( kndbgstream& stream, const ClientList& ) { return stream; }
inline
kndbgstream& operator<<( kndbgstream& stream, const ConstClientList& ) { return stream; }
#else
kdbgstream& operator<<( kdbgstream& stream, const Client* );
kdbgstream& operator<<( kdbgstream& stream, const ClientList& );
kdbgstream& operator<<( kdbgstream& stream, const ConstClientList& );
#endif
KWIN_COMPARE_PREDICATE( WindowMatchPredicate, Window, cl->window() == value );
KWIN_COMPARE_PREDICATE( FrameIdMatchPredicate, Window, cl->frameId() == value );
KWIN_COMPARE_PREDICATE( WrapperIdMatchPredicate, Window, cl->wrapperId() == value );
} // namespace } // namespace

View file

@ -21,8 +21,6 @@ License. See the file "COPYING" for the exact licensing terms.
#include "tabbox.h" #include "tabbox.h"
#include "group.h" #include "group.h"
#include "rules.h" #include "rules.h"
#include "unmanaged.h"
#include "scene.h"
#include <QWhatsThis> #include <QWhatsThis>
#include <QApplication> #include <QApplication>
@ -264,11 +262,6 @@ bool Workspace::workspaceEvent( XEvent * e )
if( c->windowEvent( e )) if( c->windowEvent( e ))
return true; return true;
} }
else if( Unmanaged* c = findUnmanaged( HandleMatchPredicate( e->xany.window )))
{
if( c->windowEvent( e ))
return true;
}
else else
{ {
Window special = findSpecialEventWindow( e ); Window special = findSpecialEventWindow( e );
@ -326,8 +319,13 @@ bool Workspace::workspaceEvent( XEvent * e )
} }
return true; return true;
} }
return ( e->xunmap.event != e->xunmap.window ); // hide wm typical event from Qt return ( e->xunmap.event != e->xunmap.window ); // hide wm typical event from Qt
} }
case MapNotify:
return ( e->xmap.event != e->xmap.window ); // hide wm typical event from Qt
case ReparentNotify: case ReparentNotify:
{ {
//do not confuse Qt with these events. After all, _we_ are the //do not confuse Qt with these events. After all, _we_ are the
@ -377,22 +375,6 @@ bool Workspace::workspaceEvent( XEvent * e )
} }
break; break;
} }
case MapNotify:
{
if( e->xmap.override_redirect )
{
Unmanaged* c = findUnmanaged( HandleMatchPredicate( e->xmap.window ));
if( c == NULL )
c = createUnmanaged( e->xmap.window );
if( c )
{
c->windowEvent( e );
return true;
}
}
return ( e->xmap.event != e->xmap.window ); // hide wm typical event from Qt
}
case EnterNotify: case EnterNotify:
{ {
if ( QWhatsThis::inWhatsThisMode() ) if ( QWhatsThis::inWhatsThisMode() )
@ -473,10 +455,6 @@ bool Workspace::workspaceEvent( XEvent * e )
XRefreshKeyboardMapping( &e->xmapping ); XRefreshKeyboardMapping( &e->xmapping );
tab_box->updateKeyMapping(); tab_box->updateKeyMapping();
break; break;
case Expose:
if( e->xexpose.window == rootWindow() && compositing()) // root window needs repainting
addDamage( e->xexpose.x, e->xexpose.y, e->xexpose.width, e->xexpose.height );
break;
default: default:
break; break;
} }
@ -573,19 +551,6 @@ bool Client::windowEvent( XEvent* e )
if( demandAttentionKNotifyTimer != NULL ) if( demandAttentionKNotifyTimer != NULL )
demandAttentionKNotify(); demandAttentionKNotify();
} }
if( dirty[ WinInfo::PROTOCOLS2 ] & NET::WM2Opacity )
{
if( compositing())
{
addDamage( rect());
scene->windowOpacityChanged( this );
}
else
{ // forward to the frame if there's possibly another compositing manager running
NETWinInfo i( display(), frameId(), rootWindow(), 0 );
i.setOpacity( info->opacity());
}
}
} }
// TODO move all focus handling stuff to separate file? // TODO move all focus handling stuff to separate file?
@ -671,18 +636,13 @@ bool Client::windowEvent( XEvent* e )
break; break;
default: default:
if( e->xany.window == window()) if( e->xany.window == window())
{
if( e->type == Shape::shapeEvent() )
{ {
if( e->type == Extensions::shapeNotifyEvent() ) is_shape = Shape::hasShape( window()); // workaround for #19644
{ updateShape();
is_shape = hasShape( window()); // workaround for #19644
updateShape();
}
}
if( e->xany.window == frameId())
{
if( e->type == Extensions::damageNotifyEvent())
damageNotifyEvent( reinterpret_cast< XDamageNotifyEvent* >( e ));
} }
}
break; break;
} }
return true; // eat all events return true; // eat all events
@ -1602,57 +1562,6 @@ void Client::keyPressEvent( uint key_code )
QCursor::setPos( pos ); QCursor::setPos( pos );
} }
// ****************************************
// Unmanaged
// ****************************************
bool Unmanaged::windowEvent( XEvent* e )
{
unsigned long dirty[ 2 ];
info->event( e, dirty, 2 ); // pass through the NET stuff
if( dirty[ NETWinInfo::PROTOCOLS2 ] & NET::WM2Opacity )
{
scene->windowOpacityChanged( this );
addDamage( rect());
}
switch (e->type)
{
case UnmapNotify:
unmapNotifyEvent( &e->xunmap );
break;
case MapNotify:
mapNotifyEvent( &e->xmap );
break;
case ConfigureNotify:
configureNotifyEvent( &e->xconfigure );
break;
default:
if( e->type == Extensions::damageNotifyEvent())
damageNotifyEvent( reinterpret_cast< XDamageNotifyEvent* >( e ));
break;
}
return true; // eat all events
}
void Unmanaged::mapNotifyEvent( XMapEvent* )
{
}
void Unmanaged::unmapNotifyEvent( XUnmapEvent* )
{
release();
}
void Unmanaged::configureNotifyEvent( XConfigureEvent* e )
{
resetWindowPixmap();
// add old and new geometry to damage
// TODO add damage only if the window is not obscured
workspace()->addDamage( this, geometry());
geom = QRect( e->x, e->y, e->width, e->height );
workspace()->addDamage( this, geometry());
}
// **************************************** // ****************************************
// Group // Group
// **************************************** // ****************************************

View file

@ -633,18 +633,18 @@ void Workspace::updateTopMenuGeometry( Client* c )
if( c != NULL ) if( c != NULL )
{ {
XEvent ev; XEvent ev;
ev.xclient.display = QX11Info::display(); ev.xclient.display = display();
ev.xclient.type = ClientMessage; ev.xclient.type = ClientMessage;
ev.xclient.window = c->window(); ev.xclient.window = c->window();
static Atom msg_type_atom = XInternAtom( QX11Info::display(), "_KDE_TOPMENU_MINSIZE", False ); static Atom msg_type_atom = XInternAtom( display(), "_KDE_TOPMENU_MINSIZE", False );
ev.xclient.message_type = msg_type_atom; ev.xclient.message_type = msg_type_atom;
ev.xclient.format = 32; ev.xclient.format = 32;
ev.xclient.data.l[0] = QX11Info::appTime(); ev.xclient.data.l[0] = xTime();
ev.xclient.data.l[1] = topmenu_space->width(); ev.xclient.data.l[1] = topmenu_space->width();
ev.xclient.data.l[2] = topmenu_space->height(); ev.xclient.data.l[2] = topmenu_space->height();
ev.xclient.data.l[3] = 0; ev.xclient.data.l[3] = 0;
ev.xclient.data.l[4] = 0; ev.xclient.data.l[4] = 0;
XSendEvent( QX11Info::display(), c->window(), False, NoEventMask, &ev ); XSendEvent( display(), c->window(), False, NoEventMask, &ev );
KWin::setStrut( c->window(), 0, 0, topmenu_height, 0 ); // so that kicker etc. know KWin::setStrut( c->window(), 0, 0, topmenu_height, 0 ); // so that kicker etc. know
c->checkWorkspacePosition(); c->checkWorkspacePosition();
return; return;
@ -780,25 +780,25 @@ NETExtendedStrut Client::strut() const
{ {
ext.left_width = str.left; ext.left_width = str.left;
ext.left_start = 0; ext.left_start = 0;
ext.left_end = XDisplayHeight( QX11Info::display(), DefaultScreen( QX11Info::display())); ext.left_end = displayHeight();
} }
if( str.right != 0 ) if( str.right != 0 )
{ {
ext.right_width = str.right; ext.right_width = str.right;
ext.right_start = 0; ext.right_start = 0;
ext.right_end = XDisplayHeight( QX11Info::display(), DefaultScreen( QX11Info::display())); ext.right_end = displayHeight();
} }
if( str.top != 0 ) if( str.top != 0 )
{ {
ext.top_width = str.top; ext.top_width = str.top;
ext.top_start = 0; ext.top_start = 0;
ext.top_end = XDisplayWidth( QX11Info::display(), DefaultScreen( QX11Info::display())); ext.top_end = displayWidth();
} }
if( str.bottom != 0 ) if( str.bottom != 0 )
{ {
ext.bottom_width = str.bottom; ext.bottom_width = str.bottom;
ext.bottom_start = 0; ext.bottom_start = 0;
ext.bottom_end = XDisplayWidth( QX11Info::display(), DefaultScreen( QX11Info::display())); ext.bottom_end = displayWidth();
} }
} }
return ext; return ext;
@ -1196,7 +1196,7 @@ QSize Client::sizeForClientSize( const QSize& wsize, Sizemode mode, bool noframe
void Client::getWmNormalHints() void Client::getWmNormalHints()
{ {
long msize; long msize;
if (XGetWMNormalHints(QX11Info::display(), window(), &xSizeHint, &msize) == 0 ) if (XGetWMNormalHints(display(), window(), &xSizeHint, &msize) == 0 )
xSizeHint.flags = 0; xSizeHint.flags = 0;
// set defined values for the fields, even if they're not in flags // set defined values for the fields, even if they're not in flags
@ -1298,7 +1298,7 @@ void Client::sendSyntheticConfigureNotify()
c.border_width = 0; c.border_width = 0;
c.above = None; c.above = None;
c.override_redirect = 0; c.override_redirect = 0;
XSendEvent( QX11Info::display(), c.event, true, StructureNotifyMask, (XEvent*)&c ); XSendEvent( display(), c.event, true, StructureNotifyMask, (XEvent*)&c );
} }
const QPoint Client::calculateGravitation( bool invert, int gravity ) const const QPoint Client::calculateGravitation( bool invert, int gravity ) const
@ -1667,14 +1667,14 @@ void Client::setGeometry( int x, int y, int w, int h, ForceGeometry_t force )
return; return;
} }
resizeDecoration( QSize( w, h )); resizeDecoration( QSize( w, h ));
XMoveResizeWindow( QX11Info::display(), frameId(), x, y, w, h ); XMoveResizeWindow( display(), frameId(), x, y, w, h );
// resizeDecoration( QSize( w, h )); // resizeDecoration( QSize( w, h ));
if( !isShade()) if( !isShade())
{ {
QSize cs = clientSize(); QSize cs = clientSize();
XMoveResizeWindow( QX11Info::display(), wrapperId(), clientPos().x(), clientPos().y(), XMoveResizeWindow( display(), wrapperId(), clientPos().x(), clientPos().y(),
cs.width(), cs.height()); cs.width(), cs.height());
XMoveResizeWindow( QX11Info::display(), window(), 0, 0, cs.width(), cs.height()); XMoveResizeWindow( display(), window(), 0, 0, cs.width(), cs.height());
} }
updateShape(); updateShape();
// SELI TODO won't this be too expensive? // SELI TODO won't this be too expensive?
@ -1721,14 +1721,14 @@ void Client::plainResize( int w, int h, ForceGeometry_t force )
return; return;
} }
resizeDecoration( QSize( w, h )); resizeDecoration( QSize( w, h ));
XResizeWindow( QX11Info::display(), frameId(), w, h ); XResizeWindow( display(), frameId(), w, h );
// resizeDecoration( QSize( w, h )); // resizeDecoration( QSize( w, h ));
if( !isShade()) if( !isShade())
{ {
QSize cs = clientSize(); QSize cs = clientSize();
XMoveResizeWindow( QX11Info::display(), wrapperId(), clientPos().x(), clientPos().y(), XMoveResizeWindow( display(), wrapperId(), clientPos().x(), clientPos().y(),
cs.width(), cs.height()); cs.width(), cs.height());
XMoveResizeWindow( QX11Info::display(), window(), 0, 0, cs.width(), cs.height()); XMoveResizeWindow( display(), window(), 0, 0, cs.width(), cs.height());
} }
updateShape(); updateShape();
updateWorkareaDiffs(); updateWorkareaDiffs();
@ -1751,7 +1751,7 @@ void Client::move( int x, int y, ForceGeometry_t force )
pending_geometry_update = true; pending_geometry_update = true;
return; return;
} }
XMoveWindow( QX11Info::display(), frameId(), x, y ); XMoveWindow( display(), frameId(), x, y );
sendSyntheticConfigureNotify(); sendSyntheticConfigureNotify();
updateWindowRules(); updateWindowRules();
checkMaximizeGeometry(); checkMaximizeGeometry();
@ -2220,18 +2220,18 @@ bool Client::startMoveResize()
// (http://lists.kde.org/?t=107302193400001&r=1&w=2) // (http://lists.kde.org/?t=107302193400001&r=1&w=2)
XSetWindowAttributes attrs; XSetWindowAttributes attrs;
QRect r = workspace()->clientArea( FullArea, this ); QRect r = workspace()->clientArea( FullArea, this );
move_resize_grab_window = XCreateWindow( QX11Info::display(), workspace()->rootWin(), r.x(), r.y(), move_resize_grab_window = XCreateWindow( display(), workspace()->rootWin(), r.x(), r.y(),
r.width(), r.height(), 0, CopyFromParent, InputOnly, CopyFromParent, 0, &attrs ); r.width(), r.height(), 0, CopyFromParent, InputOnly, CopyFromParent, 0, &attrs );
XMapRaised( QX11Info::display(), move_resize_grab_window ); XMapRaised( display(), move_resize_grab_window );
if( XGrabPointer( QX11Info::display(), move_resize_grab_window, False, if( XGrabPointer( display(), move_resize_grab_window, False,
ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask,
GrabModeAsync, GrabModeAsync, None, cursor.handle(), QX11Info::appTime() ) == Success ) GrabModeAsync, GrabModeAsync, None, cursor.handle(), xTime() ) == Success )
has_grab = true; has_grab = true;
if( XGrabKeyboard( QX11Info::display(), frameId(), False, GrabModeAsync, GrabModeAsync, QX11Info::appTime() ) == Success ) if( XGrabKeyboard( display(), frameId(), False, GrabModeAsync, GrabModeAsync, xTime() ) == Success )
has_grab = true; has_grab = true;
if( !has_grab ) // at least one grab is necessary in order to be able to finish move/resize if( !has_grab ) // at least one grab is necessary in order to be able to finish move/resize
{ {
XDestroyWindow( QX11Info::display(), move_resize_grab_window ); XDestroyWindow( display(), move_resize_grab_window );
move_resize_grab_window = None; move_resize_grab_window = None;
return false; return false;
} }
@ -2241,13 +2241,6 @@ bool Client::startMoveResize()
workspace()->setClientIsMoving(this); workspace()->setClientIsMoving(this);
initialMoveResizeGeom = moveResizeGeom = geometry(); initialMoveResizeGeom = moveResizeGeom = geometry();
checkUnrestrictedMoveResize(); checkUnrestrictedMoveResize();
// rule out non opaque windows from useless translucency settings, maybe resizes?
if ((isResize() && options->removeShadowsOnResize) || (isMove() && options->removeShadowsOnMove))
setShadowSize(0);
if (rules()->checkMoveResizeMode( options->moveMode ) == Options::Opaque){
savedOpacity_ = opacity_;
setOpacity(options->translucentMovingWindows, options->movingWindowOpacity);
}
if ( ( isMove() && rules()->checkMoveResizeMode( options->moveMode ) != Options::Opaque ) if ( ( isMove() && rules()->checkMoveResizeMode( options->moveMode ) != Options::Opaque )
|| ( isResize() && rules()->checkMoveResizeMode( options->resizeMode ) != Options::Opaque ) ) || ( isResize() && rules()->checkMoveResizeMode( options->resizeMode ) != Options::Opaque ) )
{ {
@ -2279,11 +2272,6 @@ void Client::finishMoveResize( bool cancel )
void Client::leaveMoveResize() void Client::leaveMoveResize()
{ {
// rule out non opaque windows from useless translucency settings, maybe resizes?
if (rules()->checkMoveResizeMode( options->moveMode ) == Options::Opaque)
setOpacity(true, savedOpacity_);
if ((isResize() && options->removeShadowsOnResize) || (isMove() && options->removeShadowsOnMove))
updateShadowSize();
clearbound(); clearbound();
if (geometryTip) if (geometryTip)
{ {
@ -2294,9 +2282,9 @@ void Client::leaveMoveResize()
if ( ( isMove() && rules()->checkMoveResizeMode( options->moveMode ) != Options::Opaque ) if ( ( isMove() && rules()->checkMoveResizeMode( options->moveMode ) != Options::Opaque )
|| ( isResize() && rules()->checkMoveResizeMode( options->resizeMode ) != Options::Opaque ) ) || ( isResize() && rules()->checkMoveResizeMode( options->resizeMode ) != Options::Opaque ) )
ungrabXServer(); ungrabXServer();
XUngrabKeyboard( QX11Info::display(), QX11Info::appTime() ); XUngrabKeyboard( display(), xTime() );
XUngrabPointer( QX11Info::display(), QX11Info::appTime() ); XUngrabPointer( display(), xTime() );
XDestroyWindow( QX11Info::display(), move_resize_grab_window ); XDestroyWindow( display(), move_resize_grab_window );
move_resize_grab_window = None; move_resize_grab_window = None;
workspace()->setClientIsMoving(0); workspace()->setClientIsMoving(0);
if( move_faked_activity ) if( move_faked_activity )
@ -2542,7 +2530,7 @@ void Client::handleMoveResize( int x, int y, int x_root, int y_root )
} // so the geometry tip will be painted above the outline } // so the geometry tip will be painted above the outline
} }
if ( isMove() ) if ( isMove() )
workspace()->clientMoved(globalPos, QX11Info::appTime()); workspace()->clientMoved(globalPos, xTime());
} }

View file

@ -51,7 +51,7 @@ Group::Group( Window leader_P, Workspace* workspace_P )
{ {
leader_client = workspace_P->findClient( WindowMatchPredicate( leader_P )); leader_client = workspace_P->findClient( WindowMatchPredicate( leader_P ));
unsigned long properties[ 2 ] = { 0, NET::WM2StartupId }; unsigned long properties[ 2 ] = { 0, NET::WM2StartupId };
leader_info = new NETWinInfo( QX11Info::display(), leader_P, workspace()->rootWin(), leader_info = new NETWinInfo( display(), leader_P, workspace()->rootWin(),
properties, 2 ); properties, 2 );
} }
workspace()->addGroup( this, Allowed ); workspace()->addGroup( this, Allowed );
@ -398,7 +398,7 @@ bool Client::sameAppWindowRoleMatch( const Client* c1, const Client* c2, bool ac
void Client::readTransient() void Client::readTransient()
{ {
Window new_transient_for_id; Window new_transient_for_id;
if( XGetTransientForHint( QX11Info::display(), window(), &new_transient_for_id )) if( XGetTransientForHint( display(), window(), &new_transient_for_id ))
{ {
original_transient_for_id = new_transient_for_id; original_transient_for_id = new_transient_for_id;
new_transient_for_id = verifyTransientFor( new_transient_for_id, true ); new_transient_for_id = verifyTransientFor( new_transient_for_id, true );
@ -601,7 +601,7 @@ Window Client::verifyTransientFor( Window new_transient_for, bool defined )
Window root_return, parent_return; Window root_return, parent_return;
Window* wins = NULL; Window* wins = NULL;
unsigned int nwins; unsigned int nwins;
int r = XQueryTree(QX11Info::display(), new_transient_for, &root_return, &parent_return, &wins, &nwins); int r = XQueryTree(display(), new_transient_for, &root_return, &parent_return, &wins, &nwins);
if ( wins ) if ( wins )
XFree((void *) wins); XFree((void *) wins);
if ( r == 0) if ( r == 0)
@ -642,7 +642,7 @@ Window Client::verifyTransientFor( Window new_transient_for, bool defined )
new_transient_for = workspace()->rootWin(); new_transient_for = workspace()->rootWin();
} }
if( new_property_value != original_transient_for_id ) if( new_property_value != original_transient_for_id )
XSetTransientForHint( QX11Info::display(), window(), new_property_value ); XSetTransientForHint( display(), window(), new_property_value );
return new_transient_for; return new_transient_for;
} }

View file

@ -1,30 +0,0 @@
########### next target ###############
set(kompmgr_SRCS kompmgr.c )
kde4_automoc(${kompmgr_SRCS})
kde4_add_executable(kompmgr ${kompmgr_SRCS})
target_link_libraries(kompmgr ${KDE4_KDECORE_LIBS} ${X11_Xcomposite_LIB} ${X11_Xdamage_LIB} ${X11_Xfixes_LIB} ${X11_Xext_LIB} m )
install(TARGETS kompmgr DESTINATION ${BIN_INSTALL_DIR})
########### install files ###############
#original Makefile.am contents follow:
#bin_PROGRAMS = kompmgr
#
#kompmgr_SOURCES = kompmgr.c
#kompmgr_LDADD = $(X_LDFLAGS) $(X_RPATH) -lXcomposite -lXdamage -lXfixes $(LIB_XRENDER) $(LIB_X11) -lXext -lm
#
#INCLUDES = $(all_includes)

View file

@ -30,7 +30,6 @@ License. See the file "COPYING" for the exact licensing terms.
#include "options.h" #include "options.h"
#include "sm.h" #include "sm.h"
#include "utils.h" #include "utils.h"
#include "effects.h"
#define INT8 _X11INT8 #define INT8 _X11INT8
#define INT32 _X11INT32 #define INT32 _X11INT32
@ -118,8 +117,6 @@ Application::Application( )
options = new Options; options = new Options;
atoms = new Atoms; atoms = new Atoms;
initting = false; // TODO
// create workspace. // create workspace.
(void) new Workspace( isSessionRestored() ); (void) new Workspace( isSessionRestored() );
@ -146,8 +143,6 @@ Application::~Application()
if( owner.ownerWindow() != None ) // if there was no --replace (no new WM) if( owner.ownerWindow() != None ) // if there was no --replace (no new WM)
XSetInputFocus( display(), PointerRoot, RevertToPointerRoot, xTime() ); XSetInputFocus( display(), PointerRoot, RevertToPointerRoot, xTime() );
delete options; delete options;
delete effects;
delete atoms;
} }
void Application::lostSelection() void Application::lostSelection()
@ -282,9 +277,9 @@ KDE_EXPORT int kdemain( int argc, char * argv[] )
QString appname; QString appname;
if (KWinInternal::screen_number == 0) if (KWinInternal::screen_number == 0)
appname = "kwin"; appname = "org.kde.kwin";
else else
appname.sprintf("kwin-screen-%d", KWinInternal::screen_number); appname.sprintf("org.kde.kwin-screen-%d", KWinInternal::screen_number);
QDBus::sessionBus().interface()->registerService( appname, QDBusConnectionInterface::DontQueueService ); QDBus::sessionBus().interface()->registerService( appname, QDBusConnectionInterface::DontQueueService );

View file

@ -39,7 +39,7 @@ bool Client::manage( Window w, bool isMapped )
StackingUpdatesBlocker stacking_blocker( workspace()); StackingUpdatesBlocker stacking_blocker( workspace());
XWindowAttributes attr; XWindowAttributes attr;
if( !XGetWindowAttributes(QX11Info::display(), w, &attr)) if( !XGetWindowAttributes(display(), w, &attr))
return false; return false;
grabXServer(); grabXServer();
@ -53,7 +53,7 @@ bool Client::manage( Window w, bool isMapped )
// SELI order all these things in some sane manner // SELI order all these things in some sane manner
bool init_minimize = false; bool init_minimize = false;
XWMHints * hints = XGetWMHints(QX11Info::display(), w ); XWMHints * hints = XGetWMHints(display(), w );
if (hints && (hints->flags & StateHint) && hints->initial_state == IconicState) if (hints && (hints->flags & StateHint) && hints->initial_state == IconicState)
init_minimize = true; init_minimize = true;
if (hints) if (hints)
@ -79,12 +79,12 @@ bool Client::manage( Window w, bool isMapped )
NET::WM2ExtendedStrut | NET::WM2ExtendedStrut |
0; 0;
info = new WinInfo( this, QX11Info::display(), client, QX11Info::appRootWindow(), properties, 2 ); info = new WinInfo( this, display(), client, rootWindow(), properties, 2 );
cmap = attr.colormap; cmap = attr.colormap;
XClassHint classHint; XClassHint classHint;
if ( XGetClassHint( QX11Info::display(), client, &classHint ) ) if ( XGetClassHint( display(), client, &classHint ) )
{ {
// Qt3.2 and older had this all lowercase, Qt3.3 capitalized resource class // Qt3.2 and older had this all lowercase, Qt3.3 capitalized resource class
// force lowercase, so that workarounds listing resource classes still work // force lowercase, so that workarounds listing resource classes still work
@ -106,7 +106,6 @@ bool Client::manage( Window w, bool isMapped )
setCaption( cap_normal, true ); setCaption( cap_normal, true );
detectNoBorder(); detectNoBorder();
detectShapable();
fetchIconicName(); fetchIconicName();
getWMHints(); // needs to be done before readTransient() because of reading the group getWMHints(); // needs to be done before readTransient() because of reading the group
modal = ( info->state() & NET::Modal ) != 0; // needs to be valid before handling groups modal = ( info->state() & NET::Modal ) != 0; // needs to be valid before handling groups
@ -143,8 +142,6 @@ bool Client::manage( Window w, bool isMapped )
if( rules()->checkNoBorder( false, !isMapped )) if( rules()->checkNoBorder( false, !isMapped ))
setUserNoBorder( true ); setUserNoBorder( true );
checkAndSetInitialRuledOpacity();
// initial desktop placement // initial desktop placement
if ( session ) if ( session )
{ {
@ -316,7 +313,7 @@ bool Client::manage( Window w, bool isMapped )
if(( !isSpecialWindow() || isToolbar()) && isMovable()) if(( !isSpecialWindow() || isToolbar()) && isMovable())
keepInArea( area, partial_keep_in_area ); keepInArea( area, partial_keep_in_area );
XShapeSelectInput( QX11Info::display(), window(), ShapeNotifyMask ); XShapeSelectInput( display(), window(), ShapeNotifyMask );
is_shape = Shape::hasShape( window()); is_shape = Shape::hasShape( window());
updateShape(); updateShape();
@ -431,7 +428,7 @@ bool Client::manage( Window w, bool isMapped )
// this should avoid flicker, because real restacking is done // this should avoid flicker, because real restacking is done
// only after manage() finishes because of blocking, but the window is shown sooner // only after manage() finishes because of blocking, but the window is shown sooner
XLowerWindow( QX11Info::display(), frameId()); XLowerWindow( display(), frameId());
if( session && session->stackingOrder != -1 ) if( session && session->stackingOrder != -1 )
{ {
sm_stacking_order = session->stackingOrder; sm_stacking_order = session->stackingOrder;
@ -503,9 +500,9 @@ bool Client::manage( Window w, bool isMapped )
if( user_time == CurrentTime || user_time == -1U ) // no known user time, set something old if( user_time == CurrentTime || user_time == -1U ) // no known user time, set something old
{ {
user_time = QX11Info::appTime() - 1000000; user_time = xTime() - 1000000;
if( user_time == CurrentTime || user_time == -1U ) // let's be paranoid if( user_time == CurrentTime || user_time == -1U ) // let's be paranoid
user_time = QX11Info::appTime() - 1000000 + 10; user_time = xTime() - 1000000 + 10;
} }
updateWorkareaDiffs(); updateWorkareaDiffs();
@ -535,30 +532,30 @@ void Client::embedClient( Window w, const XWindowAttributes &attr )
assert( wrapper == None ); assert( wrapper == None );
client = w; client = w;
// we don't want the window to be destroyed when we are destroyed // we don't want the window to be destroyed when we are destroyed
XAddToSaveSet( QX11Info::display(), client ); XAddToSaveSet( display(), client );
XSelectInput( QX11Info::display(), client, NoEventMask ); XSelectInput( display(), client, NoEventMask );
XUnmapWindow( QX11Info::display(), client ); XUnmapWindow( display(), client );
XWindowChanges wc; // set the border width to 0 XWindowChanges wc; // set the border width to 0
wc.border_width = 0; // TODO possibly save this, and also use it for initial configuring of the window wc.border_width = 0; // TODO possibly save this, and also use it for initial configuring of the window
XConfigureWindow( QX11Info::display(), client, CWBorderWidth, &wc ); XConfigureWindow( display(), client, CWBorderWidth, &wc );
XSetWindowAttributes swa; XSetWindowAttributes swa;
swa.colormap = attr.colormap; swa.colormap = attr.colormap;
swa.background_pixmap = None; swa.background_pixmap = None;
swa.border_pixel = 0; swa.border_pixel = 0;
frame = XCreateWindow( QX11Info::display(), QX11Info::appRootWindow(), 0, 0, 1, 1, 0, frame = XCreateWindow( display(), rootWindow(), 0, 0, 1, 1, 0,
attr.depth, InputOutput, attr.visual, attr.depth, InputOutput, attr.visual,
CWColormap | CWBackPixmap | CWBorderPixel, &swa ); CWColormap | CWBackPixmap | CWBorderPixel, &swa );
wrapper = XCreateWindow( QX11Info::display(), frame, 0, 0, 1, 1, 0, wrapper = XCreateWindow( display(), frame, 0, 0, 1, 1, 0,
attr.depth, InputOutput, attr.visual, attr.depth, InputOutput, attr.visual,
CWColormap | CWBackPixmap | CWBorderPixel, &swa ); CWColormap | CWBackPixmap | CWBorderPixel, &swa );
XDefineCursor( QX11Info::display(), frame, QCursor( Qt::ArrowCursor ).handle()); XDefineCursor( display(), frame, QCursor( Qt::ArrowCursor ).handle());
// some apps are stupid and don't define their own cursor - set the arrow one for them // some apps are stupid and don't define their own cursor - set the arrow one for them
XDefineCursor( QX11Info::display(), wrapper, QCursor( Qt::ArrowCursor ).handle()); XDefineCursor( display(), wrapper, QCursor( Qt::ArrowCursor ).handle());
XReparentWindow( QX11Info::display(), client, wrapper, 0, 0 ); XReparentWindow( display(), client, wrapper, 0, 0 );
XSelectInput( QX11Info::display(), frame, XSelectInput( display(), frame,
KeyPressMask | KeyReleaseMask | KeyPressMask | KeyReleaseMask |
ButtonPressMask | ButtonReleaseMask | ButtonPressMask | ButtonReleaseMask |
KeymapStateMask | KeymapStateMask |
@ -570,8 +567,8 @@ void Client::embedClient( Window w, const XWindowAttributes &attr )
PropertyChangeMask | PropertyChangeMask |
StructureNotifyMask | SubstructureRedirectMask | StructureNotifyMask | SubstructureRedirectMask |
VisibilityChangeMask ); VisibilityChangeMask );
XSelectInput( QX11Info::display(), wrapper, ClientWinMask | SubstructureNotifyMask ); XSelectInput( display(), wrapper, ClientWinMask | SubstructureNotifyMask );
XSelectInput( QX11Info::display(), client, XSelectInput( display(), client,
FocusChangeMask | FocusChangeMask |
PropertyChangeMask | PropertyChangeMask |
ColormapChangeMask | ColormapChangeMask |

View file

@ -174,8 +174,9 @@ unsigned long Options::updateSettings()
CmdAllWheel = mouseWheelCommand(config->readEntry("CommandAllWheel","Nothing")); CmdAllWheel = mouseWheelCommand(config->readEntry("CommandAllWheel","Nothing"));
//translucency settings - TODO //translucency settings - TODO
config->setGroup( "Notification Messages" );
useTranslucency = config->readEntry("UseTranslucency", QVariant(false)).toBool();
config->setGroup( "Translucency"); config->setGroup( "Translucency");
useTranslucency = config->readEntry("UseTranslucency", QVariant(true)).toBool();
translucentActiveWindows = config->readEntry("TranslucentActiveWindows", QVariant(false)).toBool(); translucentActiveWindows = config->readEntry("TranslucentActiveWindows", QVariant(false)).toBool();
activeWindowOpacity = uint((config->readEntry("ActiveWindowOpacity", 100)/100.0)*0xFFFFFFFF); activeWindowOpacity = uint((config->readEntry("ActiveWindowOpacity", 100)/100.0)*0xFFFFFFFF);
translucentInactiveWindows = config->readEntry("TranslucentInactiveWindows", QVariant(false)).toBool(); translucentInactiveWindows = config->readEntry("TranslucentInactiveWindows", QVariant(false)).toBool();

View file

@ -164,18 +164,10 @@ QMenu* Workspace::clientPopup()
return popup; return popup;
} }
//sets the transparency of the client to given value(given by slider)
void Workspace::setPopupClientOpacity(int value) void Workspace::setPopupClientOpacity(int value)
{ {
if( active_popup_client == NULL ) // TODO
return;
active_popup_client->setOpacity( value / 100.0 );
}
void Workspace::resetClientOpacity()
{
if( active_popup_client == NULL )
return;
active_popup_client->setOpacity( 1.0 );
} }
void Workspace::setTransButtonText(int value) void Workspace::setTransButtonText(int value)
@ -191,6 +183,11 @@ void Workspace::setTransButtonText(int value)
transButton->setText('0'+QString::number(value)+" %"); transButton->setText('0'+QString::number(value)+" %");
} }
void Workspace::resetClientOpacity()
{
// TODO
}
/*! /*!
The client popup menu will become visible soon. The client popup menu will become visible soon.
@ -644,10 +641,10 @@ bool Client::performMouseCommand( Options::MouseCommand command, QPoint globalPo
workspace()->windowToNextDesktop( this ); workspace()->windowToNextDesktop( this );
break; break;
case Options::MouseOpacityMore: case Options::MouseOpacityMore:
setOpacity( qMin( opacity() + 0.1, 1.0 )); // TODO
break; break;
case Options::MouseOpacityLess: case Options::MouseOpacityLess:
setOpacity( qMax( opacity() - 0.1, 0.0 )); // TODO
break; break;
case Options::MouseNothing: case Options::MouseNothing:
replay = true; replay = true;

View file

@ -56,7 +56,7 @@ bool Shape::hasShape( WId w)
int boundingShaped = 0, clipShaped = 0; int boundingShaped = 0, clipShaped = 0;
if (!available()) if (!available())
return false; return false;
XShapeQueryExtents(QX11Info::display(), w, XShapeQueryExtents(display(), w,
&boundingShaped, &xws, &yws, &wws, &hws, &boundingShaped, &xws, &yws, &wws, &hws,
&clipShaped, &xbs, &ybs, &wbs, &hbs); &clipShaped, &xbs, &ybs, &wbs, &hbs);
return boundingShaped != 0; return boundingShaped != 0;
@ -71,10 +71,10 @@ void Shape::init()
{ {
kwin_shape_version = 0; kwin_shape_version = 0;
int dummy; int dummy;
if( !XShapeQueryExtension( QX11Info::display(), &kwin_shape_event, &dummy )) if( !XShapeQueryExtension( display(), &kwin_shape_event, &dummy ))
return; return;
int major, minor; int major, minor;
if( !XShapeQueryVersion( QX11Info::display(), &major, &minor )) if( !XShapeQueryVersion( display(), &major, &minor ))
return; return;
kwin_shape_version = major * 16 + minor; kwin_shape_version = major * 16 + minor;
} }
@ -87,7 +87,7 @@ void Motif::readFlags( WId w, bool& noborder, bool& resize, bool& move,
unsigned long length, after; unsigned long length, after;
unsigned char* data; unsigned char* data;
MwmHints* hints = 0; MwmHints* hints = 0;
if ( XGetWindowProperty( QX11Info::display(), w, atoms->motif_wm_hints, 0, 5, if ( XGetWindowProperty( display(), w, atoms->motif_wm_hints, 0, 5,
false, atoms->motif_wm_hints, &type, &format, false, atoms->motif_wm_hints, &type, &format,
&length, &after, &data ) == Success ) &length, &after, &data ) == Success )
{ {
@ -140,10 +140,10 @@ KWinSelectionOwner::KWinSelectionOwner( int screen_P )
Atom KWinSelectionOwner::make_selection_atom( int screen_P ) Atom KWinSelectionOwner::make_selection_atom( int screen_P )
{ {
if( screen_P < 0 ) if( screen_P < 0 )
screen_P = DefaultScreen( QX11Info::display()); screen_P = DefaultScreen( display());
char tmp[ 30 ]; char tmp[ 30 ];
sprintf( tmp, "WM_S%d", screen_P ); sprintf( tmp, "WM_S%d", screen_P );
return XInternAtom( QX11Info::display(), tmp, False ); return XInternAtom( display(), tmp, False );
} }
void KWinSelectionOwner::getAtoms() void KWinSelectionOwner::getAtoms()
@ -154,7 +154,7 @@ void KWinSelectionOwner::getAtoms()
Atom atoms[ 1 ]; Atom atoms[ 1 ];
const char* const names[] = const char* const names[] =
{ "VERSION" }; { "VERSION" };
XInternAtoms( QX11Info::display(), const_cast< char** >( names ), 1, False, atoms ); XInternAtoms( display(), const_cast< char** >( names ), 1, False, atoms );
xa_version = atoms[ 0 ]; xa_version = atoms[ 0 ];
} }
} }
@ -164,7 +164,7 @@ void KWinSelectionOwner::replyTargets( Atom property_P, Window requestor_P )
KSelectionOwner::replyTargets( property_P, requestor_P ); KSelectionOwner::replyTargets( property_P, requestor_P );
Atom atoms[ 1 ] = { xa_version }; Atom atoms[ 1 ] = { xa_version };
// PropModeAppend ! // PropModeAppend !
XChangeProperty( QX11Info::display(), requestor_P, property_P, XA_ATOM, 32, PropModeAppend, XChangeProperty( display(), requestor_P, property_P, XA_ATOM, 32, PropModeAppend,
reinterpret_cast< unsigned char* >( atoms ), 1 ); reinterpret_cast< unsigned char* >( atoms ), 1 );
} }
@ -173,7 +173,7 @@ bool KWinSelectionOwner::genericReply( Atom target_P, Atom property_P, Window re
if( target_P == xa_version ) if( target_P == xa_version )
{ {
long version[] = { 2, 0 }; long version[] = { 2, 0 };
XChangeProperty( QX11Info::display(), requestor_P, property_P, XA_INTEGER, 32, XChangeProperty( display(), requestor_P, property_P, XA_INTEGER, 32,
PropModeReplace, reinterpret_cast< unsigned char* >( &version ), 2 ); PropModeReplace, reinterpret_cast< unsigned char* >( &version ), 2 );
} }
else else
@ -193,7 +193,7 @@ QByteArray getStringProperty(WId w, Atom prop, char separator)
unsigned char *data = 0; unsigned char *data = 0;
QByteArray result = ""; QByteArray result = "";
KXErrorHandler handler; // ignore errors KXErrorHandler handler; // ignore errors
status = XGetWindowProperty( QX11Info::display(), w, prop, 0, 10000, status = XGetWindowProperty( display(), w, prop, 0, 10000,
false, XA_STRING, &type, &format, false, XA_STRING, &type, &format,
&nitems, &extra, &data ); &nitems, &extra, &data );
if ( status == Success) if ( status == Success)
@ -248,8 +248,8 @@ static Bool update_x_time_predicate( Display*, XEvent* event, XPointer )
} }
/* /*
Updates QX11Info::appTime(). This used to simply fetch current timestamp from the server, Updates xTime(). This used to simply fetch current timestamp from the server,
but that can cause QX11Info::appTime() to be newer than timestamp of events that are but that can cause xTime() to be newer than timestamp of events that are
still in our events queue, thus e.g. making XSetInputFocus() caused by such still in our events queue, thus e.g. making XSetInputFocus() caused by such
event to be ignored. Therefore events queue is searched for first event to be ignored. Therefore events queue is searched for first
event with timestamp, and extra PropertyNotify is generated in order to make event with timestamp, and extra PropertyNotify is generated in order to make
@ -261,20 +261,20 @@ void updateXTime()
if ( !w ) if ( !w )
w = new QWidget; w = new QWidget;
long data = 1; long data = 1;
XChangeProperty(QX11Info::display(), w->winId(), atoms->kwin_running, atoms->kwin_running, 32, XChangeProperty(display(), w->winId(), atoms->kwin_running, atoms->kwin_running, 32,
PropModeAppend, (unsigned char*) &data, 1); PropModeAppend, (unsigned char*) &data, 1);
next_x_time = CurrentTime; next_x_time = CurrentTime;
XEvent dummy; XEvent dummy;
XCheckIfEvent( QX11Info::display(), &dummy, update_x_time_predicate, NULL ); XCheckIfEvent( display(), &dummy, update_x_time_predicate, NULL );
if( next_x_time == CurrentTime ) if( next_x_time == CurrentTime )
{ {
XSync( QX11Info::display(), False ); XSync( display(), False );
XCheckIfEvent( QX11Info::display(), &dummy, update_x_time_predicate, NULL ); XCheckIfEvent( display(), &dummy, update_x_time_predicate, NULL );
} }
assert( next_x_time != CurrentTime ); assert( next_x_time != CurrentTime );
QX11Info::setAppTime( next_x_time ); QX11Info::setAppTime( next_x_time );
XEvent ev; // remove the PropertyNotify event from the events queue XEvent ev; // remove the PropertyNotify event from the events queue
XWindowEvent( QX11Info::display(), w->winId(), PropertyChangeMask, &ev ); XWindowEvent( display(), w->winId(), PropertyChangeMask, &ev );
} }
static int server_grab_count = 0; static int server_grab_count = 0;
@ -282,7 +282,7 @@ static int server_grab_count = 0;
void grabXServer() void grabXServer()
{ {
if( ++server_grab_count == 1 ) if( ++server_grab_count == 1 )
XGrabServer( QX11Info::display()); XGrabServer( display());
} }
void ungrabXServer() void ungrabXServer()
@ -290,8 +290,8 @@ void ungrabXServer()
assert( server_grab_count > 0 ); assert( server_grab_count > 0 );
if( --server_grab_count == 0 ) if( --server_grab_count == 0 )
{ {
XUngrabServer( QX11Info::display()); XUngrabServer( display());
XFlush( QX11Info::display()); XFlush( display());
Notify::sendPendingEvents(); Notify::sendPendingEvents();
} }
} }
@ -332,7 +332,7 @@ ShortcutDialog::ShortcutDialog( const KShortcut& cut )
// make it a popup, so that it has the grab // make it a popup, so that it has the grab
XSetWindowAttributes attrs; XSetWindowAttributes attrs;
attrs.override_redirect = True; attrs.override_redirect = True;
XChangeWindowAttributes( QX11Info::display(), winId(), CWOverrideRedirect, &attrs ); XChangeWindowAttributes( display(), winId(), CWOverrideRedirect, &attrs );
setWindowFlags( Qt::Popup ); setWindowFlags( Qt::Popup );
} }

31
utils.h
View file

@ -17,6 +17,7 @@ License. See the file "COPYING" for the exact licensing terms.
#include <netwm_def.h> #include <netwm_def.h>
#include <kshortcutdialog.h> #include <kshortcutdialog.h>
#include <limits.h> #include <limits.h>
#include <QX11Info>
namespace KWinInternal namespace KWinInternal
{ {
@ -191,6 +192,36 @@ void grabXServer();
void ungrabXServer(); void ungrabXServer();
bool grabbedXServer(); bool grabbedXServer();
inline
Display* display()
{
return QX11Info::display();
}
inline
Window rootWindow()
{
return QX11Info::appRootWindow();
}
inline
Window xTime()
{
return QX11Info::appTime();
}
inline
int displayWidth()
{
return XDisplayWidth( display(), DefaultScreen( display()));
}
inline
int displayHeight()
{
return XDisplayHeight( display(), DefaultScreen( display()));
}
// the docs say it's UrgencyHint, but it's often #defined as XUrgencyHint // the docs say it's UrgencyHint, but it's often #defined as XUrgencyHint
#ifndef UrgencyHint #ifndef UrgencyHint
#define UrgencyHint XUrgencyHint #define UrgencyHint XUrgencyHint

View file

@ -43,7 +43,6 @@ License. See the file "COPYING" for the exact licensing terms.
#include "group.h" #include "group.h"
#include "rules.h" #include "rules.h"
#include "kwinadaptor.h" #include "kwinadaptor.h"
#include "unmanaged.h"
#include <X11/extensions/shape.h> #include <X11/extensions/shape.h>
#include <X11/keysym.h> #include <X11/keysym.h>
@ -123,8 +122,7 @@ Workspace::Workspace( bool restore )
topmenu_space( NULL ), topmenu_space( NULL ),
set_active_client_recursion( 0 ), set_active_client_recursion( 0 ),
block_stacking_updates( 0 ), block_stacking_updates( 0 ),
forced_global_mouse_grab( false ), forced_global_mouse_grab( false )
damage_region( None )
{ {
new KWinAdaptor( "org.kde.kwin", "/KWin", QDBus::sessionBus(), this ); new KWinAdaptor( "org.kde.kwin", "/KWin", QDBus::sessionBus(), this );
@ -168,12 +166,10 @@ Workspace::Workspace( bool restore )
ColormapChangeMask | ColormapChangeMask |
SubstructureRedirectMask | SubstructureRedirectMask |
SubstructureNotifyMask | SubstructureNotifyMask |
FocusChangeMask | // for NotifyDetailNone FocusChangeMask // for NotifyDetailNone
ExposureMask
); );
Extensions::init(); Shape::init();
setupCompositing();
// compatibility // compatibility
long data = 1; long data = 1;
@ -322,7 +318,6 @@ void Workspace::init()
connect(&reconfigureTimer, SIGNAL(timeout()), this, connect(&reconfigureTimer, SIGNAL(timeout()), this,
SLOT(slotReconfigure())); SLOT(slotReconfigure()));
connect( &updateToolWindowsTimer, SIGNAL( timeout()), this, SLOT( slotUpdateToolWindows())); connect( &updateToolWindowsTimer, SIGNAL( timeout()), this, SLOT( slotUpdateToolWindows()));
connect( &compositeTimer, SIGNAL( timeout()), SLOT( compositeTimeout()));
connect(kapp, SIGNAL(appearanceChanged()), this, connect(kapp, SIGNAL(appearanceChanged()), this,
SLOT(slotReconfigure())); SLOT(slotReconfigure()));
@ -359,11 +354,7 @@ void Workspace::init()
XWindowAttributes attr; XWindowAttributes attr;
XGetWindowAttributes(display(), wins[i], &attr); XGetWindowAttributes(display(), wins[i], &attr);
if (attr.override_redirect ) if (attr.override_redirect )
{
if( attr.map_state != IsUnmapped && attr.c_class != InputOnly && compositing())
createUnmanaged( wins[ i ] );
continue; continue;
}
if( topmenu_space && topmenu_space->winId() == wins[ i ] ) if( topmenu_space && topmenu_space->winId() == wins[ i ] )
continue; continue;
if (attr.map_state != IsUnmapped) if (attr.map_state != IsUnmapped)
@ -426,7 +417,6 @@ void Workspace::init()
Workspace::~Workspace() Workspace::~Workspace()
{ {
finishCompositing();
blockStackingUpdates( true ); blockStackingUpdates( true );
// TODO grabXServer(); // TODO grabXServer();
// use stacking_order, so that kwin --replace keeps stacking order // use stacking_order, so that kwin --replace keeps stacking order
@ -438,10 +428,6 @@ Workspace::~Workspace()
(*it)->releaseWindow( true ); (*it)->releaseWindow( true );
// no removeClient() is called ! // no removeClient() is called !
} }
for( UnmanagedList::ConstIterator it = unmanaged.begin();
it != unmanaged.end();
++it )
(*it)->release();
delete desktop_widget; delete desktop_widget;
delete tab_box; delete tab_box;
delete popupinfo; delete popupinfo;
@ -488,18 +474,6 @@ Client* Workspace::createClient( Window w, bool is_mapped )
return c; return c;
} }
Unmanaged* Workspace::createUnmanaged( Window w )
{
Unmanaged* c = new Unmanaged( this );
if( !c->track( w ))
{
Unmanaged::deleteUnmanaged( c, Allowed );
return NULL;
}
addUnmanaged( c, Allowed );
return c;
}
void Workspace::addClient( Client* c, allowed_t ) void Workspace::addClient( Client* c, allowed_t )
{ {
Group* grp = findGroup( c->window()); Group* grp = findGroup( c->window());
@ -539,11 +513,6 @@ void Workspace::addClient( Client* c, allowed_t )
updateToolWindows( true ); updateToolWindows( true );
} }
void Workspace::addUnmanaged( Unmanaged* c, allowed_t )
{
unmanaged.append( c );
}
/* /*
Destroys the client \a c Destroys the client \a c
*/ */
@ -598,12 +567,6 @@ void Workspace::removeClient( Client* c, allowed_t )
updateClientArea(); updateClientArea();
} }
void Workspace::removeUnmanaged( Unmanaged* c, allowed_t )
{
assert( unmanaged.contains( c ));
unmanaged.removeAll( c );
}
void Workspace::updateFocusChains( Client* c, FocusChainChange change ) void Workspace::updateFocusChains( Client* c, FocusChainChange change )
{ {
if( !c->wantsTabFocus()) // doesn't want tab focus, remove if( !c->wantsTabFocus()) // doesn't want tab focus, remove
@ -900,7 +863,7 @@ void Workspace::slotSettingsChanged(int category)
/*! /*!
Reread settings Reread settings
*/ */
KWIN_PROCEDURE( CheckBorderSizesProcedure, Client, cl->checkBorderSizes() ); KWIN_PROCEDURE( CheckBorderSizesProcedure, cl->checkBorderSizes() );
void Workspace::slotReconfigure() void Workspace::slotReconfigure()
{ {
@ -957,11 +920,6 @@ void Workspace::slotReconfigure()
updateTopMenuGeometry(); updateTopMenuGeometry();
updateCurrentTopMenu(); updateCurrentTopMenu();
} }
if( options->useTranslucency )
setupCompositing();
else
finishCompositing();
loadWindowRules(); loadWindowRules();
for( ClientList::Iterator it = clients.begin(); for( ClientList::Iterator it = clients.begin();
@ -1663,7 +1621,7 @@ void Workspace::slotGrabWindow()
QPixmap snapshot = QPixmap::grabWindow( active_client->frameId() ); QPixmap snapshot = QPixmap::grabWindow( active_client->frameId() );
//No XShape - no work. //No XShape - no work.
if( Extensions::shapeAvailable()) if( Shape::available())
{ {
//As the first step, get the mask from XShape. //As the first step, get the mask from XShape.
int count, order; int count, order;

View file

@ -77,7 +77,7 @@ class Workspace : public QObject, public KDecorationDefines
virtual ~Workspace(); virtual ~Workspace();
static Workspace * self() { return _self; } static Workspace * self() { return _self; }
bool workspaceEvent( XEvent * ); bool workspaceEvent( XEvent * );
KDecoration* createDecoration( KDecorationBridge* bridge ); KDecoration* createDecoration( KDecorationBridge* bridge );
@ -87,9 +87,6 @@ class Workspace : public QObject, public KDecorationDefines
template< typename T > Client* findClient( T predicate ); template< typename T > Client* findClient( T predicate );
template< typename T1, typename T2 > void forEachClient( T1 procedure, T2 predicate ); template< typename T1, typename T2 > void forEachClient( T1 procedure, T2 predicate );
template< typename T > void forEachClient( T procedure ); template< typename T > void forEachClient( T procedure );
template< typename T > Unmanaged* findUnmanaged( T predicate );
template< typename T1, typename T2 > void forEachUnmanaged( T1 procedure, T2 predicate );
template< typename T > void forEachUnmanaged( T procedure );
QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const; QRect clientArea( clientAreaOption, const QPoint& p, int desktop ) const;
QRect clientArea( clientAreaOption, const Client* c ) const; QRect clientArea( clientAreaOption, const Client* c ) const;
@ -245,9 +242,6 @@ class Workspace : public QObject, public KDecorationDefines
void removeGroup( Group* group, allowed_t ); void removeGroup( Group* group, allowed_t );
Group* findClientLeaderGroup( const Client* c ) const; Group* findClientLeaderGroup( const Client* c ) const;
// only called from Unmanaged::release()
void removeUnmanaged( Unmanaged*, allowed_t );
bool checkStartupNotification( Window w, KStartupInfoId& id, KStartupInfoData& data ); bool checkStartupNotification( Window w, KStartupInfoId& id, KStartupInfoData& data );
void focusToNull(); // SELI public? void focusToNull(); // SELI public?
@ -282,13 +276,6 @@ class Workspace : public QObject, public KDecorationDefines
void requestDelayFocus( Client* ); void requestDelayFocus( Client* );
void toggleTopDockShadows(bool on); void toggleTopDockShadows(bool on);
void addDamage( const QRect& r );
void addDamage( int x, int y, int w, int h );
void addDamage( XserverRegion r, bool destroy );
void addDamage( Toplevel* c, const QRect& r );
void addDamage( Toplevel* c, int x, int y, int w, int h );
void addDamage( Toplevel* c, XserverRegion r, bool destroy );
public slots: public slots:
void refresh(); void refresh();
@ -301,8 +288,48 @@ class Workspace : public QObject, public KDecorationDefines
void slotSwitchDesktopDown(); void slotSwitchDesktopDown();
void slotSwitchToDesktop( int ); void slotSwitchToDesktop( int );
void slotSwitchToDesktop1() { return slotSwitchToDesktop( 1 ); }
void slotSwitchToDesktop2() { return slotSwitchToDesktop( 2 ); }
void slotSwitchToDesktop3() { return slotSwitchToDesktop( 3 ); }
void slotSwitchToDesktop4() { return slotSwitchToDesktop( 4 ); }
void slotSwitchToDesktop5() { return slotSwitchToDesktop( 5 ); }
void slotSwitchToDesktop6() { return slotSwitchToDesktop( 6 ); }
void slotSwitchToDesktop7() { return slotSwitchToDesktop( 7 ); }
void slotSwitchToDesktop8() { return slotSwitchToDesktop( 8 ); }
void slotSwitchToDesktop9() { return slotSwitchToDesktop( 9 ); }
void slotSwitchToDesktop10() { return slotSwitchToDesktop( 10 ); }
void slotSwitchToDesktop11() { return slotSwitchToDesktop( 11 ); }
void slotSwitchToDesktop12() { return slotSwitchToDesktop( 12 ); }
void slotSwitchToDesktop13() { return slotSwitchToDesktop( 13 ); }
void slotSwitchToDesktop14() { return slotSwitchToDesktop( 14 ); }
void slotSwitchToDesktop15() { return slotSwitchToDesktop( 15 ); }
void slotSwitchToDesktop16() { return slotSwitchToDesktop( 16 ); }
void slotSwitchToDesktop17() { return slotSwitchToDesktop( 17 ); }
void slotSwitchToDesktop18() { return slotSwitchToDesktop( 18 ); }
void slotSwitchToDesktop19() { return slotSwitchToDesktop( 19 ); }
void slotSwitchToDesktop20() { return slotSwitchToDesktop( 20 ); }
//void slotSwitchToWindow( int ); //void slotSwitchToWindow( int );
void slotWindowToDesktop( int ); void slotWindowToDesktop( int );
void slotWindowToDesktop1() { return slotWindowToDesktop( 1 ); }
void slotWindowToDesktop2() { return slotWindowToDesktop( 2 ); }
void slotWindowToDesktop3() { return slotWindowToDesktop( 3 ); }
void slotWindowToDesktop4() { return slotWindowToDesktop( 4 ); }
void slotWindowToDesktop5() { return slotWindowToDesktop( 5 ); }
void slotWindowToDesktop6() { return slotWindowToDesktop( 6 ); }
void slotWindowToDesktop7() { return slotWindowToDesktop( 7 ); }
void slotWindowToDesktop8() { return slotWindowToDesktop( 8 ); }
void slotWindowToDesktop9() { return slotWindowToDesktop( 9 ); }
void slotWindowToDesktop10() { return slotWindowToDesktop( 10 ); }
void slotWindowToDesktop11() { return slotWindowToDesktop( 11 ); }
void slotWindowToDesktop12() { return slotWindowToDesktop( 12 ); }
void slotWindowToDesktop13() { return slotWindowToDesktop( 13 ); }
void slotWindowToDesktop14() { return slotWindowToDesktop( 14 ); }
void slotWindowToDesktop15() { return slotWindowToDesktop( 15 ); }
void slotWindowToDesktop16() { return slotWindowToDesktop( 16 ); }
void slotWindowToDesktop17() { return slotWindowToDesktop( 17 ); }
void slotWindowToDesktop18() { return slotWindowToDesktop( 18 ); }
void slotWindowToDesktop19() { return slotWindowToDesktop( 19 ); }
void slotWindowToDesktop20() { return slotWindowToDesktop( 20 ); }
//void slotWindowToListPosition( int ); //void slotWindowToListPosition( int );
void slotWindowMaximize(); void slotWindowMaximize();
@ -379,10 +406,11 @@ class Workspace : public QObject, public KDecorationDefines
void cleanupTemporaryRules(); void cleanupTemporaryRules();
void writeWindowRules(); void writeWindowRules();
void kipcMessage( int id, int data ); void kipcMessage( int id, int data );
// kompmgr
void setPopupClientOpacity(int v); void setPopupClientOpacity(int v);
void resetClientOpacity(); void resetClientOpacity();
void setTransButtonText(int value); void setTransButtonText(int value);
void compositeTimeout(); // end
protected: protected:
bool keyPressMouseEmulation( XKeyEvent& ev ); bool keyPressMouseEmulation( XKeyEvent& ev );
@ -430,8 +458,6 @@ class Workspace : public QObject, public KDecorationDefines
// this is the right way to create a new client // this is the right way to create a new client
Client* createClient( Window w, bool is_mapped ); Client* createClient( Window w, bool is_mapped );
void addClient( Client* c, allowed_t ); void addClient( Client* c, allowed_t );
Unmanaged* createUnmanaged( Window w );
void addUnmanaged( Unmanaged* c, allowed_t );
Window findSpecialEventWindow( XEvent* e ); Window findSpecialEventWindow( XEvent* e );
@ -473,9 +499,6 @@ class Workspace : public QObject, public KDecorationDefines
void closeActivePopup(); void closeActivePopup();
void updateClientArea( bool force ); void updateClientArea( bool force );
void setupCompositing();
void finishCompositing();
SystemTrayWindowList systemTrayWins; SystemTrayWindowList systemTrayWins;
@ -512,7 +535,6 @@ class Workspace : public QObject, public KDecorationDefines
ClientList clients; ClientList clients;
ClientList desktops; ClientList desktops;
UnmanagedList unmanaged;
ClientList unconstrained_stacking_order; ClientList unconstrained_stacking_order;
ClientList stacking_order; ClientList stacking_order;
@ -632,10 +654,8 @@ class Workspace : public QObject, public KDecorationDefines
Window null_focus_window; Window null_focus_window;
bool forced_global_mouse_grab; bool forced_global_mouse_grab;
friend class StackingUpdatesBlocker; friend class StackingUpdatesBlocker;
QTimer compositeTimer;
XserverRegion damage_region;
//kompmgr
QSlider *transSlider; QSlider *transSlider;
QPushButton *transButton; QPushButton *transButton;
}; };
@ -807,27 +827,7 @@ inline void Workspace::forEachClient( T procedure )
return forEachClient( procedure, TruePredicate()); return forEachClient( procedure, TruePredicate());
} }
template< typename T > KWIN_COMPARE_PREDICATE( ClientMatchPredicate, const Client*, cl == value );
inline Unmanaged* Workspace::findUnmanaged( T predicate )
{
return findUnmanagedInList( unmanaged, predicate );
}
template< typename T1, typename T2 >
inline void Workspace::forEachUnmanaged( T1 procedure, T2 predicate )
{
for ( UnmanagedList::ConstIterator it = unmanaged.begin(); it != unmanaged.end(); ++it)
if ( predicate( const_cast< const Unmanaged* >( *it)))
procedure( *it );
}
template< typename T >
inline void Workspace::forEachUnmanaged( T procedure )
{
return forEachUnmanaged( procedure, TruePredicate());
}
KWIN_COMPARE_PREDICATE( ClientMatchPredicate, Client, const Client*, cl == value );
inline bool Workspace::hasClient( const Client* c ) inline bool Workspace::hasClient( const Client* c )
{ {
return findClient( ClientMatchPredicate( c )); return findClient( ClientMatchPredicate( c ));