Patch from Christopher J. Suleski (linux tildewave com) implementing #30426.
CCMAIL: 30426-done@bugs.kde.org svn path=/trunk/kdebase/kwin/; revision=315341
This commit is contained in:
parent
d951f55689
commit
5632bb5129
9 changed files with 132 additions and 2 deletions
|
@ -331,6 +331,7 @@ void Workspace::takeActivity( Client* c, int flags, bool handled )
|
||||||
c = modal;
|
c = modal;
|
||||||
handled = false;
|
handled = false;
|
||||||
}
|
}
|
||||||
|
cancelDelayFocus();
|
||||||
}
|
}
|
||||||
if ( !( flags & ActivityFocusForce ) && ( c->isTopMenu() || c->isDock() || c->isSplash()) )
|
if ( !( flags & ActivityFocusForce ) && ( c->isTopMenu() || c->isDock() || c->isSplash()) )
|
||||||
flags &= ~ActivityFocus; // toplevel menus and dock windows don't take focus if not forced
|
flags &= ~ActivityFocus; // toplevel menus and dock windows don't take focus if not forced
|
||||||
|
|
|
@ -890,8 +890,11 @@ void Client::enterNotifyEvent( XCrossingEvent* e )
|
||||||
|
|
||||||
if ( options->focusPolicy != Options::FocusStrictlyUnderMouse && ( isDesktop() || isDock() || isTopMenu() ) )
|
if ( options->focusPolicy != Options::FocusStrictlyUnderMouse && ( isDesktop() || isDock() || isTopMenu() ) )
|
||||||
return;
|
return;
|
||||||
|
if ( options->delayFocus )
|
||||||
|
workspace()->requestDelayFocus( this );
|
||||||
|
else
|
||||||
|
workspace()->requestFocus( this );
|
||||||
|
|
||||||
workspace()->requestFocus( this );
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -927,6 +930,7 @@ void Client::leaveNotifyEvent( XCrossingEvent* e )
|
||||||
if ( lostMouse )
|
if ( lostMouse )
|
||||||
{
|
{
|
||||||
cancelAutoRaise();
|
cancelAutoRaise();
|
||||||
|
workspace()->cancelDelayFocus();
|
||||||
delete shadeHoverTimer;
|
delete shadeHoverTimer;
|
||||||
shadeHoverTimer = 0;
|
shadeHoverTimer = 0;
|
||||||
if ( shade_mode == ShadeHover && !moveResizeMode && !buttonDown )
|
if ( shade_mode == ShadeHover && !moveResizeMode && !buttonDown )
|
||||||
|
|
|
@ -57,6 +57,8 @@
|
||||||
#define KWIN_GEOMETRY "GeometryTip"
|
#define KWIN_GEOMETRY "GeometryTip"
|
||||||
#define KWIN_AUTORAISE_INTERVAL "AutoRaiseInterval"
|
#define KWIN_AUTORAISE_INTERVAL "AutoRaiseInterval"
|
||||||
#define KWIN_AUTORAISE "AutoRaise"
|
#define KWIN_AUTORAISE "AutoRaise"
|
||||||
|
#define KWIN_DELAYFOCUS_INTERVAL "DelayFocusInterval"
|
||||||
|
#define KWIN_DELAYFOCUS "DelayFocus"
|
||||||
#define KWIN_CLICKRAISE "ClickRaise"
|
#define KWIN_CLICKRAISE "ClickRaise"
|
||||||
#define KWIN_ANIMSHADE "AnimateShade"
|
#define KWIN_ANIMSHADE "AnimateShade"
|
||||||
#define KWIN_MOVE_RESIZE_MAXIMIZED "MoveResizeMaximizedWindows"
|
#define KWIN_MOVE_RESIZE_MAXIMIZED "MoveResizeMaximizedWindows"
|
||||||
|
@ -164,6 +166,19 @@ KFocusConfig::KFocusConfig (bool _standAlone, KConfig *_config, QWidget * parent
|
||||||
autoRaise->setSuffix(i18n(" msec"));
|
autoRaise->setSuffix(i18n(" msec"));
|
||||||
fLay->addWidget(autoRaise);
|
fLay->addWidget(autoRaise);
|
||||||
|
|
||||||
|
connect(focusCombo, SIGNAL(activated(int)), this, SLOT(setDelayFocusEnabled()) );
|
||||||
|
|
||||||
|
delayFocusOn = new QCheckBox(i18n("Delay focus"), fcsBox);
|
||||||
|
fLay->addWidget(delayFocusOn);
|
||||||
|
connect(delayFocusOn,SIGNAL(toggled(bool)), this, SLOT(delayFocusOnTog(bool)));
|
||||||
|
|
||||||
|
delayFocus = new KIntNumInput(500, fcsBox);
|
||||||
|
delayFocus->setLabel(i18n("Dela&y:"), Qt::AlignVCenter|Qt::AlignLeft);
|
||||||
|
delayFocus->setRange(0, 3000, 100, true);
|
||||||
|
delayFocus->setSteps(100,100);
|
||||||
|
delayFocus->setSuffix(i18n(" msec"));
|
||||||
|
fLay->addWidget(delayFocus);
|
||||||
|
|
||||||
clickRaiseOn = new QCheckBox(i18n("C&lick raise active window"), fcsBox);
|
clickRaiseOn = new QCheckBox(i18n("C&lick raise active window"), fcsBox);
|
||||||
connect(clickRaiseOn,SIGNAL(toggled(bool)), this, SLOT(clickRaiseOnTog(bool)));
|
connect(clickRaiseOn,SIGNAL(toggled(bool)), this, SLOT(clickRaiseOnTog(bool)));
|
||||||
fLay->addWidget(clickRaiseOn);
|
fLay->addWidget(clickRaiseOn);
|
||||||
|
@ -182,6 +197,11 @@ KFocusConfig::KFocusConfig (bool _standAlone, KConfig *_config, QWidget * parent
|
||||||
" it for inactive windows, you need to change the settings"
|
" it for inactive windows, you need to change the settings"
|
||||||
" in the Actions tab.") );
|
" in the Actions tab.") );
|
||||||
|
|
||||||
|
QWhatsThis::add( delayFocusOn, i18n("When this option is enabled, there will be a delay after which the"
|
||||||
|
" window the mouse pointer is over will become active (receive focus).") );
|
||||||
|
QWhatsThis::add( delayFocus, i18n("This is the delay after which the window the mouse pointer is over"
|
||||||
|
" will automatically receive focus.") );
|
||||||
|
|
||||||
lay->addWidget(fcsBox);
|
lay->addWidget(fcsBox);
|
||||||
|
|
||||||
kbdBox = new QButtonGroup(i18n("Navigation"), this);
|
kbdBox = new QButtonGroup(i18n("Navigation"), this);
|
||||||
|
@ -235,6 +255,7 @@ KFocusConfig::KFocusConfig (bool _standAlone, KConfig *_config, QWidget * parent
|
||||||
connect(focusCombo, SIGNAL(activated(int)), SLOT(changed()));
|
connect(focusCombo, SIGNAL(activated(int)), SLOT(changed()));
|
||||||
connect(fcsBox, SIGNAL(clicked(int)), SLOT(changed()));
|
connect(fcsBox, SIGNAL(clicked(int)), SLOT(changed()));
|
||||||
connect(autoRaise, SIGNAL(valueChanged(int)), SLOT(changed()));
|
connect(autoRaise, SIGNAL(valueChanged(int)), SLOT(changed()));
|
||||||
|
connect(delayFocus, SIGNAL(valueChanged(int)), SLOT(changed()));
|
||||||
connect(kdeMode, SIGNAL(clicked()), SLOT(changed()));
|
connect(kdeMode, SIGNAL(clicked()), SLOT(changed()));
|
||||||
connect(cdeMode, SIGNAL(clicked()), SLOT(changed()));
|
connect(cdeMode, SIGNAL(clicked()), SLOT(changed()));
|
||||||
connect(traverseAll, SIGNAL(clicked()), SLOT(changed()));
|
connect(traverseAll, SIGNAL(clicked()), SLOT(changed()));
|
||||||
|
@ -263,16 +284,31 @@ void KFocusConfig::setAutoRaiseInterval(int tb)
|
||||||
autoRaise->setValue(tb);
|
autoRaise->setValue(tb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KFocusConfig::setDelayFocusInterval(int tb)
|
||||||
|
{
|
||||||
|
delayFocus->setValue(tb);
|
||||||
|
}
|
||||||
|
|
||||||
int KFocusConfig::getAutoRaiseInterval()
|
int KFocusConfig::getAutoRaiseInterval()
|
||||||
{
|
{
|
||||||
return autoRaise->value();
|
return autoRaise->value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int KFocusConfig::getDelayFocusInterval()
|
||||||
|
{
|
||||||
|
return delayFocus->value();
|
||||||
|
}
|
||||||
|
|
||||||
void KFocusConfig::setAutoRaise(bool on)
|
void KFocusConfig::setAutoRaise(bool on)
|
||||||
{
|
{
|
||||||
autoRaiseOn->setChecked(on);
|
autoRaiseOn->setChecked(on);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KFocusConfig::setDelayFocus(bool on)
|
||||||
|
{
|
||||||
|
delayFocusOn->setChecked(on);
|
||||||
|
}
|
||||||
|
|
||||||
void KFocusConfig::setClickRaise(bool on)
|
void KFocusConfig::setClickRaise(bool on)
|
||||||
{
|
{
|
||||||
clickRaiseOn->setChecked(on);
|
clickRaiseOn->setChecked(on);
|
||||||
|
@ -293,12 +329,30 @@ void KFocusConfig::setAutoRaiseEnabled()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KFocusConfig::setDelayFocusEnabled()
|
||||||
|
{
|
||||||
|
// the delayed focus related widgets are: delayFocus
|
||||||
|
if ( focusCombo->currentItem() != CLICK_TO_FOCUS )
|
||||||
|
{
|
||||||
|
delayFocusOn->setEnabled(true);
|
||||||
|
delayFocusOnTog(delayFocusOn->isChecked());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delayFocusOn->setEnabled(false);
|
||||||
|
delayFocusOnTog(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void KFocusConfig::autoRaiseOnTog(bool a) {
|
void KFocusConfig::autoRaiseOnTog(bool a) {
|
||||||
autoRaise->setEnabled(a);
|
autoRaise->setEnabled(a);
|
||||||
clickRaiseOn->setEnabled( !a );
|
clickRaiseOn->setEnabled( !a );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KFocusConfig::delayFocusOnTog(bool a) {
|
||||||
|
delayFocus->setEnabled(a);
|
||||||
|
}
|
||||||
|
|
||||||
void KFocusConfig::clickRaiseOnTog(bool ) {
|
void KFocusConfig::clickRaiseOnTog(bool ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,11 +392,17 @@ void KFocusConfig::load( void )
|
||||||
int k = config->readNumEntry(KWIN_AUTORAISE_INTERVAL,750);
|
int k = config->readNumEntry(KWIN_AUTORAISE_INTERVAL,750);
|
||||||
setAutoRaiseInterval(k);
|
setAutoRaiseInterval(k);
|
||||||
|
|
||||||
|
k = config->readNumEntry(KWIN_DELAYFOCUS_INTERVAL,750);
|
||||||
|
setDelayFocusInterval(k);
|
||||||
|
|
||||||
key = config->readEntry(KWIN_AUTORAISE);
|
key = config->readEntry(KWIN_AUTORAISE);
|
||||||
setAutoRaise(key == "on");
|
setAutoRaise(key == "on");
|
||||||
|
key = config->readEntry(KWIN_DELAYFOCUS);
|
||||||
|
setDelayFocus(key == "on");
|
||||||
key = config->readEntry(KWIN_CLICKRAISE);
|
key = config->readEntry(KWIN_CLICKRAISE);
|
||||||
setClickRaise(key != "off");
|
setClickRaise(key != "off");
|
||||||
setAutoRaiseEnabled(); // this will disable/hide the auto raise delay widget if focus==click
|
setAutoRaiseEnabled(); // this will disable/hide the auto raise delay widget if focus==click
|
||||||
|
setDelayFocusEnabled();
|
||||||
|
|
||||||
key = config->readEntry(KWIN_ALTTABMODE, "KDE");
|
key = config->readEntry(KWIN_ALTTABMODE, "KDE");
|
||||||
setAltTabMode(key == "KDE");
|
setAltTabMode(key == "KDE");
|
||||||
|
@ -379,11 +439,20 @@ void KFocusConfig::save( void )
|
||||||
if (v <0) v = 0;
|
if (v <0) v = 0;
|
||||||
config->writeEntry(KWIN_AUTORAISE_INTERVAL,v);
|
config->writeEntry(KWIN_AUTORAISE_INTERVAL,v);
|
||||||
|
|
||||||
|
v = getDelayFocusInterval();
|
||||||
|
if (v <0) v = 0;
|
||||||
|
config->writeEntry(KWIN_DELAYFOCUS_INTERVAL,v);
|
||||||
|
|
||||||
if (autoRaiseOn->isChecked())
|
if (autoRaiseOn->isChecked())
|
||||||
config->writeEntry(KWIN_AUTORAISE, "on");
|
config->writeEntry(KWIN_AUTORAISE, "on");
|
||||||
else
|
else
|
||||||
config->writeEntry(KWIN_AUTORAISE, "off");
|
config->writeEntry(KWIN_AUTORAISE, "off");
|
||||||
|
|
||||||
|
if (delayFocusOn->isChecked())
|
||||||
|
config->writeEntry(KWIN_DELAYFOCUS, "on");
|
||||||
|
else
|
||||||
|
config->writeEntry(KWIN_DELAYFOCUS, "off");
|
||||||
|
|
||||||
if (clickRaiseOn->isChecked())
|
if (clickRaiseOn->isChecked())
|
||||||
config->writeEntry(KWIN_CLICKRAISE, "on");
|
config->writeEntry(KWIN_CLICKRAISE, "on");
|
||||||
else
|
else
|
||||||
|
@ -417,8 +486,10 @@ void KFocusConfig::save( void )
|
||||||
void KFocusConfig::defaults()
|
void KFocusConfig::defaults()
|
||||||
{
|
{
|
||||||
setAutoRaiseInterval(0);
|
setAutoRaiseInterval(0);
|
||||||
|
setDelayFocusInterval(0);
|
||||||
setFocus(CLICK_TO_FOCUS);
|
setFocus(CLICK_TO_FOCUS);
|
||||||
setAutoRaise(false);
|
setAutoRaise(false);
|
||||||
|
setDelayFocus(false);
|
||||||
setClickRaise(true);
|
setClickRaise(true);
|
||||||
setAltTabMode(true);
|
setAltTabMode(true);
|
||||||
setTraverseAll( false );
|
setTraverseAll( false );
|
||||||
|
|
|
@ -77,8 +77,10 @@ public:
|
||||||
void defaults();
|
void defaults();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void setDelayFocusEnabled();
|
||||||
void setAutoRaiseEnabled();
|
void setAutoRaiseEnabled();
|
||||||
void autoRaiseOnTog(bool);//CT 23Oct1998
|
void autoRaiseOnTog(bool);//CT 23Oct1998
|
||||||
|
void delayFocusOnTog(bool);
|
||||||
void clickRaiseOnTog(bool);
|
void clickRaiseOnTog(bool);
|
||||||
void changed() { emit KCModule::changed(true); }
|
void changed() { emit KCModule::changed(true); }
|
||||||
|
|
||||||
|
@ -87,10 +89,13 @@ private:
|
||||||
|
|
||||||
int getFocus( void );
|
int getFocus( void );
|
||||||
int getAutoRaiseInterval( void );
|
int getAutoRaiseInterval( void );
|
||||||
|
int getDelayFocusInterval( void );
|
||||||
|
|
||||||
void setFocus(int);
|
void setFocus(int);
|
||||||
void setAutoRaiseInterval(int);
|
void setAutoRaiseInterval(int);
|
||||||
void setAutoRaise(bool);
|
void setAutoRaise(bool);
|
||||||
|
void setDelayFocusInterval(int);
|
||||||
|
void setDelayFocus(bool);
|
||||||
void setClickRaise(bool);
|
void setClickRaise(bool);
|
||||||
void setAltTabMode(bool);
|
void setAltTabMode(bool);
|
||||||
void setTraverseAll(bool);
|
void setTraverseAll(bool);
|
||||||
|
@ -100,8 +105,10 @@ private:
|
||||||
QButtonGroup *fcsBox;
|
QButtonGroup *fcsBox;
|
||||||
QComboBox *focusCombo;
|
QComboBox *focusCombo;
|
||||||
QCheckBox *autoRaiseOn;
|
QCheckBox *autoRaiseOn;
|
||||||
|
QCheckBox *delayFocusOn;
|
||||||
QCheckBox *clickRaiseOn;
|
QCheckBox *clickRaiseOn;
|
||||||
KIntNumInput *autoRaise;
|
KIntNumInput *autoRaise;
|
||||||
|
KIntNumInput *delayFocus;
|
||||||
|
|
||||||
QButtonGroup *kbdBox;
|
QButtonGroup *kbdBox;
|
||||||
QRadioButton *kdeMode;
|
QRadioButton *kdeMode;
|
||||||
|
|
|
@ -45,6 +45,8 @@
|
||||||
<entry key="Placement" type="String" />
|
<entry key="Placement" type="String" />
|
||||||
<entry key="AutoRaise" type="Bool" />
|
<entry key="AutoRaise" type="Bool" />
|
||||||
<entry key="AutoRaiseInterval" type="Int" />
|
<entry key="AutoRaiseInterval" type="Int" />
|
||||||
|
<entry key="DelayFocus" type="Bool" />
|
||||||
|
<entry key="DelayFocusInterval" type="Int" />
|
||||||
<entry key="ShadeHoverInterval" type="Int" />
|
<entry key="ShadeHoverInterval" type="Int" />
|
||||||
<entry key="ClickRaise" type="Bool" />
|
<entry key="ClickRaise" type="Bool" />
|
||||||
<entry key="BorderSnapZone" type="Int" />
|
<entry key="BorderSnapZone" type="Int" />
|
||||||
|
|
|
@ -108,11 +108,15 @@ unsigned long Options::updateSettings()
|
||||||
{
|
{
|
||||||
autoRaise = false;
|
autoRaise = false;
|
||||||
autoRaiseInterval = 0;
|
autoRaiseInterval = 0;
|
||||||
|
delayFocus = false;
|
||||||
|
delayFocusInterval = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
autoRaise = config->readBoolEntry("AutoRaise", FALSE );
|
autoRaise = config->readBoolEntry("AutoRaise", FALSE );
|
||||||
autoRaiseInterval = config->readNumEntry("AutoRaiseInterval", 0 );
|
autoRaiseInterval = config->readNumEntry("AutoRaiseInterval", 0 );
|
||||||
|
delayFocus = config->readBoolEntry("DelayFocus", FALSE );
|
||||||
|
delayFocusInterval = config->readNumEntry("DelayFocusInterval", 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
shadeHover = config->readBoolEntry("ShadeHover", FALSE );
|
shadeHover = config->readBoolEntry("ShadeHover", FALSE );
|
||||||
|
|
10
options.h
10
options.h
|
@ -83,6 +83,16 @@ class Options : public KDecorationOptions
|
||||||
*/
|
*/
|
||||||
int autoRaiseInterval;
|
int autoRaiseInterval;
|
||||||
|
|
||||||
|
/**
|
||||||
|
whether delay focus is enabled or not.
|
||||||
|
*/
|
||||||
|
bool delayFocus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
delayed focus interval
|
||||||
|
*/
|
||||||
|
int delayFocusInterval;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Whether shade hover is enabled or not
|
Whether shade hover is enabled or not
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -70,6 +70,7 @@ Workspace::Workspace( bool restore )
|
||||||
most_recently_raised (0),
|
most_recently_raised (0),
|
||||||
movingClient(0),
|
movingClient(0),
|
||||||
pending_take_activity ( NULL ),
|
pending_take_activity ( NULL ),
|
||||||
|
delayfocus_client (0),
|
||||||
was_user_interaction (false),
|
was_user_interaction (false),
|
||||||
session_saving (false),
|
session_saving (false),
|
||||||
control_grab (false),
|
control_grab (false),
|
||||||
|
@ -109,6 +110,8 @@ Workspace::Workspace( bool restore )
|
||||||
|
|
||||||
updateXTime(); // needed for proper initialization of user_time in Client ctor
|
updateXTime(); // needed for proper initialization of user_time in Client ctor
|
||||||
|
|
||||||
|
delayFocusTimer = 0;
|
||||||
|
|
||||||
electric_time_first = qt_x_time;
|
electric_time_first = qt_x_time;
|
||||||
electric_time_last = qt_x_time;
|
electric_time_last = qt_x_time;
|
||||||
|
|
||||||
|
@ -1641,7 +1644,27 @@ QWidget* Workspace::desktopWidget()
|
||||||
return desktop_widget;
|
return desktop_widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Delayed focus functions
|
||||||
|
void Workspace::delayFocus()
|
||||||
|
{
|
||||||
|
requestFocus( delayfocus_client );
|
||||||
|
cancelDelayFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Workspace::requestDelayFocus( Client* c )
|
||||||
|
{
|
||||||
|
delayfocus_client = c;
|
||||||
|
delete delayFocusTimer;
|
||||||
|
delayFocusTimer = new QTimer( this );
|
||||||
|
connect( delayFocusTimer, SIGNAL( timeout() ), this, SLOT( delayFocus() ) );
|
||||||
|
delayFocusTimer->start( options->delayFocusInterval, TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Workspace::cancelDelayFocus()
|
||||||
|
{
|
||||||
|
delete delayFocusTimer;
|
||||||
|
delayFocusTimer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Electric Borders
|
// Electric Borders
|
||||||
//========================================================================//
|
//========================================================================//
|
||||||
|
|
|
@ -244,6 +244,9 @@ class Workspace : public QObject, public KWinInterface, public KDecorationDefine
|
||||||
|
|
||||||
static QStringList configModules(bool controlCenter);
|
static QStringList configModules(bool controlCenter);
|
||||||
|
|
||||||
|
void cancelDelayFocus();
|
||||||
|
void requestDelayFocus( Client* );
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void refresh();
|
void refresh();
|
||||||
// keybindings
|
// keybindings
|
||||||
|
@ -320,6 +323,7 @@ class Workspace : public QObject, public KWinInterface, public KDecorationDefine
|
||||||
void slotUpdateToolWindows();
|
void slotUpdateToolWindows();
|
||||||
void lostTopMenuSelection();
|
void lostTopMenuSelection();
|
||||||
void lostTopMenuOwner();
|
void lostTopMenuOwner();
|
||||||
|
void delayFocus();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool keyPressMouseEmulation( XKeyEvent& ev );
|
bool keyPressMouseEmulation( XKeyEvent& ev );
|
||||||
|
@ -431,6 +435,10 @@ class Workspace : public QObject, public KWinInterface, public KDecorationDefine
|
||||||
Client* movingClient;
|
Client* movingClient;
|
||||||
Client* pending_take_activity;
|
Client* pending_take_activity;
|
||||||
|
|
||||||
|
// delay(ed) window focus timer and client
|
||||||
|
QTimer* delayFocusTimer;
|
||||||
|
Client* delayfocus_client;
|
||||||
|
|
||||||
ClientList clients;
|
ClientList clients;
|
||||||
ClientList desktops;
|
ClientList desktops;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue