3.3.5 XFT

 As you know, Open Motif 2.3 (Appendix G - New Features in Motif 2.3) and later support the free type fonts Xft (X free type).
To use XFT fonts on Motif, you only have to write some XmRenderTable specific resources into .Xdefaults file as shown below.
Please note that the *fontTye is a mandatory item and must take FONT_IS_XFT for Xft fonts.
Fortunately, you don't need to change your already-written C/C++ source files for using Xft.

The following DirectoryScanner program is an example to show the directories of your home directory in ListBox.
You can see some localized directory names of the directory are displayed properly, but almost all people in Linux world may not be so interested in something like localized strings, then you simply specify familiar Times, Helvetica or Courier for fontName property of XmRenderTable.




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


//2015/02/14 Updated

#include <oz++/DirectoryScanner.h>
#include <oz++/SmartPtrs.h>
#include <oz++/motif/ApplicationView.h>
#include <oz++/motif/Form.h>
#include <oz++/motif/ScrolledListBox.h>
#include <oz++/motif/TextField.h>
#include <oz++/motif/Label.h>
#include <oz++/FileAttributes.h>

namespace OZ {

class MainView :public ApplicationView {
private:
  SmartPtr<Form>            form;
  SmartPtr<Label>           label;
  SmartPtr<TextField>       textField;
  SmartPtr<ScrolledListBox> scrolledListBox;

  void   enter(Action& action)
  {
    char* string = textField -> getString();
    try {
      //Does the directory of string exist?
      FileAttributes attr(string);
      if (attr.isDirectory()) {
        addDirectories(scrolledListBox, string);
      } else {
        printf("Not directory %s\n", string);
      }
    } catch (Exception& ex) {
      ex.display();
    }
    XtFree(string);
  }

  void addDirectories(ScrolledListBox* scrolledListBox, const char* dir)
  {
    ListBox* listb= scrolledListBox -> getList();
    listb -> deleteAllItems();
    listb -> listupDirectories(dir, "*");
  }

public:
  MainView(Application& applet, const char* name, Args& args)
  :ApplicationView(applet, name, args)
  {
    Args ar;
    form = new Form(this, "", ar);
    
    ar.reset();
    ar.set(XmNtopAttachment, XmATTACH_FORM);
    ar.set(XmNleftAttachment, XmATTACH_FORM);
    ar.set(XmNrightAttachment, XmATTACH_FORM); 
    label = new Label(form, "Input a directory name with fullpath:", ar);
    const char* dir = "/";

    ar.reset();
    ar.set(XmNtopAttachment, XmATTACH_WIDGET);
    ar.set(XmNtopWidget, label); 
    ar.set(XmNleftAttachment, XmATTACH_FORM);
    ar.set(XmNrightAttachment, XmATTACH_FORM); 
    textField = new TextField(form, "", ar);
    textField -> addCallback(XmNactivateCallback, this,
              (Callback)&MainView::enter, NULL);
 
    ar.reset();
    ar.set(XmNtopAttachment, XmATTACH_WIDGET);
    ar.set(XmNtopWidget, textField); 
    ar.set(XmNleftAttachment, XmATTACH_FORM);
    ar.set(XmNrightAttachment, XmATTACH_FORM); 
    ar.set(XmNbottomAttachment, XmATTACH_FORM); 
    ar.set(XmNvisibleItemCount, 15);
    scrolledListBox = new ScrolledListBox(form, "", ar);

    addDirectories(scrolledListBox, dir);
    textField -> setString((char*)dir);
  }

  ~MainView()
  {
  }
};
}

//
int main(int argc, char** argv)
{
  const char*  appclass = argv[0];
  Application applet(appclass, argc, argv);
  try {
    Args args;
    args.set(XmNwidth, 500);
    MainView view(applet, argv[0], args);
    view.realize();

    applet.run();
  } catch (Exception& ex) {
     ex.display();
  }
  return 0;
}



Last modified: 1 Jan 2017

 Last modified: 1 Jan 2017

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