Wysyłanie naciśnięć klawiszy do okna X.
Obecnie eksperymentuję z xdotool, aby wysłać klucze do procesu (rozumiem, że może nie działać dla wszystkich procesów, które nie ustawiają _NET_WM_PID). Mam problem z wysyłaniem naciśnięć klawiszy do innych okien z fokusa. Działa, jeśli wysyłasz naciśnięcia klawiszy doCURRENTWINDOW
. Poniżej znajduje się fragment, którego użyłem do testowania funkcjonalności xdotool.
extern "C"{
#include <xdo.h>
}
//extern "C" xdo_window_search
#include <iostream>
#include <string.h>
using namespace std;
int main(){
xdo_t* p_xdo = xdo_new(NULL);
// Allocate memory for search query.
xdo_search_t s;
// Clear the allocated memory.
memset(&s, 0, sizeof(xdo_search_t));
// Set the search query.
s.pid = 1916;
s.max_depth = -1;
s.searchmask = SEARCH_PID;
s.require = xdo_search::SEARCH_ANY;
// Allocate memory for output
Window* windows;
int no_windows;
xdo_window_search(p_xdo,&s,&windows,&no_windows);
cout << no_windows << endl;
// Prints all windows' names with matching criteria
for( int i=0;i<no_windows;i++ ){
unsigned char * name;
int size;
int type;
xdo_get_window_name(p_xdo,windows[i],&name,&size,&type);
cout << i << ":" << name << endl;
}
for( int i=0;i<no_windows;i++ ){
xdo_type(p_xdo,windows[i],"Hello World",0);
}
//xdo_type(p_xdo,CURRENTWINDOW,"Hello World",0); // This does work.
return 0;
}
Oprócz testowania funkcjonalności xdotool, przejrzałem kod źródłowy xdotool. Co ciekawe, odkryłem, że używają Xtest do wysyłania naciśnięć klawiszy do skupionego okna (CURRENTWINDOW
) i X11XSendEvent
dla innych okien. Zwróciłem się do xdotool, ponieważ nie mogłem uruchomić XSendEvent i Xtest nie może wysyłać kluczy do innych okien niż okno zogniskowane.
Czy nie używam poprawnie xdotool? Czy xdotool nie działa ze wszystkimi systemami operacyjnymi * nix z X11?
[Używam tego na Ubuntu 13.04.]
EDYTOWAĆ
Wygląda na to, że działa, ale nie dla wszystkich znalezionych okien. Na przykład działa dla firefox, ale nie dla gedit i gnome-terminal, chociaż znalazł gedit i gnome-terminal przez jego pid. Zachowuje się inaczej, gdybym użyłCURRENTWINDOW
.
Więc byłoby wspaniale, gdyby ktoś mógł to wyjaśnić. Czy jest to związane z flagą wysyłania siły w XEvent?