@ -26,6 +26,7 @@
# include <tqstringlist.h>
# include <tqstringlist.h>
# include <klocale.h>
# include <klocale.h>
# include <kmessagebox.h>
# include <kapplication.h>
# include <kapplication.h>
# include <stdlib.h>
# include <stdlib.h>
@ -50,6 +51,25 @@ unsigned int reverse_bits(register unsigned int x)
return ( ( x > > 16 ) | ( x < < 16 ) ) ;
return ( ( x > > 16 ) | ( x < < 16 ) ) ;
}
}
// This routine returns the output of an arbitrary Bash command
TQString exec ( const char * cmd ) {
TQString bashcommand = cmd ;
bashcommand = bashcommand . replace ( " \" " , " \\ \" " ) ;
bashcommand = TQString ( " /bin/bash -c \" %1 \" 2>&1 " ) . tqarg ( bashcommand ) ;
FILE * pipe = popen ( bashcommand . ascii ( ) , " r " ) ;
if ( ! pipe ) return " ERROR " ;
char buffer [ 128 ] ;
TQString result = " " ;
while ( ! feof ( pipe ) ) {
if ( fgets ( buffer , 128 , pipe ) ! = NULL ) {
result + = buffer ;
}
}
pclose ( pipe ) ;
result . remove ( result . length ( ) , 1 ) ;
return result ;
}
TQString capitalizeString ( TQString in ) {
TQString capitalizeString ( TQString in ) {
return in . left ( 1 ) . upper ( ) + in . right ( in . length ( ) - 1 ) ;
return in . left ( 1 ) . upper ( ) + in . right ( in . length ( ) - 1 ) ;
}
}
@ -606,7 +626,15 @@ bool KRandrSimpleAPI::applySystemwideDisplayConfiguration(TQPtrList<SingleScreen
}
}
freeScreenInfoStructure ( randr_screen_info ) ;
freeScreenInfoStructure ( randr_screen_info ) ;
system ( command . ascii ( ) ) ;
TQString xrandr_command_output = exec ( command . ascii ( ) ) ;
xrandr_command_output = xrandr_command_output . stripWhiteSpace ( ) ;
if ( xrandr_command_output ! = " " ) {
applySystemwideDisplayConfiguration ( oldconfig , FALSE ) ;
accepted = false ;
destroyScreenInformationObject ( oldconfig ) ;
KMessageBox : : sorry ( 0 , xrandr_command_output , i18n ( " XRandR encountered a problem " ) ) ;
return accepted ;
}
// HACK
// HACK
// This is needed because Qt does not properly generate screen
// This is needed because Qt does not properly generate screen
@ -778,6 +806,19 @@ void KRandrSimpleAPI::ensureMonitorDataConsistency(TQPtrList<SingleScreenData> s
}
}
}
}
bool found_first_primary_monitor = false ;
for ( i = 0 ; i < numberOfScreens ; i + + ) {
screendata = screenInfoArray . at ( i ) ;
if ( screendata - > is_primary ) {
if ( ! found_first_primary_monitor ) {
found_first_primary_monitor = true ;
}
else {
screendata - > is_primary = false ;
}
}
}
for ( i = 0 ; i < numberOfScreens ; i + + ) {
for ( i = 0 ; i < numberOfScreens ; i + + ) {
screendata = screenInfoArray . at ( i ) ;
screendata = screenInfoArray . at ( i ) ;
if ( screendata - > is_primary ) {
if ( screendata - > is_primary ) {
@ -1083,6 +1124,8 @@ TQPtrList<SingleScreenData> KRandrSimpleAPI::readCurrentDisplayConfiguration() {
else
else
screendata - > is_primary = true ;
screendata - > is_primary = true ;
screendata - > is_extended = screen_active ;
screendata - > is_extended = screen_active ;
if ( ! screendata - > is_extended )
screendata - > is_primary = false ;
// Get this screen's absolute position
// Get this screen's absolute position
screendata - > absolute_x_position = 0 ;
screendata - > absolute_x_position = 0 ;