1992.12.23

SUBJECT: Xview 정리

MEANING OF THIS MEMO:
Xview 의 개념 정리

CONTENTS:
     1. XView and X Window System
     2. The XView Programmer's Model
     3. Example program & compile

DISCRIPTION:
1. XView and X Window System
-XView(X window-system-based Visual/Integrated Environment for Workstation)은
 내재된 윈도우 시스템의 많은 자세한 부분을 알필요없이 programmer 가 
 application 에 대한 interface 를 가능하게 해준다.
 그러나 X window 에 대한 개념은 꼭 있어야 한다.

-이 툴킷은 Sun Microsystem 의 기존 KERNEL-base 의 SunView 를 위한 X 로의
 변환 이다. 즉, 웍스테이션 시장에서 2000 여가지의 SunView application 이
 있고, 많은 programmer 들이 SunView application programmer's interface(API)에
 익숙한 상태이므로 XView  로 하여 X marketplace 에 들어가게함이다.

-어떤 toolkit 과 마찬가지로 XView  도 canvases, scrollbars,menus 그리고
 control pannels 같은 내장된 user-interface objects 를 제공한다.

- XView 는 X window system 의 가장 lowest level 인 XLib 를 base 로 한다.

1.1 X window system

-X window system 은 network_based graphics system 이며 1984년 MIT 에서
 개발하였으며 지금은 1987 년에 발표한 X version 을 발전시켜오고 있다.
 X11 은 industory standard window system 으로 받아들여지며 DEC,HP,
 Sun,AT&T 에서 발전시키며 지원하고 있다.

-대부분의 window system 은 그자체가 operating system 과 밀접게 연계되며
 single workstation  과 같은 단지 분리된 시스템에 돌아가는 kernel_base 이다.
 그러나 X 는 어떤 OS 의 부분이아니라 user_level program 이며 그 구조는 
 client_server model 을 기본 으로 한다.
 아시는바와 같이 일반적인 server-client 와는 개념이 틀린다.
 즉, server 라고 불리는 X display server 는 keyboard , mouse 같은 input 
 device 로 부터 모든 input 을 다루고 또한 실행되고 있는 다른 client 들로부터
 input 도 추적한다.
 server 는 pc, worstation  과 special terminal 에서도 유용하며 다른 
 machine 에서 download 하거나 ROM 안에 저장되어 있고 display capability 를
 제공하며 보다 기본적인면에서는 client application 과 local display h/w
 사이의 매개체(intermediary) 로서 활동한다.
 client 는 특정한 일을 수행하는 application program 으로 server 에의해
 h/w display 와 통신하는 request(for information, process etc)를 만든다.
 X protocol  은 client 가  server 에게 information  을 위한 network 상의
 통신을 위한것이다.

-Window manager 는 특정한 system 위에 X 의 look and feel 을 거의 결정하며
 몇가지의 window manager 가 존재하며 MIT 의 standard release 에 돌아가는것은
 twm(release 4) 이다.
 즉, multi application  이 동시에 running 되면 input 의 요구에대한
 conflicting 에 대해 rules 들이 존재해야만 한다.
 대부분의 window system 과는 달리 X 는 이러한 rules  는 없지만 대신
 window manager 라고 불리는 special client 가 있다.
 window manager 는 server's display 상에서 application 의 main window 의
 position 및 size  를 유지 관리한다.
 또한 another client 로 서 전통적으로 screen space, olor resources,keyboard 를
 포함한 physical resources 를 요구하는 traffic 에서의 조정하는 특별한 
 책임이 주어진다.
 그리고, window manager 는 user  가 screen 상에서 window 를 옮기고 
 resize 하고 new application 을 start 하고 window 가 overlap 인지
 tiled(side by side), keyboard focus(click-to-type) 을 바꾸기위해
 pointer button 을 눌러야하는지의 window system 의 많은 부분을 manage 한다.
 (window hint : application  이 screen space 나 resources  의 요구에대해
  window manager 의 교통정리를 위해 주는 특별한 정보로서 XView toolkit 은
  application 이 windowmanager hints 를 setting  하는 편리한 방법을 제공)


-X 는 screen 상의 dot 의 모든 pixel 에 bit-mapped display 를 control 한다.
 이러한 이유 때문에 가장중요한 client 중의 하나가 terminal emulator 이다.
 terminal emulator 는 multi-user system 에 log in 하고 standard apphanumeric
 terminal 에서 사용하기위해 구성된 application  들을 수행한다.
 xterm 이 가장 널리 사용되는 terminal emulator 이고 DEC VT102 terminal 이나
 tektronix 4014 를 보여주나 한번에 하나만 active 한다.

-X Consortium : window manager 와 다른 client 간의 interaction 을 위한 
 규약(convention) 으로 1989, july 에 표준화되었으며 이 규약에 관한
 manual 이 ICCCM(Inter-Client Communications Conventions Manual) 이다.
 이 내용은  application 간의 transferring data 를 위한 rules,layout schemes,
 transfer of keyboard focus, colormap installation 등으로 application 과 
 window manager 의 표준화로 서로다른 toolkit 들로 만들어진 applicatin 들이 
 같은 server 상에서 공존하고 돌아갈수있게 되었다.


    
 ------------         ---------------           -------------
    DISPLAY                MOUSE                   KEYBOARD
 -------------        ---------------           -------------




 -------------- 
  Application
 --------------       --------------     
  XView Toolkit           Device
 --------------       --------------           -----------------
     Xlib              X11 Server                Window Manager
 --------------       --------------           -----------------




<---------------------------------------------------------------------->

                            NETWORK




  fig 1-4. The S/W architecture of X applications



1.2 Handling Events

-X 가 제공하는 window 는 XView application 과 X server 간 의 connection 이다.
 X windows 들이 XView 에 중요한 이유는 이러한 X windows 가 user 의 목적에 
 부합되는 input 을 위한 target 이기 때문이다. 
 다시말하면, 이러한 X window 들은 user 로 부터 events 를 얻고 XView 세계로
 events 를 pass 하는 실제적인 objects 이다.
 X event  는 server 에 의해 보내진 application 에 방금 일어난 흥미있는
 현상의 그 무엇을 표시하는 data structure 이다.
 각 event 들의 내용은 user's input,window system ,OS, application 등 이다.
 예를 들면 user  가 keyboard 작업 또는 mouse 를 click 하는것이 event 를
 생성하며 window 를 screen 에서 움직이는것 또한 event 를  만드는것이다.
 여기서 일어난 event 를 screen 상의 다양한 window 들에게 보내는것이 
 바로 server 의 일 이다.
 여기서 새로운 정의가 나오는데 server 와 application 간 의 event dispatch
 mechanism 이 바로 Notifier 이다.(Chap 19 참조: Notifier maintains the 
 flow of control in an application.)

 예를 들면, user 가 window 에서 A 를 치면 X 는 그 event 를 XView 에게
 넘겨주고 XView 는 해당 application 에게 주고 client 의 application 의
 event procedure 에 의해 이 event 가 해석하여 역으로 그 window 에 display 
 된다. 결국 control 은 top level 에 return 되며 다음 event 가 읽혀진다.


                       Server 

       Pipe                                 Signal
                    



                     XView Notifier




                     Translate Events
                                                          XView




                     Distribute Events






      Application           Application      Application         Client
        Event                 Event            Event
      Procedure             Procedure        Procedure



 fig 1-5 The Notifier exists between the server and XView application



