Provided by: libprima-perl_1.28-1.4_amd64 bug

NAME

       Prima::X11 - usage guide for X11 environment

DESCRIPTION

       This document describes subtle topics one must be aware when programming or using Prima programs under
       X11.

       The document covers various aspects of the toolkit and their implementation details with guidelines of
       the expected use. Also, standard X11 user-level and programming techniques are visited.

Basic command-line switches

       "--help"
           Prints the command-line arguments available and exits.

       "--display"
           Sets  X display address in Xlib notation. If not set, standard Xlib ( "XOpenDisplay(null)" ) behavior
           applies.

           Example:

              --display=:0.1

       "--visual"
           Sets X visual, to be used by default. Example:

              --visual=0x23

       "--sync"
           Turn off X synchronization

       "--bg", "--fg"
           Set default background and foreground colors. Example:

             --bg=BlanchedAlmond

       "--font"
           Sets default font. Example:

              --font='adobe-helvetica-medium-r-*-*--*-120-*-*-*-*-*-*'

       "--no-x11"
           Runs Prima without X11 display initialized. This switch can be used for programs that  use  only  OS-
           independent  parts of Prima, such as image subsystem or PostScript generator, in environments where X
           is not  present,  for  example,  a  CGI  script.   Obviously,  any  attempt  to  create  instance  of
           "Prima::Application"  or otherwise access X-depended code under such conditions causes the program to
           abort.

           There are alternatives to use the command switch. First, there is module "Prima::noX11" for the  same
           purpose but more convenient to use as

              perl -MPrima::noX11

           construct.  Second,  there  is  a  technique  to  continue execution even if connection to a X server
           failed:

              use Prima::noX11;
              use Prima;

              my $error = Prima::XOpenDisplay();
              if ( defined $error) {
                   print "not connected to display: $error\n";
              } else {
                   print "connected to display\n";
              }

           The Prima::noX11 module exports a single function "XOpenDisplay" into "Prima" namespace,  to  connect
           to  the  X  display  explicitly.  The  display  to  be  connected to is $ENV{DISPLAY}, unless started
           otherwise on command line ( with --display option) or with parameter to the "XOpenDisplay" function.

           This technique may be useful to programs that use Prima imaging functionality and may or may not  use
           windowing capabilites.

X resources database

       X11  provides  XRDB,  the  X  resource  database, a keyed list of arbitrary string values stored on the X
       server. Each key is a combination of names and classes of widgets,  each  in  string  form.  The  key  is
       constructed  so  the  leftmost  substring  (  name  or  class  ) corresponds to the top-level item in the
       hierarchy, usually the application name or class. Although the XRDB can be changed via native X  API,  it
       is  rarely  done  by  applications.  Instead,  the  user  creates a file, usually named .Xdefaults, which
       contains the database in the string form.

       The format of .Xdefaults directly reflects XRDB capabilities, one of  the  most  important  of  which  is
       globbing,  manifested via * ( star ) character. Using globbing, the user can set up a property value that
       corresponds to multiple targets:

          *.ListBox.backColor: yellow

       The string above means that all widgets of ListBox class must have yellow background.

       The application itself is responsible for parsing the strings and querying the XRDB.   Also,  both  class
       names  and  widget names, as well as database values are fully defined in terms of the application. There
       are some guidelines though, for example, colors and fonts best  described  in  terms,  native  to  the  X
       server.   Also,  classes  and  names  are  distinguished  by  the case: classes must begin with the upper
       register letter. Also, not every character can be stored in the  XRDB  database  (  space,  for  example,
       cannot) , and therefore XRDB API automatically converts these to _ ( underscore ) characters.

       Prima  defines  its  all  set of resources, divided in two parts: general toolkit settings and per-widget
       settings. The general settings functionality is partially  overloaded  by  command-line  arguments.  Per-
       widget settings are fonts and colors, definable for each Prima widget.

       All  of  the  general  settings are applicable to the top-level item of widget hierarchy, named after the
       application, and "Prima" class.  Some  of  these,  though,  are  needed  to  be  initialized  before  the
       application  instance  itself  is  created, so these can be accessed via "Prima" class only, for example,
       "Prima.Visual".  Some, on the contrary, may occasionally overlap with per-widget syntax.  In  particular,
       one must vary not to mix

          Prima.font: some-font

       with

          Prima*font: some-font

       The  former  syntax  is  a  general setting, and sets the default Prima font.  The latter is a per-widget
       assignment, and explicitly sets  font  to  all  Prima  widgets,  effectively  ruining  the  toolkit  font
       inheritance scheme. The same is valid for an even more oppressive

          *font: some-font

       record.

       The  allowed  per-widget settings are colors and font settings only ( see corresponding sections ). It is
       an arguably useful feature to map all widget properties onto XRDB, but Prima  does  not  implement  this,
       primarily because no one asked for it, and also because this creates unnecessary latency when enumeration
       of all properties for each widget takes place.

       All  global  settings have identical class and name, varied in the case of the first letter. For example,
       to set "Submenudelay" value, one can do it either by

          Prima.Submenudelay: 10

       or

          Prima.submenudelay: 10

       syntax. Despite that these calls are different, in a way that one reaches for the whole class and another
       for the name, for the majority of these properties it does  not  matter.  To  avoid  confusion,  for  all
       properties their names and class are given as "PropetyClass.propertyname" index.

