Unix.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Interface::Console::Unix
  3. #  Console interface for Unix/Linux.
  4. #
  5. #  Copyright (c) 2005 OpenKore development team 
  6. #
  7. #  This program is free software; you can redistribute it and/or modify
  8. #  it under the terms of the GNU General Public License as published by
  9. #  the Free Software Foundation; either version 2 of the License, or
  10. #  (at your option) any later version.
  11. #
  12. #  This program is distributed in the hope that it will be useful,
  13. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. #  GNU General Public License for more details.
  16. #########################################################################
  17. package Interface::Console::Unix;
  18. use strict;
  19. use IO::Socket;
  20. use Time::HiRes qw(time sleep);
  21. use POSIX;
  22. use bytes;
  23. no encoding 'utf8';
  24. use Globals qw(%consoleColors);
  25. use Interface;
  26. use base qw(Interface);
  27. use Utils qw(timeOut);
  28. use I18N qw(UTF8ToString);
  29. use Utils::Unix;
  30. sub new {
  31. my $class = shift;
  32. my %self;
  33. if (POSIX::ttyname(0) && POSIX::tcgetpgrp(0) == POSIX::getpgrp()) {
  34. # Only initialize readline if we have a controlling
  35. # terminal to read input from.
  36. $self{readline} = 1;
  37. Utils::Unix::ConsoleUI::start();
  38. }
  39. return bless %self, $class;
  40. }
  41. sub DESTROY {
  42. my $self = shift;
  43. Utils::Unix::ConsoleUI::stop() if ($self->{readline});
  44. print Utils::Unix::getColor('default');
  45. STDOUT->flush;
  46. }
  47. sub getInput {
  48. my ($self, $timeout) = @_;
  49. my $line;
  50. return if (!$self->{readline});
  51. if ($timeout < 0) {
  52. do {
  53. $line = Utils::Unix::ConsoleUI::getInput();
  54. sleep 0.01;
  55. } while (!defined $line);
  56. } elsif ($timeout == 0) {
  57. $line = Utils::Unix::ConsoleUI::getInput();
  58. } else {
  59. my $time = time;
  60. do {
  61. $line = Utils::Unix::ConsoleUI::getInput();
  62. sleep 0.01;
  63. } while (!defined($line) && !timeOut($time, $timeout));
  64. }
  65. $line = undef if (defined($line) && $line eq '');
  66. $line = I18N::UTF8ToString($line) if (defined($line));
  67. return $line;
  68. }
  69. sub errorDialog {
  70. # UNIX consoles don't close when the program exits,
  71. # so don't block execution
  72. my ($self, $message) = @_;
  73. $self->writeOutput("error", $message . "n");
  74. Utils::Unix::ConsoleUI::waitUntilPrinted() if ($self->{readline});
  75. }
  76. sub writeOutput {
  77. my ($self, $type, $message, $domain) = @_;
  78. my $code;
  79. # Hide prompt and input buffer
  80. $code = Utils::Unix::getColorForMessage(%consoleColors, $type, $domain);
  81. if (!$self->{readline}) {
  82. print STDOUT $code . $message . Utils::Unix::getColor('reset');
  83. STDOUT->flush;
  84. } else {
  85. while (length($message) > 0) {
  86. $message =~ /^(.*?)(n|$)(.*)/s;
  87. my $line = $1 . $2;
  88. $message = $3;
  89. Utils::Unix::ConsoleUI::print($code . $line);
  90. }
  91. }
  92. }
  93. sub title {
  94. my ($self, $title) = @_;
  95. if ($title) {
  96. $self->{title} = $title;
  97. if ($ENV{TERM} eq 'xterm' || $ENV{TERM} eq 'screen') {
  98. print STDOUT "e]2;" . $title . "a";
  99. STDOUT->flush;
  100. }
  101. } else {
  102. return $self->{title};
  103. }
  104. }
  105. 1;