VMS DECwindows Guide to Xlib (Release 4) Programming: MIT C Binding


Previous Contents Index

12.3.4 Example of Setting Properties

This section includes an example that uses the following routines:

SET WM NORMAL HINTS
SET WM HINTS
SET WM WINDOW NAME
SET WM ICON NAME
SET CLASS HINT

Example 12-2 uses the following resource file to return values for such variables as window and icon position, name and size, font name, and colors. Using a resource data file is one method that the client can use to set properties. For more information about using the X resource manager, see Chapter 10.


star.window.name: Complying with ICCCM Conventions Example 
star.icon.name: Star 
star.font: -Adobe-New Century Schoolbook-Bold-R-NormaL--*-140-*-*-P-ISO8859-1 
star.background: blue 
star.foreground: yellow 
star.border.color: black 
star.border.width: 2 
star.window.height: 400 
star.window.width: 600 
star.window.x: 60 
star.window.y: 70 
star.window.maxHeight: 375 
star.window.maxWidth: 475 
star.window.minHeight: 120 
star.window.minWidth: 350 
star.icon.x: 800 
star.icon.y: 10 

Example 12-2 maps one window. When the user clicks MB1 on the minimize button, the window manager uses a bitmap to create a star as the icon pixmap. Clicking on MB2 exits the program. See Chapter 7 for more information about pixmaps and bitmaps.

Example 12-2 Setting Window Manager Properties

#include <decw$include/Xlib.h> 
#include <decw$include/Xutil.h> 
#include <decw$include/Xresource.h> 
#include <decw$include/Xatom.h> 
 
(1)#include "icon_file.dat" 
 
Display *dpy; 
Window win; 
GC gc; 
Screen *screen; 
int scrNum; 
Pixmap icon_win_pixmap; 
 
int n;                
int winX, winY, winHeight, winWidth; 
unsigned depth; 
unsigned long bd, fg, bg; 
unsigned long bw = 1; 
char *name, *class; 
char *fontname; 
char *message[]={ 
    "This example demonstrates how applications", 
    "can comply with ICCCM conventions." 
    }; 
 
XrmDatabase star_db = 0; 
XrmValue value; 
XrmString type; 
XWMHints *xwmh; 
XSizeHints *xsh; 
XClassHint *xch; 
XSetWindowAttributes xswa; 
XGCValues xgcv; 
XTextProperty windowName, iconName; 
                    .
                    .
                    .
/***** Create the Window using XSizeHints  *****/ 
static void doCreateWindows( ) 
{   
(2)  xsh = XAllocSizeHints(); 
    xsh->flags = PMinSize | PMaxSize;     
    xsh->min_height = atoi (doGetResource("star.window.minHeight", 
                                          "Star.Window.MinHeight")); 
    xsh->min_width  = atoi (doGetResource("star.window.minWidth", 
                                          "Star.Window.MinWidth")); 
    xsh->max_height = atoi (doGetResource("star.window.maxHeight", 
                                          "Star.Window.MaxHeight")); 
    xsh->max_width  = atoi (doGetResource("star.window.maxWidth", 
                                          "Star.Window.MaxWidth")); 
     
    xswa.event_mask = ExposureMask | ButtonPressMask; 
    xswa.background_pixel = doDefineColor(doGetResource("star.background", 
                                                        "Star.Background")); 
 
    winX = atoi (doGetResource("star.window.x", "Star.Window.X")); 
    winY = atoi (doGetResource("star.window.y", "Star.Window.Y")); 
    winWidth = atoi (doGetResource("star.window.width", 
           "Star.Window.Width")); 
    winHeight = atoi (doGetResource("star.window.height", 
        "Star.Window.height")); 
 
    win = XCreateWindow(dpy, DefaultRootWindow(dpy), 
            winX, winY, winWidth, winHeight, 0, 
            DefaultDepthOfScreen(screen), InputOutput, 
            DefaultVisualOfScreen(screen), CWEventMask | 
               CWBackPixel, &xswa); 
 
(3)  XSetWMNormalHints(dpy, win, xsh); 
} 
                                                    