Fonts

   Default fonts
       Prima::Application defines set of "get_default_XXX_font" functions, where each returns some user-selected
       font, to be displayed correspondingly in menu, message, window captions, all other widgets, and finally a
       default  font.  While in other OS'es these are indeed standard configurable user options, raw X11 doesn't
       define any. Nevertheless, as the high-level code relies on these, corresponding  resources  are  defined.
       These are:

       •   font - Application::get_default_font

       •   caption_font - Application::get_caption_font. Used in "Prima::MDI".

       •   menu_font - Widget::get_default_menu_font. Default font for pull-down and pop-up menus.

       •   msg_font - Application::get_message_font. Used in "Prima::MsgBox".

       •   widget_font - Widget::get_default_font.

       All  of  the global font properties can only be set via "Prima" class, no application name is recognized.
       Also, these properties are identical to  "--font",  "--menu-font",  "--caption-font",  "--msg-font",  and
       "--widget-font"  command-line  arguments.  The per-widget properties are "font" and "popupFont", of class
       "Font", settable via XRDB only:

          Prima*Dialog.font: my-fancy-dialog-font
          Prima.FontDialog.font: some-conservative-font

       By default, Prima font is 12.Helvetica .

   X core fonts
       The values of the font entries are standard XLFD  strings,  the  default  "*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
       pattern, where each star character can be replaced by a particular font property, as name, size, charset,
       and  so  on.  To  interactively  select  an  appropriate  font,  use standard "xfontsel" program from X11
       distribution.

       Note, that encoding part of the font is recommended to left unspecified, otherwise it may clash with LANG
       environment variable, which is used by Prima font subsystem to determine which font  to  select  when  no
       encoding  is  given.   This advice, though, is correct only when both LANG and encoding part of a desired
       font match. In order to force a particular font encoding, the property "Prima.font" must contain one.

       Alternatively, and/or to reduce X font traffic, one may set  "IgnoreEncodings.ignoreEncodings"  property,
       which  is  a  semicolon-  separated  list  of  encodings Prima must not account. This feature has limited
       usability when for example fonts in Asian encodings result  in  large  font  requests.   Another  drastic
       measure to decrease font traffic is a boolean property "Noscaledfonts.noscaledfonts", which, if set to 1,
       restricts the choice of fonts to the non-scalable fonts only.

   Xft fonts
       Recently,  Prima was made to compile with Xft library, which contrary to core X font API, can make use of
       client-side fonts. Plus, Xft offers appealing features as font  antialiasing,  unicode,  and  arguably  a
       better  font  syntax. The Xft font syntax is inherited from "fontconfig" library and to be consulted from
       "man fonts-conf", but currently ( November 2003 ) basic font descriptions can be composed as follows:

          Palatino-12

       A font with name "Palatino" and size 12.

          Arial-10:BI

       A font with name "Arial", size 10, bold, italic. The "fontconfig"  syntax  allows  more  than  that,  for
       example,  arbitrary  matrix  transformations,  but  Prima can make use only of font name, size, and style
       flags.

       "--no-xft"
           "--no-xft" command-line argument, and boolean "UseXFT.usexft" XRDB property can be  used  to  disable
           use of the Xft library.

       "--no-core-fonts"
           Disables  all X11 core fonts, except "fixed" fonts. The "fixed" font is selected for the same reasons
           that X server is designed to provide at least one font, which usually is "fixed".

           It is valid to combine "--no-core-fonts" and "--no-xft". Moreover, adding "--noscaled" to these gives
           Prima programs a 'classic' X look.

       "--font-priority"
           Can be set to either "xft" or "core", to select  a  font  provider  mechanism  to  match  unknown  or
           incompletely specified fonts against.

           Default value: "xft" ( if compiled in ), "core" otherwise.

       "--no-aa"
           If set, turns off Xft antialiasing.

