Provided by: libx11-protocol-other-perl_28-1_all bug

NAME

       X11::Protocol::ChooseWindow -- user click to choose window

SYNOPSIS

        use X11::Protocol::ChooseWindow;
        my $client_window = X11::Protocol::ChooseWindow->choose (X => $X);

DESCRIPTION

       This spot of code lets the user click on a toplevel window to choose it, in a similar
       style to the "xwininfo" or "xkill" programs.

   Implementation
       The method is similar to the "xwininfo" etc programs.  It consists of a "GrabPointer" on
       the root window, waits for a "ButtonPress" and corresponding "ButtonRelease" from the
       user, get the frame window is from the Press event, then the client window under there
       from "frame_window_to_client()" in "X11::Protocol::WM".

       "KeyPress" events are not used and go to the focus window in the usual way.  This can be
       good in a command line program since it lets the user press "^C" ("SIGINT") in an "xterm"
       or similar.  Perhaps in the future there could be an option to watch for "Esc" to cancel
       or some such.

       A virtual root per "root_to_virtual_root()" in "X11::Protocol::WM" is used if present.
       This helps "ChooseWindow" work with "amiwm" and similar virtual root window managers.

FUNCTIONS

       The following "choose()" is in class method style with the intention of perhaps in the
       future having objects of type "X11::Protocol::ChooseWindow" holding state and advanced by
       events supplied by an external main loop.

   Choosing
       "$window = X11::Protocol::ChooseWindow->choose (key=>value,...)"
           Read a user button press to choose a toplevel window.  The key/value options are as
           follows,

               X        => X11::Protocol object
               display  => string ":0:0" etc

               screen   => integer, eg. 0
               root     => XID of root window

               time     => integer server timestamp
               event    => hashref of event initiating the choose

               cursor       => XID of cursor
               cursor_glyph => integer glyph for cursor font
               cursor_name  => string name from cursor font

           "X" or "display" gives the server, or the default is to open the "DISPLAY" environment
           variable.  "X" for an "X11::Protocol" object is usual, but sometimes it can make sense
           to open a new connection just to choose.

           "root" or "screen" gives the root window to choose on, or the default is the current
           screen of $X, which in turn defaults to the screen part of the display name.  If
           there's a window manager virtual root then that's automatically used as necessary.

           "time" or the time field in "event" is a server timestamp for the "GrabPointer()".
           This guards against stealing a grab from another client if badly lagged.  Omitted or
           "undef" means "CurrentTime".  In a command line program there might be no initiating
           event, making "CurrentTime" all that's possible.

           "cursor" etc is the mouse pointer cursor to show during the choose, as a visual
           indication to the user.  The default is a "crosshair".  "cursor_name" or
           "cursor_glyph" are from the usual cursor font.  See X11::CursorFont for available
           names.  For example perhaps the "exchange" cursor to choose a window for some sort of
           swap or flip,

               $window = X11::Protocol::ChooseWindow->choose
                           (X => $X,
                            cursor_name => "exchange");

SEE ALSO

       X11::Protocol, X11::Protocol::WM, X11::CursorFont

       xwininfo(1), xkill(1), and their dsimple.c "Select_Window()" code

HOME PAGE

       <http://user42.tuxfamily.org/x11-protocol-other/index.html>

LICENSE

       Copyright 2010, 2011, 2012, 2013 Kevin Ryde

       X11-Protocol-Other is free software; you can redistribute it and/or modify it under the
       terms of the GNU General Public License as published by the Free Software Foundation;
       either version 3, or (at your option) any later version.

       X11-Protocol-Other is distributed in the hope that it will be useful, but WITHOUT ANY
       WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
       PURPOSE.  See the GNU General Public License for more details.

       You should have received a copy of the GNU General Public License along with
       X11-Protocol-Other.  If not, see <http://www.gnu.org/licenses/>.