当前位置

ksmsserver的困惑

主标签

大家都知道不起KDM就不能看到KDE注销时有关机和重启选项,为什么?
看下面:
void KSMServer::shutdown( KApplication::ShutdownConfirm confirm,
KApplication::ShutdownType sdtype, KApplication::ShutdownMode sdmode )
{
if ( state != Idle || dialogActive )
return;
dialogActive = true;

bool maysd, maynuke;
KApplication::ShutdownMode defsdmode;
QString fifoname;
QStringList dmopt =
QStringList::split( QChar( ',' ),
QString::fromLatin1( ::getenv( "XDM_MANAGED" ) ) );
if ( dmopt.isEmpty() || dmopt.first()[0] != QChar( '/' ) ) {
fifoname = QString::null;
maysd = maynuke = false;
defsdmode = KApplication::ShutdownModeSchedule;
} else {
fifoname = dmopt.first();
maysd = dmopt.contains( QString::fromLatin1( "maysd" ) ) != 0;
maynuke = dmopt.contains( QString::fromLatin1( "mayfn" ) ) != 0;
if ( dmopt.contains( QString::fromLatin1( "fn" ) ) != 0 )
defsdmode = KApplication::ShutdownModeForceNow;
else if ( dmopt.contains( QString::fromLatin1( "tn" ) ) != 0 )
defsdmode = KApplication::ShutdownModeTryNow;
else

就差在这个变量XDM_MANAGED上,如果系统设置了这个变量,就可以不需要启动KDM而看到那个带关机和重启的对话框,但是还是不能用。
if ( sdtype != KApplication::ShutdownTypeNone ) {
QFile fifo( fifoname );
if ( fifo.open( IO_WriteOnly | IO_Raw ) ) {
QCString cmd( "shutdown\t" );
cmd.append( sdtype == KApplication::ShutdownTypeReboot ?
"reboot\t" : "halt\t" );
cmd.append( sdmode == KApplication::ShutdownModeForceNow ?
"forcenow\n" :
sdmode == KApplication::ShutdownModeTryNow ?
"trynow\n" : "schedule\n" );
fifo.writeBlock( cmd.data(), cmd.length() );
fifo.close();
}
}
原因在这,kdm在启动的时候设置了大量的变量,这些ksmsserver使用的。
如果不能构建关机命令,自然也就无效了。
一个笨办法就是直接调用系统命令。

大概开发者为了保证整体完整性而建立这些错综复杂的证明和关联关系。

唯一不懂的就是这会不会有点慢?
不用kdm的人需不需要用的关机命令?在关机之前save 一下session不是更好。
KDM拿掉了这些乱七八糟的代码会不会快很多?
而ksmsserver的代码也会很干净?

不知道,没敢去修改,怕被人骂,可能我是幼稚的。