Colors

   XRDB conventions
       X  traditionally contains a color names database, usually a text file named rgb.txt.  Check your X manual
       where exactly this file resides and what is its format.  The idea behind it is  that  users  can  benefit
       from  portable  literal color names, with color values transparently adjustable to displays capabilities.
       Thus, it is customary to write

          color: green

       for many applications, and these in turn call "XParseColor" to convert strings into RGB values.

       Prima is no exception to the scheme. Each  widget  can  be  assigned  eight  color  properties:  "color",
       "hiliteBackColor",   "disabledColor",   "dark3DColor"  "backColor",  "hiliteColor",  "disabledBackColor",
       "light3DColor" by their name:

          Prima.backColor: #cccccc

       Additionally, set of command-line arguments allows overriding default values for these:

       •   "--fg" - color

       •   "--bg" - backColor

       •   "--hilite-fg" - hiliteColor

       •   "--hilite-bg" - hiliteBackColor

       •   "--disabled-fg" - disabledColor

       •   "--disabled-bg" - disabledBackColor

       •   "--light" - light3DColor

       •   "--dark" - dark3DColor

   Visuals
       X protocol works with explicitly defined pixel  values  only.   A  pixel  value,  maximum  32-bit  value,
       represents  a color in a display. There are two different color coding schemes - direct color and indexed
       color. The direct color-coded pixel value can unambiguously be converted into a  RGB-value,  without  any
       external  information.   The  indexed-color scheme represents pixel value as an index in a palette, which
       resided on X server. Depending on the color cell value of the palette, RGB color  representation  can  be
       computed.  A  X  display  can  contain  more  than one palette, and allow ( or disallow ) modification of
       palette color cells depending on a visual, the palette is attributed to.

       A visual is a X server resource, containing representation of color coding scheme, color bit  depth,  and
       modificability of the palette. X server can ( and usually does ) provide more than one visual, as well as
       different  bit  depths.   There  are  six  classes  of  visuals  in  X  paradigm.  In each, Prima behaves
       differently, also depending on display bit depth available.  In particular, color dithering can  be  used
       on  displays  with  less  than  12-bit  color depth. On displays with modifiable color palette, Prima can
       install its own values in palettes, which may result in an effect known as display flashing. To switch to
       a non-default visual, use "Prima.Visual" XRDB property or  "--visual"  command-line  argument.   List  of
       visuals  can  be  produced  interactively  by standard "xdpyinfo" command from X distribution, where each
       class of visual corresponds to one of six visual classes:

       StaticGray
           All color cells are read-only, and contain monochrome values only.  A typical example is a two-color,
           black-and-white monochrome display.  This visual is extremely rarely met.

       GrayScale
           Contains modifiable color palette, and capable of displaying monochrome values  only.  Theoretically,
           any paletted display on a monochrome monitor can be treated as a GrayScale visual. For both GrayScale
           and  StaticGray  visuals  Prima  resorts to dithering if it cannot get at least 32 evenly spaced gray
           values from black to white.

       StaticColor
           All color cells are read-only.  A typical example is a PC display  in  a  16-color  EGA  mode.   This
           visual is rarely met.

       PseudoColor
           All color cells are modifiable. Typically, 8-bit displays define this class for a default visual. For
           both  StaticColor  and PseudoColor visuals dithering is always used, although for "PseudoColor" Prima
           resorts to that only if X server cannot allocate another color.

           On "PseudoColor" and "GrayScale" Prima  allocates  a  small  set  of  colors,  not  used  in  palette
           modifications.  When  a  bitmap  is  to be exported via clipboard, or displayed in menu, or sent to a
           window manager as an icon to be displayed, it is downgraded to using these  colors  only,  which  are
           though guaranteedly to stay permanent through life of the application.

       TrueColor
           Each  pixel  value  is  explicitly coded as RGB. Typical example are 16, 24, or 32-bit display modes.
           This visual class is the best in terms of visual quality.

       DirectColor
           Same as TrueColor, but additionally each pixel value can be reprogrammed.  Not all  hardware  support
           this  visual,  and usually by default it is not set.  Prima supports this mode in exactly same way as
           TrueColor without additional features. During  testing,  it  appeared  that  non-default  DirectColor
           visuals require explicit assignment of each pixel used, which is inappropriate for color-rich images,
           and therefore Prima refuses to work on a non-default DirectColor visual.