/***** Set the window name and icon name *****/ 
static void doSetNames( ) 
{ 
(4)  windowName.value = (doGetResource("star.window.name", "Star.Window.Name")); 
    windowName.encoding = XA_STRING; 
    windowName.format = 8; 
    windowName.nitems = strlen(windowName.value); 
(5)  XSetWMName(dpy, win, &windowName); 
 
    iconName.value =  (doGetResource("star.icon.name", "Star.Icon.Name")); 
    iconName.encoding = XA_STRING; 
    iconName.format = 8; 
    iconName.nitems = strlen(iconName.value); 
    XSetWMIconName(dpy, win, &iconName); 
} 
                                                    
/***** Create the graphics context *****/    
static void doCreateGraphicsContext( ) 
{                                                
    
    xgcv.foreground = doDefineColor(doGetResource("star.foreground", 
        "Star.Foreground")); 
    xgcv.background = doDefineColor(doGetResource("star.background", 
        "Star.Background")); 
    gc = XCreateGC(dpy, win, (GCForeground | GCBackground), &xgcv);   
} 
 
/**** Use the WM Hints data structure *****/ 
static void doWMHints ( ) 
{ 
(6)  xwmh = XAllocWMHints( ); 
    xwmh->flags = (InputHint | StateHint | IconPixmapHint 
                   | IconWindowHint | IconPositionHint); 
    xwmh->input = False; 
    xwmh->initial_state = NormalState; 
 
 /* Create the bitmap for the icon pixmap */ 
 
(7)   if (xwmh->icon_pixmap = XCreateBitmapFromData(dpy, win, icon_file_bits, 
          icon_file_width, icon_file_height)){ 
          depth=DefaultDepth(dpy, DefaultScreen(dpy)); 
          icon_win_pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy), 
          icon_file_width, icon_file_height, depth); 
          XCopyPlane(dpy, xwmh->icon_pixmap, icon_win_pixmap, gc, 0, 0, 
              icon_file_width, icon_file_height, 0, 0, 1); 
 
   /* Create the icon window */ 
 
(8)        xswa.background_pixmap = icon_win_pixmap; 
          xswa.border_pixel = bd; 
          xwmh->icon_window = XCreateWindow(dpy, DefaultRootWindow(dpy), 
              0, 0, icon_file_width, icon_file_height, bw, 
          CopyFromParent, InputOutput, CopyFromParent, 
          (CWBackPixmap | CWBorderPixel), &xswa); 
          
          XFreePixmap (dpy, icon_win_pixmap); 
          xwmh->icon_x = atoi (doGetResource("star.icon.x", "Star.Icon.X")); 
          xwmh->icon_y = atoi (doGetResource("star.icon.y", "Star.Icon.Y")); 
(9)        XSetWMHints(dpy, win, xwmh); 
 
     } 
     else 
          printf("Can't open bitmap file for icon\n"); 
 
    /* Set the class hint data structure */ 
    xch = XAllocClassHint( ); 
    xch->res_name = "star"; 
    xch->res_class = "Star"; 
(10)  SetClassHint(dpy, win, xch);  
}        
 
/***** Load the font for text writing *****/ 
static void doLoadFont( ) 
{                                                                            
    Font font; 
    fontname = (doGetResource ("star.font", "Star.Font")); 
    font = XLoadFont(dpy, fontname); 
    XSetFont(dpy, gc, font); 
} 
 
/***** Map the window *****/ 
static void doMapWindow( ) 
{ 
 XMapWindow(dpy, win); 
} 
                    .
                    .
                    .
