asview.html

Generated from asview.c with ROBODoc v3.2.3 on Fri Jul 13 13:35:01 2001

## libAfterImage/tutorials/ASView

SYNOPSIS

     Simple image viewer based on libAfterImage.

DESCRIPTION

     All we want to do here is to get image filename from the command line,
     then load this image, and display it in simple window.
     After that we would want to wait, until user closes our window.

SOURCE

        #include <X11/Xlib.h>
        #include <X11/Xutil.h>
        #include <X11/Xproto.h>
        #include <X11/Xatom.h>

        #include "afterimage.h"
        #include "common.h"

        void usage()
        {
            printf( "Usage: asview [-h]|[image]\n");
            printf( "Where: image - filename of the image to display.\n");
        }

        int main(int argc, char* argv[])
        {
            Window w ;
            ASVisual *asv ;
            int screen, depth ;
            char *image_file = "rose512.jpg" ;
            ASImage *im ;
            /* see ASView.1 : */
            set_application_name( argv[0] );

            if( argc > 1 )
            {
                if( strcmp( argv[1], "-h" ) == 0 )
                {
                    usage();
                    return 0;
                }
                image_file = argv[1] ;
            }else
            {
                show_warning( "Image filename was not specified. Using default: \"%s\"", image_file );
                usage();
            }

            dpy = XOpenDisplay(NULL);
            _XA_WM_DELETE_WINDOW = XInternAtom( dpy, "WM_DELETE_WINDOW", False);
            screen = DefaultScreen(dpy);
            depth = DefaultDepth( dpy, screen );
            /* see ASView.2 : */
            im = file2ASImage( image_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, NULL );

            if( im != NULL )
            {
                /* see ASView.3 : */
                asv = create_asvisual( dpy, screen, depth, NULL );
                /* see ASView.4 : */
                w = create_top_level_window( asv, DefaultRootWindow(dpy), 32, 32,
                                             im->width, im->height, 1, 0, NULL,
                                             "ASView" );
                if( w != None )
                {
                    Pixmap p ;

                    XSelectInput (dpy, w, (StructureNotifyMask | ButtonPress));
                    XMapRaised   (dpy, w);
                    /* see ASView.5 : */
                    p = asimage2pixmap( asv, DefaultRootWindow(dpy), im, NULL,
                                        False );
                    destroy_asimage( &im );
                    /* see common.c:set_window_background_and_free(): */
                    p = set_window_background_and_free( w, p );
                }
                /* see ASView.6 : */
                while(w != None)
                {
                    XEvent event ;
                    XNextEvent (dpy, &event);
                    switch(event.type)
                    {
                        case ButtonPress:
                            break ;
                        case ClientMessage:
                            if ((event.xclient.format == 32) &&
                                (event.xclient.data.l[0] == _XA_WM_DELETE_WINDOW))
                            {
                                XDestroyWindow( dpy, w );
                                XFlush( dpy );
                                w = None ;
                            }
                            break;
                    }
                }
            }

            if( dpy )
                XCloseDisplay (dpy);
            return 0 ;
        }

## libAfterImage/tutorials/ASView.1

SYNOPSIS

     Step 1. Initialization.

DESCRIPTION

     libAfterImage requires only 2 global things to be setup, and both of
     those are inherited from libAfterBase: dpy - pointer to open X display -
     naturally that is something we cannot live without; application name -
     used in all the text output, such as error and warning messages and
     also debugging messages if such are enabled.
     The following two line are about all that is required to setup both
     of this global variables :

EXAMPLE

         set_application_name( argv[0] );
         dpy = XOpenDisplay(NULL);

NOTES

     First line is setting up application name from command line's
     program name. Second opens up X display specified in DISPLAY env.
     variable. Naturally based on application purpose different parameters
     can be passed to these functions, such as some custom display string.

SEE ALSO

     libAfterBase, set_application_name(), XOpenDisplay(), Display,

## libAfterImage/tutorials/ASView.2

SYNOPSIS

     Step 2. Loading image file.

DESCRIPTION

     At this point we are ready to load image from file into memory. Since
     libAfterImage does not use any X facilities to store image - we don't
     have to create any window or anything else yet. Even dpy is optional
     here - it will only be used to try and parse names of colors from
     .XPM images.

