home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / register-window-manager < prev    next >
Text File  |  1999-09-19  |  5KB  |  239 lines

  1. #! /usr/bin/perl
  2.  
  3. # register-window-manager
  4. # Copyright 1998 Sean Perry, Marcelo Magallon, Branden Robinson and
  5. # Marcus Brinkmann.
  6. # Licensed under the GNU GPL.
  7.  
  8. # History
  9. # 0.3.0 - Create the config file if it doesn't exist yet (#35055). [MB]
  10. # 0.2.7 - Fixed bug: The word boundaries introduced a bug, now checking for
  11. #         whole line matching (#30186, Gorgo). Cleaned up a bit of the
  12. #         source (using numeric values instead of strings in &ifexists). [MB]
  13. # 0.2.6 - Fixed bug: Watch out for word boundaries (#28936, Daniel Martin). [MB]
  14. # 0.2.5 - made /usr/X11R6/bin error more terse [BR]
  15. # 0.2.4 - Fixed bug: The script will refuse to add /usr/X11R6/bin/*
  16. #         window managers. [MB]
  17. # 0.2.3 - minor cosmetic changes [BR]
  18. # 0.2.2 - Removed debug line. [MB]
  19. # 0.2.1 - Fixed bug in --default handling. [MB]
  20. # 0.2   - Fixed minor typo in usage text ("the the" -> "be the"). [MB]
  21. #       - Added removal of /usr/X11R6/bin/* entries. [MB]
  22. #         This is done to remove policy violation of prior window
  23. #         managers.  This is radical, but simple.  At some later time,
  24. #         the code that does this should probably be removed, so even
  25. #         /usr/X11R6/bin/* style paths work.
  26. #       - Added configuration variables. [MB]
  27. #       - Reworked file handling.  Read once, write once, modify array. [MB]
  28. # 0.1   - Initial Version
  29.  
  30. # Configuration
  31.  
  32. $wm_file = '/etc/X11/window-managers';
  33. $df_path = '/usr/bin/X11/';
  34.  
  35. while ($ARGV[0] =~ m/^--/) {
  36.     $_ = shift(@ARGV);
  37.     if (/--add/) {
  38.         $mode="add";
  39.     } elsif (/--remove/) {
  40.         $mode="remove";
  41.     } elsif (/--default/) {
  42.         $mode="default";
  43.     } elsif (/--ask/) {
  44.         $ask="true";
  45.     } else {
  46.         &usage;
  47.     }
  48. }
  49.  
  50. unless( $#ARGV == 0 ) { 
  51.     &usage;
  52. }
  53.  
  54. if( $ARGV[0] !~ m/^\// ) {
  55.     $WM = $df_path . $ARGV[0];
  56. }
  57. else {
  58.     $WM = $ARGV[0];
  59. }
  60.  
  61. if (! -e $wm_file) {
  62.     open (WMFILE, ">$wm_file");
  63.     print WMFILE << '_EOF_';
  64. # This file contains a list of available window managers. The default
  65. # Xsession file will start the first window manager that it can
  66. # in this list.
  67. _EOF_
  68.     close WMFILE;
  69. }
  70.  
  71. open(WMFILE, $wm_file) || 
  72.     die("Error opening $wm_file!\n");
  73. @WMS = <WMFILE>;
  74. close WMFILE;
  75.  
  76. &kill_dirty_policy_violation();
  77.  
  78. if ( $ask eq "true") {
  79.     &ask($mode, $WM);
  80. }
  81.  
  82. if( $mode eq 'add' ) {
  83.     &add_to_file($WM);
  84. elsif( $mode eq 'default' ) {
  85.     &make_default($WM);
  86. elsif( $mode eq 'remove' ) {
  87.     &rm_from_file($WM);
  88.  
  89. open (WMFILE, '>'.$wm_file) ||
  90.     die("Error opening $wm_file for writing!\n");
  91. print WMFILE @WMS;
  92. close WMFILE;
  93.  
  94. ###
  95. #
  96. # Usage information
  97. #
  98. ###
  99. sub usage {
  100.     print <<EOT;
  101. Usage: $0 [--ask] {--add|--default|--remove} <wm>
  102.  
  103. Options:
  104.   --ask            Asks for confimation of the requested action
  105.  
  106. Actions:
  107.   --add            Adds the specified window manager to the bottom of the
  108.                    $wm_file file
  109.   --remove         Removes the specified window manager
  110.   --default        Adds the specified window manager to the top of the
  111.                    $wm_file file, thus making it the system
  112.                    default
  113.  
  114. <wm> can be the full path to the window manager excecutable, or just the
  115. filename ($df_path will be prepended to it).
  116. EOT
  117.     exit(0);
  118. }
  119.  
  120. ###
  121. #
  122. # Asks for confirmation of the requested action
  123. #
  124. ###
  125. sub ask {
  126.     ($mode) = shift(@_);
  127.     ($WM)   = @_;
  128.  
  129.     print "The following window managers are listed in $wm_file:\n\n";
  130.     foreach (@WMS) {
  131.         if (m/\//) {
  132.             print "\t" . $_;
  133.         }
  134.     }
  135.     print "\n";
  136.  
  137.     if ($mode eq "add") {
  138.         $prompt = "Do you want to add $WM to the list";
  139.     } elsif ($mode eq "remove") {
  140.         $prompt = "Do you want to remove $WM from the list";
  141.     } elsif ($mode eq "default") {
  142.         $prompt = "Do you want make $WM the default";
  143.     }
  144.  
  145.     &ask_n($prompt) || exit(0);
  146. }
  147.  
  148. ###
  149. #
  150. # Asks a question, "No" is the default
  151. #
  152. ###
  153. sub ask_n {
  154.     my $answer;
  155.     print @_,"? [No] ";
  156.     $answer=<STDIN>;
  157.     return ( $answer =~ /^\s*y/i );
  158. }
  159.  
  160. ###
  161. #
  162. # Adds window manager passed to the end of window-managers file
  163. #
  164. ###
  165. sub add_to_file {
  166.     ($wm) = @_;
  167.  
  168.     return if(&ifexists($wm));
  169.     die ("not adding window manager with path /usr/X11R6/bin/ per Debian policy\n") if ($wm =~ /^\/usr\/X11R6\/bin\//);
  170.  
  171.     push @WMS, $wm."\n";
  172. }
  173.  
  174. ###
  175. #
  176. # Makes window manager passed the default by putting it first
  177. #
  178. ###
  179. sub make_default {
  180.     ($wm) = @_;
  181.     my $found = -1;
  182.  
  183.     if(&ifexists($wm)) {
  184.         &rm_from_file($wm);
  185.     }
  186.  
  187.     while ($WMS[$found+1] !~ /^\// && $found <= $#WMS) {
  188.         $found++;
  189.     }
  190.     splice (@WMS, $found+1, 0, $wm."\n");    # insert window manager at top
  191. }
  192.  
  193. ###
  194. #
  195. # Removes passed window manager from window-managers file
  196. #
  197. ###
  198. sub rm_from_file {
  199.     ($wm) = @_;
  200.     my @backup = ();
  201.  
  202.     foreach (@WMS) {
  203.         push (@backup, $_) unless ( m/^$wm$/ );
  204.     }
  205.     @WMS = @backup;
  206. }
  207.  
  208. ###
  209. #
  210. # returns 1 if window manager exists in the file, 0 otherwise
  211. #
  212. ###
  213. sub ifexists {
  214.     ($wm) = @_;
  215.     foreach (@WMS) {
  216.         if( m/^$wm$/ ) {
  217.             return 1;
  218.         }
  219.     }
  220.     return 0;
  221. }
  222.  
  223. ##
  224. #
  225. # kills all /usr/X11R6/bin/* entries.
  226. #
  227. ###
  228. sub kill_dirty_policy_violation {
  229.     my @backup = ();
  230.  
  231.     foreach (@WMS) {
  232.         push (@backup, $_) unless ( m!^/usr/X11R6/bin/! );
  233.     }
  234.     @WMS = @backup;
  235. }
  236.