/***** Button press & shutdown *****/ 
static void doButtonPress(eventP) 
XEvent *eventP; 
{ 
    if (eventP->xbutton.button == Button2) { 
        XWithdrawWindow(dpy, win, scrNum); 
        XFree(xwmh); 
        XFree(xch); 
        XFree(xsh); 
        XCloseDisplay(dpy); 
        exit(1); 
     } 
} 

  1. The client specifies an include file, icon_file.dat, that contains the data to create an icon bitmap.
  2. The client calls the ALLOC SIZE HINTS routine to allocate a size hints data structure and return a pointer. In this example, the client sets the minimum and maximum size of the window. The client-defined doGetResource routine accesses the X resource manager database and sets the specified members of the data structure. For more information about the X resource manager, see Chapter 10.
  3. The SET WM NORMAL HINTS routine sets the window's WM_NORMAL_HINTS property with the values from the size hints data structure. The SET NORMAL HINTS routine has the following format:

    XSetWMNormalHints(display, window, hints)

  4. The client uses the text property data structure to assign values for the window and icon name. The client sets the value member of the data structure by calling the client-defined doGetResource routine, which fetches the name of the window and the icon from the database.
  5. The client calls the SET WM NAME to set the property XA_WM_NAME. SET WM NAME is a convenience function that performs a SET TEXT PROPERTY on the XA_WM_NAME property. The SET WM NAME routine has the following format:

    XSetWMName(display, window, text_property)


    The client also sets the icon name in the same manner with the SET WM ICON NAME routine.

  6. By calling the ALLOC WM HINTS routine, the client allocates and sets the values of the WM hints data structure. Because the client does not expect any keyboard input, the input member is set to false. To create a mapped and visible window, the client sets the initial_state member to NormalState.
  7. The CREATE BITMAP FROM DATA routine creates a bitmap and returns the pixmap ID to the wm hints data structure. For more information about bitmaps and pixmaps refer to Chapter 7.
  8. The client creates a pixmap and copies the icon pixmap into it. When the client creates the icon window with the CREATE WINDOW routine, the icon pixmap is used as the background.
    The example sets both the icon pixmap and the icon window, which displays a window for the client to use as an icon. MWM supports icon windows; however, not all window managers support icon windows. For reasons of portability, it is important that if the client sets the icon window, the client also set the icon pixmap as a backup.
  9. The SET WM HINTS routine sets all of the properties specified in the WM hints data structure.
  10. The name and class of the window can be set with the SET CLASS routine. Note that this is not the window name, but is the resource manager name and class. For more information about names and classes, see Chapter 10.

12.3.5 Using the SET WM PROPERTIES Routine

Xlib also provides a convenience function to set the standard window manager properties. Use the SET WM PROPERTIES routine to set the following window manager properties:

WM_CLASS
WM_CLIENT_MACHINE
WM_COMMAND
WM_HINTS
WM_ICON_NAME
WM_NAME
WM_NORMAL_HINTS

Example 12-3 illustrates how to use the SET WM PROPERTIES routine. This example is identical to Example 12-2 except that all properties are set at the end of the client-defined doWMHints routine.

Example 12-3 Using the SET WM PROPERTIES Routine

#include <decw$include/Xlib.h> 
#include <decw$include/Xutil.h> 
#include <decw$include/Xresource.h> 
#include <decw$include/Xatom.h> 
#include "icon_file.dat" 
 
Display *dpy; 
Window win; 
GC gc; 
Screen *screen; 
int scrNum; 
Pixmap icon_win_pixmap; 
 
int n; 
int winX, winY, winHeight, winWidth;                
unsigned depth; 
unsigned long bd, fg, bg; 
unsigned long bw = 1; 
char *name, *class; 
char *fontname; 
char *message[]={ 
    "This example demonstrates how applications", 
 "can set properties with one routine call." 
 }; 
 
 
    "This example demonstrates how applications", 
 "can set properties with one routine call." 
 }; 
 
XrmDatabase star_db = 0; 
XrmValue value; 
XrmString type; 
XWMHints *xwmh; 
XSizeHints *xsh; 
XClassHint *xch; 
XSetWindowAttributes xswa; 
XGCValues xgcv; 
XTextProperty windowName, iconName; 
                    .
                    .
                    .
