[X2Go-Commits] [telekinesis] 01/01: Rework of "Supporting Services"

git-admin at x2go.org git-admin at x2go.org
Tue Aug 26 12:48:15 CEST 2014


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository telekinesis.

commit be2bca6d3da02f7886a964609b91058849b715ea
Author: gznget <opensource at gznianguan.com>
Date:   Tue Aug 26 09:58:14 2014 +0200

    Rework of "Supporting Services"
---
 X2Go/Telekinesis/Client/Supporting_Services.pm |   60 +------------
 client/bin/telekinesis-client                  |  107 ++++++++++++++++--------
 2 files changed, 71 insertions(+), 96 deletions(-)

diff --git a/X2Go/Telekinesis/Client/Supporting_Services.pm b/X2Go/Telekinesis/Client/Supporting_Services.pm
index a9a511c..3f6c7a2 100644
--- a/X2Go/Telekinesis/Client/Supporting_Services.pm
+++ b/X2Go/Telekinesis/Client/Supporting_Services.pm
@@ -24,32 +24,9 @@ package X2Go::Telekinesis::Client::Supporting_Services;
 use strict;
 use Exporter qw(import);
      
-our @EXPORT_OK = qw(getStateOfX2GoClientWindow);
+our @EXPORT_OK = qw(getActiveWindowAndDTSIZE);
 
 
-
-
-sub getStateOfX2GoClientWindow { # Hopefully one day, this polling junk can be replaced with the Client window reporting events and states to our local socket.
-  my $X2GoSID = $_[0];		 # On dedicated thin clients we're not doing this anyway and on any reasonably new system  
-  my $Visible = 0;		 # the resource usage is not really an issue... at all...
-  my $FullScreen = 0;
-  my $DeskX = 0;
-  my $DeskY = 0;
-  my ($rx,$ry,$ax,$ay,$h,$w,$wID,$mapState) = getXWinPosNDim("X2GO-$X2GoSID"); 
-  if ($mapState eq 1) {# If the window is mapped...  
-    my ($ActiveWID,$cDeskX,$cDeskY)= getActiveWindowAndDTSIZE();# Get active window and desktop size
-    $DeskX = $cDeskX;$DeskY = $cDeskY;
-    if ($ActiveWID eq $wID) {#  if the active window is the X2Go client window...
-      $Visible = 1;# At this point were both mapped and we're the active window.... so unlikely anything else is obscuring... (except our stuff)
-    } 
-  }  else {
-    if (($h eq 1) and ($w eq 1)) {
-      $FullScreen = 1;
-    }
-  }
-  return ($Visible,$ax,$ay,$h,$w,$DeskX,$DeskY,$FullScreen);
-}
-
 sub getActiveWindowAndDTSIZE {
   my $return;
   my $returnX;
@@ -70,38 +47,3 @@ sub getActiveWindowAndDTSIZE {
 }
 
 
-
-
-sub getXWinPosNDim {
-  my $NAME = $_[0];
-  my %Xpos;
-  $Xpos{'mapstate'} = 0;
-  open(RUN, '-|', "xwininfo", '-shape', '-name',$NAME);
-  while (<RUN>) {
-    my $line = $_;
-    $line =~ s/[\n\ ]//g;
-    if ($line =~ /^Width:(\d{1,5})$/) {
-      $Xpos{'width'} = $1;
-    } elsif ($line =~ /^Height:(\d{1,5})$/) {   
-      $Xpos{'height'} = $1;
-    } elsif ($line =~ /^Absoluteupper-leftX:([\-\d]{1,5})$/) {
-      $Xpos{'absupleftx'} = $1;
-    } elsif ($line =~ /^Absoluteupper-leftY:([\-\d]{1,5})$/) {
-      $Xpos{'absuplefty'} = $1;
-    } elsif ($line =~ /^Relativeupper-leftX:([\-\d]{1,5})$/) {
-      $Xpos{'relupleftx'} = $1;
-    } elsif ($line =~ /^Relativeupper-leftY:([\-\d]{1,5})$/) {
-      $Xpos{'reluplefty'} = $1;
-    } elsif ($line =~ /^xwininfo:Windowid:([a-z\d]{9})\"$NAME\"$/) {
-      $Xpos{'wID'} = $1;
-    } elsif ($line =~ /^MapState:IsViewable$/) {
-      $Xpos{'mapstate'} = 1;
-    }
-
-  }
-  close(RUN);
-  return ($Xpos{'relupleftx'},$Xpos{'reluplefty'},$Xpos{'absupleftx'},$Xpos{'absuplefty'},$Xpos{'height'},$Xpos{'width'},$Xpos{'wID'},$Xpos{'mapstate'});
-}
-
-
-
diff --git a/client/bin/telekinesis-client b/client/bin/telekinesis-client
index cbd9a0a..da0fdca 100644
--- a/client/bin/telekinesis-client
+++ b/client/bin/telekinesis-client
@@ -33,7 +33,7 @@ use File::Path qw(make_path remove_tree);
 use IO::Socket::UNIX qw( SOCK_STREAM SOMAXCONN );
 use Gtk2;
 use X2Go::Telekinesis::CoreSupport qw(versionCompCheck getConnectToken premZealot getCmdFlags dbugPrint tcDie sanitizeDirPath sanitizeFilePath sanitizer checkPID genRandSID genRandToken clups);;
-use X2Go::Telekinesis::Client::Supporting_Services qw(getStateOfX2GoClientWindow);
+use X2Go::Telekinesis::Client::Supporting_Services qw(getActiveWindowAndDTSIZE);
 my $TeKiCVersion  = "0.0.6.2";
 $ENV{'PATH'} = "/bin:/usr/bin";
 @SIG{qw( INT TERM HUP )} = \&doSelfTerminate;  # 
@@ -449,7 +449,8 @@ sub initBuiltInServices {
             	  if ($TeKiServices{'StateOfX2GoCliWin'}{'active'} ne 1) {
 	            dbugPrint("Service STARTED"); 
 		    $TeKiServices{'StateOfX2GoCliWin'}{'active'} = 1;
-                    $TeKiServices{'StateOfX2GoCliWin'}{'glibTimeoutID'} = Glib::Timeout->add (300, \&runStateOfX2GoCliWin);# Make this configurable?
+                    $TeKiServices{'StateOfX2GoCliWin'}{'loopCnt'} = 0;
+                    $TeKiServices{'StateOfX2GoCliWin'}{'glibTimeoutID'} = Glib::Timeout->add (30, \&runStateOfX2GoCliWin);# Make this configurable?
            	  } else {
 	            dbugPrint("Service already started..."); 
                   }
@@ -463,41 +464,73 @@ sub initBuiltInServices {
 }
 
 sub runStateOfX2GoCliWin {
-  if ($TeKiServices{'StateOfX2GoCliWin'}{'active'} eq 1) {
-    my ($Visible,$ax,$ay,$h,$w,$DeskX,$DeskY,$FullScreen) = getStateOfX2GoClientWindow($X2GoSID);
-    if (
-        ($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'FullScreen'} ne $FullScreen) or 
-        ($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'Visible'} ne $Visible) or 
-        ($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ax'} ne $ax) or 
-        ($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ay'} ne $ay) or 
-        ($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'h'} ne $h) or 
-        ($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'w'} ne $w) or 
-        ($_[0] eq 1) 
-       ) {
-
-      $TeKiServices{'StateOfX2GoCliWin'}{'data'}{'FullScreen'} = $FullScreen;
-      $TeKiServices{'StateOfX2GoCliWin'}{'data'}{'Visible'} = $Visible;
-      $TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ax'} = $ax;
-      $TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ay'} = $ay; 
-      $TeKiServices{'StateOfX2GoCliWin'}{'data'}{'h'} = $h; 
-      $TeKiServices{'StateOfX2GoCliWin'}{'data'}{'w'} = $w;
-      my $SendString = "1|1|0|0|0|0";
-      if ($FullScreen eq 1) {
-        # Default And Asuming we're thin client mode in which case we should never get this far anyhow....
-      } else {
-        $SendString = clups("0|$Visible|$ax|$ay|$h|$w");
-      }
-#      print "Change: $SendString\n";
-#print Dumper($TeKiServices{'StateOfX2GoCliWin'}{'clients'}),"\n";
-      foreach  my $chanID (keys $TeKiServices{'StateOfX2GoCliWin'}{'clients'}) {
-#        print "Wants window state: $chanID\n";
-        if ($CHANS{$chanID}{'sockclient'}) {
-           my $client = $CHANS{$chanID}{'sockclient'};
-           sayToClient($client,"CORE|SERVICES|X2GOWINDOWSTATE|$SendString|");
-        }
-      }
-    }
-  }
+	if ($TeKiServices{'StateOfX2GoCliWin'}{'active'} eq 1) {
+		unless ($TeKiServices{'StateOfX2GoCliWin'}{'heXid'}) {
+			if (-f "$X2GoSesHome/session.window") {
+				open(SWXID,"$X2GoSesHome/session.window");
+				my ($tmpSwXid,undef) = <SWXID>;
+				close(SWXID);
+				if ($tmpSwXid =~ /ID:(\d*)/) {
+					dbugPrint("session.window file OK ($1)"); 
+					$TeKiServices{'StateOfX2GoCliWin'}{'heXid'} = sprintf("0x%x",$1);
+					$TeKiServices{'StateOfX2GoCliWin'}{'theWindow'} = Gtk2::Gdk::Window->foreign_new($1);
+				}
+			}
+    		}
+
+		if ($TeKiServices{'StateOfX2GoCliWin'}{'theWindow'}) {
+#			dbugPrint("theWindow is OK"); 
+			if ($TeKiServices{'StateOfX2GoCliWin'}{'loopCnt'} < 1) {
+				dbugPrint("GET ACTIVE WINDOW INFO!"); 
+				($TeKiServices{'StateOfX2GoCliWin'}{'ActiveWID'},$TeKiServices{'StateOfX2GoCliWin'}{'DeskX'},$TeKiServices{'StateOfX2GoCliWin'}{'DeskY'}) = getActiveWindowAndDTSIZE();
+				$TeKiServices{'StateOfX2GoCliWin'}{'loopCnt'} = 8;
+			} else {$TeKiServices{'StateOfX2GoCliWin'}{'loopCnt'}--;}
+			my $DeskX = $TeKiServices{'StateOfX2GoCliWin'}{'DeskX'};
+			my $DeskY = $TeKiServices{'StateOfX2GoCliWin'}{'DeskY'};
+ 
+			my $FullScreen = 0;
+			my $Visible = 0;
+			my ($ax,$ay) = $TeKiServices{'StateOfX2GoCliWin'}{'theWindow'}->get_origin;
+			my ($relx, $rely, $w, $h, undef) = $TeKiServices{'StateOfX2GoCliWin'}{'theWindow'}->get_geometry;
+			if ($TeKiServices{'StateOfX2GoCliWin'}{'ActiveWID'} eq $TeKiServices{'StateOfX2GoCliWin'}{'heXid'}) {
+				$Visible = 1;
+			}
+#dbugPrint("SIZES: $DeskX x $DeskY	$w x $h		$relx, $rely,	$ax,$ay");
+			if (($w >= $DeskX) and ($h >= $DeskY)) {
+				$FullScreen = 1;
+			}
+			if (
+				($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'FullScreen'} ne $FullScreen) or 
+				($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'Visible'} ne $Visible) or 
+				($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ax'} ne $ax) or 
+				($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ay'} ne $ay) or 
+				($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'h'} ne $h) or 
+				($TeKiServices{'StateOfX2GoCliWin'}{'data'}{'w'} ne $w) or 
+				($_[0] eq 1) 
+			) {
+
+				$TeKiServices{'StateOfX2GoCliWin'}{'data'}{'FullScreen'} = $FullScreen;
+				$TeKiServices{'StateOfX2GoCliWin'}{'data'}{'Visible'} = $Visible;
+				$TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ax'} = $ax;
+				$TeKiServices{'StateOfX2GoCliWin'}{'data'}{'ay'} = $ay; 
+				$TeKiServices{'StateOfX2GoCliWin'}{'data'}{'h'} = $h; 
+				$TeKiServices{'StateOfX2GoCliWin'}{'data'}{'w'} = $w;
+				my $SendString = "1|1|0|0|0|0";
+				if ($FullScreen eq 1) {
+				        # Default And Asuming we're thin client mode in which case we should never get this far anyhow....
+				} else {
+					$SendString = clups("0|$Visible|$ax|$ay|$h|$w");
+				}
+
+				foreach  my $chanID (keys $TeKiServices{'StateOfX2GoCliWin'}{'clients'}) {
+					if ($CHANS{$chanID}{'sockclient'}) {
+						my $client = $CHANS{$chanID}{'sockclient'};
+						sayToClient($client,"CORE|SERVICES|X2GOWINDOWSTATE|$SendString|");
+					}
+				}
+			}
+		}
+	}
 # Insert cleanup routine at the end....
   return 1;
 }

--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/telekinesis.git


More information about the x2go-commits mailing list