1.3 Development of the XView Toolkit

-Kernel_based window system 인 Sunview Toolkit 은 Sun Windows 에 based
 되어 있으며 이것은 single computer 가 application, user's display, keyboard
 를 control 한다.
 X window system 은 window system 의 새 장을 열었다.
 즉, 이것은 display 를 control 하는 server 와 서로다른 system 에 돌아가는
 client application 을 가지는 server base 이다.
 오늘날 수천개의 Sunview application 이 존재하며 XView 의 목표중의 하나는
 이러한 application 을 X window 에 porting 하는 것이며 추가로 Sun 은
 그 source code 를 XView toolkit 에 완전 freely available 하게 만듬.
 그것은  standard MIT X distribution 뿐만 아니라 SVR4 에 곧 porting 될것이다.
 XView 는 다음과 같은 window sets 를 제공한다.

 * Canvases - program 이 draw 되는 window
 *Text subwindows - editing  기능이 내장된 windows
 *Panels - buttons,choice items,sliders 등을 포함한 window
 *TTy subwindows - character based terminal 을 emulate 하는 window
 
 이러한 windows 들은 frames 라는 window 안의 subwindow 로서 존재한다.
 Frames 는 transitory 또는 permanent 할수있다.
 일시적인 user  와의 interaction 을 위해 menu 에는 screen 상에
 어느곳에든지 pop-up 이 있을수 있다.
 
 
