diff options
Diffstat (limited to 'libX11/specs/libX11/CH16')
-rw-r--r-- | libX11/specs/libX11/CH16 | 2364 |
1 files changed, 2364 insertions, 0 deletions
diff --git a/libX11/specs/libX11/CH16 b/libX11/specs/libX11/CH16 new file mode 100644 index 000000000..3a21a2290 --- /dev/null +++ b/libX11/specs/libX11/CH16 @@ -0,0 +1,2364 @@ +.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium +.\" +.\" Permission is hereby granted, free of charge, to any person obtaining +.\" a copy of this software and associated documentation files (the +.\" "Software"), to deal in the Software without restriction, including +.\" without limitation the rights to use, copy, modify, merge, publish, +.\" distribute, sublicense, and/or sell copies of the Software, and to +.\" permit persons to whom the Software is furnished to do so, subject to +.\" the following conditions: +.\" +.\" The above copyright notice and this permission notice shall be included +.\" in all copies or substantial portions of the Software. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +.\" OTHER DEALINGS IN THE SOFTWARE. +.\" +.\" Except as contained in this notice, the name of the X Consortium shall +.\" not be used in advertising or otherwise to promote the sale, use or +.\" other dealings in this Software without prior written authorization +.\" from the X Consortium. +.\" +.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by +.\" Digital Equipment Corporation +.\" +.\" Portions Copyright \(co 1990, 1991 by +.\" Tektronix, Inc. +.\" +.\" Permission to use, copy, modify and distribute this documentation for +.\" any purpose and without fee is hereby granted, provided that the above +.\" copyright notice appears in all copies and that both that copyright notice +.\" and this permission notice appear in all copies, and that the names of +.\" Digital and Tektronix not be used in in advertising or publicity pertaining +.\" to this documentation without specific, written prior permission. +.\" Digital and Tektronix makes no representations about the suitability +.\" of this documentation for any purpose. +.\" It is provided ``as is'' without express or implied warranty. +.\" +\& +.sp 1 +.ce 3 +\s+1\fBChapter 16\fP\s-1 + +\s+1\fBApplication Utility Functions\fP\s-1 +.sp 2 +.nr H1 16 +.nr H2 0 +.nr H3 0 +.nr H4 0 +.nr H5 0 +.na +.LP +.XS +Chapter 16: Application Utility Functions +.XE +Once you have initialized the X system, +you can use the Xlib utility functions to: +.IP \(bu 5 +Use keyboard utility functions +.IP \(bu 5 +Use Latin-1 keyboard event functions +.IP \(bu 5 +Allocate permanent storage +.IP \(bu 5 +Parse the window geometry +.IP \(bu 5 +Manipulate regions +.IP \(bu 5 +Use cut buffers +.IP \(bu 5 +Determine the appropriate visual type +.IP \(bu 5 +Manipulate images +.IP \(bu 5 +Manipulate bitmaps +.IP \(bu 5 +Use the context manager +.LP +As a group, +the functions discussed in this chapter provide the functionality that +is frequently needed and that spans toolkits. +Many of these functions do not generate actual protocol requests to the server. +.NH 2 +Using Keyboard Utility Functions +.XS +\*(SN Using Keyboard Utility Functions +.XE +.LP +This section discusses mapping between KeyCodes and KeySyms, +classifying KeySyms, and mapping between KeySyms and string names. +The first three functions in this section operate on a cached copy of the +server keyboard mapping. +The first four KeySyms for each KeyCode +are modified according to the rules given in section 12.7. +To obtain the untransformed KeySyms defined for a key, +use the functions described in section 12.7. +.LP +.sp +To obtain a KeySym for the KeyCode of an event, use +.PN XLookupKeysym . +.IN "XLookupKeysym" "" "@DEF@" +.sM +.FD 0 +KeySym XLookupKeysym(\^\fIkey_event\fP, \fIindex\fP\^) +.br + XKeyEvent *\fIkey_event\fP\^; +.br + int \fIindex\fP\^; +.FN +.IP \fIkey_event\fP 1i +Specifies the +.PN KeyPress +or +.PN KeyRelease +event. +.IP \fIindex\fP 1i +Specifies the index into the KeySyms list for the event's KeyCode. +.LP +.eM +The +.PN XLookupKeysym +function uses a given keyboard event and the index you specified to return +the KeySym from the list that corresponds to the KeyCode member in the +.PN XKeyPressedEvent +or +.PN XKeyReleasedEvent +structure. +If no KeySym is defined for the KeyCode of the event, +.PN XLookupKeysym +returns +.PN NoSymbol . +.LP +.sp +To obtain a KeySym for a specific KeyCode, use +.PN XKeycodeToKeysym . +.IN "XKeycodeToKeysym" "" "@DEF@" +.sM +.FD 0 +KeySym XKeycodeToKeysym\^(\^\fIdisplay\fP, \fIkeycode\fP, \fIindex\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + KeyCode \fIkeycode\fP\^; +.br + int \fIindex\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIkeycode\fP 1i +Specifies the KeyCode. +.IP \fIindex\fP 1i +Specifies the element of KeyCode vector. +.LP +.eM +The +.PN XKeycodeToKeysym +function uses internal Xlib tables +and returns the KeySym defined for the specified KeyCode and +the element of the KeyCode vector. +If no symbol is defined, +.PN XKeycodeToKeysym +returns +.PN NoSymbol . +.LP +.sp +To obtain a KeyCode for a key having a specific KeySym, use +.PN XKeysymToKeycode . +.IN "XKeysymToKeycode" "" "@DEF@" +.sM +.FD 0 +KeyCode XKeysymToKeycode\^(\^\fIdisplay\fP, \fIkeysym\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + KeySym \fIkeysym\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be searched for. +.LP +.eM +If the specified KeySym is not defined for any KeyCode, +.PN XKeysymToKeycode +returns zero. +.LP +.sp +The mapping between KeyCodes and KeySyms is cached internal to Xlib. +When this information is changed at the server, an Xlib function must +be called to refresh the cache. +To refresh the stored modifier and keymap information, use +.PN XRefreshKeyboardMapping . +.IN "XRefreshKeyboardMapping" "" "@DEF@" +.sM +.FD 0 +XRefreshKeyboardMapping(\^\fIevent_map\fP\^) +.br + XMappingEvent *\fIevent_map\fP\^; +.FN +.IP \fIevent_map\fP 1i +Specifies the mapping event that is to be used. +.LP +.eM +The +.PN XRefreshKeyboardMapping +function refreshes the stored modifier and keymap information. +You usually call this function when a +.PN MappingNotify +event with a request member of +.PN MappingKeyboard +or +.PN MappingModifier +occurs. +The result is to update Xlib's knowledge of the keyboard. +.LP +.sp +To obtain the uppercase and lowercase forms of a KeySym, use +.PN XConvertCase . +.IN "XConvertCase" "" "@DEF@" +.sM +.FD 0 +void XConvertCase(\^\fIkeysym\fP, \fIlower_return\fP, \fIupper_return\fP\^) +.br + KeySym \fIkeysym\fP\^; +.br + KeySym *\fIlower_return\fP\^; +.br + KeySym *\fIupper_return\fP\^; +.FN +.ds Fn converted +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.IP \fIlower_return\fP 1i +Returns the lowercase form of keysym, or keysym. +.IP \fIupper_return\fP 1i +Returns the uppercase form of keysym, or keysym. +.LP +.eM +The +.PN XConvertCase +function returns the uppercase and lowercase forms of the specified Keysym, +if the KeySym is subject to case conversion; +otherwise, the specified KeySym is returned to both lower_return and +upper_return. +Support for conversion of other than Latin and Cyrillic KeySyms is +implementation-dependent. +.LP +.sp +KeySyms have string names as well as numeric codes. +To convert the name of the KeySym to the KeySym code, use +.PN XStringToKeysym . +.IN "XStringToKeysym" "" "@DEF@" +.sM +.FD 0 +KeySym XStringToKeysym\^(\^\fIstring\fP\^) +.br + char *\fIstring\fP\^; +.FN +.IP \fIstring\fP 1i +Specifies the name of the KeySym that is to be converted. +.LP +.eM +Standard KeySym names are obtained from +.hN X11/keysymdef.h +by removing the XK_ prefix from each name. +KeySyms that are not part of the Xlib standard also may be obtained +with this function. +The set of KeySyms that are available in this manner +and the mechanisms by which Xlib obtains them is implementation-dependent. +.LP +If the KeySym name is not in the Host Portable Character Encoding, +the result is implementation-dependent. +If the specified string does not match a valid KeySym, +.PN XStringToKeysym +returns +.PN NoSymbol . +.LP +.sp +To convert a KeySym code to the name of the KeySym, use +.PN XKeysymToString . +.IN "XKeysymToString" "" "@DEF@" +.sM +.FD 0 +char *XKeysymToString\^(\^\fIkeysym\fP\^) +.br + KeySym \fIkeysym\fP\^; +.FN +.ds Fn converted +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +The returned string is in a static area and must not be modified. +The returned string is in the Host Portable Character Encoding. +If the specified KeySym is not defined, +.PN XKeysymToString +returns a NULL. +.NH 3 +KeySym Classification Macros +.XS +\*(SN KeySym Classification Macros +.XE +.LP +You may want to test if a KeySym is, for example, +on the keypad or on one of the function keys. +You can use KeySym macros to perform the following tests. +.LP +.sp +.sM +.FD 0 +IsCursorKey\^(\^\fIkeysym\fP\^) +.FN +.ds Fn tested +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +.IN "IsCursorKey" "" "@DEF@" +Returns +.PN True +if the specified KeySym is a cursor key. +.LP +.sp +.sM +.FD 0 +IsFunctionKey\^(\^\fIkeysym\fP\^) +.FN +.ds Fn tested +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +.IN "IsFunctionKey" "" "@DEF@" +Returns +.PN True +if the specified KeySym is a function key. +.LP +.sp +.sM +.FD 0 +IsKeypadKey\^(\^\fIkeysym\fP\^) +.FN +.ds Fn tested +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +.IN "IsKeypadKey" "" "@DEF@" +Returns +.PN True +if the specified KeySym is a standard keypad key. +.LP +.sp +.sM +.FD 0 +IsPrivateKeypadKey\^(\^\fIkeysym\fP\^) +.FN +.ds Fn tested +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +.IN "IsPrivateKeypadKey" "" "@DEF@" +Returns +.PN True +if the specified KeySym is a vendor-private keypad key. +.LP +.sp +.sM +.FD 0 +IsMiscFunctionKey\^(\^\fIkeysym\fP\^) +.FN +.ds Fn tested +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +.IN "IsMiscFunctionKey" "" "@DEF@" +Returns +.PN True +if the specified KeySym is a miscellaneous function key. +.LP +.sp +.sM +.FD 0 +IsModifierKey\^(\^\fIkeysym\fP\^) +.FN +.ds Fn tested +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +.IN "IsModifierKey" "" "@DEF@" +Returns +.PN True +if the specified KeySym is a modifier key. +.LP +.sp +.sM +.FD 0 +IsPFKey\^(\^\fIkeysym\fP\^) +.FN +.ds Fn tested +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.LP +.eM +.IN "IsPFKey" "" "@DEF@" +Returns +.PN True +if the specified KeySym is a PF key. +.NH 2 +Using Latin-1 Keyboard Event Functions +.XS +\*(SN Using Latin-1 Keyboard Event Functions +.XE +.LP +Chapter 13 describes internationalized text input facilities, +but sometimes it is expedient to write an application that +only deals with Latin-1 characters and ASCII controls, +so Xlib provides a simple function for that purpose. +.PN XLookupString +handles the standard modifier semantics described in section 12.7. +This function does not use any of the input method facilities +described in chapter 13 and does not depend on the current locale. +.LP +.sp +To map a key event to an ISO Latin-1 string, use +.PN XLookupString . +.IN "XLookupString" "" "@DEF@" +.sM +.FD 0 +int XLookupString(\^\fIevent_struct\fP, \fIbuffer_return\fP,\ + \fIbytes_buffer\fP, \fIkeysym_return\fP, \fIstatus_in_out\fP\^) +.br + XKeyEvent *\fIevent_struct\fP\^; +.br + char *\fIbuffer_return\fP\^; +.br + int \fIbytes_buffer\fP\^; +.br + KeySym *\fIkeysym_return\fP\^; +.br + XComposeStatus *\fIstatus_in_out\fP\^; +.FN +.IP \fIevent_struct\fP 1i +Specifies the key event structure to be used. +You can pass +.PN XKeyPressedEvent +or +.PN XKeyReleasedEvent . +.IP \fIbuffer_return\fP 1i +Returns the translated characters. +.IP \fIbytes_buffer\fP 1i +Specifies the length of the buffer. +No more than bytes_buffer of translation are returned. +.IP \fIkeysym_return\fP 1i +Returns the KeySym computed from the event if this argument is not NULL. +.IP \fIstatus_in_out\fP 1i +Specifies or returns the +.PN XComposeStatus +structure or NULL. +.LP +.eM +The +.PN XLookupString +function translates a key event to a KeySym and a string. +The KeySym is obtained by using the standard interpretation of the +.PN Shift , +.PN Lock , +group, and numlock modifiers as defined in the X Protocol specification. +If the KeySym has been rebound (see +.PN XRebindKeysym ), +the bound string will be stored in the buffer. +Otherwise, the KeySym is mapped, if possible, to an ISO Latin-1 character +or (if the Control modifier is on) to an ASCII control character, +and that character is stored in the buffer. +.PN XLookupString +returns the number of characters that are stored in the buffer. +.LP +If present (non-NULL), +the +.PN XComposeStatus +structure records the state, +which is private to Xlib, +that needs preservation across calls to +.PN XLookupString +to implement compose processing. +The creation of +.PN XComposeStatus +structures is implementation-dependent; +a portable program must pass NULL for this argument. +.LP +.PN XLookupString +depends on the cached keyboard information mentioned in the +previous section, so it is necessary to use +.PN XRefreshKeyboardMapping +to keep this information up-to-date. +.LP +.sp +To rebind the meaning of a KeySym for +.PN XLookupString , +use +.PN XRebindKeysym . +.IN "XRebindKeysym" "" "@DEF@" +.sM +.FD 0 +XRebindKeysym(\^\fIdisplay\fP, \fIkeysym\fP, \fIlist\fP, \fImod_count\fP, \fIstring\fP, \fInum_bytes\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + KeySym \fIkeysym\fP\^; +.br + KeySym \fIlist\fP\^[\^]\^; +.br + int \fImod_count\fP\^; +.br + unsigned char *\fIstring\fP\^; +.br + int \fInum_bytes\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.ds Fn rebound +.IP \fIkeysym\fP 1i +Specifies the KeySym that is to be \*(Fn. +.IP \fIlist\fP 1i +Specifies the KeySyms to be used as modifiers. +.IP \fImod_count\fP 1i +Specifies the number of modifiers in the modifier list. +.IP \fIstring\fP 1i +Specifies the string that is copied and will be returned by +.PN XLookupString . +.IP \fInum_bytes\fP 1i +Specifies the number of bytes in the string argument. +.LP +.eM +The +.PN XRebindKeysym +function can be used to rebind the meaning of a KeySym for the client. +It does not redefine any key in the X server but merely +provides an easy way for long strings to be attached to keys. +.PN XLookupString +returns this string when the appropriate set of +modifier keys are pressed and when the KeySym would have been used for +the translation. +No text conversions are performed; +the client is responsible for supplying appropriately encoded strings. +Note that you can rebind a KeySym that may not exist. +.NH 2 +Allocating Permanent Storage +.XS +\*(SN Allocating Permanent Storage +.XE +.LP +To allocate some memory you will never give back, use +.PN Xpermalloc . +.IN "Xpermalloc" "" "@DEF@" +.sM +.FD 0 +char *Xpermalloc\^(\^\fIsize\fP\^) +.br + unsigned int \fIsize\fP\^; +.FN +.LP +.eM +The +.PN Xpermalloc +function allocates storage that can never be freed for the life of the +program. The memory is allocated with alignment for the C type double. +This function may provide some performance and space savings over +the standard operating system memory allocator. +.NH 2 +Parsing the Window Geometry +.XS +\*(SN Parsing the Window Geometry +.XE +.LP +To parse standard window geometry strings, use +.PN XParseGeometry . +.IN "Window" "determining location" +.IN "XParseGeometry" "" "@DEF@" +.LP +.sM +.FD 0 +int XParseGeometry\^(\^\fIparsestring\fP\^, \fIx_return\fP\^, \fIy_return\fP\^, \fIwidth_return\fP\^, \fIheight_return\fP\^) +.br + char *\fIparsestring\fP\^; +.br + int *\fIx_return\fP\^, *\fIy_return\fP\^; +.br + unsigned int *\fIwidth_return\fP\^, *\fIheight_return\fP\^; +.FN +.IP \fIparsestring\fP 1i +Specifies the string you want to parse. +.IP \fIx_return\fP 1i +.br +.ns +.IP \fIy_return\fP 1i +Return the x and y offsets. +.IP \fIwidth_return\fP 1i +.br +.ns +.IP \fIheight_return\fP 1i +Return the width and height determined. +.LP +.eM +By convention, +X applications use a standard string to indicate window size and placement. +.PN XParseGeometry +makes it easier to conform to this standard because it allows you +to parse the standard window geometry. +Specifically, this function lets you parse strings of the form: +.LP +.\" Start marker code here +.Ds +[=][<\fIwidth\fP>{xX}<\fIheight\fP>][{+-}<\fIxoffset\fP>{+-}<\fIyoffset\fP>] +.De +.\" End marker code here +.LP +The fields map into the arguments associated with this function. +(Items enclosed in <\^> are integers, items in [\^] are optional, and +items enclosed in {\^} indicate ``choose one of.'' +Note that the brackets should not appear in the actual string.) +If the string is not in the Host Portable Character Encoding, +the result is implementation-dependent. +.LP +The +.PN XParseGeometry +function returns a bitmask that indicates which of the four values (width, +height, xoffset, and yoffset) were actually found in the string +and whether the x and y values are negative. +By convention, \-0 is not equal to +0, because the user needs to +be able to say ``position the window relative to the right or bottom edge.'' +For each value found, the corresponding argument is updated. +For each value not found, the argument is left unchanged. +The bits are represented by +.PN XValue , +.PN YValue , +.PN WidthValue , +.PN HeightValue , +.PN XNegative , +or +.PN YNegative +and are defined in +.hN X11/Xutil.h . +They will be set whenever one of the values is defined +or one of the signs is set. +.LP +If the function returns either the +.PN XValue +or +.PN YValue +flag, +you should place the window at the requested position. +.sp +.LP +To construct a window's geometry information, use +.PN XWMGeometry . +.IN "XWMGeometry" "" "@DEF@" +.sM +.FD 0 +int XWMGeometry\^(\^\fIdisplay\fP, \fIscreen\fP, \fIuser_geom\fP, \ +\fIdef_geom\fP, \fIbwidth\fP, \fIhints\fP, \fIx_return\fP, \fIy_return\fP, +.br + \fIwidth_return\fP, \fIheight_return\fP, \fIgravity_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + int \fIscreen\fP\^; +.br + char *\fIuser_geom\fP\^; +.br + char *\fIdef_geom\fP\^; +.br + unsigned int \fIbwidth\fP\^; +.br + XSizeHints *\fIhints\fP\^; +.br + int *\fIx_return\fP, *\fIy_return\fP\^; +.br + int *\fIwidth_return\fP\^; +.br + int *\fIheight_return\fP\^; +.br + int *\fIgravity_return\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIscreen\fP 1i +Specifies the screen. +.IP \fIuser_geom\fP 1i +Specifies the user-specified geometry or NULL. +.IP \fIdef_geom\fP 1i +Specifies the application's default geometry or NULL. +.IP \fIbwidth\fP 1i +Specifies the border width. +.IP \fIhints\fP 1i +Specifies the size hints for the window in its normal state. +.IP \fIx_return\fP 1i +.br +.ns +.IP \fIy_return\fP 1i +Return the x and y offsets. +.IP \fIwidth_return\fP 1i +.br +.ns +.IP \fIheight_return\fP 1i +Return the width and height determined. +.IP \fIgravity_return\fP 1i +Returns the window gravity. +.LP +.eM +The +.PN XWMGeometry +function combines any geometry information (given in the format used by +.PN XParseGeometry ) +specified by the user and by the calling program with size hints +(usually the ones to be stored in WM_NORMAL_HINTS) and returns the position, +size, and gravity +.Pn ( NorthWestGravity , +.PN NorthEastGravity , +.PN SouthEastGravity , +or +.PN SouthWestGravity ) +that describe the window. +If the base size is not set in the +.PN XSizeHints +structure, +the minimum size is used if set. +Otherwise, a base size of zero is assumed. +If no minimum size is set in the hints structure, +the base size is used. +A mask (in the form returned by +.PN XParseGeometry ) +that describes which values came from the user specification +and whether or not the position coordinates are relative +to the right and bottom edges is returned. +Note that these coordinates will have already been accounted for +in the x_return and y_return values. +.LP +Note that invalid geometry specifications can cause a width or height +of zero to be returned. +The caller may pass the address of the hints win_gravity field +as gravity_return to update the hints directly. +.NH 2 +Manipulating Regions +.XS +\*(SN Manipulating Regions +.XE +.LP +Regions are arbitrary sets of pixel locations. +Xlib provides functions for manipulating regions. +The opaque type +.PN Region +is defined in +.hN X11/Xutil.h . +Xlib provides functions that you can use to manipulate regions. +This section discusses how to: +.IP \(bu 5 +Create, copy, or destroy regions +.IP \(bu 5 +Move or shrink regions +.IP \(bu 5 +Compute with regions +.IP \(bu 5 +Determine if regions are empty or equal +.IP \(bu 5 +Locate a point or rectangle in a region +.NH 3 +Creating, Copying, or Destroying Regions +.XS +\*(SN Creating, Copying, or Destroying Regions +.XE +.LP +To create a new empty region, use +.PN XCreateRegion . +.IN "XCreateRegion" "" "@DEF@" +.sM +.FD 0 +Region XCreateRegion\^() +.FN +.LP +.eM +.sp +To generate a region from a polygon, use +.PN XPolygonRegion . +.IN "XPolygonRegion" "" "@DEF@" +.sM +.FD 0 +Region XPolygonRegion\^(\^\fIpoints\fP\^, \fIn\fP\^, \fIfill_rule\fP\^) +.br + XPoint \fIpoints[]\fP\^; +.br + int \fIn\fP\^; +.br + int \fIfill_rule\fP\^; +.FN +.IP \fIpoints\fP 1i +Specifies an array of points. +.IP \fIn\fP 1i +Specifies the number of points in the polygon. +.IP \fIfill_rule\fP 1i +Specifies the fill-rule you want to set for the specified GC. +You can pass +.PN EvenOddRule +or +.PN WindingRule . +.LP +.eM +The +.PN XPolygonRegion +function returns a region for the polygon defined by the points array. +For an explanation of fill_rule, +see +.PN XCreateGC . +.LP +.sp +To set the clip-mask of a GC to a region, use +.PN XSetRegion . +.IN "XSetRegion" "" "@DEF@" +.sM +.FD 0 +XSetRegion\^(\^\fIdisplay\fP, \fIgc\fP\^, \fIr\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + GC \fIgc\fP\^; +.br + Region \fIr\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIgc\fP 1i +Specifies the GC. +.IP \fIr\fP 1i +Specifies the region. +.LP +.eM +The +.PN XSetRegion +function sets the clip-mask in the GC to the specified region. +The region is specified relative to the drawable's origin. +The resulting GC clip origin is implementation-dependent. +Once it is set in the GC, +the region can be destroyed. +.LP +.sp +To deallocate the storage associated with a specified region, use +.PN XDestroyRegion . +.IN "XDestroyRegion" "" "@DEF@" +.sM +.FD 0 +XDestroyRegion\^(\^\fIr\fP\^) +.br + Region \fIr\fP\^; +.FN +.IP \fIr\fP 1i +Specifies the region. +.LP +.eM +.NH 3 +Moving or Shrinking Regions +.XS +\*(SN Moving or Shrinking Regions +.XE +.LP +To move a region by a specified amount, use +.PN XOffsetRegion . +.IN "XOffsetRegion" "" "@DEF@" +.sM +.FD 0 +XOffsetRegion\^(\^\fIr\fP\^, \fIdx\fP\^, \fIdy\fP\^) +.br + Region \fIr\fP\^; +.br + int \fIdx\fP\^, \fIdy\fP\^; +.FN +.IP \fIr\fP 1i +Specifies the region. +.ds Dy move +.IP \fIdx\fP 1i +.br +.ns +.IP \fIdy\fP 1i +Specify the x and y coordinates, +which define the amount you want to \*(Dy the specified region. +.LP +.eM +.sp +To reduce a region by a specified amount, use +.PN XShrinkRegion . +.IN "XShrinkRegion" "" "@DEF@" +.sM +.FD 0 +XShrinkRegion\^(\^\fIr\fP\^, \fIdx\fP\^, \fIdy\fP\^) +.br + Region \fIr\fP\^; +.br + int \fIdx\fP\^, \fIdy\fP\^; +.FN +.IP \fIr\fP 1i +Specifies the region. +.ds Dy shrink +.IP \fIdx\fP 1i +.br +.ns +.IP \fIdy\fP 1i +Specify the x and y coordinates, +which define the amount you want to \*(Dy the specified region. +.LP +.eM +Positive values shrink the size of the region, +and negative values expand the region. +.NH 3 +Computing with Regions +.XS +\*(SN Computing with Regions +.XE +.LP +.sp +To generate the smallest rectangle enclosing a region, use +.PN XClipBox . +.IN "XClipBox" "" "@DEF@" +.sM +.FD 0 +XClipBox\^(\^\fIr\fP\^, \fIrect_return\fP\^) +.br + Region \fIr\fP\^; +.br + XRectangle *\fIrect_return\fP\^; +.FN +.IP \fIr\fP 1i +Specifies the region. +.IP \fIrect_return\fP 1i +Returns the smallest enclosing rectangle. +.LP +.eM +The +.PN XClipBox +function returns the smallest rectangle enclosing the specified region. +.sp +.LP +To compute the intersection of two regions, use +.PN XIntersectRegion . +.IN "XIntersectRegion" "" "@DEF@" +.sM +.FD 0 +XIntersectRegion\^(\^\fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^) +.br + Region \fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^; +.FN +.IP \fIsra\fP 1i +.br +.ns +.IP \fIsrb\fP 1i +Specify the two regions with which you want to perform the computation. +.IP \fIdr_return\fP 1i +Returns the result of the computation. +.LP +.eM +.sp +To compute the union of two regions, use +.PN XUnionRegion . +.IN "XUnionRegion" "" "@DEF@" +.sM +.FD 0 +XUnionRegion\^(\^\fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^) +.br + Region \fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^; +.FN +.IP \fIsra\fP 1i +.br +.ns +.IP \fIsrb\fP 1i +Specify the two regions with which you want to perform the computation. +.IP \fIdr_return\fP 1i +Returns the result of the computation. +.LP +.eM +.sp +To create a union of a source region and a rectangle, use +.PN XUnionRectWithRegion . +.IN "XUnionRectWithRegion" "" "@DEF@" +.sM +.FD 0 +XUnionRectWithRegion\^(\^\fIrectangle\fP, \fIsrc_region\fP, \ +\fIdest_region_return\fP\^) +.br + XRectangle *\fIrectangle\fP\^; +.br + Region \fIsrc_region\fP\^; +.br + Region \fIdest_region_return\fP\^; +.FN +.IP \fIrectangle\fP 1i +Specifies the rectangle. +.IP \fIsrc_region\fP 1i +Specifies the source region to be used. +.IP \fIdest_region_return\fP 1i +Returns the destination region. +.LP +.eM +The +.PN XUnionRectWithRegion +function updates the destination region from a union of the specified rectangle +and the specified source region. +.LP +.sp +To subtract two regions, use +.PN XSubtractRegion . +.IN "XSubtractRegion" "" "@DEF@" +.sM +.FD 0 +XSubtractRegion\^(\^\fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^) +.br + Region \fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^; +.FN +.IP \fIsra\fP 1i +.br +.ns +.IP \fIsrb\fP 1i +Specify the two regions with which you want to perform the computation. +.IP \fIdr_return\fP 1i +Returns the result of the computation. +.LP +.eM +The +.PN XSubtractRegion +function subtracts srb from sra and stores the results in dr_return. +.LP +.sp +To calculate the difference between the union and intersection +of two regions, use +.PN XXorRegion . +.IN "XXorRegion" "" "@DEF@" +.sM +.FD 0 +XXorRegion\^(\^\fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^) +.br + Region \fIsra\fP\^, \fIsrb\fP\^, \fIdr_return\fP\^; +.FN +.IP \fIsra\fP 1i +.br +.ns +.IP \fIsrb\fP 1i +Specify the two regions with which you want to perform the computation. +.IP \fIdr_return\fP 1i +Returns the result of the computation. +.LP +.eM +.NH 3 +Determining if Regions Are Empty or Equal +.XS +\*(SN Determining if Regions Are Empty or Equal +.XE +.LP +To determine if the specified region is empty, use +.PN XEmptyRegion . +.IN "XEmptyRegion" "" "@DEF@" +.sM +.FD 0 +Bool XEmptyRegion\^(\^\fIr\fP\^) +.br + Region \fIr\fP\^; +.FN +.IP \fIr\fP 1i +Specifies the region. +.LP +.eM +The +.PN XEmptyRegion +function returns +.PN True +if the region is empty. +.LP +.sp +To determine if two regions have the same offset, size, and shape, use +.PN XEqualRegion . +.IN "XEqualRegion" "" "@DEF@" +.sM +.FD 0 +Bool XEqualRegion\^(\^\fIr1\fP\^, \fIr2\fP\^) +.br + Region \fIr1\fP\^, \fIr2\fP\^; +.FN +.IP \fIr1\fP 1i +.br +.ns +.IP \fIr2\fP 1i +Specify the two regions. +.LP +.eM +The +.PN XEqualRegion +function returns +.PN True +if the two regions have the same offset, size, and shape. +.NH 3 +Locating a Point or a Rectangle in a Region +.XS +\*(SN Locating a Point or a Rectangle in a Region +.XE +.LP +To determine if a specified point resides in a specified region, use +.PN XPointInRegion . +.IN "XPointInRegion" "" "@DEF@" +.sM +.FD 0 +Bool XPointInRegion\^(\^\fIr\fP\^, \fIx\fP\^, \fIy\fP\^) +.br + Region \fIr\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.FN +.IP \fIr\fP 1i +Specifies the region. +.ds Xy , which define the point +.IP \fIx\fP 1i +.br +.ns +.IP \fIy\fP 1i +Specify the x and y coordinates\*(Xy. +.LP +.eM +The +.PN XPointInRegion +function returns +.PN True +if the point (x, y) is contained in the region r. +.LP +.sp +To determine if a specified rectangle is inside a region, use +.PN XRectInRegion . +.IN "XRectInRegion" "" "@DEF@" +.sM +.FD 0 +int XRectInRegion\^(\^\fIr\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^) +.br + Region \fIr\fP\^; +.br + int \fIx\fP\^, \fIy\fP\^; +.br + unsigned int \fIwidth\fP\^, \fIheight\fP\^; +.FN +.IP \fIr\fP 1i +Specifies the region. +.ds Xy , which define the coordinates of the upper-left corner of the rectangle +.IP \fIx\fP 1i +.br +.ns +.IP \fIy\fP 1i +Specify the x and y coordinates\*(Xy. +.ds Wh , which define the rectangle +.IP \fIwidth\fP 1i +.br +.ns +.IP \fIheight\fP 1i +Specify the width and height\*(Wh. +.LP +.eM +The +.PN XRectInRegion +function returns +.PN RectangleIn +if the rectangle is entirely in the specified region, +.PN RectangleOut +if the rectangle is entirely out of the specified region, +and +.PN RectanglePart +if the rectangle is partially in the specified region. +.NH 2 +Using Cut Buffers +.XS +\*(SN Using Cut Buffers +.XE +.LP +.IN "Cut Buffers" +Xlib provides functions to manipulate cut buffers, +a very simple form of cut-and-paste inter-client communication. +Selections are a much more powerful and useful mechanism for +interchanging data between clients (see section 4.5) +and generally should be used instead of cut buffers. +.LP +Cut buffers are implemented as properties on the first root window +of the display. +The buffers can only contain text, in the STRING encoding. +The text encoding is not changed by Xlib when fetching or storing. +Eight buffers are provided +and can be accessed as a ring or as explicit buffers (numbered 0 through 7). +.LP +.sp +To store data in cut buffer 0, use +.PN XStoreBytes . +.IN "XStoreBytes" "" "@DEF@" +.sM +.FD 0 +XStoreBytes\^(\^\fIdisplay\fP, \fIbytes\fP\^, \fInbytes\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + char *\fIbytes\fP\^; +.br + int \^\fInbytes\fP\^; +.br +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIbytes\fP 1i +Specifies the bytes, which are not necessarily ASCII or null-terminated. +.IP \fInbytes\fP 1i +Specifies the number of bytes to be stored. +.LP +.eM +The data can have embedded null characters +and need not be null-terminated. +The cut buffer's contents can be retrieved later by +any client calling +.PN XFetchBytes . +.LP +.PN XStoreBytes +can generate a +.PN BadAlloc +error. +.LP +.sp +To store data in a specified cut buffer, use +.PN XStoreBuffer . +.IN "XStoreBuffer" "" "@DEF@" +.sM +.FD 0 +XStoreBuffer\^(\^\fIdisplay\fP, \fIbytes\fP\^, \fInbytes\fP\^, \fIbuffer\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + char *\fIbytes\fP\^; +.br + int \^\fInbytes\fP\^; +.br + int \fIbuffer\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIbytes\fP 1i +Specifies the bytes, which are not necessarily ASCII or null-terminated. +.IP \fInbytes\fP 1i +Specifies the number of bytes to be stored. +.ds Fn in which you want to store the bytes +.IP \fIbuffer\fP 1i +Specifies the buffer \*(Fn. +.LP +.eM +If an invalid buffer is specified, the call has no effect. +The data can have embedded null characters +and need not be null-terminated. +.LP +.PN XStoreBuffer +can generate a +.PN BadAlloc +error. +.LP +.sp +To return data from cut buffer 0, use +.PN XFetchBytes . +.IN "XFetchBytes" "" "@DEF@" +.sM +.FD 0 +char *XFetchBytes\^(\^\fIdisplay\fP, \fInbytes_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + int *\fInbytes_return\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fInbytes_return\fP 1i +Returns the number of bytes in the buffer. +.LP +.eM +The +.PN XFetchBytes +function +returns the number of bytes in the nbytes_return argument, +if the buffer contains data. +Otherwise, the function +returns NULL and sets nbytes to 0. +The appropriate amount of storage is allocated and the pointer returned. +The client must free this storage when finished with it by calling +.PN XFree . +.LP +.sp +To return data from a specified cut buffer, use +.PN XFetchBuffer . +.IN "XFetchBuffer" "" "@DEF@" +.sM +.FD 0 +char *XFetchBuffer\^(\^\fIdisplay\fP, \fInbytes_return\fP\^, \fIbuffer\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + int *\fInbytes_return\fP\^; +.br + int \fIbuffer\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fInbytes_return\fP 1i +Returns the number of bytes in the buffer. +.ds Fn from which you want the stored data returned +.IP \fIbuffer\fP 1i +Specifies the buffer \*(Fn. +.LP +.eM +The +.PN XFetchBuffer +function returns zero to the nbytes_return argument +if there is no data in the buffer or if an invalid +buffer is specified. +.LP +.sp +To rotate the cut buffers, use +.PN XRotateBuffers . +.IN "XRotateBuffers" "" "@DEF@" +.sM +.FD 0 +XRotateBuffers\^(\^\fIdisplay\fP, \fIrotate\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + int \fIrotate\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIrotate\fP 1i +Specifies how much to rotate the cut buffers. +.LP +.eM +The +.PN XRotateBuffers +function rotates the cut +buffers, such that buffer 0 becomes buffer n, +buffer 1 becomes n + 1 mod 8, and so on. +This cut buffer numbering is global to the display. +Note that +.PN XRotateBuffers +generates +.PN BadMatch +errors if any of the eight buffers have not been created. +.NH 2 +Determining the Appropriate Visual Type +.XS +\*(SN Determining the Appropriate Visual Type +.XE +.LP +A single display can support multiple screens. +Each screen can have several different visual types supported +at different depths. +You can use the functions described in this section to determine +which visual to use for your application. +.LP +The functions in this section use the visual information masks and the +.PN XVisualInfo +structure, +which is defined in +.hN X11/Xutil.h +and contains: +.sM +.LP +/* Visual information mask bits */ +.TS +lw(.5i) lw(2.5i) lw(.8i). +T{ +#define +T} T{ +.PN VisualNoMask +T} T{ +0x0 +T} +T{ +#define +T} T{ +.PN VisualIDMask +T} T{ +0x1 +T} +T{ +#define +T} T{ +.PN VisualScreenMask +T} T{ +0x2 +T} +T{ +#define +T} T{ +.PN VisualDepthMask +T} T{ +0x4 +T} +T{ +#define +T} T{ +.PN VisualClassMask +T} T{ +0x8 +T} +T{ +#define +T} T{ +.PN VisualRedMaskMask +T} T{ +0x10 +T} +T{ +#define +T} T{ +.PN VisualGreenMaskMask +T} T{ +0x20 +T} +T{ +#define +T} T{ +.PN VisualBlueMaskMask +T} T{ +0x40 +T} +T{ +#define +T} T{ +.PN VisualColormapSizeMask +T} T{ +0x80 +T} +T{ +#define +T} T{ +.PN VisualBitsPerRGBMask +T} T{ +0x100 +T} +T{ +#define +T} T{ +.PN VisualAllMask +T} T{ +0x1FF +T} +.TE +.IN "XVisualInfo" "" "@DEF@" +.Ds 0 +.TA .5i 3i +.ta .5i 3i +/* Values */ + +typedef struct { + Visual *visual; + VisualID visualid; + int screen; + unsigned int depth; + int class; + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + int colormap_size; + int bits_per_rgb; +} XVisualInfo; +.De +.LP +.eM +To obtain a list of visual information structures that match a specified +template, use +.PN XGetVisualInfo . +.IN "XGetVisualInfo" "" "@DEF@" +.sM +.FD 0 +XVisualInfo *XGetVisualInfo\^(\^\fIdisplay\fP, \fIvinfo_mask\fP, \fIvinfo_template\fP, \fInitems_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + long \fIvinfo_mask\fP\^; +.br + XVisualInfo *\fIvinfo_template\fP\^; +.br + int *\fInitems_return\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIvinfo_mask\fP 1i +Specifies the visual mask value. +.IP \fIvinfo_template\fP 1i +Specifies the visual attributes that are to be used in matching the visual +structures. +.IP \fInitems_return\fP 1i +Returns the number of matching visual structures. +.LP +.eM +The +.PN XGetVisualInfo +function returns a list of visual structures that have attributes +equal to the attributes specified by vinfo_template. +If no visual structures match the template using the specified vinfo_mask, +.PN XGetVisualInfo +returns a NULL. +To free the data returned by this function, use +.PN XFree . +.LP +.sp +To obtain the visual information that matches the specified depth and +class of the screen, use +.PN XMatchVisualInfo . +.IN "XMatchVisualInfo" "" "@DEF@" +.sM +.FD 0 +Status XMatchVisualInfo\^(\^\fIdisplay\fP, \fIscreen\fP, \fIdepth\fP, \fIclass\fP, \fIvinfo_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + int \fIscreen\fP\^; +.br + int \fIdepth\fP\^; +.br + int \fIclass\fP\^; +.br + XVisualInfo *\fIvinfo_return\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIscreen\fP 1i +Specifies the screen. +.IP \fIdepth\fP 1i +Specifies the depth of the screen. +.IP \fIclass\fP 1i +Specifies the class of the screen. +.IP \fIvinfo_return\fP 1i +Returns the matched visual information. +.LP +.eM +The +.PN XMatchVisualInfo +function returns the visual information for a visual that matches the specified +depth and class for a screen. +Because multiple visuals that match the specified depth and class can exist, +the exact visual chosen is undefined. +If a visual is found, +.PN XMatchVisualInfo +returns nonzero and the information on the visual to vinfo_return. +Otherwise, when a visual is not found, +.PN XMatchVisualInfo +returns zero. +.NH 2 +Manipulating Images +.XS +\*(SN Manipulating Images +.XE +.LP +Xlib provides several functions that perform basic operations on images. +All operations on images are defined using an +.PN XImage +structure, +as defined in +.hN X11/Xlib.h . +Because the number of different types of image formats can be very large, +this hides details of image storage properly from applications. +.LP +This section describes the functions for generic operations on images. +Manufacturers can provide very fast implementations of these for the +formats frequently encountered on their hardware. +These functions are neither sufficient nor desirable to use for general image +processing. +Rather, they are here to provide minimal functions on screen format +images. +The basic operations for getting and putting images are +.PN XGetImage +and +.PN XPutImage . +.LP +Note that no functions have been defined, as yet, to read and write images +to and from disk files. +.LP +The +.PN XImage +structure describes an image as it exists in the client's memory. +The user can request that some of the members such as height, width, +and xoffset be changed when the image is sent to the server. +Note that bytes_per_line in concert with offset can be used to +extract a subset of the image. +Other members (for example, byte order, bitmap_unit, and so forth) +are characteristics of both the image and the server. +If these members +differ between the image and the server, +.PN XPutImage +makes the appropriate conversions. +The first byte of the first line of +plane n must be located at the address (data + (n * height * bytes_per_line)). +For a description of the +.PN XImage +structure, +see section 8.7. +.LP +.sp +To allocate an +.PN XImage +structure and initialize it with image format values from a display, use +.PN XCreateImage . +.IN "XCreateImage" "" "@DEF@" +.sM +.FD 0 +XImage *XCreateImage\^(\^\fIdisplay\fP, \fIvisual\fP, \fIdepth\fP, \fIformat\fP, \fIoffset\fP, \fIdata\fP, \fIwidth\fP, \fIheight\fP\^, \fIbitmap_pad\fP, +.br + \fIbytes_per_line\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Visual *\fIvisual\fP\^; +.br + unsigned int \fIdepth\fP\^; +.br + int \fIformat\fP\^; +.br + int \fIoffset\fP\^; +.br + char *\fIdata\fP\^; +.br + unsigned int \fIwidth\fP\^; +.br + unsigned int \fIheight\fP\^; +.br + int \fIbitmap_pad\fP\^; +.br + int \fIbytes_per_line\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIvisual\fP 1i +Specifies the +.PN Visual +structure. +.IP \fIdepth\fP 1i +Specifies the depth of the image. +.IP \fIformat\fP 1i +Specifies the format for the image. +You can pass +.PN XYBitmap , +.PN XYPixmap , +or +.PN ZPixmap . +.IP \fIoffset\fP 1i +Specifies the number of pixels to ignore at the beginning of the scanline. +.IP \fIdata\fP 1i +Specifies the image data. +.IP \fIwidth\fP 1i +Specifies the width of the image, in pixels. +.IP \fIheight\fP 1i +Specifies the height of the image, in pixels. +.IP \fIbitmap_pad\fP 1i +Specifies the quantum of a scanline (8, 16, or 32). +In other words, the start of one scanline is separated in client memory from +the start of the next scanline by an integer multiple of this many bits. +.IP \fIbytes_per_line\fP 1i +Specifies the number of bytes in the client image between +the start of one scanline and the start of the next. +.LP +.eM +The +.PN XCreateImage +function allocates the memory needed for an +.PN XImage +structure for the +specified display but does not allocate space for the image itself. +Rather, it initializes the structure byte-order, bit-order, and bitmap-unit +values from the display and returns a pointer to the +.PN XImage +structure. +The red, green, and blue mask values are defined for Z format images only +and are derived from the +.PN Visual +structure passed in. +Other values also are passed in. +The offset permits the rapid displaying of the image without requiring each +scanline to be shifted into position. +If you pass a zero value in bytes_per_line, +Xlib assumes that the scanlines are contiguous +in memory and calculates the value of bytes_per_line itself. +.LP +Note that when the image is created using +.PN XCreateImage , +.PN XGetImage , +or +.PN XSubImage , +the destroy procedure that the +.PN XDestroyImage +function calls frees both the image structure +and the data pointed to by the image structure. +.LP +The basic functions used to get a pixel, set a pixel, create a subimage, +and add a constant value to an image are defined in the image object. +The functions in this section are really macro invocations of the functions +in the image object and are defined in +.hN X11/Xutil.h . +.LP +.sp +To obtain a pixel value in an image, use +.PN XGetPixel . +.IN "XGetPixel" "" "@DEF@" +.sM +.FD 0 +unsigned long XGetPixel\^(\^\fIximage\fP, \fIx\fP, \fIy\fP\^) +.br + XImage *\fIximage\fP\^; +.br + int \fIx\fP\^; +.br + int \fIy\fP\^; +.FN +.IP \fIximage\fP 1i +Specifies the image. +.IP \fIx\fP 1i +.br +.ns +.IP \fIy\fP 1i +Specify the x and y coordinates. +.LP +.eM +The +.PN XGetPixel +function returns the specified pixel from the named image. +The pixel value is returned in normalized format (that is, +the least significant byte of the long is the least significant byte +of the pixel). +The image must contain the x and y coordinates. +.LP +.sp +To set a pixel value in an image, use +.PN XPutPixel . +.IN "XPutPixel" "" "@DEF@" +.sM +.FD 0 +XPutPixel\^(\^\fIximage\fP, \fIx\fP, \fIy\fP, \fIpixel\fP\^) +.br + XImage *\fIximage\fP\^; +.br + int \fIx\fP\^; +.br + int \fIy\fP\^; +.br + unsigned long \fIpixel\fP\^; +.FN +.IP \fIximage\fP 1i +Specifies the image. +.IP \fIx\fP 1i +.br +.ns +.IP \fIy\fP 1i +Specify the x and y coordinates. +.IP \fIpixel\fP 1i +Specifies the new pixel value. +.LP +.eM +The +.PN XPutPixel +function overwrites the pixel in the named image with the specified pixel value. +The input pixel value must be in normalized format +(that is, the least significant byte of the long is the least significant +byte of the pixel). +The image must contain the x and y coordinates. +.LP +.sp +To create a subimage, use +.PN XSubImage . +.IN "XSubImage" "" "@DEF@" +.sM +.FD 0 +XImage *XSubImage\^(\^\fIximage\fP, \fIx\fP, \fIy\fP, \fIsubimage_width\fP, \fIsubimage_height\fP\^) +.br + XImage *\fIximage\fP\^; +.br + int \fIx\fP\^; +.br + int \fIy\fP\^; +.br + unsigned int \fIsubimage_width\fP\^; +.br + unsigned int \fIsubimage_height\fP\^; +.FN +.IP \fIximage\fP 1i +Specifies the image. +.IP \fIx\fP 1i +.br +.ns +.IP \fIy\fP 1i +Specify the x and y coordinates. +.IP \fIsubimage_width\fP 1i +Specifies the width of the new subimage, in pixels. +.IP \fIsubimage_height\fP 1i +Specifies the height of the new subimage, in pixels. +.LP +.eM +The +.PN XSubImage +function creates a new image that is a subsection of an existing one. +It allocates the memory necessary for the new +.PN XImage +structure +and returns a pointer to the new image. +The data is copied from the source image, +and the image must contain the rectangle defined by x, y, subimage_width, +and subimage_height. +.LP +.sp +To increment each pixel in an image by a constant value, use +.PN XAddPixel . +.IN "XAddPixel" "" "@DEF@" +.sM +.FD 0 +XAddPixel\^(\^\fIximage\fP, \fIvalue\fP\^) +.br + XImage *\fIximage\fP\^; +.br + long \fIvalue\fP\^; +.FN +.IP \fIximage\fP 1i +Specifies the image. +.IP \fIvalue\fP 1i +Specifies the constant value that is to be added. +.LP +.eM +The +.PN XAddPixel +function adds a constant value to every pixel in an image. +It is useful when you have a base pixel value from allocating +color resources and need to manipulate the image to that form. +.LP +.sp +To deallocate the memory allocated in a previous call to +.PN XCreateImage , +use +.PN XDestroyImage . +.IN "XDestroyImage" "" "@DEF@" +.sM +.FD 0 +XDestroyImage\^(\^\fIximage\fP\^) +.br + XImage *\^\fIximage\fP\^; +.FN +.IP \fIximage\fP 1i +Specifies the image. +.LP +.eM +The +.PN XDestroyImage +function deallocates the memory associated with the +.PN XImage +structure. +.LP +Note that when the image is created using +.PN XCreateImage , +.PN XGetImage , +or +.PN XSubImage , +the destroy procedure that this macro calls +frees both the image structure and the data pointed to by the image structure. +.NH 2 +Manipulating Bitmaps +.XS +\*(SN Manipulating Bitmaps +.XE +.LP +Xlib provides functions that you can use to read a bitmap from a file, +save a bitmap to a file, or create a bitmap. +This section describes those functions that transfer bitmaps to and +from the client's file system, thus allowing their reuse in a later +connection (for example, from an entirely different client or to a +different display or server). +.LP +The X version 11 bitmap file format is: +.LP +.sM +.Ds 0 +#define \fIname\fP_width \fIwidth\fP +#define \fIname\fP_height \fIheight\fP +#define \fIname\fP_x_hot \fIx\fP +#define \fIname\fP_y_hot \fIy\fP +static unsigned char \fIname\fP_bits[] = { 0x\fINN\fP,... } +.De +.LP +.eM +The lines for the variables ending with _x_hot and _y_hot suffixes are optional +because they are present only if a hotspot has been defined for this bitmap. +The lines for the other variables are required. +The word ``unsigned'' is optional; +that is, the type of the _bits array can be ``char'' or ``unsigned char''. +The _bits array must be large enough to contain the size bitmap. +The bitmap unit is 8. +.LP +.sp +To read a bitmap from a file and store it in a pixmap, use +.PN XReadBitmapFile . +.IN "XReadBitmapFile" "" "@DEF@" +.sM +.FD 0 +int XReadBitmapFile(\^\fIdisplay\fP, \fId\fP, \fIfilename\fP, \fIwidth_return\fP, \fIheight_return\fP, \fIbitmap_return\fP, \fIx_hot_return\fP, +.br + \fIy_hot_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + char *\fIfilename\fP\^; +.br + unsigned int *\fIwidth_return\fP, *\fIheight_return\fP\^; +.br + Pixmap *\fIbitmap_return\fP\^; +.br + int *\fIx_hot_return\fP, *\fIy_hot_return\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.ds Dr \ that indicates the screen +.IP \fId\fP 1i +Specifies the drawable\*(Dr. +.IP \fIfilename\fP 1i +Specifies the file name to use. +The format of the file name is operating-system dependent. +.IP \fIwidth_return\fP 1i +.br +.ns +.IP \fIheight_return\fP 1i +Return the width and height values of the read in bitmap file. +.IP \fIbitmap_return\fP 1i +Returns the bitmap that is created. +.IP \fIx_hot_return\fP 1i +.br +.ns +.IP \fIy_hot_return\fP 1i +Return the hotspot coordinates. +.LP +.eM +The +.PN XReadBitmapFile +function reads in a file containing a bitmap. +The file is parsed in the encoding of the current locale. +The ability to read other than the standard format +is implementation-dependent. +If the file cannot be opened, +.PN XReadBitmapFile +returns +.PN BitmapOpenFailed . +If the file can be opened but does not contain valid bitmap data, +it returns +.PN BitmapFileInvalid . +If insufficient working storage is allocated, +it returns +.PN BitmapNoMemory . +If the file is readable and valid, +it returns +.PN BitmapSuccess . +.LP +.PN XReadBitmapFile +returns the bitmap's height and width, as read +from the file, to width_return and height_return. +It then creates a pixmap of the appropriate size, +reads the bitmap data from the file into the pixmap, +and assigns the pixmap to the caller's variable bitmap. +The caller must free the bitmap using +.PN XFreePixmap +when finished. +If \fIname\fP_x_hot and \fIname\fP_y_hot exist, +.PN XReadBitmapFile +returns them to x_hot_return and y_hot_return; +otherwise, it returns \-1,\-1. +.LP +.PN XReadBitmapFile +can generate +.PN BadAlloc , +.PN BadDrawable , +and +.PN BadGC +errors. +.LP +.sp +To read a bitmap from a file and return it as data, use +.PN XReadBitmapFileData . +.IN "XReadBitmapFileData" "" "@DEF@" +.sM +.FD 0 +int XReadBitmapFileData(\^\fIfilename\fP, \fIwidth_return\fP, \fIheight_return\fP, \fIdata_return\fP, \fIx_hot_return\fP, \fIy_hot_return\fP\^) +.br + char *\fIfilename\fP\^; +.br + unsigned int *\fIwidth_return\fP, *\fIheight_return\fP\^; +.br + unsigned char *\fIdata_return\fP\^; +.br + int *\fIx_hot_return\fP, *\fIy_hot_return\fP\^; +.FN +.IP \fIfilename\fP 1i +Specifies the file name to use. +The format of the file name is operating-system dependent. +.IP \fIwidth_return\fP 1i +.br +.ns +.IP \fIheight_return\fP 1i +Return the width and height values of the read in bitmap file. +.IP \fIdata_return\fP 1i +Returns the bitmap data. +.IP \fIx_hot_return\fP 1i +.br +.ns +.IP \fIy_hot_return\fP 1i +Return the hotspot coordinates. +.LP +.eM +The +.PN XReadBitmapFileData +function reads in a file containing a bitmap, in the same manner as +.PN XReadBitmapFile , +but returns the data directly rather than creating a pixmap in the server. +The bitmap data is returned in data_return; the client must free this +storage when finished with it by calling +.PN XFree . +The status and other return values are the same as for +.PN XReadBitmapFile . +.LP +.sp +To write out a bitmap from a pixmap to a file, use +.PN XWriteBitmapFile . +.IN "XWriteBitmapFile" "" "@DEF@" +.sM +.FD 0 +int XWriteBitmapFile(\^\fIdisplay\fP, \fIfilename\fP, \fIbitmap\fP, \fIwidth\fP, \fIheight\fP, \fIx_hot\fP, \fIy_hot\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + char *\fIfilename\fP\^; +.br + Pixmap \fIbitmap\fP\^; +.br + unsigned int \fIwidth\fP, \fIheight\fP\^; +.br + int \fIx_hot\fP, \fIy_hot\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIfilename\fP 1i +Specifies the file name to use. +The format of the file name is operating-system dependent. +.IP \fIbitmap\fP 1i +Specifies the bitmap. +.IP \fIwidth\fP 1i +.br +.ns +.IP \fIheight\fP 1i +Specify the width and height. +.IP \fIx_hot\fP 1i +.br +.ns +.IP \fIy_hot\fP 1i +Specify where to place the hotspot coordinates (or \-1,\-1 if none are present) +in the file. +.LP +.eM +The +.PN XWriteBitmapFile +function writes a bitmap out to a file in the X Version 11 format. +The name used in the output file is derived from the file name +by deleting the directory prefix. +The file is written in the encoding of the current locale. +If the file cannot be opened for writing, +it returns +.PN BitmapOpenFailed . +If insufficient memory is allocated, +.PN XWriteBitmapFile +returns +.PN BitmapNoMemory ; +otherwise, on no error, +it returns +.PN BitmapSuccess . +If x_hot and y_hot are not \-1, \-1, +.PN XWriteBitmapFile +writes them out as the hotspot coordinates for the bitmap. +.LP +.PN XWriteBitmapFile +can generate +.PN BadDrawable +and +.PN BadMatch +errors. +.LP +.sp +To create a pixmap and then store bitmap-format data into it, use +.PN XCreatePixmapFromBitmapData . +.IN "XCreatePixmapFromBitmapData" "" "@DEF@" +.sM +.FD 0 +Pixmap XCreatePixmapFromBitmapData\^(\^\fIdisplay\fP, \fId\fP, \fIdata\fP, \fIwidth\fP, \fIheight\fP, \fIfg\fP, \fIbg\fP, \fIdepth\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + char *\fIdata\fP\^; +.br + unsigned int \fIwidth\fP, \fIheight\fP\^; +.br + unsigned long \fIfg\fP, \fIbg\fP\^; +.br + unsigned int \fIdepth\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.ds Dr \ that indicates the screen +.IP \fId\fP 1i +Specifies the drawable\*(Dr. +.IP \fIdata\fP 1i +Specifies the data in bitmap format. +.IP \fIwidth\fP 1i +.br +.ns +.IP \fIheight\fP 1i +Specify the width and height. +.IP \fIfg\fP 1i +.br +.ns +.IP \fIbg\fP 1i +Specify the foreground and background pixel values to use. +.IP \fIdepth\fP 1i +Specifies the depth of the pixmap. +.LP +.eM +The +.PN XCreatePixmapFromBitmapData +function creates a pixmap of the given depth and then does a bitmap-format +.PN XPutImage +of the data into it. +The depth must be supported by the screen of the specified drawable, +or a +.PN BadMatch +error results. +.LP +.PN XCreatePixmapFromBitmapData +can generate +.PN BadAlloc , +.PN BadDrawable , +.PN BadGC , +and +.PN BadValue +errors. +.LP +.sp +To include a bitmap written out by +.PN XWriteBitmapFile +.IN "XWriteBitmapFile" +in a program directly, as opposed to reading it in every time at run time, use +.PN XCreateBitmapFromData . +.IN "XCreateBitmapFromData" "" "@DEF@" +.sM +.FD 0 +Pixmap XCreateBitmapFromData(\^\fIdisplay\fP, \fId\fP, \fIdata\fP, \fIwidth\fP, \fIheight\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + Drawable \fId\fP\^; +.br + char *\fIdata\fP\^; +.br + unsigned int \fIwidth\fP, \fIheight\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.ds Dr \ that indicates the screen +.IP \fId\fP 1i +Specifies the drawable\*(Dr. +.IP \fIdata\fP 1i +Specifies the location of the bitmap data. +.IP \fIwidth\fP 1i +.br +.ns +.IP \fIheight\fP 1i +Specify the width and height. +.LP +.eM +The +.PN XCreateBitmapFromData +function allows you to include in your C program (using +.PN #include ) +a bitmap file that was written out by +.PN XWriteBitmapFile +(X version 11 format only) without reading in the bitmap file. +The following example creates a gray bitmap: +.LP +.Ds 0 +#include "gray.bitmap" +.sp 6p +Pixmap bitmap; +bitmap = XCreateBitmapFromData(display, window, gray_bits, gray_width, gray_height); +.De +.LP +If insufficient working storage was allocated, +.PN XCreateBitmapFromData +returns +.PN None . +It is your responsibility to free the +bitmap using +.PN XFreePixmap +when finished. +.LP +.PN XCreateBitmapFromData +can generate +.PN BadAlloc +and +.PN BadGC +errors. +.NH 2 +Using the Context Manager +.XS +\*(SN Using the Context Manager +.XE +.LP +The context manager provides a way of associating data with an X resource ID +(mostly typically a window) in your program. +Note that this is local to your program; +the data is not stored in the server on a property list. +Any amount of data in any number of pieces can be associated with a +resource ID, +and each piece of data has a type associated with it. +The context manager requires knowledge of the resource ID +and type to store or retrieve data. +.LP +Essentially, the context manager can be viewed as a two-dimensional, +sparse array: one dimension is subscripted by the X resource ID +and the other by a context type field. +Each entry in the array contains a pointer to the data. +Xlib provides context management functions with which you can +save data values, get data values, delete entries, and create a unique +context type. +The symbols used are in +.hN X11/Xutil.h . +.LP +.sp +To save a data value that corresponds to a resource ID and context type, use +.PN XSaveContext . +.IN "XSaveContext" "" "@DEF@" +.sM +.FD 0 +int XSaveContext(\^\fIdisplay\fP, \fIrid\fP, \fIcontext\fP, \fIdata\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + XID \fIrid\fP\^; +.br + XContext \fIcontext\fP\^; +.br + XPointer \fIdata\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIrid\fP 1i +Specifies the resource ID with which the data is associated. +.IP \fIcontext\fP 1i +Specifies the context type to which the data belongs. +.IP \fIdata\fP 1i +Specifies the data to be associated with the window and type. +.LP +.eM +If an entry with the specified resource ID and type already exists, +.PN XSaveContext +overrides it with the specified context. +The +.PN XSaveContext +function returns a nonzero error code if an error has occurred +and zero otherwise. +Possible errors are +.PN XCNOMEM +(out of memory). +.LP +.sp +To get the data associated with a resource ID and type, use +.PN XFindContext . +.IN "XFindContext" "" "@DEF@" +.sM +.FD 0 +int XFindContext(\^\fIdisplay\fP, \fIrid\fP, \fIcontext\fP, \fIdata_return\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + XID \fIrid\fP\^; +.br + XContext \fIcontext\fP\^; +.br + XPointer *\fIdata_return\fP\^; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIrid\fP 1i +Specifies the resource ID with which the data is associated. +.IP \fIcontext\fP 1i +Specifies the context type to which the data belongs. +.IP \fIdata_return\fP 1i +Returns the data. +.LP +.eM +Because it is a return value, +the data is a pointer. +The +.PN XFindContext +function returns a nonzero error code if an error has occurred +and zero otherwise. +Possible errors are +.PN XCNOENT +(context-not-found). +.LP +.sp +To delete an entry for a given resource ID and type, use +.PN XDeleteContext . +.IN "XDeleteContext" "" "@DEF@" +.sM +.FD 0 +int XDeleteContext(\^\fIdisplay\fP, \fIrid\fP, \fIcontext\fP\^) +.br + Display *\fIdisplay\fP\^; +.br + XID \fIrid\fP; +.br + XContext \fIcontext\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the connection to the X server. +.IP \fIrid\fP 1i +Specifies the resource ID with which the data is associated. +.IP \fIcontext\fP 1i +Specifies the context type to which the data belongs. +.LP +.eM +The +.PN XDeleteContext +function deletes the entry for the given resource ID +and type from the data structure. +This function returns the same error codes that +.PN XFindContext +returns if called with the same arguments. +.PN XDeleteContext +does not free the data whose address was saved. +.LP +.sp +To create a unique context type that may be used in subsequent calls to +.PN XSaveContext +and +.PN XFindContext , +use +.PN XUniqueContext . +.IN "XUniqueContext" "" "@DEF@" +.sM +.FD 0 +XContext XUniqueContext(\^) +.FN +.LP +.eM +.bp |