3.3.13 ImageViewer

 Although you may not be so interested in an image processing on X11/Motif, Open Motif 2.3 has added support of PNG and JPEG images (Appendix G - New Features in Motif 2.3). It will enable us to create easily better imaged widgets such as XmLabel and XmPushButton which have XmNlabelPixmap or XmNsomethingPixmap resources as shown below.

 The advanced image and XFT support of Motif 2.3 could help to develop a more elegant and sophisticated desktop environment, at least in appearance, than the retro style CDE. The real programmers, however, would not probably respect the desktop environment or something accessaries, even if they could feel cool.
 The following ImageViewer program is an example to display PNG or JPEG images on OZ::Label (XmLabelWidget) by using such a new feature.

//Copyright (c) 2015 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.

#include <oz++/motif/ApplicationView.h>
#include <oz++/motif/MainWindow.h>
#include <oz++/motif/SashlessPanedWindow.h>
#include <oz++/motif/MenuItem.h>
#include <oz++/motif/MenuBar.h>
#include <oz++/motif/PushButton.h>
#include <oz++/motif/CascadeButton.h>
#include <oz++/motif/PulldownMenu.h>
#include <oz++/motif/Scrolled.h>
#include <oz++/motif/Color.h>
#include <oz++/motif/Label.h>
#include <oz++/motif/FileDialog.h>
#include <oz++/Exception.h>

namespace OZ {

class MainView :public ApplicationView {
  enum {OPEN, EXIT};

  int                           menuId;
  SmartPtr<MainWindow>          mainw;
  SmartPtr<MenuBar>             menubar;
  SmartPtr<CascadeButton>       file;
  SmartPtr<PulldownMenu>        pulldownm;
  SmartPtr<SashlessPanedWindow> panedw;
  SmartPtr<Label>               title;
  SmartPtr<PixmapFile>          pixmapf;
  SmartPtr<Scrolled<Label> >     scrolledLabel;
  SmartPtr<FileDialog>          fileDialog;

  void    fileMenu(Action& action)
    this->menuId = (int)action.getClientData();

    switch(menuId) {
    case OPEN:
    case EXIT: 

  void  cancel(Action& action)
    fileDialog ->unmanage();

  void  open(Action& action)
    XmFileSelectionBoxCallbackStruct* cbs =
    CompoundString cs(cbs->value);
    char* filename;
    //printf("filename: %s\n", filename);
    if (menuId == OPEN) {
      Label* label = scrolledLabel -> getItem(); 
      try {
        PixmapFile* pfile = new PixmapFile(getDisplay(), filename); 
        if (pfile) {
          unsigned int w, h, bw, d;
          pfile -> getGeometry(&w, &h, &bw, &d); 
          printf("Depth %d\n", d);
          label -> unmanage(); 
          pixmapf = NULL;
          pixmapf = pfile;    
          label->set(XmNlabelPixmap, (XtArgVal)pixmapf -> get());
          label -> manage(); 
          char* name = filename; 
          char* slash = strrchr(filename, '/');
          if (slash) {
            name = ++slash;
          CompoundString cs(name);
          title -> set(XmNlabelString, cs);
      } catch (Exception& ex) {
    fileDialog ->unmanage();

  MainView(Application& applet, const char* name, Args& args)
  :ApplicationView(applet, name, args) 
    static MenuItem items[] = {
      {PUSHBUTTON,  "open",  "Open", OPEN, ZERO},
      {SEPARATOR,   "sep",    "", 0, ZERO},
      {PUSHBUTTON,  "exit",  "Exit", EXIT, ZERO} 

    Args ar;
    mainw   = new MainWindow(this, "mainw", ar);

    menubar = new MenuBar(mainw, "menubar", ar);

    CompoundString cs("File");
    ar.set(XmNlabelString, cs);
    file = new CascadeButton(menubar, "File", ar);

    pulldownm = new PulldownMenu(menubar, "pulldownm", ar);
    pulldownm -> addItem(items, XtNumber(items),
                    this, (Callback)&MainView::fileMenu);
    file -> set(XmNsubMenuId, pulldownm);

    ar.set(XmNorientation, XmVERTICAL);
    panedw = new SashlessPanedWindow(mainw, "", ar);

    CompoundString ls(" ");
    ar.set(XmNlabelType, XmSTRING);
    ar.set(XmNlabelString, ls);
    ar.set(XmNalignment, XmALIGNMENT_BEGINNING);
    title  = new Label(panedw, "", ar);
    pixmapf = NULL;

    ar.set(XmNscrollingPolicy, XmAUTOMATIC);
    ar.set(XmNscrollBarDisplayPolicy, XmVARIABLE);
    ar.set(XmNlabelType, XmPIXMAP);
    scrolledLabel = new Scrolled<Label>(panedw, "scrolledLabel", ar);

    fileDialog = new FileDialog(this, "FileDialog", ar);
    fileDialog -> getFileBox()
               -> addCallback(XmNokCallback, this,
                      (Callback)&MainView::open, NULL);
    fileDialog -> getFileBox()
               -> addCallback(XmNcancelCallback, this,
                      (Callback)&MainView::cancel, NULL);


int main(int argc, char** argv) {
  try {
    const char*  appclass = argv[0];
    Application applet(appclass, argc, argv);

    Args args;
    args.set(XmNgeometry, "400x400");
    MainView view(applet, argv[0], args);

  } catch (Exception& ex) {
  return 0;

Last modified: 1 Jan 2017

 Last modified: 1 Jan 2017

Copyright (c) 2000-2017 Antillia.com ALL RIGHTS RESERVED.