Images

       As  described  in  the  previous  section,  X  does not standardize pixel memory format for TrueColor and
       "DirectColor" visuals, so there is a chance that Prima wouldn't work on some bizarre hardware. Currently,
       Prima knows how to compose pixels of 15, 16, 24, and 32 bit depth, of contiguous  (  not  interspersed  )
       red-green-blue memory layout. Any other pixel memory layout causes Prima to fail.

       Prima  supports  shared memory image X extension, which speeds up image display for X servers and clients
       running on same machine. The price for this is that if Prima program aborts, the shared memory will never
       be returned to the OS.  To remove the leftover segments, use your OS facilities, for example, "ipcrm"  on
       *BSD.

       The  clipboard  exchange  of  images  is  incompletely  implemented, since Prima does not accompany ( and
       neither reads ) COLORMAP, FOREGROUND, and BACKGROUND clipboard data, which contains pixel RGB values  for
       a  paletted  image.  As  a palliative, the clipboard-bound images are downgraded to a safe set of colors,
       locked immutable either by X server or Prima core.

       On images in the clipboard: contrary to the text in the clipboard,  which  can  be  used  several  times,
       images  seemingly  cannot.  The Bitmap or Pixmap descriptor, stored in the clipboard, is rendered invalid
       after it has been read once.