EXAMPLE

         im = file2ASImage( image_file, 0xFFFFFFFF, SCREEN_GAMMA, 0, NULL);

NOTES

     We used compression set to 0, as we do not intend to store
     image in memory for any considerable amount of time, and we want to
     avoid additional processing overhead related to image compression.
     If image was loaded successfully, which is indicated by returned
     pointer being not NULL, we can proceed to creation of the window and
     displaying of the image.

SEE ALSO

     file2ASImage()

## libAfterImage/tutorials/ASView.3

SYNOPSIS

     Step 3. Preparation of the visual.

DESCRIPTION

     At this point we have to obtain Visual information, as window
     creation is highly dependant on Visual being used. In fact when X
     creates a window it ties it to a particular Visual, and all its
     attributes, such as colormap, pixel values, pixmaps, etc. must be
     associated with the same Visual. Accordingly we need to acquire
     ASVisual structure, which is our abstraction layer from them naughty
     X Visuals. :

EXAMPLE

         asv = create_asvisual( dpy, screen, depth, NULL );

NOTES

     If any Window or Pixmap is created based on particular ASVisual, then
     this ASVisual structure must not be destroyed untill all such
     Windows and Pixmaps are destroyed.

SEE ALSO

     See create_asvisual() for details.

## libAfterImage/tutorials/ASView.4

SYNOPSIS

     Step 4. Preparation of the window.

DESCRIPTION

     Creation of top level window consists of several steps of its own:
     a) create the window of desired size and placement
     b) set ICCCM hints on the window
     c) select appropriate events on the window
     c) map the window.
     First two steps has been moved out into create_top_level_window()
     function.

EXAMPLE

         w = create_top_level_window( asv, DefaultRootWindow(dpy), 32, 32,
                                      im->width, im->height, 1, 0, NULL,
                                      "ASView" );
         if( w != None )
         {
             XSelectInput (dpy, w, (StructureNotifyMask | ButtonPress));
             XMapRaised   (dpy, w);
         }

NOTES

     Map request should be made only for window that has all its hints set
     up already, so that Window Manager can read them right away.
     We want to map window as soon as possible so that User could see that
     something really is going on, even before image is displayed.

SEE ALSO

     ASImage, create_top_level_window()

## libAfterImage/tutorials/ASView.5

SYNOPSIS

     Step 5. Displaying the image.

DESCRIPTION

     The simplest way to display image in the window is to convert it
     into Pixmap, then set Window's background to this Pixmap, and,
     at last, clear the window, so that background shows up.

EXAMPLE

         p = asimage2pixmap( asv, DefaultRootWindow(dpy), im, NULL, False );
         destroy_asimage( &im );

NOTES

     We no longer need ASImage after we transfered it onto the Pixmap, so
     we better destroy it to conserve resources.

SEE ALSO

     asimage2pixmap(), destroy_asimage(), set_window_background_and_free()

## libAfterImage/tutorials/ASView.6

SYNOPSIS

     Step 6. Waiting for user to close our window.

DESCRIPTION

     User action requesting window to be closed is generally received
     first by Window Manager. Window Manager is then handles it down to
     the window by sending it ClientMessage event with first 32 bit word
     of data set to the value of WM_DELETE_WINDOW Atom.
     Accordingly, all client has to do is wait for such event from X server
     and, when received, it should destroy its window and generally exit.

EXAMPLE

         while(w != None)
         {
             XEvent event ;
             XNextEvent (dpy, &event);
             switch(event.type)
             {
                 case ButtonPress:
                     break ;
                 case ClientMessage:
                     if ((event.xclient.format == 32) &&
                         (event.xclient.data.l[0] == _XA_WM_DELETE_WINDOW))
                     {
                         XDestroyWindow( dpy, w );
                         XFlush( dpy );
                         w = None ;
                     }
                     break;
             }
         }

NOTES

     It is recommended that XFlush() is issued right after XDestroyWindow()
     as Window Manager itself may attempt to do something with the window
     until it receives DestroyNotify event.

SEE ALSO

     ICCCM, Window