Новосибирский институт органической химии им. Н.Н. Ворожцова СО РАН

Лаборатория изучения механизмов органических реакций

mldn


#!/usr/bin/perl -ws

our ($h,$help,$c,$g,$slow);
if ($h or $help) {
  (my $program = $0) =~ s/.*[\/\\]//;
  print "
Usage: $program file OR cat file | $program
Зависимости: molden, linux\n
Запускалка для molden'а. Запускает molden с некоторыми полезными опциями, 
заодно отвязывая его от терминала. Кроме того, позволяет позволяет передавать
molden'у stdout через pipe.
\n";
exit;
}

# Если интернет медленный, раскомментируйте след. строку
#$slow = 1;

@ARGV = map {"'$_'"} @ARGV;

my $molden = $g ? `which gmolden` : `which molden`;
#my $molden = $g ? 'gmolden' : 'molden';
chomp $molden;
#if (@ARGV && @ARGV>1) {
#  $molden = `which molden47`;
#  chomp $molden;
#}
die "No molden\n" unless $molden;
#print "$molden\n";

my $options = '-A -l -j 999 -c 0.2 -S -m -p 0.0 -hdmin 1.31 -hdmax 2.2 -hamin 90 -hamax 180';

if ($c) {
  #die "No fast_internet\n" if $slow;
  my ($screenX, $screenY) = `xdpyinfo | grep 'dimensions:'` =~ /(\d+)x(\d+)/;
  #print "$screenX, $screenY\n";
  $screenX ||= 1280;
  $screenY ||= 1024;
  my $frameX = 12;
  my $frameY = 28;
  my $XY = int($screenY*7/16);
  my $x0 = 48;
  my $y0 = 0;
  my $COL = int($#ARGV/2);
  for (my $i=0; $i<@ARGV; $i++) {
    # xprop -name MOLDEN -set WM_NAME qwertu
    my ($x,$y);
    $y = $i%2 ? $y0+$XY+$frameY : $y0;
    my $col = int($i/2);
    if ($x0+$XY*($COL+1) <= $screenX) {
      $x = $x0 + ($XY+$frameX)*$col;
    }
    else {
      $x = $x0 + int(($screenX-$x0-$XY)/($COL||1)*$col);
    }
    system("$molden -geom ${XY}x$XY+$x+$y $options $ARGV[$i] > /dev/null 2>&1 &");
    #print "$molden -geom ${XY}x$XY+$x+$y $options $ARGV[$i] > /dev/null 2>&1 &\n";
    if (! $slow) {
      select(undef, undef, undef, 0.1); # As sleep(0.1)
      #sleep 1;
      system("xprop -name MOLDEN -set WM_NAME $ARGV[$i]");
      system("xprop -name 'Molden Control' -set WM_NAME '$ARGV[$i] Control'");
      #system('xprop', '-name', 'MOLDEN', '-set', 'WM_NAME', $ARGV[$i]);
      #system('xprop', '-name', 'Molden Control', '-set', 'WM_NAME', "$ARGV[$i] Control");
    }
  }
  exit;
}

if (@ARGV) {
  print "$molden -geom 640x480 $options @ARGV > /dev/null 2>&1 &\n";
  system "$molden -geom 640x480 $options @ARGV > /dev/null 2>&1 &";
  if (@ARGV==1 and ! $slow) {
    #print "$molden -geom 640x480 $options @ARGV > /dev/null 2>&1 &\n";
    sleep 1;
    system("xprop -name MOLDEN -set 'WM_NAME' $ARGV[0]");
  }
}
elsif (-p STDIN) { # If pipe
	$tmp = '/tmp/mldn_tmp';
	open TMP, "> $tmp" or die "$!\n";
	print TMP while <>;
	close TMP;
	if (-s "$tmp") {
		exec "($molden -geom 640x480 $options $tmp > /dev/null 2>&1 &); sleep 1; rm -f $tmp";
	} else {
		unlink $tmp;
		die "No input for molden found\n";
	}
}
else {
  exec "($molden -geom 640x480 $options > /dev/null 2>&1 &)";
}