Как я могу найти окно Firefox из xwininfo?

Мой Perl не очень хорош, и я не могу понять, почему этот великолепный Perl-скрипт продолжает возвращаться :

Ошибка: запущенное окно не найдено Не удалось найти окно [Mozilla] в [xwininfo -tree -root]

Я установил эти переменные:

my $PROGNAME = $0;
$PROGNAME =~ s|.*/||;
my $GRAB = 'xwd -silent -nobdrs -id %id | convert -quality 85 - %out';
my $XINFO = 'xwininfo -tree -root';
my $BROWSER = 'firefox';    # Must match find_window() code - see usage()

В использовании это говорит следующее:

- Requires "Mozilla" or "Opera" browser
    (update find_window() code for other browsers)

Соответствующий код таков:

# I'm using mozilla..
sub find_window {
  $BROWSER eq "opera" ?
    opera_find_window(@_) :
    mozilla_find_window(@_);
}

Как мне заставить вышеприведенное отразить браузер Firefox. В моей оболочке, если я наберу mozilla, ничего не произойдет, если я наберу firefox - откроется мой браузер, поэтому я должен использовать это.

Вот рассматриваемый код, который возвращает эту ошибку:

sub mozilla_find_window {
  open(XINFO,"$XINFO|") || die("Couldn't run: [$XINFO]\n");

  # Pick the first mozilla window.  It's got the title in it, but
  # we have no way of knowing if that matches the URL, so we'll
  # hope this is the right one..
  my ($spacing,$id,$title,$x,$y);
  while(<XINFO>) {
    # This could easily break and is very mozilla specific (works on firefox)
    # Looks for [...("Mozilla" "navigator:browser") ..]
    # I've had this reported:     0x80002f "TITLE - Mozilla": ("Gecko" "Mozilla-bin")  889x687+0+22  +136+44
    last if (($spacing,$id,$title,$x,$y) = (/^(\s+)(0x[0-9a-f]+) "(.*)\s*-\s*Mozilla.*": \("Mozilla" "navigator:browser"\)\s*$GEOM_RE$/));

    last if (($spacing,$id,$title,$x,$y) = (/^(\s+)(0x[0-9a-f]+) "(.*)\s*-\s*Mozilla.*": \("mozilla-bin" "Mozilla-bin"\)\s*$GEOM_RE$/));
    # Mozilla Firefox 1.0.4
    last if (($spacing,$id,$title,$x,$y) = (/^(\s+)(0x[0-9a-f]+) "(.*)\s*-\s*Mozilla Firefox.*": \("Gecko" "Firefox-bin"\)\s*$GEOM_RE$/));
        # Debian Mozilla Firefox
        last if (($spacing,$id,$title,$x,$y) = (/^(\s+)(0x[0-9a-f]+) "(.*)\s*-\s*Mozilla Firefox.*": \("firefox-bin" "Firefox-bin"\)\s*$GEOM_RE$/));
  }
  die("Couldn't find window [Mozilla] in [$XINFO]\n") unless $title && $x && $y;

Кто-нибудь знает, как я могу это исправить, что я делаю неправильно? Это проблема, связанная с местом, где установлен firefox?

Спасибо всем

Обновлять

 0x140529c "Firefox": ()  10x10+-100+-100  +-100+-100
 0x14051b9 "Firefox": ()  10x10+-100+-100  +-100+-100
 0x14038c9 "Firefox": ("firefox" "Firefox")  1x1+-100+-100  +-100+-100
    1 child:
    0x14038ca (has no name): ()  1x1+-1+-1  +-101+-101
 0x14002bd "Firefox": ()  1x1+0+0  +0+0
    1 child:
    0x14002be (has no name): ()  1x1+-1+-1  +-1+-1
 0x1400210 "Firefox": ()  10x10+-100+-100  +-100+-100
 0x14000ea "Firefox": ("firefox" "Firefox")  200x200+0+0  +0+0
    1 child:
    0x14000eb (has no name): ()  1x1+-1+-1  +-1+-1
 0x14000a6 "Firefox": ("firefox" "Firefox")  200x200+0+0  +0+0
    2 children:
    0x14000a9 (has no name): ()  1x1+-1+-1  +-1+-1
       1 child:
       0x14000aa (has no name): ()  1x1+2+2  +1+1
          1 child:
          0x14000ab (has no name): ()  1x1+0+0  +1+1
             4 children:
             0x140519f (has no name): ()  1x1+-1+-1  +0+0
             0x140519e (has no name): ()  1x1+-1+-1  +0+0
             0x1400286 (has no name): ()  1x1+-1+-1  +0+0
             0x14000ad (has no name): ()  1x1+-1+-1  +0+0
    0x14000a7 (has no name): ()  1x1+-1+-1  +-1+-1
 0x140008d "Firefox": ("firefox" "Firefox")  200x200+0+0  +0+0

Вышеупомянутое получается, когда я запускаю это вручную xwininfo -tree -root


person Abs    schedule 29.12.2009    source источник
comment
Не похоже, что это имеет какое-либо отношение к тому, где установлен ваш firefox, так как он просто просматривает заголовки открытых окон X. Что выводит xwininfo -tree -root во время запуска скрипта?   -  person glomad    schedule 29.12.2009
comment
Я действительно плохо разбираюсь в Perl, поэтому я не уверен, правильно ли я это сделал. Я помещаю print $XINFO после открытия в sub mozilla_find_window. Он вернул xwininfo -tree -root. Я предполагаю, что делаю это правильно! Извинения.   -  person Abs    schedule 29.12.2009
comment
Что ж, $XINFO — это просто переменная, содержащая фактическую команду, которую пытается запустить этот скрипт (в open(XINFO, "$XINFO|"). Итак, perl пытается запустить xwininfo -tree -root, а затем просмотреть вывод этой команды (во время цикла while). Поэтому было бы полезно, если бы мы знали, что на самом деле выводит xwininfo -tree -root при запуске скрипта. Если бы вы могли запустить эту команду самостоятельно и вставить вывод сюда или, по крайней мере, просмотреть ее, чтобы вы могли понять, что просматривает Perl, решить эту проблему было бы проще.   -  person glomad    schedule 29.12.2009
comment
Ах, я вижу, значит, он ищет экземпляры Firefox в запущенных программах. Таким образом, эти регулярные выражения испытывают трудности с поиском соответствия. Я поместил вывод этой команды, которую я выполнил (только ее часть).   -  person Abs    schedule 29.12.2009
comment
Вот так. Попробуйте мой ответ...   -  person glomad    schedule 29.12.2009


Ответы (1)


Из вывода xwininfo видно, что ваш Firefox отображается в списке X-окна как "Firefox": ("firefox" "Firefox").

Ни одно из ваших регулярных выражений в настоящее время не ищет эту комбинацию. Добавьте этот код сразу после #Debian Mozilla Firefox строк (или хотя бы где-нибудь в том же while блоке):

# my Firefox
last if (($spacing,$id,$title,$x,$y) = (/^(\s+)(0x[0-9a-f]+) "(Firefox)": \("firefox" "Firefox"\)\s*$GEOM_RE$/));
person glomad    schedule 29.12.2009
comment
Вышеприведенное заставило его пройти эту точку ошибки! Спасибо. Я столкнулся с новой ошибкой сейчас, я попытаюсь исправить это сначала, если нет, я вернусь! - person Abs; 29.12.2009