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

NAME

       X11::Protocol::WM -- window manager things for client programs

SYNOPSIS

        use X11::Protocol::WM;

DESCRIPTION

       This is some window manager related functions for use by client programs, as per the "Inter-Client
       Communication Conventions Manual" and some of the Net-WM "Extended Window Manager Hints".

           /usr/share/doc/xorg-docs/specs/ICCCM/icccm.txt.gz

           <http://www.freedesktop.org/wiki/Specifications/wm-spec>

   Usual Properties
       Every toplevel client window should usually

       •   "set_wm_class()" to identify itself to other programs (see "WM_CLASS").

       •   "set_wm_name()"   and   "set_wm_icon_name()"   for   user-visible   identification   (see   "WM_NAME,
           WM_ICON_NAME").

       •   "set_wm_client_machine_from_syshostname()"  and  "set_net_wm_pid()"  for  the  running  process  (see
           "WM_CLIENT_MACHINE" and "_NET_WM_PID").

       Then optionally,

       •   If you have an icon image then "set_wm_hints()" with a bitmap or a window (see "WM_HINTS").

       •   If  the  user gave an initial size or position on the command line then "set_wm_normal_hints()".  The
           same if the program has min/max sizes or aspect ratio desired (see "WM_NORMAL_HINTS").

       •   If a command to re-run the program can be constructed then "set_wm_command()",  and  preferably  keep
           that up-to-date with changes such as currently open file etc (see "WM_COMMAND").

FUNCTIONS

   Text Properties
       Property  functions  taking  text  strings such as "set_wm_name()" accept either byte strings or Perl 5.8
       wide char strings.  Byte strings in 5.8 and all strings in earlier Perl are presumed to  be  Latin-1  and
       set  as  "STRING"  type  in  properties.   Perl  5.8 wide char strings are stored as "STRING" if entirely
       Latin-1, or encoded to "COMPOUND_TEXT" for other chars (see Encode::X11).

       In the future perhaps the string functions could accept some sort of compound text  object  to  represent
       segments  of  various  encodings  to become "COMPOUND_TEXT", together with manipulations for such content
       etc.  If text is bytes in one of the ICCCM encodings then  it  might  save  some  work  to  represent  it
       directly as "COMPOUND_TEXT" segments rather than going to wide chars and back again.

       "set_text_property ($X, $window, $prop, $str)"
           Set  the  given  $prop  (integer  atom)  property  on  $window (integer XID) using either "STRING" or
           "COMPOUND_TEXT" as described above.  If $str is "undef" then $prop is deleted.

           $str is limited to "$X->maximum_request_length()".  There's no attempt to  store  very  long  strings
           piecewise.   The  protocol  makes  this  limit  at  least  16384 bytes and the server may allow more,
           possibly much more.

   WM_CLASS
       "X11::Protocol::WM::set_wm_class ($X, $window, $instance, $class)"
           Set the "WM_CLASS" property on $window (an XID).

           This property may be used by the window manager to lookup settings and preferences  for  the  program
           through the X Resource system (see "RESOURCES" in X(7)) or similar.

           Usually  the  instance  name is the program command such as "xterm" and the class name something like
           "XTerm".  Some programs have command line options to set the class and/or instance so  the  user  can
           have different window manager settings applied to a particular running copy of a program.

               X11::Protocol::WM::set_wm_class ($X, $window,
                                                "myprog", "MyProg");

           $instance and $class must be ASCII or Latin-1 only.  Perl 5.8 wide-char strings which are Latin-1 are
           converted as necessary.

   WM_CLIENT_MACHINE
       "X11::Protocol::WM::set_wm_client_machine ($X, $window, $hostname)"
           Set the "WM_CLIENT_MACHINE" property on $window to $hostname (a string).

           $hostname  should be the name of the client machine as seen from the server.  If $hostname is "undef"
           then the property is deleted.

           Usually a machine name is ASCII-only, but anything per "Text Properties" above is accepted.

       "X11::Protocol::WM::set_wm_client_machine_from_syshostname ($X, $window)"
           Set the "WM_CLIENT_MACHINE" property on $window using the Sys::Hostname module.

           If "Sys::Hostname" can't determine a hostname by its various gambits then currently the  property  is
           deleted.  Would it be better to leave it unchanged, or return a flag to say if set?

           Some  of  the  "Sys::Hostname"  cases might return "localhost".  That's put through unchanged, on the
           assumption that it would be when there's no networking beyond the local host so client and server are
           always on the same machine and name "localhost" suffices.

   WM_COMMAND
       "X11::Protocol::WM::set_wm_command ($X, $window, $command, $arg...)"
           Set the "WM_COMMAND" property on $window (an XID).

           This should be a program name and argument strings which will restart the client.   $command  is  the
           program name, followed by any argument strings.

               X11::Protocol::WM::set_wm_command ($X, $window,
                                                  'myprog',
                                                  '--option',
                                                  'filename.txt');

           A  client  can  set  this  at any time, or if participating in the "WM_SAVE_YOURSELF" session manager
           protocol then it should set in response to a "WM_SAVE_YOURSELF" "ClientMessage".

           The command should start the client in its current state as far as possible,  so  the  command  might
           include a filename, command line options for current settings, etc.

           Non-ASCII  is  allowed per "Text Properties" above.  The ICCCM spec is for Latin-1 to work on a POSIX
           Latin-1 system, but how well anything else survives a session manager etc is another matter.

   WM_ICON_SIZE
       "($min_width,$min_height, $max_width,$max_height, $width_inc,$height_inc) =
       X11::Protocol::WM::get_wm_icon_size($X,$root)"
           Return the window manager's "WM_ICON_SIZE" recommended  icon  sizes  (in  pixels)  as  a  range,  and
           increment above the minimum.  If there's no "WM_ICON_SIZE" property then return an empty list.

           $root is the root window to read.  If omitted then read the "$X->root" default.

           An  icon  pixmap  or window in "WM_HINTS" should be a size in this range.  Many window managers don't
           set a preferred icon size.  32x32 might be typical on a small screen or 48x48 on a bigger screen.

   WM_HINTS
       "X11::Protocol::WM::set_wm_hints ($X, $window, key=>value, ...)"
           Set the "WM_HINTS" property on $window (an XID).  For example,

               X11::Protocol::WM::set_wm_hints
                   ($X, $my_window,
                    input         => 1,
                    initial_state => 'NormalState',
                    icon_pixmap   => $my_pixmap);

           The key/value parameters are as follows.

               input             integer 0 or 1
               initial_state     enum string or number
               icon_pixmap       pixmap (XID integer), depth 1
               icon_window       window (XID integer)
               icon_x            \ integer coordinate
               icon_y            / integer coordinate
               icon_mask         pixmap (XID integer)
               window_group      window (XID integer)
               urgency           boolean

           "input" is 1 if the client wants the window manager to give $window the keyboard input  focus.   This
           will  be  with  "$X->SetInputFocus()",  or  if "WM_TAKE_FOCUS" is in "WM_PROTOCOLS" then instead by a
           "ClientMessage".

           "input" is 0 if the window manager should not give the client the  focus.   This  is  either  because
           $window  is output-only, or if "WM_TAKE_FOCUS" is in "WM_PROTOCOLS" then because the client will do a
           "SetInputFocus()" to itself on an appropriate button press etc.

           "initial_state" is a string or number.  The ICCCM allows "NormalState" or  "IconicState"  as  initial
           states.

               "NormalState"       1
               "IconicState"       3

           "icon_pixmap"  should  be a pixmap (an XID) with depth 1, ie. a bitmap.  The window manager will draw
           it in suitable contrasting colours.  "1" pixels are foreground and "0"  is  background.   "icon_mask"
           bitmap is applied to the displayed icon.  It can be used to make a non-rectangular icon.

           "icon_window"  is  a window which the window manager may show when $window is iconified.  This can be
           used for a multi-colour icon, either by a background or by client drawing (in  response  to  "Expose"
           events,  or  updated  periodically  for  a clock, etc).  The window should be a child of the root and
           should use the default visual and colormap of the screen.  The window manager might resize the window
           and/or border.

           The window manager might set a "WM_ICON_SIZE" property on the root window for good icon  sizes.   See
           "WM_ICON_SIZE".

           "window_group" is the XID of a window which is the group leader of a group of top-level windows being
           used  by  the client.  The window manager might provide a way to manipulate the group as a whole, for
           example to iconify it all.  If iconified then the icon hints of the leader are  used  for  the  icon.
           The group leader can be an unmapped window.  It can be convenient to use a never-mapped window as the
           leader for all subsequent windows.

           "urgency"  true means the window is important and the window manager should draw the user's attention
           to it in some way.  The client can change this hint at any time to change the current importance.

       "(key => $value, ...) = X11::Protocol::WM::get_wm_hints ($X, $window)"
           Return the "WM_HINTS" property from $window.  The  return  is  a  list  of  key/value  pairs  as  per
           "set_wm_hints()" above

               input => 1,
               icon_pixmap => 1234,
               ...

           Only  fields  with  their  flag  bits  set  in  the  hints are included in the return.  If there's no
           "WM_HINTS" at all or or its flags field is zero then the return is an empty list.

           The return can be put into a hash to get fields by name,

               my %hints = X11::Protocol::WM::get_wm_hints ($X, $window);
               if (exists $hints{'icon_pixmap'}) {
                 print "icon_pixmap is ", $hints{'icon_pixmap'}, "\n";
               }

           "initial_state" is a string such as "NormalState".  The pixmaps and windows are string "None" if  set
           but zero (which is probably unusual).  If "$X->{'do_interp'}" is disabled then all are numbers.

           X11R2 Xlib had a bug in its "XSetWMHints()" which chopped off the "window_group" value from the hints
           stored.  The "window_group" field is omitted from the return in that case.

       "(key => $value, ...) = X11::Protocol::WM::change_wm_hints ($X, $window, key=>value, ...)"
           Change  some  fields  of the "WM_HINTS" property on $window.  The given key/value fields are changed.
           Other fields are left alone.  For example,

               X11::Protocol::WM::set_wm_hints ($X, $window,
                                                urgency => 1);

           A value "undef" means delete a field,

               X11::Protocol::WM::set_wm_hints ($X, $window,
                                                icon_pixmap => undef,
                                                icon_mask   => undef);

           The change requires a server round-trip to fetch the current values  from  $window.   An  application
           might prefer to remember its desired hints and send a full "set_wm_hints()" each time.

       "$bytes = X11::Protocol::WM::pack_wm_hints ($X, key=>value...)"
           Pack  a  set  of  values  into  a  byte string of "WM_HINTS" format.  The key/value arguments are per
           "set_wm_hints()" above and the result is the raw bytes stored in a "WM_HINTS" property.

           The $X argument is not actually used currently, but is  present  in  case  "initial_state"  or  other
           values might use an "$X->num()" lookup in the future.

       "(key => $value, ...) = X11::Protocol::WM::unpack_wm_hints ($X, $bytes)"
           Unpack   a   byte  string  as  a  "WM_HINTS"  structure.   The  return  is  key/value  pairs  as  per
           "get_wm_hints()" above.  The $X parameter is used for "do_interp".  There's no communication with the
           server.

   WM_NAME, WM_ICON_NAME
       "X11::Protocol::WM::set_wm_name ($X, $window, $name)"
           Set the "WM_NAME" property on $window (an integer XID) to $name (a string).

           The window manager might display this as a title above the window, or in a menu of windows, etc.   It
           can  be  a  Perl  5.8  wide-char  string per "Text Properties" above.  A good window manager ought to
           support non-ASCII or non-Latin-1 titles, but how well it displays might depend on fonts etc.

       "X11::Protocol::WM::set_wm_icon_name ($X, $window, $name)"
           Set the "WM_ICON_NAME" property on $window (an integer XID) to $name (a string).

           The window manager might display this when $window is iconified.  If $window doesn't have an icon (in
           "WM_HINTS" or from the window manager itself) then this text might be all that's shown.   Either  way
           it should be something short.  It can be a Perl 5.8 wide-char string per "Text Properties" above.

   WM_NORMAL_HINTS
       "X11::Protocol::WM::set_wm_normal_hints ($X, $window, key=>value,...)"
           Set  the "WM_NORMAL_HINTS" property on $window (an integer XID).  This is a "WM_SIZE_HINTS" structure
           which tells the window manager what sizes the client would like.  For example,

               set_wm_normal_hints ($X, $window,
                                    min_width => 200,
                                    min_height => 100);

           Generally the window manager restricts user resizing to the hint limits.  Most  window  managers  use
           these  hints,  but of course they're only hints and a good program should be prepared for other sizes
           even if it won't look good or can't do much useful when too big or too small etc.

           The key/value parameters are

               user_position      boolean, window x,y is user specified
               user_size          boolean, window width,height is user specified
               program_position   boolean, window x,y is program specified
               program_size       boolean, window width,height is program specified
               min_width          \ integers, min size in pixels
               min_height         /
               max_width          \ integers, max size in pixels
               max_height         /
               base_width         \ integers, size base in pixels
               base_height        /
               width_inc          \ integers, size increment in pixels
               height_inc         /
               min_aspect         \  fraction 2/3 or decimal 2 or 1.5
               min_aspect_num      | or integer num/den up to 0x7FFFFFFF
               min_aspect_den      |
               max_aspect          |
               max_aspect_num      |
               max_aspect_den     /
               win_gravity        WinGravity enum "NorthEast" etc

           "user_position" and "user_size" are flags meaning that the window's x,y or width,height (in the usual
           core "$X->SetWindowAttributes()") were given by the user, for example from a "-geometry" command line
           option.  The window manager  will  generally  obey  these  values  and  skip  any  auto-placement  or
           interactive placement it might otherwise do.

           "program_position"  and  "program_size"  are  flags  meaning  the  window  x,y  or  width,height were
           calculated by the program.  The window manager might override with  its  own  positioning  or  sizing
           policy.   There's  generally  no  need  to set these fields unless the program has a definite idea of
           where and how big it should be.  For a size it's enough to set the core window width,height  and  let
           the window manager (if there's one running) go from there.

           Items  shown  grouped  above  must  be given together, so for instance if a "min_width" is given then
           "min_height" should be given too.

           "base_width","base_height" and "width_inc","height_inc" ask that the window be a certain base size in
           pixels then a multiple of "inc" pixels above that.  This can be used by  things  like  "xterm"  which
           want  a  fixed size for border or scrollbar and then a multiple of the character size above that.  If
           "base_width","base_height" are not given then "min_width","min_height" is the base size.

           "base_width","base_height" can be smaller than "min_width","min_height".  This means the size  should
           still  be a base+inc multiple, but the first such which is at least the min size.  The window manager
           generally presents the "inc" multiple to the user, so that for example on an xterm the  user  sees  a
           count of characters.  A min size can then demand for example a minimum 1x1 or 2x2 character size.

           "min_aspect","max_aspect"  ask  that the window have a certain minimum or maximum width/height ratio.
           For example aspect 2/1 means it should be twice as wide as it is high.  This is applied to  the  size
           above "base_width","base_height", or if base not given then to the whole window size.

           "min_aspect_num","min_aspect_den" and "max_aspect_num","max_aspect_den" set numerator and denominator
           values  directly  (INT32,  so maximum 0x7FFF_FFFF).  Or "min_aspect" and "max_aspect" accept a single
           value in various forms which are turned into num/den values.

               2         integer
               1.125     decimal, meaning 1125/1000
               2/3       fraction
               1.5/4.5   fraction with decimals

           Values bigger than 0x7FFFFFFF in these  forms  are  reduced  proportionally  as  necessary.   A  Perl
           floating  point  value  will  usually have more bits of precision than 0x7FFFFFFF and is truncated to
           something that fits.

           "win_gravity" is how the client would like to be shifted to make room for any surrounding  frame  the
           window  manager  might  add.   For  example if the program calculated the window size and position to
           ensure the north-east corner is at a desired position, then give "win_gravity => "NorthEast"" so that
           the window manager keeps the north-east corner the same when it applies its frame.

           "win_gravity => "Static"" means the frame is put around the window and the window not moved  at  all.
           Of course that might mean some of the frame ends up off-screen.

       "$bytes = X11::Protocol::WM::pack_size_hints ($X, key=>value,...)"
           Return  a bytes string which is a "WM_SIZE_HINTS" structure made from the given key/value parameters.
           "WM_SIZE_HINTS" is structure type for "WM_NORMAL_HINTS" described above and the key/value  parameters
           are as described above.

           The  $X  parameter is used to interpret "win_gravity" enum values.  There's no communication with the
           server.

       "($num,$den) = X11::Protocol::WM::aspect_to_num_den ($aspect)"
           Return a pair of INT32 integers 0 to 0x7FFF_FFFF for the given aspect ratio  $aspect.   This  is  the
           conversion  applied  to  "min_aspect"  and  "max_aspect"  above.   $aspect can be any of the integer,
           decimal or fraction described.

   WM_PROTOCOLS
       "X11::Protocol::WM::set_wm_protocols ($X, $window, $protocol,...)"
           Set the "WM_PROTOCOLS" property on $window (an XID).  Each argument is a string protocol name  or  an
           integer atom ID.

               X11::Protocol::WM::set_wm_protocols
                 ($X, $window, 'WM_DELETE_WINDOW', '_NET_WM_PING')

           For  example  "WM_DELETE_WINDOW"  means that when the user clicks the close button the window manager
           sends a "ClientMessage" event rather than doing a "KillClient()".  The "ClientMessage" event allows a
           program to clean-up or ask the user about saving a document before exiting, etc.

   WM_STATE
       The window manager maintains a state for each client window it manages,

           WithdrawnState
           NormalState
           IconicState

       Withdrawn means the window is not mapped and the window manager is not  managing  it.   A  Newly  created
       window  ("$X->CreateWindow()") is initially withdrawn state and on first "$X->MapWindow()" goes to normal
       state (or to iconic state if that's the initial state asked for in "WM_HINTS").

       "iconify()" and "withdraw()" below can change the state to iconic or withdrawn.  A window can be restored
       from iconic to normal state by a "MapWindow()".

       "($state, $icon_window) = X11::Protocol::WM::get_wm_state ($X, $window)"
           Return the "WM_STATE" property from $window.   This  is  set  by  the  window  manager  on  top-level
           application windows.  If there's no such property then the return is an empty list.

           $state  returned  is  an  enum  string, or an integer value if "$X->{'do_interp'}" is disabled or the
           value unrecognised.

               "WithdrawnState"    0      not displayed
               "NormalState"       1      window displayed
               "IconicState"       3      iconified in some way

               "ZoomState"         2      \ no longer in ICCCM
               "InactiveState"     4      /   (zoom meant maximized)

           $icon_window returned is the window (integer XID) used by the window manager to display  an  icon  of
           $window.   If  there's  no  such  window  then $icon_window is "None" (or 0 if "$X->{'do_interp'}" is
           disabled).

           $icon_window might be the icon window from the client's "WM_HINTS" or it might be a window created by
           the window manager.  The client can draw into it  for  animations  etc,  perhaps  selecting  "Expose"
           events on it to know when to redraw.

           "WM_STATE"  is set by the window manager when a toplevel window is first mapped (or perhaps earlier),
           and then kept up-to-date.  Generally no "WM_STATE" property or a  "WM_STATE"  set  to  WithdrawnState
           means  the  window  manager  is  not  managing  the window, or not yet doing so.  A client can select
           "PropertyChange" event mask in the usual way to listen for "WM_STATE" changes.

       "($state, $icon_window) = X11::Protocol::WM::unpack_wm_state ($X, $bytes)"
           Unpack the bytes of a "WM_STATE" property to a $state and $icon_window as per "get_wm_state()" above.

           $X is used for "$X->{'do_interp'}" but there's no communication with the server.

       "X11::Protocol::WM::iconify ($X, $window)"
       "X11::Protocol::WM::iconify ($X, $window, $root)"
           Change $window to "IconicState" by sending a "ClientMessage" to the window manager.   If  there's  no
           window manager running then iconification is not possible and this message does nothing.

           $root  should  be  the  root  window  of  $window.  If not given or "undef" then it's obtained from a
           "QueryTree()".  Any client can iconify any top level window.

           If $window has other windows which are "WM_TRANSIENT_FOR" for it then generally  the  window  manager
           will iconify or hide those windows too (see "WM_TRANSIENT_FOR" below).

       "X11::Protocol::WM::withdraw ($X, $window)"
       "X11::Protocol::WM::withdraw ($X, $window, $root)"
           Change $window to "WithdrawnState" by an "$X->UnmapWindow()" and a synthetic "UnmapNotify" message to
           the window manager.

           If  there's  no  window manager running then the "UnmapWindow()" unmaps and the "UnmapNotify" message
           does nothing.

           $root should be the root window of $window.  If not given  or  "undef"  then  it's  obtained  from  a
           "$X->QueryTree()".

           If  other  windows  are  "WM_TRANSIENT_FOR" this $window (eg. open dialog windows) then generally the
           client should withdraw them too.  The window manager  might  make  such  other  windows  inaccessible
           anyway.

           The  ICCCM  specifies an "UnmapNotify" message so the window manager is notified of the desired state
           change even if $window is already unmapped, such as in "IconicState" or perhaps  during  some  window
           manager reparenting, etc.

           $window  can  be  changed back to NormalState or IconicState later with "$X->MapWindow()" the same as
           for a newly created window.  (And "WM_HINTS" "initial_state" can give a desired initial iconic/normal
           state).  But before doing so be sure the window manager has recognised the "withdraw()".   This  will
           be  when  the  window  manager  changes  the "WM_STATE" property to "WithdrawnState", or deletes that
           property.

           Any client can withdraw any toplevel window, but it's unusual for a client to withdraw windows  which
           are not its own.

   WM_TRANSIENT_FOR
       "X11::Protocol::WM::set_wm_transient_for ($X, $window, $transient_for)"
           Set the "WM_TRANSIENT_FOR" property on $window (an XID).

           $transient_for  is  another  window  XID,  or  "undef"  if  $window  is not transient for anything so
           "WM_TRANSIENT_FOR" should be deleted.

           "Transient for" means $window is some sort of dialog or menu  related  to  the  given  $transient_for
           window.   The  window  manager  will generally iconify $window together with its $transient_for, etc.
           See "set_motif_wm_hints()" below for "modal" transients.

   _MOTIF_WM_HINTS
       "X11::Protocol::WM::set_motif_wm_hints ($X, $window, key=>value...)"
           Set the "MOTIF_WM_HINTS" property on $window (an XID).

           These hints control window decorations and "modal" state.  It originated in the  Motif  "mwm"  window
           manager  but  is  recognised  by  most  other window managers.  It should be set on a toplevel window
           before mapping.  Changes made later might not affect what the window manager does.

               X11::Protocol::WM::set_motif_wm_hints
                 ($X, $dialog_window,
                  input_mode => "full_application_modal");
               $X->MapWindow ($dialog_window);

           Ordinary windows generally don't need to restrict their decorations etc, but something special like a
           clock or gadget might benefit.

               X11::Protocol::WM::set_motif_wm_hints
                 ($X, $my_gadget_window,
                  functions   => 4+32,   # move+close
                  decorations => 1+4+8); # border+title+menu

           The key/value arguments are

               functions   => integer bits
               decorations => integer bits
               input_mode  => enum string or integer
               status      => integer bits

           "functions" is what actions the window manager should offer to  the  user  in  a  drop-down  menu  or
           similar.   It's  an  integer  bitwise  OR  of the following values.  If not given then the default is
           normally all functions.

               bit    actions offered
               ---    ---------------
                1     all functions
                2     resize window
                4     move window
                8     minimize, to iconify
               16     maximize, to full-screen (with a frame still)
               32     close window

           "decorations" is what visual decorations the window manager should show around the window.   It's  an
           integer  bitwise  OR  of  the  following  values.   If  not  given  then  the default is normally all
           decorations.

               bit       decorations displayed
               ---       ---------------------
                1        all decorations
                2        border around the window
                4        resizeh, handles to resize by dragging
                8        title bar, showing WM_NAME
               16        menu, drop-down menu of the "functions" above
               32        minimize button, to iconify
               64        maximize button, to full-screen

           "input_mode" allows a window to be "modal", meaning the user should interact only with $window.   The
           window manager will generally keep it on top, not move the focus to other windows, etc.  The value is
           one of the following strings or corresponding integer,

                 string                   integer
               "modeless"                    0    not modal (the default)
               "primary_application_modal"   1    modal to its "transient for"
               "system_modal"                2    modal to the whole display
               "full_application_modal"      3    modal to the current client

           "primary_application_modal"  means  $window  is  modal for the "WM_TRANSIENT_FOR" set on $window (see
           "WM_TRANSIENT_FOR"  above),  but   other   windows   on   the   display   can   be   used   normally.
           "full_application_modal"  means  modal  for  all windows of the same client, but other clients can be
           used normally.

           Modal behaviour is important for good user interaction and therefore ought to  be  implemented  by  a
           window manager, but a good program should be prepared to do something with input on other windows.

           "status" field is a bitwise OR of the following bits (only one currently).

               bit
                1    tearoff menu window

           Tearoff menu flag is intended for tearoff menus, as the name suggests.

               X11::Protocol::WM::set_motif_wm_hints
                 ($X, $my_tearoff_window, status => 1);

           Motif  "mwm"  will expand the window to make it wide enough for the "WM_NAME" in the frame title bar.
           Otherwise a title is generally truncated to as much as fits the window's  current  width.   Expanding
           can  be good for tearoffs where the title bar is some originating item name etc which the user should
           see.  But don't be surprised if this flag is ignored by other window managers.

           Perhaps in the future the individual bits above will have some symbolic names.  Either  constants  or
           string  values interpreted.  What would a possible "get_hints()" return, and what might be convenient
           to add/subtract bits?

           See  /usr/include/Xm/MwmUtil.h   on   the   hints   bits,   and   see   "mwm"   sources   WmWinInfo.c
           "ProcessWmWindowTitle()" for the "status" tearoff window flag.

   _NET_FRAME_EXTENTS
       "my ($left,$right, $top,$bottom) = X11::Protocol::WM::get_net_frame_extents ($X, $window)"
           Get the "_NET_FRAME_EXTENTS" property from $window.

           This  is  set  on  top-level  windows  by  the  window  manager to report how many pixels of frame or
           decoration it has added around $window.

           If there's no such property set then the return is an empty list.  So for example

               my ($left,$right,$top,$bottom)
                     = get_net_frame_extents ($X, $window)
                 or print "no frame extents";

               my ($left,$right,$top,$bottom)
                 = get_net_frame_extents ($X, $window);
               if (! defined $left) {
                 print "no frame extents";
               }

           A client might look at the frame size if moving a window programmatically so as not to put the  title
           bar etc off-screen.  Oldish window managers might not provide this information though.

   _NET_WM_PID
       "X11::Protocol::WM::set_net_wm_pid ($X, $window)"
       "X11::Protocol::WM::set_net_wm_pid ($X, $window, $pid)"
       "X11::Protocol::WM::set_net_wm_pid ($X, $window, undef)"
           Set  the "_NET_WM_PID" property on $window to the given $pid process ID, or to the $$ current process
           ID if omitted.  (See perlvar for $$.)  If $pid is "undef" then the property is deleted.

           A window manager or similar might use the PID to forcibly kill an  unresponsive  client.   It's  only
           useful if "WM_CLIENT_MACHINE" (above) is set too, to know where the client is running.

   _NET_WM_STATE
       An  EWMH  compliant  window manager maintains a set of state flags for each client window.  A state is an
       atom such as "_NET_WM_STATE_FULLSCREEN" and each such state can be  present  or  absent.   The  supported
       states  are  listed  in  "_NET_SUPPORTED".  Any client can ask the window manager to change states on any
       window.  A client  might  be  able  to  ask  for  an  initial  set  of  states  for  a  new  window  (see
       "set_net_wm_state()" below).  Possible states include

       _NET_WM_STATE_MODAL
           The  window  is modal to its "WM_TRANSIENT_FOR" parent or if "WM_TRANSIENT_FOR" not set then modal to
           its window group.

           See "_MOTIF_WM_HINTS" to set modal with the Motif style hints.

       _NET_WM_STATE_STICKY
           The window is kept in a fixed position on screen when the desktop scrolls.

       _NET_WM_STATE_MAXIMIZED_VERT
       _NET_WM_STATE_MAXIMIZED_HORZ
           The window is maximum size vertically or horizontally or both.  The window still has its  surrounding
           decoration and the size should obey size increments specified in "WM_NORMAL_HINTS".

       _NET_WM_STATE_FULLSCREEN
           The window is the full screen with no decoration around it, thus being the full screen.

           The  window  manager  remembers  the  "normal" size of the window so that when maximize or fullscreen
           state is removed the previous size is restored.

       _NET_WM_STATE_SHADED
           The window is "shaded" which generally means its title bar  is  displayed  but  none  of  the  client
           window.  This is an alternative to iconifying a window.

       _NET_WM_STATE_SKIP_TASKBAR
       _NET_WM_STATE_SKIP_PAGER
           Don't show the window on a task bar or in a pager, respectively.

       _NET_WM_STATE_HIDDEN (read-only)
           This state is set by the window manger when the window is iconified or similar and so does not appear
           on screen.  Clients cannot change this.

       _NET_WM_STATE_ABOVE
       _NET_WM_STATE_BELOW
           The window is kept above or below other client windows.  The stacking order maintained is roughly

                top
               +-----------------------------+
               |  _NET_WM_WINDOW_TYPE_DOCK   |   "DOCK" panels etc on top,
               +-----------------------------+   except perhaps FULLSCREEN
               |     _NET_WM_STATE_ABOVE     |   windows above those panels
               +-----------------------------+   when focused
               |            normal           |
               +-----------------------------+
               |     _NET_WM_STATE_BELOW     |
               +-----------------------------+
               | _NET_WM_WINDOW_TYPE_DESKTOP |
               +-----------------------------+
                bottom

       _NET_WM_STATE_DEMANDS_ATTENTION
           The  window  should  be brought to the attention of the user in some way.  A client sets this and the
           window manager clears it after the window has received user  attention  (which  might  mean  keyboard
           focus or similar).

       The following functions get or set the states.

       "change_net_wm_state($X, $window, $action, $state, key=>value,...)"
           Change  one of the "_NET_WM_STATE" state flags on $window by sending a message to the window manager.
           For example,

               change_net_wm_state ($X, $window, "toggle", "FULLSCREEN");

           $window must be a managed window, ie. must have had its initial "MapWindow()" and not be an override-
           redirect.  If that's not so or if there's no window manager or it doesn't have EWMH then this  change
           message will have no effect.

           $action is a string or integer how to change the state,

               "remove"       0
               "add"          1
               "toggle"       2

           $state    is    a    string    such    as    "FULLSCREEN"    or    an    atom    integer    such   as
           "$X->atom("_NET_WM_STATE_FULLSCREEN")".

           The further optional key/value parameters are

               state2   => string or atom
               source   => "none", "normal", "user", 0,1,2
               root     => integer XID, or undef

           A change message can act on one or two states.  For two states the second is "state2".   For  example
           to maximize vertically and horizontally in one operation,

               change_net_wm_state ($X, $window, "add", "MAXIMIZED_VERT",
                                    state2 => "MAXIMIZED_HORZ");

           "source"  is  where  the  change  request  came  from.   The default is "normal" which means a normal
           application.  "user" is for a user-interface control program such as  a  pager.   ("none"=0  is  what
           clients prior to EWMH 1.2 gave.)

           "root"  is  the  root  window (integer XID) of $window.  If "undef" or not given then it's found with
           "$X->QueryTree()".  If you already know the root then giving it avoids that round-trip query.

       "@strings = get_net_wm_state ($X, $window)"
       "@atoms = get_net_wm_state_atoms ($X, $window)"
           Get the "_NET_WM_STATE" property from $window.  "get_net_wm_state()" returns a list of  strings  such
           as   "FULLSCREEN".    "get_net_wm_state_atoms()"   returns   a   list   of   atom  integers  such  as
           "$X->atom('_NET_WM_STATE_FULLSCREEN')".  In both cases if there's no such property or if  it's  empty
           then return an empty list.

       "set_net_wm_state ($X, $window, $state,...)"
           Set  the "_NET_WM_STATE" property on $window.  Each $state can be a string such as "FULLSCREEN" or an
           atom integer such as "$X->atom('_NET_WM_STATE_FULLSCREEN')".

           A client can set "_NET_WM_STATE" on a new window to  tell  the  window  manager  of  desired  initial
           states.  However this is only a "should" in the EWMH spec so it might not be obeyed.

               # initial desired state
               set_net_wm_state ($X, $window,
                                 "MAXIMIZED_HORZ", "MAXIMIZED_VERT");

           After   the  window  is  managed  by  the  window  manager  (once  mapped)  clients  should  not  set
           "_NET_WM_STATE" but instead ask the window manager with "change_net_wm_state()" per above.

   _NET_WM_USER_TIME
       "set_net_wm_user_time ($X, $window, $time)"
           Set the "_NET_WM_USER_TIME" property on $window.

           $time should be a server time value (an integer) from the last user keypress etc  event  in  $window.
           Or when $window is created then the time from the event which caused it to be opened.

           On  a newly created window a special $time value 0 means the window should not receive the focus when
           mapped -- assuming the window manager recognises "_NET_WM_USER_TIME" of course.

           If the client has the active window it  should  update  "_NET_WM_USER_TIME"  for  every  user  input.
           Generally  KeyPress  and  ButtonPress events are user input, but KeyRelease and ButtonRelease are not
           since it's the Press events which are the user actively doing something.

           The window manager might use "_NET_WM_USER_TIME" to control focus and/or stacking order so  that  for
           example a slow popup doesn't steal the focus if you've gone to another window to do other work in the
           interim.

   _NET_WM_WINDOW_TYPE
       "X11::Protocol::WM::set_net_wm_window_type ($X, $window, $window_type)"
           Set  the  "_NET_WM_WINDOW_TYPE"  property  on $window (an XID).  $window_type can be a type string as
           follows from the EWMH,

               "NORMAL"
               "DIALOG"
               "DESKTOP"
               "DOCK"
               "TOOLBAR"
               "MENU"
               "UTILITY"
               "SPLASH"

           $window_type can also be an integer atom such as "$X->atom('_NET_WM_WINDOW_TYPE_DIALOG')".

   Frame to Client
       "$window = X11::Protocol::WM::frame_window_to_client ($X, $frame)"
           Return the client window (XID) contained within window manager $frame window  (an  XID).   $frame  is
           usually an immediate child of the root window.

           If  no  client  window can be found in $frame then return "undef".  This might happen if $frame is an
           icon window or similar created by the window manager itself, or an override-redirect client without a
           frame, or if there's no window manager running at all.  In the latter two cases $frame would  be  the
           client already.

           The  strategy  is  to look at $frame and down the window tree seeking a "WM_STATE" property which the
           window manager puts on a client's toplevel when mapped.  The  search  depth  and  total  windows  are
           limited  in  case  the  window  manager does its decoration in some ridiculous way or the client uses
           excessive windows (which would be traversed if there's no window manager).

               +-rootwin--------------------------+
               |                                  |
               |                                  |
               |    +-frame-win--------+          |
               |    | +-client-win---+ |          |
               |    | | WM_STATE ... | |          |
               |    | |              | |          |
               |    | +--------------+ |          |
               |    +------------------+          |
               |                                  |
               +----------------------------------+

           Care is taken not to error out if some windows are destroyed during  the  search.   The  windows  may
           belong  to other clients and could be destroyed at any time.  If $frame itself doesn't exist then the
           return is "undef".

           This function is similar to what "xwininfo" and similar programs do to go from a toplevel root window
           child down to the client window, per dmsimple.c "Select_Window()" or Xlib "XmuClientWindow()".   (See
           also X11::Protocol::ChooseWindow.)

   Virtual Root
       Some  window  managers  use  a  "virtual root" window covering the entire screen.  Application windows or
       frame windows are then children of that virtual root.  This can help the window manager implement a large
       desktop or multiple desktops, though it tends to fail in subtle ways with various root oriented programs,
       including for example xsetroot(1) or the click-to-select in xwininfo(1) and xprop(1).

       "$window = X11::Protocol::WM::root_to_virtual_root ($X, $root)"
           If the window manager is using a virtual root then return  that  window  XID.   If  not  then  return
           "undef".

           The  current  implementation  searches for a window with an "__SWM_VROOT" property, as per the "swm",
           "tvtwm" and "amiwm" window managers, and as used by  the  "xscreensaver"  program  and  perhaps  some
           versions of KDE.

           There's   nothing   yet   for  EWMH  "_NET_VIRTUAL_ROOTS".   Do  any  window  managers  use  it?   Is
           "_NET_CURRENT_DESKTOP" an index into that virtual roots list?

           (See X11::Protocol::XSetRoot for changing the background of a root or virtual root.)

EXPORTS

       Nothing is exported by default, but the functions can be requested in usual "Exporter" style,

           use X11::Protocol::WM 'set_wm_hints';
           set_wm_hints ($X, $window, input => 1, ...);

       Or just call with full package name

           use X11::Protocol::WM;
           X11::Protocol::WM::set_wm_hints ($X, $window, input => 1, ...);

       There's no ":all" tag since this module is meant as a grab-bag of functions and to import as-yet  unknown
       things would be asking for name clashes.

BUGS

       Not  much  attention  is  paid  to  text  on an EBCDIC system.  Wide char strings probably work, but byte
       strings may go straight through where they ought to be  re-coded  to  Latin-1.   But  the  same  probably
       applies  to  parts  of  the  core  "X11::Protocol"  such as "$X->atom_name()" where you'd want to convert
       Latin-1 from the server to native EBCDIC.

SEE ALSO

       X11::Protocol, X11::Protocol::Other, X11::Protocol::ChooseWindow, X11::Protocol::XSetRoot

       "Inter-Client  Communication  Conventions   Manual",   /usr/share/doc/xorg-docs/specs/ICCCM/icccm.txt.gz,
       <http://www.x.org/docs/ICCCM/>

       "Compound     Text     Encoding"    specification.     /usr/share/doc/xorg-docs/specs/CTEXT/ctext.txt.gz,
       <http://www.x.org/docs/CTEXT/>

       "Extended      Window      Manager      Hints"      which      is       the       "_NET_WM"       things.
       <http://www.freedesktop.org/wiki/Specifications/wm-spec>, <http://mail.gnome.org/archives/wm-spec-list/>

       wmctrl(1), xwit(1), X(7)

HOME PAGE

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

LICENSE

       Copyright 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/>.

perl v5.18.2                                       2013-11-04                             X11::Protocol::WM(3pm)