/***** Create the Window using XSizeHints  *****/ 
static void doCreateWindows( ) 
{   
    xsh = XAllocSizeHints(); 
    xsh->flags = PMinSize | PMaxSize;     
    xsh->min_height = atoi (doGetResource("star.window.minHeight", 
                                          "Star.Window.MinHeight")); 
    xsh->min_width  = atoi (doGetResource("star.window.minWidth", 
                                          "Star.Window.MinWidth")); 
    xsh->max_height = atoi (doGetResource("star.window.maxHeight", 
                                          "Star.Window.MaxHeight")); 
    xsh->max_width  = atoi (doGetResource("star.window.maxWidth", 
                                          "Star.Window.MaxWidth")); 
     
    xswa.event_mask = ExposureMask | ButtonPressMask; 
    xswa.background_pixel = doDefineColor(doGetResource("star.background", 
                                                        "Star.Background")); 
 
    winX = atoi (doGetResource("star.window.x", "Star.Window.X")); 
    winY = atoi (doGetResource("star.window.y", "Star.Window.Y")); 
    winWidth = atoi (doGetResource("star.window.width", 
                                   "Star.Window.Width")); 
    winHeight = atoi (doGetResource("star.window.height", 
                                    "Star.Window.height")); 
 
    win = XCreateWindow(dpy, DefaultRootWindow(dpy), winX, winY, 
              winWidth, winHeight, DefaultDepthOfScreen(screen), 
              InputOutput, DefaultVisualOfScreen(screen), CWEventMask | 
              CWBackPixel, &xswa); 
} 
                                                    
/***** Set the window name and icon name *****/ 
static void doSetNames( ) 
{ 
    windowName.value = (doGetResource("star.window.name", "Star.Window.Name")); 
    windowName.encoding = XA_STRING; 
    windowName.format = 8; 
    windowName.nitems = strlen(windowName.value); 
 
    iconName.value =  (doGetResource("star.icon.name", "Star.Icon.Name")); 
    iconName.encoding = XA_STRING; 
    iconName.format = 8; 
    iconName.nitems = strlen(iconName.value); 
} 
                                                    
/***** Create the graphics context *****/    
static void doCreateGraphicsContext( ) 
{                                                
    xgcv.foreground = doDefineColor(doGetResource("star.foreground", 
                                                  "Star.Foreground")); 
    xgcv.background = doDefineColor(doGetResource("star.background", 
                                                  "Star.Background")); 
    gc = XCreateGC(dpy, win, (GCForeground | GCBackground), &xgcv);   
} 
 
/***** Use the WM Hints data structure *****/ 
static void doWMHints ( ) 
{ 
    xwmh = XAllocWMHints( ); 
    xwmh->flags = (InputHint | StateHint | IconPixmapHint 
                   | IconWindowHint | IconPositionHint); 
    xwmh->input = False; 
    xwmh->initial_state = NormalState; 
 
        /* Create the bitmap for the icon pixmap */ 
        if (xwmh->icon_pixmap = XCreateBitmapFromData(dpy, win, icon_file_bits, 
        icon_file_width, icon_file_height)){ 
 
            depth=DefaultDepth(dpy, DefaultScreen(dpy)); 
            icon_win_pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy), 
                icon_file_width, icon_file_height, depth); 
            XCopyPlane(dpy, xwmh->icon_pixmap, icon_win_pixmap, gc, 0, 0, 
                icon_file_width, icon_file_height, 0, 0, 1); 
 
            /* Create the icon window */ 
            xswa.background_pixmap = icon_win_pixmap; 
            xswa.border_pixel = bd; 
            xwmh->icon_window = XCreateWindow(dpy, DefaultRootWindow(dpy), 
                   0, 0, icon_file_width, icon_file_height, bw, 
                   CopyFromParent, InputOutput, CopyFromParent, 
                   (CWBackPixmap | CWBorderPixel), &xswa); 
            XFreePixmap (dpy, icon_win_pixmap); 
            xwmh->icon_x = atoi (doGetResource("star.icon.x", "Star.Icon.X")); 
            xwmh->icon_y = atoi (doGetResource("star.icon.y", "Star.Icon.Y")); 
    }else 
            printf("Can't open bitmap file for icon\n"); 
 
    
        /* Set the class hint data structure */ 
        xch = XAllocClassHint( ); 
        xch->res_name = "star"; 
        xch->res_class = "Star"; 
 
