Posts Tagged ‘X server’

Often I find myself working on multiple source code clones or views simultaneously. And I like to have a separate screen session for each view/clone. In this post, I attempt to achieve two things.

  • Make it easier to correct the DISPLAY variable after reconnecting to an existing screen session.
  • Display current clone name on screen status line.

Screen shot of screen status line

First we decide on a suitable environment variable name to hold the view/clone name. CLONE_NAME is good enough. Now let’s define a bash function that will set the view/clone for us. Give this command to change the view/clone.

setclone ()
{
  if [ "$1" ]; then
    export CLONE_NAME=$1;
    SERVER_CLONE=`hostname`.$CLONE_NAME;
    export DISPLAY_FILE="$HOME/displays/$SERVER_CLONE";
    fi;
    echo clone=$CLONE_NAME;
}

Setclone exports two variables. CLONE_NAME is the name of the view/clone that we are going to work on. DISPLAY_FILE is the name of an ASCII file where we will store the current $DISPLAY variable before starting screen. We will use this later, from within screen. Now we define another function – clview (short for clone view) which actually starts the screen session.

clview ()
{
  if [ "$1" ]; then
    setclone $1;
  fi;
  rm -f $DISPLAY_FILE;
  echo $DISPLAY > $DISPLAY_FILE;
  screen -xR -S $CLONE_NAME;
}

This function writes the current DISPLAY variable to $DISPLAY_FILE (which was set by setclone). If we had started a screen session before and are reconnecting to it now, the DISPLAY variable in the existing screen session may have changed. So we have to set it up again. Instead of detaching from screen, finding the DISPLAY variable, reconnecting to screen and manually updating the DISPLAY variable, the clview function will put the correct value for DISPLAY variable in the file $DISPLAY_FILE. Now we write another function that will correct the DISPLAY variable for the screen sessions.

display ()
{
  echo old DISPLAY=$DISPLAY;
  export DISPLAY=`cat $DISPLAY_FILE`;
  echo new DISPLAY=$DISPLAY;
}

The screen options used are

       -x   Attach to a not detached screen session. (Multi display mode).
       -R   attempts  to resume the first detached screen session it finds.  If successful,
            all other command-line options are ignored.  If no detached session exists,
            starts a new session using the specified options, just as if -R had not been
            specified. The option is set by default if screen is run as a login-shell
            (actually screen uses "-xRR" in that case).
       -S sessionname
            When creating a new session, this option can be used to specify a meaningful
            name for the session. This name identifies  the  session  for  "screen -list"
            and "screen -r" actions. It substitutes the default [tty.host] suffix.

One thing that can be useful is for screen to display the current view/clone name on the status bar. Put the following the the screenrc file for a nice status line. The backtick command can query the shell and display its output in the status line. The query interval is set to 3600 seconds.

backtick 1 3600 3600 /bin/echo $CLONE_NAME
hardstatus alwayslastline "%{ck}%H: %{gk}%1` %?%{wk}%-Lw%?%{Yk}[%n*%f %t]%?%{kk}(%u)%?%?%{wk}%+Lw%?%=%{gk}%C %A %{Bk}%D, %M %d, %Y"

One side effect of the above status line is that it display the current time. So if we use the mouse to scroll back in history and the minute changes, it needs to be redisplayed. As part of the redisplay, we end up back at the prompt. You can disable this from the status line by removing “%{gk}%C %A ” (set green foreground, black background, time in 12 HR format, AM or PM).

I used to use Xming for an X server for my Windows 7 PC. I started looking out for other X servers for Windows because of a particularly irritating bug of Xming. Sometime Xming interferes with the clipboard, so that cut/copy/paste no longer works. The bug blocks the clipboard not only for X applications but also for native Windows applications. Quitting Xming doesn’t get the clipboard functionality back. Even after quitting Xming, a residual process would still be running which continues to block the clipboard. It has to be manually killed from the task manager.

Finally, I found an alternative that is as capable as Xming but doesn’t block the clipboard from time to time. Cygwin comes with an X server among many other things. Grab your copy here. It is an installer stub and will download additional stuff from the internet based on the components selected for installation. Cygwin/X which has the X server is not selected for installation by default. You can do it manually by selecting the Xinit package from the X11 section as shown. Cygwin has so many packages, that it is easier to search for what you want.

Screenshot of Cygwin X Server Installation

Cygwin installs a whole bunch of stuff (standard Unixy stuff). It is after all meant to provide a Unix style native environment in Windows. Even if you don’t use any of the other Cygwin stuff, it is worth it just for the X server. I am using Cygwin X Server for over a year now and it has never failed me. Also I put a shortcut to Cygwin X Server in my Startup folder so that it is automatically started whenever my PC boots.

Most of the time I use Linux on my desktop and use the default X server for remote X clients. On the rare occasion of having to use Windows to ssh to a Linux server, my preferred X server is Xming. Now by default the fonts displayed by default X server on Linux is much more readable than the tiny size displayed by Xming. My initial solution was to increase the font sizes of the few applications (gvim, gnome-terminal) I typically used. But once I switched back to Linux desktop, the fonts were too big.

Xming properties screenshot

There is a better solution. By default Xming uses a DPI of 96. We can increase this value to have bigger font sizes (not only fonts, everything scales proportionately). I found anything in the range of 108-112 DPI to be appropriate. Xming takes the DPI config as part of its command line parameters.

Right click on the Xming icon and select properties. You should see a similar dialog box. You can edit the “Target” field (see screenshot) and add -dpi 108 to set the DPI config to be 108.

The final command should look something similar to

"C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow -dpi 108

Xming has a whole bunch of other options too. You can see a full list by giving

"C:\Program Files (x86)\Xming\Xming.exe" -h

A notepad with all options should popup.

EDIT: If you are having trouble with Xming hijacking the clipboard, you can give Cygwin X Server a try.