1.4 OPENLOOK Graphical User Interface
 
 
-XView Toolkit 의 중요한 특징은 OPENLOOK GUI 를 수행및 실행하는것이다.`
 OPENLOOK GUI 의 목적은 user 에게 간단하고 일관성 있으며 효율적인
 Interface 를 제공하는 것이다.
 OPENLOOK 은 Sun 과 AT&T 에서 SVR4  의 graphical user interface standard 로
 제공되고 있다.
 개발을 하는 사람들이 표준으로 함으로써 다양한 application 을 일관성있게
 또한 system 에 구애없이 가능하다는것 이다.
 


 2.The XView Programmer's Model


2.1 Object-oriented Programming

-programmer 에게는 XView 가 object-oriented toolkit 이다.
 XView objects  는 application 의 user interface 로 부터 구성되는 것으로
 blocks  을 만드는 것이다.
 각 application 은 특별한 package  로 부터의 object 로 생각되어질수 있다.
 각 package 는 user  가 object 로 구성하기 위해 선택할수있는 특성 의
 list 를 제공하며 적절한 package 들로부터 object 를 선택하여
 필요한 application 을 위한 user interface 를 만들수가 있다.
 XView 는 object-oriented programming 의 근본적인 원칙들을 근본으로 한다.

 *Objects are represented in a class hierarchy.
 *Objects are opaque data type.
 *Objects 는 function 을 통하여 message 를 setting  할수있는 특징을 가짐.
 *Objects 는 event 에 의해 구동되는 callback procedure 를 가진다.

2.1.1 Object Class Hierachy

-XView 는 tree 구조로써 Object 의 class 를 정의한다.
 예를들어 Frame 은 더 general 한 class 인 window 의 subclass 이다.


                        Generic Object
 


  Server    Screen    Cursor   (Drawable)   Fullscreen    Font      Menu




                Server Image       Window



      Frame     Tty     (Openwin)      Scrollbar      Icon






                Text                  Canvas





                                      Panel



        fig 2-1 XView class hierachy



 -각 class 는 다른 classes 나 packages 와는 unique 한 features 를 가진다.
  XView 에서 하나의 class 는  연관된 function set 인 package 라고도 종종 불린다.
  그러나 Notifier package 같은 object class 구조의 구성요소 가 아닌 xview
  package 도 있다.

 - 일부 object 는 visual 이고 다른것들은 non-visual 이다.
   visual objects 는 windows, scrollbars,frames,panels, panel item 등이고,
   non-visual objects 는 각각 형태가 안보이는것이지만 visual objects 에서
   도움을 주는 information 을 가지고 있으며 , server , screen, font ovbjects가
   있다.
   예를들면,screen 은 objects 가 가질수있는 default bg, fg color 값과
   color type 과 같은 information 을 제공한다.

 - visual,non-visual의 모든 objects들은 이 object classing system 의 부분이다.
   XView 는 object-oriented model 로써의 static subclassing 과
   chained inheritance 를 가진다.
   따라서 하나의 특정 class 의 모든 object 들은 super class 라고 불리는
   parent class 의 properties 를 내재하고 있다.
   Generic Object 인 XV_OBJECT 는 모든 object 들이 가지는 어떤
   basic properties 를 가진다. 예를들면 같은 object 는 screen  상에서
   storage 를 최적화 하기위해 여러장소에 나타날수가 있다.
   이러한 기록을 유지하기위해 Generic Object 는 objects 의 instances 의
   횟수에 대한 reference 를 가지고 있다.
   모든 objects 는 owner 를 가지고 있으므로 object 의 parent 는 그
   object 의 generic part 부분에 기록 되어 있다.
   하나의 object 가 특별한 기능수행의 필요성으로 lower-level classes 가
   그 기능을  수행하기위해 특성들을 define 하고 있다.
   각 class 는 그 dbject 의 모든 instance  중에 공유되어 지는 특성들을
   포함하고 있다.
   예를들면, panels  는 PANEL package  의 일부분이다.
   모든 panel 들은 그 object 의 각 instance 가 달라서 properties가 달라지더라도
   PANEL package 의 특성들은 공유하고 있다.

 -위에서 언급하였듯이 XView 는 subclassing 을 사용하므로 각 package 는
  superclass 의 properties  를 내부적으로 가진다.
  PANEL package 는 window dimension, screen 상의 위치,thickness,depth,
  visual and colormap information 을 가지는 WINDOW package 의 특성을
  가질수가 있는데 그 이유는 WINDOW package 의 subpackage 이기때문이다.
  또한, WINDOW package 는 모든 object들이 그렇듯이 root object 인
  XV_OBJECT 의 subclass 이므로 panel 이 size 와 position of itself
  같은 generic information 에 access 가 가능 하다.




    2.1.2 Object Handles


 - user 가 하나의 object 를 만들때 XView function 은 그 object 에 대해
   하나의 handle 을 return 한다.후에 user 가 그 object 에 대한 상태나
   정보를 알고 싶을때는 적절한 function 에 handle 을 pass 하면 된다.
   object handles 의 구현 방법은 information hiding 방법을 쓰고 있으므로
   이 핸들은 그 의미에서 opaque하기 때문에 그 object 를 나타내는
   실제적인 data structure 를 통하여는 알수가 없다.
   각 object type  은 handle 에 일치하는 type  을 가진다.
   C language 가 opaque type 를 갖지않으므로 위에서 언급된 모든 opaque data
   type 은 XView type 의 Xv_opaque 또는 Xv_object 의 typedef' 이다.
   opaque data type 에 추가로서 pointer들에 참조되는것이 아니라
   structure  들에 참조가 되는 몇가지 typedef 들이있다.(Event,Rect,Rectlist)


   table 2-1. XView Objects,Owners,Packages and Data Types


 Object      Owner                     Package            Handle Data type


 canvas      frame                     CANVAS             Canvas
 cursor      window or screen          CURSOR             Xv_cursor
 font        root window               FONT               Xv_font
 frame       frame or root window      FRAME              Frame
 icon        window or screen          ICON               Icon
 menu        server                    MENU               Menu
 openwin     frame                     OPENWIN            Openwin
 panel       frame                     PANEL              Panel
 screen      null                      SCREEN             Screen
 scrollbar   panel or canvas           SCROLLBAR          Scrollbar
 server      null                      SERVER             Server
 tty         frame                     TTY                Tty
 window      frame                     WINDOW             Xv_window



 2.2 Attribute-based Functions

 -complex 하고 flexible 한 objects 들을 기본으로 사용되고 있는 XView 와 같은
  model 에서 그 dbjects  를 어떻게 client 가 운용할것인가 의 문제가 있다.
  XView interface 의 basic idea 는 많은 attribute 들을 argument 로 가지는
  몇개의 function 들을 제공하고 있다.


 2.2.1 Creating and Manuplating Objects

 -programmer 가 object handle 을 참조하여 어떤 object 를 운용하는 몇가지
  function 들이 있다.

  * xv_init()  : server 와의 connection 을 구축하며 Notifier 와
    Defaults/Resource-Manager database 를 초기화 하며 server resource-manager
    database 를 load 하며 ~/.Xdefaults database 와 passing 된 attributes 를
    읽는다.

   * xv_create()  : objects 를 생성한다.

  * xv_destroy()  : objects 를 쥑인다.

  * xv_find()  : 어떤 조건에 맞는 object 를 찾는다. 없으면 새로 만든다.

  * xv_get()  : attribute 의 값을 취한다.

  * xv_set()  : attribute 의 값을 setting 한다.


  -위의 6개의 function 으로 XView 에서 가능한 모든 package 들로부터
   objects 들이 생성되고 운용되어진다.
   programmer 가 어떠한 package 로 부터 한 object 의 경우를 만들기를 원한다면
   xv_create() 를 이용한다.

   Panel panel;
   panel = xv_create(panel_parent,PANEL,NULL);

 - 여기에서 PANEL package 로부터 하나의 panel이 생기는데 object-specific 한
   attribute  가 생략되었으므로 panel 의 default properties 값을 가지며
   새로운 panel object 에 대한 return 된 handle 이 변수 panel 에 저장되며
   이 handle 은 pointer 가 아니고 그 object 자체에대한 어떤 유용한
   information 도 가지고 있지 않다.




  2.2.2  Changing Object Attributes


   - programmer 는 xv_create() 로 부터 하나의  parameter로 return  된 그
     handle 을 function xv_get() 과 xv_set() 에 사용하여 그 object 의
     attribute 를 얻고 setting 한다.

     panel=xv_create(...)
     xv_set(panel,PANEL_LAYOUT,PANEL_HORIZONTAL,NULL);

    - 그 panel 에서 얻어진 handle은 PANEL package attribute 를 변경하는데 쓰임
     PANEL_LAYOUT 의 값은 PANEL_HORIZONTAL 이며, variable argument  의
     끝은 NULL 로 나타내는네 NULL 은 상수 0 가 아니며 terminating
     argument 로 쓰여야만한다.



    2.2.3 Types of Attributes


 - Attribute 는 세개의 범주로 나누어 진다.

    * generic  : 모든 XView objects 에 적용되는 attributes.

    * common  : 많은 objects 에 의해 지원되는 attributes 이지만 모든
              objects 에 적용되지는 않는 attributes.

    * specific  : 특별한 package 또는 object 의 class 에 적용되는 attributes.




 - XView 는 하나의 attribute 의 쓰임을 이름을 통하여 알수있게 한다.
   즉, 특별한 package 에 적용될 attribute 들은 그 package name 에 의해
   앞부분이 prefix 되어있다.
   예를들면, CANVAS_*, CURSOR_*, FRAME_*, ICON_*, PANEL_*,SCROLLBAR_*,
   TEXTSW_*, TTY_*, 등이다.

 - common 과 generic attributes 는 몇가지 서로다른 object type 의
   적용을 위해서 XV_. 으로 prefix 되어진다.
   예를들면,  generic attribute 의 XV_HEIGHT 는 모든 objects 에 적용되는데
   이는 모든 object 들이 반드시 높이를 가지기 때문이다.
   반대로, 단지 window 에 적용되는 attribute 는 WIN_. 으로 prefix 되어짐.
   WIN_HEIGHT 와 WIN_WIDTH 같은 attributes 는 panel 이나 canvas 들이
   나타나든 상관없이 모든 window 에 적용된다.
   attribute value part 의 value part  는 attribute 마다 틀린다.
   이러한 이유는 그 attribute 가  다양한 범위의 변수 를 나타낼수도
   있기 때문이다.



    Panel_item panel_item;
    panel_item=xv_create(panel,PANEL_CYCLE,
          XV_WIDTH,      50,
         XV_HEIGHT,     25,
         PANEL_LABEL_X,  100,
         PANEL_LABEL_Y,   100,
         PANEL_LABEL_STRING,   "Open File"
         PANEL_CHOICE_STRINGS, "Append to file",
                               "Overwrite contents",
                                NULL,
         NULL);


 - PANEL_CHOICE_STRINGS 를 제외한 모든 attributes 는 single value 를
   갖는다.
   PANEL_CHOICE_STRINGS attribute 는 string 의 list 를 가지며 NULL 로
   끝난다.
   마지막 NULL 은 xv_create() function 으로 pass 된 attribute 변수값을
   끝낸다.


     2.4 Types of Objects


 - 여기에서는 개념적인 차원에서 XView 가 제공하는 다양한 종류의 object 를
   설명하고자 한다.
   많은 경우에 있어 OPENLOOK GUI Specification Guide 로 부터 발췌된 그림들이
   object 의 외관을 설명하는데 쓰여진다.
   object 가 어떻게 만들어지며 그들의 특성들은 무엇인지에 대한 상세한
   내용들은 각 dbject 특징별로 각 chapter 별로 다룬다.(Manual 참조)
   다음은 생성되어 질수 있는 object 의 list 이다.


        * Generic Objects
        * Windows
        * Frames
        * Openwins
        * Canvases
        * Text Windows
        * Menus
        * Scrollbars



  2.4.1  Generic Objects

 - 이 것은 계층구조 에서 root object 이다.
   이 자체가 function 을 갖지 않으므로 아무도 Generic Object 의 instance 를
   만들수가 없다.(hidden class)


                    Generic Object




    Server   Screen   Cursor  (Drawable)   Fullscreen  Font   Menu


             Server Image            Window




    Frame    Tty     (Openwin)    Scrollbar      Icon





               Text            Canvas




                               Panel





                     Generic Object




   Server   Screen   Cursor  (Drawable)   Fullscreen  Font   Menu




              Server Image            Window



    Frame    Tty     (Openwin)    Scrollbar      Icon





                Text            Canvas





                                Panel



    fig2-2. Object creation is top down; attribute setting is bottom up



 - 먼저, Generic Object  가 만들어 지고 그 object 의 subclass  의 object 가
   topdown 방식으로 만들어지고 bottom up  방식으로 가면서 program 상의
   주어진 attribute 가 setting 되어진다.
   하나의 panel 을 만드는 아래의 경우를 생각해 보자.



   extern xv_font font;
   Panel panel;

   panel= xv_create(frame, PANEL,
                    XV_Y,       5,
                    WIN_HEIGHT,   50,
                    PANEL_FONT,   font,
                    NULL);


 - 위에서 하나의 panel 이 만들어 질때 가장먼저 생성되는 것이 Generic Object
   이다.다음에, panel object 에 의해 하나의 window 가 만들어진다.
   각각은 해당 계층에 표시된 default 값으로 topdown 방식으로 object 가
   만들어 지며, 여기에서 역순으로 xv_create() 에 의해 주어진 attribute 로
   setting 되어진다.
   panel 의 x, y position 이 setting 될때 y 값만 setting 되었는데 이는
   그 panel 의 width 가 extend 될수있다는것을 parent panel 에게
   생성되는 window package 가 알리는것이다.
   여기서 parent 는 owner 인 frame 이다.



   2.4.2   Window Objects


 - 많은 XView objects 는 display 와 events 를 receive 하기위해 X window  를
  포함하고 있다.
  예를들면, frames, tty windows,scrollbars,icons 등이 있다.
  XView window class 는 Generic Object class  와 같이 hidden class 이므로
  외관적으로는 만들어 지지 않는다. 즉, 그 window 의 subclass 인 object 가
  만들어진다.
  이것은 panel items 를 제외하고는 대부분의 visual object  를 포함한다.
  Nonvisual object 는 이름을 가지므로 window 의 subclass 가 아니거나
  windows 를 포함하지 않는다.예를들면, Fonts 는 window 에 display 되거나
  메모리 image 로 표현되거나 bitmap 을 가지지 사용될 windows 를
  요구하거나 포함 하지는 못한다.
  일부 windows 의 attribute 는 depth 나 forground color background color 를
  가질수가 있다.



  2.4.3  Frames and Subframes

 - 두개의 frame 의 종류가 있다.

        * Base frames
        * Pop-up frames

 - 하나의 예외로써 모든 frames  는 frame 과 tild(서로 overlap 될수없는) 에
   의해 bound 되는 sunwindow 를 가지는 free-floating window 들이다.

 - Base fame  : root window 에 상주하면서 모든 frame 들이 서로 overlap
   하더라도 어떤 다른 window 에 제약을 받지않는다.
   이는 또 하나의 base frame 은 다른 application 과 관련되므로 application
   의 frame 으로 알려져 있다.
   Subframe 은 그 owner  가 frame 인  frames 들로써 그 application 의
   base frame 에 의해 controll 되어진다.
   OPENLOOK GUI Specification  Guide 로 부터 base frame 의 전체적인
   형태를 볼수가 있는데 만약 window manager  다르면 base fame 은 다를수있다.
   왜냐하면, XView 는 window manager 에게 hints 를 줌으로써  title bar
   information, resize corners  등의 특징을 포함한 attribute 를 정의하기
   때문이다.만약 OPENLOOK window manager 가 쓰이지 않는다면 이러한
    attribute 를 보장할수가 없다.


 - Pop-up frame  : 전형적으로 한번 또는 그 이상의 일시적으로 사용되는
   frame 이다.
   이것은 그 frame 의 좌측상단 의 pushpin 에의해 control 된다.
   pop-up frame 의 종류는 다음과 같다.

   *Command frame - 하나의 command 를 위해 operland  를 제공하며
                    parameter 를 setting 한다. 이것은 default panel 을 가지는
                    하나의 subframe  으로써 수행되어진다.

   *Help frame  -  그 object 를 위한 help text 를 display 하며
                    subframe 내의 하나의 text subwindow 로 수행되어진다.

   *Notices  - 이것은 special pop-up window 로써  request 를 conform 하고
               user 의 주의사항에 대한 메세지, condition 을 display  한다.



     2.4.4 Subwindows


 - Subwindow  는 몇가지 기본적인 측면에서 frame 과 다르다.
   그들은 결코 독립적으로 존재하지못하고 항상 owner 를 가지며 frame 이나
   다른 window 에의해 유지된다.또한 자체적으로 자신의 frame 을 갖지못한다.
   frame 이 자유로이 screen 상에 움직여 질수있는반면 subwindow 는 그들이
   속한 frame 의 경계안에서 제한을 받는다.그리고 frame 에 대조적으로
   subwindow  는 tiled(서로 overlap 안되는것) 이다.
   이러한 제한범위안에서 program 이나 user 에 의해 움직여지고 resize 된다.
   Canvas subwindow 와 text subwindow 들은 OPENWIN package 의 subclass 이다.

   *Canvas Subwindows : canvas 는 가장 전형적인 subwindow 이다.
    이것은 XLib graphics 의 결과가 display 되는 곳이다.
    canvas object 는 visible window 의 size 보다 더 큰 영역에 application 이
    그려지는 것을 가능하게끔 configuration 된다.
    전체적인 그림의 화면 이 나타나는 window 가 paint window 라고 불린다.
    paint window 의  visible portion  을 view window 라고 한다.
    canvas subwindow 에나타나는 것이 바로 view window 이다.


   *Text Subwindows  : 또다른 basic window type 이 text subwindow 이다.
    이는 OPENLOOK text editing model 을 사용하여 기본적인 text editing 능력을
    제공한다.


   *Panels  : buttons 과 setting 이 dispaly 되는 control area(조절영역) 이다.
              이것은 pane 안에서 다음의 menu 들의 병형된 조합으로 구성된다.

             -Buttons,Check boxes,Sliders, Gauges, Text and numeric fields


   * Menus   : 이것은 Generic Object 의 subclass 이다.
              이 자체는 하나의 windowless object 이다.
              user  에의해 activate 되는경우는 window 안에서이고
              3 type 의 menu 가 있다.
           1)Pop-up menu ; user 가 하니의 window 에서 menu button 을 눌렀을때
                           display  되는 menu.
           2)Pullright menu ; menu 의 오른쪽에 menu 로써 display .
           3)Pulldown menu  ; panel 위에서 menu button 의 아래에 display.

   * Scrollbars :이것은 다양한 subwindow 에 자체적으로 붙어서 존재하는 object.
                 이것은 cable 이라불리는 bar 위에서 OPENLOOK metaphor 를
                 구현한다.
                하나의 visual object 이므로 WINDOW class 의 subclass 이다.
                SCROLLBAR package 는 단지 scrollbar window 만 관리한다.
                이것은 또 수평 또는 수직으로 oriented  되어있다.
                그러나 Text subwindows 같은 것들은 default 로 수직만 제공하고
                수평 scrollbar 는 허용하지않는다.


    *Icons : 아이콘은 application 이 닫혀졌을때 그 application 을 나타내는
             작은 image 이다.
             ICON package 는 매우작고 graphic  을 display 하고 input 을
             받아들이는 window 이므로 이것은 WINDOW package 의 subclass 이다.
             user 가 ICON package 에서 setting 할수있는 유일한 attribute 는
             window안에서 display 될 image 를 나타내고 그 image의 geometry 를
             iconedit 로 구현할수가 있다.



   2.4.5  Nonvisual Objects



 - screen 상에는 나타나지 않지만 Generic Object 의 subclass 인 몇가지
   nonvisual objects  들이 있다.



  SERVER : 이 package 는 X server 와 interact 한다.
           window-server 는 screen 에 그림을 그리고 user 의 input 을 받는
           program 으로 특별한 application 에 setting 될수있는 information 과
           user-configurable resources 들을 유지관리한다.

  SCREEN : 이 object 는 visual 특성과 physical screen  의 다른 특성들을
           나타내며 XLib SCREEN object 와 분리되어 있다.

  FONT : 이 font package 는 programmer 가 font family 와 style 같은
          다양한 attribute  의 fonts 들을  요구할수 있도록하며
          name , size, scling  으로써 접근가능하다.

  CURSOR : cursor 또는 pointer 는 screen 상에서 mouse 의 위치를 나타내는
           visual object 이다.

  CMS : Colormap segments(cms) 로써 color specification 을 제공하는
        window 와 관련되는 object 로써 Cms objects 는 multiple window  와
        공유되어 질수가 있다.



 - 이러한 objects 들은 X window system 과 밀접한 연관관계에 있으며 X 로 부터
   attribute 들을 setting 하거나 getting 하려는 요청을 함으로써 운용되어진다.



      2.5 The Notifier Model


 - XView 는 notification-base system  이다.
   Notifier 는 하나의 user process 안에서 entity 를 control 하며 OS 로부터
   input 을 읽고 그것을 high-level events 로 formatting 한다.
   그리고나서 다른 XView object 에 뿌려준다.


   2.5.1 Callback Style of Programming


 - 전형적인 programming방법은 main control loop가 application안에 존재했다.
   그러나 Notification-base system에서는 main control loop 가 application 이
   아니라 Notifier 안에 존재한다.
   Notifier 는 events 들을 읽고 notify 하며, 또는 Notifier 에 등록되어있는
   해당 application 의 다양한 procedure들을  끌어낸다.
   이러한 procedure 가 바로 notify procs 또는 callback procs 라고 부른다.



     Application Code                                    Notifier





         start






       register
    callback procs with Notifier




         call
       Notifier




         end                                         read input



     2.5.2 Why a Notification-based System?


 - 만약, 당신이 Notification-based system 에 익숙치 못하다면 곧 익숙해
   지리라 !!
  그러면 왜 이러한 것이 필요한가?
  그것은 바로 이것이 복잡하고 event-driven environment 에서의 무거운 짐을
  들어주기 때문이라고나 할까?
  즉, XView 에서는 전형적으로 많은 objects 들을 가지고 있기때문에
  centralized Notifier 가 없다면 각 application 들은 그 수행과정에서
  모든 objects 에대한 events 를 조사하고 적재적소에 뿌려주어야만 된다.
  centralized Notifier 가 존재함으로써 각 application 의 component  는
  단지 user  가 제시한 event 만 받아들이면 된다.



    2.5.3 Relationship Among the Notifier, Objects and Application


  - user가 user 의 application 에서 반드시 Notifier 와 직접적으로 interact
   할 필요는 없다.
   XView 는 package 안 에서 panels, canvases,scrollbars 와 같은 다양한
   objects 들을  support 하는 two-tiered scheme 를 가지고 있다.
   즉, 그 Notifier 와 직접적으로 interact 하는것.(그들자신의 callback
   procedure 를 기록하면서) 또한, 교대로 그 application 이 그 object  와
   같이 자신의 callback procedure 를 기록한다.
   일반적으로 , XView application 을 쓸때 user 는 user 의 interface 를
   하고자하는 다른 object 와 다양한 window 를 만들어야 하고 그 object 와
   관련된 callback procedure 를 기록하여야 한다.
   그리고나서 당신은 그 Notifier 에게 control 을 넘긴다.
   많은 callback procedure 안에서 이러한 일이 일어난다.
   그 Notifier 와의  관계를 설명해보라.
   fig 2-15 는 어떻게 Notifier 가 X server 로 부터 X event 를 받으며 또한
   file descriptor 상에서  signals 또는 input 같은 OS event를
   receive 하는지를 나타낸다.







                user types, moves mouse, presses mouse buttons ...


               UNIX events;  input on file descriptors




                      NOTIFIER

           formats UNIX input into XView events,
           passes each event to the event procedure
              of the appropriate window





                           XView events





                Control           Drawing        Paint
                 Panel             Canvas         Canvas             event
                                                                 procedures
XView                                                               for
                                                                 subwindows




Application




               notify         notify       event      event
            proc            proc         proc       proc
            for              for         for         for     application's
           item 1           item n      Drawing    Paint       event
                                        Canvas     Canvas     procedures



        application's notify
          procedures
         for panel items




    fig2-15 Flow of input events in an XView application




- 한가지 언급할 것은 canvases 에대한 event procedure  와 panel items 에
    대한 notify procedures 사이의 차이점이있다.
    즉, canvas's event procedure 는 많은 일을 하지않는다. 기본벅으로
    그것은 하나의 event 가 receive 될때마다 application  의 event procedure
    에게 call out 한다. 그 application 은 모든 event 를 보며 자유롭게
    interprete 한다.
    panel 에대한 event procedure  는 한편으로 꽤 많은 일을 한다.
    즉, 그것은 item 이 그 event 를 받아야만 하는지를 결정하고 event  에
    자신이 해독한것을 대치한다.
    중간 mouse button  이 무시되고 좌측 mouse button 이 item 위를
    따라 내려가는것은 그 item 의 일시적인 activation 으로 해석되어진다.
    좌측 mouse button 이 그 item 위에 선택되어 질때까지는 그 item 에 대한
    notify procedure 가 callback 되어지지 않는다.
    따라서 panel item  이 procedure 를 알리는것은 새로은 선택을
    만드는 button 이 push 되었을 경우이다.



    2.5.4  Calling the Notifier Directly


 - 위에서 언급하였듯이 많은 application 에대해 당신 은 Notifier 를 직접
   호출할 필요는 없다.
   그러나 signal 을 호출할 필요가 있다거나 child process 가 죽었다는것을
   알았을때는 당신은 직접 Notifier  를 호출할 필요가 있다.
   Notifier 는 또한 interposition 이라고 알려진 technique 를 제공한다.
   이것은 window 의 event stream 에서 user 자신의 routine  을 삽입 할수있게
   하는 것이다.
   Notifier 를 직접 call 할수있게 하는것은 Chap 19, The Notifier 를 참조하라.





    * Examples *



       1.quit.c

#include 
#include 
#include 
Frame frame;
main(argc,argv)
int argc;
char *argv[];
{
 Panel panel;
 void lsh();

xv_init(XV_INIT_ARGS,argc ,argv,NULL);
frame=(Frame)xv_create (NULL,FRAME,FRAME_LABEL,argv[0],
      XV_WIDTH,400, XV_HEIGHT,700,NULL);
panel=(Panel)xv_create(frame,PANEL,NULL);
(void) xv_create(panel,PANEL_BUTTON,PANEL_LABEL_STRING,   "lee",
           PANEL_NOTIFY_PROC,    lsh, NULL);

xv_main_loop(frame);
exit(0);
}
void lsh()
{
   xv_destroy_safe(frame);
}


     2.btn_menu.c

#include 
#include 
#include 

main(argc,argv)
int argc;
char *argv[];
{
        Frame frame;
        Panel panel;
        Menu menu;
        int selected();
        void menu_proc();

xv_init(XV_INIT_ARGC_PTR_ARGV,&argc,argv,NULL);
frame=(Frame)xv_create(NULL,FRAME,NULL);
panel=(Panel)xv_create(frame,PANEL,NULL);

menu=(Menu)xv_create(NULL,MENU,
        MENU_NOTIFY_PROC,  menu_proc,
        MENU_STRINGS,  "yes","no","Quit",NULL,
       NULL);

(void) xv_create(panel,PANEL_BUTTON,
   PANEL_LABEL_STRING,  "Y/N/Q",
   PANEL_NOTIFY_PROC, selected,
   PANEL_ITEM_MENU,  menu,
   NULL);

window_fit(panel);
window_fit(frame);
xv_main_loop(frame);
}

int
selected(item,event)
Panel_item item;
Event *event;
{
  printf("%s selected.. \n",xv_get(item,PANEL_LABEL_STRING));
  return XV_OK;
}

void
menu_proc(menu,menu_item)
Menu menu;
Menu_item menu_item;
{
        printf("Menu Item: %s\n",xv_get(menu_item,MENU_STRING));
if(!strcmp((char *)xv_get(menu_item,MENU_STRING),"Quit"))
exit(0);
}


      3.canvas_input.c

include 
#include 
#include 
#include 

Canvas canvas;
Frame frame;
char msg[128];
void init_split(),my_event_proc(),my_repaint_proc();

main(argc,argv)
int argc;
char *argv[];
{

xv_init(XV_INIT_ARGS,argc,argv,NULL);
frame=(Frame)xv_create(NULL,FRAME,
         FRAME_LABEL,    "Split View Windows.",
        FRAME_SHOW_FOOTER,      TRUE,
        NULL);

canvas=(Canvas)xv_create(frame,CANVAS,
        CANVAS_X_PAINT_WINDOW,  TRUE,
        OPENWIN_SPLIT,
        OPENWIN_SPLIT_INIT_PROC,        init_split,
        NULL,
        CANVAS_REPAINT_PROC,    my_repaint_proc,
        NULL);

        (void) xv_create(canvas,SCROLLBAR,
        SCROLLBAR_SPLITTABLE,   TRUE,
        SCROLLBAR_DIRECTION,    SCROLLBAR_VERTICAL,
        NULL);

(void) xv_create(canvas,SCROLLBAR,
        SCROLLBAR_SPLITTABLE,   TRUE,
        SCROLLBAR_DIRECTION,    SCROLLBAR_HORIZONTAL,
        NULL);

xv_set(canvas_paint_window(canvas),
        WIN_CONSUME_EVENTS,
        WIN_NO_EVENTS,
        WIN_ASCII_EVENTS,       KBD_USE,KBD_DONE,
        LOC_DRAG,       LOC_WINENTER,   LOC_WINEXIT, WIN_MOUSE_BUTTONS,
        NULL,
        WIN_EVENT_PROC, my_event_proc,
        NULL);

        xv_main_loop(frame);
}

void
init_split(splitview,newview,pos)
Xv_Window splitview,newview;
int pos;
{
        Xv_Window view;
        int i=0;

OPENWIN_EACH_VIEW(canvas,view)
        if(view==splitview) {
           sprintf(msg,"Split view #%d",i+1);
           xv_set(frame,FRAME_LEFT_FOOTER,msg,NULL);
} else if(view==newview) {
        xv_set(xv_get(canvas,OPENWIN_VERTICAL_SCROLLBAR,view),
           SCROLLBAR_VIEW_START,0,
           NULL);
         xv_set(xv_get(canvas,OPENWIN_HORIZONTAL_SCROLLBAR,view),
           SCROLLBAR_VIEW_START,0,
           NULL);
}
  i++;

OPENWIN_END_EACH
sprintf(msg,"Total views: %d",i);
xv_set(frame,FRAME_RIGHT_FOOTER,msg,NULL);
}

void
my_event_proc(window,event,arg)
Xv_Window  window;
Event      *event;
Notify_arg  arg;
{
     register char *p=msg;
*p=0;

   if(event_is_key_left(event))
     sprintf(p,"(L%D) ",event_id(event) - KEY_LEFTFIRST +1);
       else if(event_is_key_top(event))
     sprintf(p,"(T%D) ",event_id(event) - KEY_LEFTFIRST +1);
       else if(event_is_key_right(event))
     sprintf(p,"(R%D) ",event_id(event) - KEY_LEFTFIRST +1);
       else if(event_id(event)==KEY_BOTTOMLEFT)
           strcpy(p,"bottom left");
       else if(event_id(event)==KEY_BOTTOMRIGHT)
           strcpy(p,"bottom right");
     p+=strlen(p);

if (event_is_ascii(event)) {
   sprintf(p,"Keyboard: key '%c' (%d) %s at %d,%d",
          event_action(event),event_action(event),
          event_is_down(event)? "pressed": "released",
          event_x(event),event_y(event));
} else switch (event_action(event)) {
     case ACTION_CLOSE:
      xv_set(frame,FRAME_CLOSED,TRUE,NULL);
      break;
     case ACTION_OPEN:
      strcpy(p,"frame opened up");
      break;
     case ACTION_HELP:
      strcpy(p,"Help (action ignored)");
      break;
     case ACTION_SELECT:
     sprintf(p,"Button: Select(Left) %s at %d,%d",
            event_is_down(event)? "pressed": "released",
            event_x(event),event_y(event));
      break;
     case SHIFT_RIGHT:
        sprintf(p,"Keyboard: right shift %s",
            event_is_down(event)? "pressed": "released");
        break;
     case SHIFT_LEFT:
        sprintf(p,"Keyboard: left shift %s",
           event_is_down(event)? "pressed": "released");
        break;
     case ACTION_ADJUST:
     sprintf(p,"Button: Adjust(middle) %s at %d,%d",
            event_is_down(event)? "pressed": "released",
            event_x(event),event_y(event));
         break;
     case ACTION_MENU:
     sprintf(p,"Button: Menu(right) %s at %d,%d",
            event_is_down(event)? "pressed": "released",
            event_x(event),event_y(event));
        break;
     case SHIFT_LEFTCTRL: case SHIFT_RIGHTCTRL:
        sprintf(p,"Keyboard: control key  %s",
           event_is_down(event)? "pressed": "released");
        break;

     case SHIFT_META:
        sprintf(p,"Keyboard: meta key  %s",
           event_is_down(event)? "pressed": "released");
        break;
     case SHIFT_ALT:
        sprintf(p,"Keyboard: alt key   %s",
           event_is_down(event)? "pressed": "released");
        break;
      case KBD_USE:
        sprintf(p,"Keyboard: got keyboard focus   %s",
           event_is_down(event)? "pressed": "released");
        break;
     case KBD_DONE:
        sprintf(p,"Keyboard: lost keyboard focus   %s",
           event_is_down(event)? "pressed": "released");
        break;
     case LOC_MOVE:
        sprintf(p,"Pointer: moved to %d %d",
       event_x(event),event_y(event));
        break;
     case LOC_DRAG:
        sprintf(p,"Pointer: dragged to %d %d",
       event_x(event),event_y(event));
        break;
     case LOC_WINENTER:
        win_set_kbd_focus(window,xv_get(window,XV_XID));
        sprintf(p,"Pointer: entered window at  %d %d",
       event_x(event),event_y(event));
        break;
     case LOC_WINEXIT:
        sprintf(p,"Pointer: exited window at  %d %d",
       event_x(event),event_y(event));
        break;
     case WIN_RESIZE:
     case WIN_REPAINT:
       return;
     default:
        return;
}
my_repaint_proc(canvas,window,
      xv_get(canvas,XV_DISPLAY), xv_get(window,XV_XID),NULL);
}
void
my_repaint_proc(canvas,pw,dpy,xwin,xrects)
Canvas canvas;
Xv_Window pw;
Display *dpy;
Window xwin;
Xv_xrectlist *xrects;
{
    char win_num[16];
    Xv_Window w;
    int i=0;
    GC  gc=DefaultGC(dpy,DefaultScreen(dpy));

CANVAS_EACH_PAINT_WINDOW(canvas,w)
   if (w==pw)
     break;
i++;

CANVAS_END_EACH
sprintf(win_num,"(Window #%d)",i+1);

XClearWindow(dpy,xwin);
XDrawString(dpy,xwin,gc,25,25,win_num,strlen(win_num));
}




      4.sample_tty.c


#include 
#include 
char *my_argv[]={"man","man",NULL};
main(argc,argv)
char *argv[];
{
        Tty tty;
        Frame frame;
        xv_init();
        frame=(Frame)xv_create(NULL,FRAME,NULL);
        tty=(Tty)xv_create(frame,TTY,
        WIN_ROWS, 24,
        WIN_COLUMNS, 80,
        TTY_ARGV, my_argv,
        NULL);
window_fit(frame);
xv_main_loop(frame);
}
~



       5.subframe.c



#include 
main(argc,argv)
int argc;
char *argv[];
{
Frame frame, subframe;
xv_init(XV_INIT_ARGC_PTR_ARGV,&argc,argv,NULL);
frame=(Frame)xv_create(NULL,FRAME,XV_WIDTH,100,XV_HEIGHT,100,FRAME_LABEL, "Base
Frame",NULL);
subframe=(Frame)xv_create(frame,FRAME_CMD,XV_WIDTH,100,XV_HEIGHT,100,FRAME_LABEL,"PoPup",NULL);

xv_set(subframe,XV_SHOW,TRUE,NULL);
xv_main_loop(frame);
}



     6.textsw_to_textsw.c



#include 
#include 
#include 
#include 
#include 

Textsw textsw;
Tty ttysw;

main(argc,argv)
int argc;
char *argv[];
{
        Frame frame;
        Panel panel;
void text_to_tty(),exit();

xv_init(XV_INIT_ARGC_PTR_ARGV,&argc,argv,NULL);
frame=(Frame)xv_create(XV_NULL,FRAME,
   FRAME_LABEL,argv[0],
    NULL);

panel=(Panel)xv_create(frame,PANEL,
    PANEL_LAYOUT,PANEL_VERTICAL,
    NULL);
(void) xv_create(panel,PANEL_BUTTON,
   PANEL_LABEL_STRING, "Quit",
   PANEL_NOTIFY_PROC, exit,
   NULL);

(void) xv_create(panel,PANEL_BUTTON,
   PANEL_LABEL_STRING, "Text To Tty",
   PANEL_NOTIFY_PROC, text_to_tty,
   NULL);
window_fit(panel);

textsw=(Textsw)xv_create(frame,TEXTSW,
    WIN_ROWS, 10,
    WIN_COLUMNS, 80,
     NULL);

textsw=(Textsw)xv_create(frame,TTY,
    WIN_BELOW, textsw,
    WIN_X, 0,
    TTY_ARGV, TTY_ARGV_DO_NOT_FORK,
    NULL);

window_fit(frame);
xv_main_loop(frame);
}

void
text_to_tty(item,event)
Panel_item item;
Event *event;
{
  char buf[BUFSIZ];

(void) xv_get(textsw, TEXTSW_CONTENTS,0,buf,sizeof buf);
 ttysw_output(ttysw,buf,strlen(buf));
}



     7.stop_frame.c


#include 
#include 
#include 
static short stop_bits[]={
 0x3E00,0x7f00,0xFF80,0xFF80,0xFF80,0xFF80,0xFF80,0x7F00,
 0x3E00,0x0800,0x0800,0x0800,0x0800,0x0800,0x7F00,0x0000
};

 main(argc,argv)
 char *argv[];
{
  Frame frame;
  Panel panel;
  Server_image stopsign;

 xv_init();
 frame=(Frame)xv_create(NULL,FRAME,
   FRAME_SHOW_HEADER, FALSE,
   NULL);
panel=(Panel)xv_create(frame,PANEL,NULL);

 stopsign=(Server_image)xv_create(NULL,SERVER_IMAGE,
  XV_WIDTH, 16,
  XV_HEIGHT, 16,
  SERVER_IMAGE_DEPTH, 1,
  SERVER_IMAGE_BITS, stop_bits,
  NULL);

(void) xv_create(panel,PANEL_MESSAGE,
      PANEL_LABEL_IMAGE,stopsign,
    NULL);
(void) xv_create(panel,PANEL_MESSAGE,
     PANEL_LABEL_STRING,
   "This action will cause unsaved edits to be lost.",
    NULL);
(void) xv_create(panel,PANEL_BUTTON,
  PANEL_NEXT_ROW, -1,
  XV_X,  110,
PANEL_LABEL_STRING, "OK",
  NULL);
 (void) xv_create(panel,PANEL_BUTTON,
PANEL_LABEL_STRING, "Cancel",
 NULL);

 window_fit(panel);
 window_fit(frame);
 xv_main_loop(frame);
}



   8.line.c


#include 
#include 
#include 
#include 

main(argc,argv)
int argc;
char *argv[];
{
        Frame frame;
        void canvas_repaint_proc();

        xv_init(XV_INIT_ARGC_PTR_ARGV,&argc,argv,NULL);
        frame=(Frame)xv_create(NULL,FRAME,NULL);

        (void) xv_create(frame,CANVAS,
                CANVAS_REPAINT_PROC, canvas_repaint_proc,
                CANVAS_X_PAINT_WINDOW, TRUE,
                NULL);

    xv_main_loop(frame);
}

void
canvas_repaint_proc(canvas,paint_window,dpy,xwin,xrects)
Canvas   canvas;
Xv_Window paint_window;
Display *dpy;
Window xwin;

Xv_xrectlist *xrects;
{
        GC gc;
        int width,height;
        gc=DefaultGC(dpy,DefaultScreen(dpy));
        width=(int)xv_get(paint_window,XV_WIDTH);
        height=(int)xv_get(paint_window,XV_HEIGHT);

XDrawLine(dpy,xwin,gc,100,10,width,height);
}



    9.color.c


#include 
#include 
#include 
main()
{
 Frame frame;
 Panel panel;
Xv_singlecolor fg,bg;

fg.red=250, fg.green=230, fg.blue=20;
bg.red=180, bg.green=100, bg.blue=20;

frame=(Frame)xv_create(NULL,FRAME,
FRAME_BACKGROUND_COLOR,&bg,
FRAME_FOREGROUND_COLOR,&fg,
FRAME_INHERIT_COLORS, TRUE,NULL);

panel=(Panel)xv_create(frame,PANEL,NULL);
(void) xv_create(panel,PANEL_BUTTON,
   PANEL_LABEL_STRING, "Push Me",NULL);
xv_main_loop(frame);
}



    10.popup.c



#include 
#include 
main(argc,argv)
int argc;
char *argv[];
{
Frame frame, subframe;
int done_proc();
xv_init(XV_INIT_ARGC_PTR_ARGV,&argc,argv,NULL);
frame=(Frame)xv_create(NULL,FRAME,NULL);
subframe=(Frame)xv_create(frame,FRAME_CMD,
         FRAME_DONE_PROC,done_proc,
         XV_SHOW, TRUE,
         NULL);
xv_main_loop(frame);
}

done_proc(subframe)
Frame subframe;
{
   xv_set(subframe,XV_SHOW,FALSE,NULL);
}

~


 * COMPILE METHOD *


hyundai# ccxv popup



vi ccxv

if [ -n "$3" ]
then
        cc -g -sb  -DOW_I18N $2.c -o $3 -I$OPENWINHOME/include \
        -L$OPENWINHOME/lib -lxview -lolgx -lX11 -lmle
else
        cc -g  -sb -DOW_I18N $1.c -o $1 -I$OPENWINHOME/include \
        -L$OPENWINHOME/lib -lxview -lolgx -lX11 -lmle
fi
~



Revision History
Created        on Dec  12 ,1992
~