(1)SetWMProperties(dpy, win, &windowName, &iconName, 
    NULL, NULL, xsh, xwmh, xch); 
}        
 
/***** Load the font for text writing *****/ 
static void doLoadFont( ) 
{                                                                            
    Font font; 
    fontname = (doGetResource ("star.font", "Star.Font")); 
    font = XLoadFont(dpy, fontname); 
    XSetFont(dpy, gc, font); 
} 
 
/***** Map the window *****/ 
static void doMapWindow( ) 
{ 
 XMapWindow(dpy, win); 
} 
                    .
                    .
                    .
/***** Button press & shutdown *****/ 
static void doButtonPress(eventP) 
XEvent *eventP; 
{ 
    if (eventP->xbutton.button == Button2) { 
        XWithdrawWindow(dpy, win, scrNum); 
        XFree(xwmh); 
        XFree(xch); 
        XFree(xsh); 
        XCloseDisplay(dpy); 
        exit(1); 
        } 
} 

  1. The client uses the convenience routine SET WM PROPERTIES to set the standard window manager properties. The SET WM PROPERTIES routine has the following format:

    XSetWMProperties(display, window, window_name, icon_name,
    argv, argc, normal_hints, wm_hints, class_hints)


Appendix A
Compiling Fonts

VMS DECwindows includes a font compiler that enables programmers to convert an ASCII Bitmap Distribution Format (BDF) font into a binary server natural font (SNF). For information about the Bitmap Distribution Format, see the X Window System. The server uses an SNF file to display a font. In addition to converting the BDF file to binary form, the compiler provides statistical information about the font and the compilation process.

To invoke the font compiler, use the following DCL format:

FONT filename [
/[NO]OUTPUT[=output_file]
/[NO]MINBBOX
/[NO]REPORT[=report_file]
]

The filename parameter specifies the BDF file to be compiled. A file name is required. The default file type is DECW$BDF.

The optional /OUTPUT qualifier specifies the file name of the resulting SNF file. The default output file name is the file name of the BDF file being compiled. The default output SNF file type is DECW$FONT. The default is /OUTPUT.

Compiler output consists of an SNF file that contains font information, character metrics, and the image of each character in the font. Font information in the SNF file is essentially the same as information stored in the font struct data structure. For a description of the data structure, see Section 8.1.

The optional /MINBBOX qualifier specifies that the compiler produce the minimum bounding box for each character in the font and adjust values for the left bearing, right bearing, ascent, and descent of each character accordingly. Character width is not affected. Specifying the /MINBBOX qualifier is equivalent to converting a fixed font to a monospaced font. For a description of character metrics and fonts, see Section 8.1. The default is /NOMINBBOX.

Using the /MINBBOX qualifier has two advantages. Because the font compiler produces minimum instead of fixed bounding boxes, the resulting SNF file is significantly smaller than the comparable fixed font SNF file. Consequently, both disk requirements for storing the font and server memory requirements when a client loads the font are reduced. In addition, because the resulting font comprises minimum inkable characters, server performance when writing text is increased.

The optional /REPORT qualifier directs the compiler to report information about the font and the compilation process, including BDF information, font properties, compiler generation information, and metrics. The /REPORT qualifier also causes the compiler to illustrate each glyph in the font. The default report file name is the file name of the BDF file being compiled. The default report file type is DECW$REP. The default is /NOREPORT.


Previous Next Contents Index