home *** CD-ROM | disk | FTP | other *** search
-
-
- README for cutnpaste subtree.
-
- (this is a bastardized ascii-version file of the CutPaste.show
- showcase file that lives in this same directory)
-
- ==============================================================+
- This is a draft paper introducing cut and paste for SGI using the
- Motif clipboard and ICCCM selection mechanism. The technology
- is still under development and we are looking forward to your
- feedback on how this strategy fits into your application.
- ==============================================================+
-
- =================================
- Intro - general info
- =================================
- Cut and paste is a user interface model that allows applications
- to communicate data.
-
- In current desktop implementations, most notably the Macintosh,
- Windows 3.0, and Motif interfaces, data is transferred within
- and across applications using an implicit "Clipboard" model.
- The user interface to this Clipboard is presented by three items
- in a pull-down Edit menu: "Cut", "Copy", and "Paste". After
- data has been selected within an application, the user can then
- "transfer" this data to the Clipboard by choosing Cut or Copy.
- Cut is used to "move" the selected data to the Clipboard,
- removing it from the place it was originally selected within
- the application. Copy is used to "copy" the selected data to
- the Clipboard, leaving the original selection intact within the
- application. At any point after a Cut or Copy into the Clipboard
- has been performed, the user may "transfer" the data held in
- the Clipboard back into the application by choosing Paste. Note
- that the user may perform the Cut/Copy and subsequent Paste either
- within the same application , or across any two different
- applications which may be run on the system.
-
- Notice that the Clipboard model is really a conceptual model,
- which must be presented cleanly and clearly to the user, to allow
- them to focus on their challenging job at hand, without
- distracting them with the busywork details of operating their
- computer. An important part of this conceptual model is the
- "correct" conversion of selected data as it is transferred from
- one application context to another. Note that the actual
- implementation details of how this Clipboard and data transfer
- model is coded internally may differ from the simplistic copying
- model presented to the user. However, the success of this style
- of user interface depends upon the quality of its seamlessness
- and simplicity from the user's point of view.
-
- Within the X Windows community, another user interface has
- gained widespread popularity for performing "quick transfers" of
- text data from one window to another. This mouse-based
- shorthand allows text to be selected with the Left Mouse Button,
- and supports the quick copy of that selection into the window
- where the Middle Mouse Button is clicked. Motif has incorporated
- this shorthand, Clipboard-free notion of "Primary Selection" and
- "Primary Transfer" alongside the more formal Clipboard model
- introduced above. This shorthand model is more appropriate for
- experienced users, where the selected data is to be transferred
- immediately, and a Clipboard is not needed to preserve the data
- across intermediate selections, operations, or the comings and
- goings of various application windows.
-
- SGI has adopted the data transfer strategy outlined in the the
- OSF/Motif Style Guidelines document (section 3.2, "Selection
- Actions"). Motif 1.2 implements the user model described in
- that section, supporting both the shortcut style of Primary
- Selection-based transfers, as well as the more explicit
- Clipboard-based transfers. This dual approach allows
- Motif-compliant applications to operate compatibly with a large
- base of existing X programs which expect selection-based
- transfers, and also to operate compatibly with the growing base
- of serious commercial end-user-oriented applications, which
- depend on an explicit Clipboard-based transfer model for ease
- of use. SGI is fostering this same approach for all programs
- developed to run in its end-user environment, to confer these
- same interoperability advantages to the users of all applications
- found on the SGI platforms. This approach is also in keeping
- the Motif's acceptance by the ACE consortium.
-
- Motif text widgets implement the X selection mechanisms using the
- mouse to transfer the data through the XA_PRIMARY selection, the
- application programmer doesn't need to add any code to do this.
- The Motif 1.2 clipboard mechanism, an implementation which is
- ICCCM compliant, also provides the programmer with an easy
- interface for transferring data through an Edit menu. This
- mechanism supports the Clipboard model described above,
- transferring data between applications via a 'system' clipboard.
- However, the application has the choice to either prestore the
- data on the clipboard or to retain the data until such time as it
- is actually requested by a Paste operation. This approach
- supports a more optimized method for avoiding excessive and
- gratuitous copies of what may be massive data sets. In addition,
- Motif is compatible with existing X applications that have coded
- cut and paste using the X selection mechanism with the
- XA_CLIPBOARD selection.
-
- The Motif clipboard conceptually works like this: a user
- sketches out an area of interest and goes to the edit menu and
- chooses Copy. The application then identifies the data selected,
- decides how many ways it can represent the data and then posts
- the data in those formats to the Motif clipboard - or posts a
- reference to the data format to say that it's available. The
- user then chooses Paste from some application edit menu. The
- requesting application then may inquire what formats the data
- is available in, choose the format that is most suitable for it,
- and then begin retrieving the data from the clipboard. In the
- event that the application that last placed data on the Motif
- clipboard exits or dies, if the data was placed in the Motif
- clipboard, the data will persist. If the data was posted to the
- clipboard by reference, when the application exits, it can
- choose whether or not to leave the data on the clipboard.
-
- The greatest benefit of using the Motif clipboard or the X
- selection model is that they permit communication among clients
- on different operating systems, file systems and network
- environments. If you're not interested in being a Motif client,
- you can still have your application communicate on the desktop
- through cut and paste by programming in X or Xt the selection
- mechanism using the XA_PRIMARY and XA_CLIPBOARD selections.
-
- If you're interested in learning more about Motif some books to
- check are: the OSF /Motif Programmer's Guide, the OSF/Motif
- Programmer's Reference, and the OSF/Motif Style Guide. Also, the
- "Motif Programming Manual" in the O'Riley Series (Volume 6). For
- information on the underlying ICCCM and the X selection mechanism,
- the "Inter-Client Communication Conventions Manual; Version 1.0;
- MIT X Consortium Standard" by David S. H. Rosenthal is the
- official document for ICCCM. Xhibition holds a ICCCM Tutorial
- which is very informative. There is also "X Toolkit Intrinsics
- Programming Manual" in the O'Riley Series (Volume 4). "X Window
- System Toolkit" byPaul J. Asente & Ralph R. Swick is very helpful
- for toolkit applications.
-
- =======================================
- Application Level Responsibilities: UI
- =======================================
- You'll need some buttons and probably some pop-up menus when you
- implement the user interface. Depending on your application, you
- may want at least a CUT, COPY, and PASTE button. CUT and COPY
- will have the same behavior at the selection level, but CUT will
- alter the application database or display list and thereby remove
- the selected object from the screen. You may already have a cut
- and paste interface that works within your application. If so,
- you're most of the way there.
-
- ==================================
- Copy or Cut
- ==================================
-
- Two include files
- that you'll need are:
-
- #include <Xm/Xm.h>
- #include <Xm/CutPaste.h>
-
- XmClipboardStartCopy()
- XmClipboardCopy()
- XmClipboardEndCopy()
- XmClipboardCopybyName()
-
- When the user chooses the Copy button, the application should
- notify Motif that it has some data that it would like to share.
- It does this through
-
-
- XmClipboardStartCopy(Display *display, Window window,
- XmString clip_label,
- Time timestamp,
- Widget widget,
- VoidProc callback,
- long *item_id);
-
- where the clip_label is the name of the application wishing to
- write to the clipboard - most likely built through
-
- XmStringCreate("name", XmSTRING_DEFAULT_CHARSET);
-
- where timestamp is the time of the event that triggered the call -
-
- XtLastTimestampProcessed(display)
- ...
-
- and then data can be prepared to be posted to the clipboard using
-
- XmClipboardCopy(Display *display,
- Window win,
- long item_id,
- char *format_name,
- char *buffer,
- unsigned long length,
- int private_id,
- int *data_id)
-
- for
- each of the formats that the application wants to make available.
- To notify Motif that the copy to temporary storage is finished
- and to do the actual copy from the temporary storage area to
- the clipboard, call,
-
- XmClipboardEndCopy(Display *display, Window win, long item_id)
-
- There are times when the amount of data to be posted to the
- clipboard is large and once there may never be used. Motif
- provides for this circumstance by allowing applications to Copy
- by Name rather than posting the actual data thereby saving
- resources and improving performance. When a request for the
- data occurs, then the application is notified through the callback
- provided in XmClipboardCopyStart -and that callback should call:
-
- XmClipboardCopyByName(Display *display,
- Window win,
- int data_id,
- char *buffer,
- unsigned long length,
- int private_id)
-
- to affect the actual transfer of the data in buffer to the
- clipboard so it can be pasted by the requesting application.
-
-
- ==================================
- Paste
- ==================================
- XmClipboardStartRetrieve()
- XmClipboardRetrieve()
- XmClipboardEndRetrieve()
-
- XmClipboardInquireCount()
- XmClipboardInquireFormat()
- XmClipboardInquireLength()
-
- When an application wants to paste data that is out on the clipboard,
- it notifies Motif to begin the retrieval of data by
-
- XmClipboardStartRetrieve(Display *display,
- Window win,
- Timestamp timestamp)
-
- This routine locks the clipboard until XmClipboardEndRetrieve is called.
- Next, the application can begin to make inquiries to see if
- the clipboard data is in the format that it needs by using some
- of the auxilliary Inquire functions.
-
- XmClipboardInquireCount
-
- returns the number of formats that are available for the next paste
- item in the clipboard. It also returns the maximum length of the
- format names posted - this is for use in the next routine. The
- application can now loop for count times to get the formats that
- are available for the next paste item.
-
- XmClipboardInquireFormat
-
- returns the format name for a given index. The application can
- check these formats for the most desirable match and then ask how
- much data is available by
-
- XmClipboardInquireLength
-
- and begin to retrieve the paste data with
-
- XmClipboard Retrieve( Display *display, Window window,
- char *format_name,
- char *buffer,
- unsigned long length,
- unsigned long *num_bytes,
- int *private_id)
-
- When the application gets the return value of ClipboardSuccess, it
- knows that all of the data has been transferred and so should call
-
- XmClipboardEndRetrieve(Display *display, Window window)
-
- to signal to Motif that the copy is done and to remove the lock
- from the clipboard.
-
- There are other auxilliary functions available to the Motif client to
- control the clipboard. They are:
-
- XmClipboardCancelCopy
- XmClipboardUndoCopy
- XmClipboardInquirePendingItems
- XmClipboardLock
- XmClipboardRegisterFormat
- XmClipboardUnlock
- XmClipboardWithdrawFormat
-
-