After some investigations I found few ways. KDE is setting it's own env variables. For KDE3:
KDE_FULL_SESSION=true
DESKTOP_SESSION=kde
For KDE4:
DESKTOP_SESSION=kde4
KDE_SESSION_VERSION=4
KDE_FULL_SESSION=true
But it works only for SUSE, Kubuntu have only KDE_SESSION_VERSION=4 and KDE_FULL_SESSION=true. And this is only for 8.04 KDE4 release of Kubuntu, there was no such flags in 8.04beta. So, determination is simple:
public static boolean isKDERunning() {
return "true".equals(System.getenv("KDE_FULL_SESSION"));
}
public static boolean isKDE4Running() {
if (!isKDERunning()) {
throw new IllegalStateException("KDE is not running");
}
return "4".equals(System.getenv("KDE_SESSION_VERSION")) ||
"kde4".equals(System.getenv("DESKTOP_SESSION"));
}
If you feel paranoid and want to get 100% result it will be better to run Konsole (konsole --version) and parse output. Output for different versions looks like this:
konsole --version
Qt: 3.3.8
KDE: 3.5.7 "release 72"
Konsole: 1.6.6
/usr/bin/konsole --version
Qt: 4.3.4
KDE: 4.0.3 (KDE 4.0.3) "release 9.1"
Konsole: 2.0
So, parsing code:
public static boolean isKDE4Version() throws Exception {
Process process = Runtime.getRuntime().exec("konsole --version");
InputStream in = process.getInputStream();
byte[] buffer = new byte[32];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int read = 0;
while ((read = in.read(buffer)) >= 0) {
out.write(buffer, 0, read);
}
String output = out.toString();
int indexOfKde = output.indexOf("KDE:");
if (indexOfKde >= 0) {
char v = output.charAt(indexOfKde + 5);
return '4' == v;
}
throw new IllegalStateException("KDE version information not found");
}
And don't fear performance issues - on my Athlon X2 6000+ this operation takes only 26 millis!
No comments:
Post a Comment