Window managers

       The original design of X protocol did not include the notion of a  window  manager,  and  latter  is  was
       implemented  as  an  ad-hoc patch, which results in race conditions when configuring widgets. The extreme
       situation may well happen when even a non-top level widget may be influenced by a  window  manager,  when
       for example a top-level widget was reparented into another widget, but the window manager is not aware or
       this yet.

       The  consequences  of  this,  as well as programming guidances are described in "Prima::Window". Here, we
       describe other aspects of interactions with WMs, as WM protocols, hints, and properties.

       Prima was tested with alternating success under the following window managers: mwm, kwin,  wmaker,  fvwm,
       fvwm2, enlightment, sawfish, blackbox, 9wm, olvm, twm, and in no-WM environment.

   Protocols
       Prima  makes  use  of  "WM_DELETE_WINDOW" and "WM_TAKE_FOCUS" protocols.  While "WM_DELETE_WINDOW" use is
       straightforward and needs no further attention, "WM_TAKE_FOCUS" can be tricky, since X defines several of
       input modes for a widget, which behave differently for each WM.  In particular, 'focus  follows  pointer'
       gives  pains  under  twm and mwm, where navigation of drop-down combo boxes is greatly hindered by window
       manager. The drop-down list is programmed so it is dismissed as soon its  focus  is  gone;  these  window
       managers withdraw focus even if the pointer is over the focused widget's border.

   Hints
       Size,  position,  icons,  and  other  standard X hints are passed to WM in a standard way, and, as inter-
       client communication manual ( ICCCM ) allows,  repeatedly  misinterpreted  by  window  managers.  Many  (
       wmaker,  for  example  ) apply the coordinates given from the program not to the top-level widget itself,
       but to its decoration.  mwm defines list of accepted icon sizes so these can be absurdly high, which adds
       confusion to a client who can create icon of any size, but unable to determine the best one.

   Non-standard properties
       Prima tries to use WM-specific hints, known for two window managers: mwm  and  kwin.   For  mwm  (  Motif
       window  manager  ) Prima sets hints of decoration border width and icons only. For kwin ( and probably to
       others, who wish to conform to specifications of http://www.freedesktop.org/ ) Prima uses  "NET_WM_STATE"
       property, in particular its maximization and task-bar visibility hints.

       Use  of  these  explicitly  contradicts  ICCCM, and definitely may lead to bugs in future ( at least with
       "NET_WM_STATE", since Motif interface can hardly expected to be changed ).  To disable the  use  of  non-
       standard WM properties, "--icccm" command-line argument can be set.

Unicode

       X  does  not  support  unicode,  and  number of patches were applied to X servers and clients to make the
       situation change. Currently ( 2003 ) standard unicode practices are not emerged yet, so  Prima  copes  up
       with what ( in author's opinion ) is most promising: Xft and iconv libraries.

   Fonts
       X11 supports 8-bit and 16-bit text string display, and neither can be used effectively to display unicode
       strings.  A "XCreateFontSet" technique, which combines several fonts under one descriptor, or a similarly
       implemented technique is the only way to provide correct unicode display.

       Also, core font transfer protocol suffers from ineffective memory representation, which  creates  latency
       when  fonts  with  large span of glyphs is loaded. Such fonts, in still uncommon though standard iso10646
       encoding, are the only media to display multi-encoding text without falling  back  to  hacks  similar  to
       "XCreateFontSet".

       These,  and  some  other  problems  are  efficiently  solved  by  Xft  library, a superset of X core font
       functionality. Xft features Level 1 ( November 2003 ) unicode display and supports 32-bit text strings as
       well as UTF8-coded strings.  Xft does not operate with charset encodings, and these  are  implemented  in
       Prima using iconv charset convertor library.

   Input
       Prima  does  not  support  extended  input  methods  (  XIM  etc ), primarily because the authors are not
       acquainted with CIJK problem domain. Volunteers are welcome.

   Clipboard
       Prima supports UTF8 text in clipboard via "UTF8_STRING" transparently, although not by default.

          Prima::Application-> wantUnicodeInput(1)

       is the easiest ( see Prima::Application ) way to initiate UTF8 clipboard text exchange.

       Due to the fact that any application can take ownership over the clipboard at  any  time,  "open"/"close"
       brackets  are  not strictly respected in X11 implementation. Practically, this means that when modern X11
       clipboard daemons ( KDE klipper, for example ) interfere with Prima clipboard, the  results  may  not  be
       consistent  from  the programmer's view, for example, clipboard contains data after "clear" call, and the
       like. It must be noted though that this behavior is expected by the users.

Other XRDB resources

   Timeouts
       Raw X11 provides no such GUI helpers as double-click event, cursor, or menu.  Neither does it provide the
       related time how often, for example, a cursor would blink. Therefore Prima emulates these, but allows the
       user to reprogram the corresponding timeouts.  Prima  recognizes  the  following  properties,  accessible
       either  via  application name or Prima class key. All timeouts are integer values, representing number of
       milliseconds for the corresponding timeout property.

       Blinkinvisibletime.blinkinvisibletime: MSEC
           Cursor stays invisible MSEC milliseconds.

           Default value: 500

       Blinkvisibletime.blinkvisibletime: MSEC
           Cursor stays visible MSEC milliseconds.

           Default value: 500

       Clicktimeframe.clicktimeframe MSEC
           If 'mouse down' and 'mouse up' events are follow in MSEC, 'mouse click' event is synthesized.

           Default value: 200

       Doubleclicktimeframe.doubleclicktimeframe MSEC
           If 'mouse click' and 'mouse  down'  events  are  follow  in  MSEC,  'mouse  double  click'  event  is
           synthesized.

           Default value: 200

       Submenudelay.submenudelay MSEC
           When  the  used  clicks  on  a  menu  item,  which points to a lower-level menu window, the latter is
           displayed after MSEC milliseconds.

           Default value: 200

       Scrollfirst.scrollfirst MSEC
           When an auto-repetitive action, similar to keystroke events resulting from a long key  press  on  the
           keyboard,  is  to be simulated, two timeout values are used - 'first' and 'next' delay. These actions
           are not simulated within Prima core, and the corresponding  timeouts  are  merely  advisable  to  the
           programmer.  Prima  widgets  use  it  for  automatic scrolling, either by a scrollbar or by any other
           means.  Also, "Prima::Button" in "autoRepeat" mode uses these timeouts for emulation of a key press.

           "Scrollfirst" is a 'first' timeout.

           Default value: 200

       Scrollnext.scrollnext MSEC
           A timeout used for same reasons as "Scrollfirst", but after it is expired.

           Default value: 50

   Miscellaneous
       Visual.visual: VISUAL_ID
           Selects display visual by VISUAL_ID, which is usually has a form of "0x??".  Various visuals  provide
           different  color  depth  and  access  scheme.  Some X stations have badly chosen default visuals (for
           example, default IRIX workstation setup has 8-bit default visual selected), so this property  can  be
           used  to  fix  things.  List  of  visuals,  supported by a X display can be produced interactively by
           standard "xdpyinfo" command from X distribution.

           Identical to "--visual" command-line argument.

           See Color for more information.

       Wheeldown.wheeldown BUTTON
           BUTTON is a number of X mouse button event, treated as 'mouse wheel down' event.

           Default value: 5 ( default values for  wheeldown  and  wheelup  are  current  de-facto  most  popular
           settings ).

       Wheelup.wheelup BUTTON
           BUTTON is a number of X mouse button event, treated as 'mouse wheel up' event.

           Default value: 4

Debugging

       The  famous  'use  the  source'  call  is highly actual with Prima. However, some debug information comes
       compiled in, and can be activated by "--debug" command-line  key.  Combination  of  letters  to  the  key
       activates debug printouts of different subsystems:

       •   C - clipboard

       •   E - events subsystem

       •   F - fonts

       •   M - miscellaneous debug info

       •   P - palettes and colors

       •   X - XRDB

       •   A - all of the above

       Example:

          --debug=xf

       Also,  the  built-in  X API "XSynchronize" call, which enables X protocol synchronization ( at expense of
       operation slowdown though ) is activated with "--sync" command-line argument, and can be used to ease the
       debugging.

AUTHOR

       Dmitry Karasik, <dmitry@karasik.eu.org>.

SEE ALSO

       Prima, Prima::gp-problems, Prima::Widget, Nye A, Xlib programming manual. O'Reilly & Associates, 1995.

perl v5.22.1                                       2009-02-24                                 pod::Prima::X11(3)