XCB: an X Protocol C Binding

Total Page:16

File Type:pdf, Size:1020Kb

XCB: an X Protocol C Binding USENIX Association Proceedings of the XFree86 Technical Conference Oakland, California, USA November 8–9, 2001 THE ADVANCED COMPUTING SYSTEMS ASSOCIATION © 2001 by The USENIX Association All Rights Reserved For more information about the USENIX Association: Phone: 1 510 528 8649 FAX: 1 510 548 5738 Email: [email protected] WWW: http://www.usenix.org Rights to individual papers remain with the author or the author's employer. Permission is granted for noncommercial reproduction of the work for educational or research purposes. This copyright notice must be included in the reproduced paper. USENIX acknowledges all trademarks herein. XCB: An X Protocol C Binding Bart Massey Jamey Sharp Computer Science Department Portland State University bart,jamey ¡ @cs.pdx.edu September 19, 2001 Abstract protocol requests and responses to an API for the C programming language [KR78]; as the repository The standard X Window System binding for the C of a number of performance optimizations of the C programming language, Xlib, is a very successful API, such as caching and grouping of requests; as piece of software across a wide range of applica- a base for GUI toolkit implementations; and as a tions. However, for many modern uses, Xlib is not focal point for convenience routines and extensions an ideal fit: its size, complexity, difficulty of ex- necessary to build functional, internationalized and tension and synchronous interface are particularly standards-conforming standalone programs without problematic. toolkit support. The XCB “X Protocol C Binding”, currently under Unfortunately, these roles have been somewhat development, is a response to these and other con- contradictory, and the long history of Xlib has not cerns. XCB is intended to be a simpler and more generally worked in its favor. The current Xlib suf- direct binding of protocol objects to C functions; fers from a number of outright defects. careful design of the XCB API and internal data structures and thorough modularization provides a 1.1 Xlib Features solution that is size and time efficient, maintain- able, easy to use both by single-threaded and multi- Xlib has a number of notable features, resulting threaded applications and easily extensible. Some both from an excellent initial design and the ma- features of Xlib have been sacrificed in achieving turity attained through 15 years of large-scale use. these goals, notably i18n support and convenience Perhaps the most important is its completeness: the buffering and caching features, but the cost will XFree86 Xlib release includes support for every likely be worth it for toolkit developers and for protocol request provided by X11R6 and libraries those looking to write specialized applications lay- for every protocol extension request supported by ered atop the XCB API. XFree86, as well as support for a rich set of conve- nience features. Among these convenience features are automatic marshaling of multiple requests (for 1 Xlib example, combining a series of DrawPoint re- quests into a PolyPoint request), automatic de- Perhaps the oldest software in modern X Window composition of large requests and tools for auto- System [SG86] distributions is Xlib [SG92]: the matic input canonicalization and internationaliza- oldest files in the current XFree861 distribution tion (i18n) of both input and output. have a 1985 copyright. Xlib has played an impor- The large-scale usage of Xlib has also made it a tant role in the development of the X Window Sys- thoroughly use-tested piece of software. It has been tem in several ways: as the standard binding of X carefully maintained, and its reliability is currently 1http://xfree86.org quite high. In particular, its code embodies many clever solutions to subtle problems in X protocol this problem, but ultimately it seems difficult to se- interaction. Since the protocol has co-evolved with riously shrink Xlib without significantly changing Xlib, both have been adjusted to work well together. the API and excising substantial parts of its func- tionality. The X protocol is bandwidth efficient. Requests, replies and events are parsimonious in size. The Because of the size, complexity and ubiquity of simple representations of the protocol allow most Xlib, it is quite difficult to maintain, especially to transactions to be easily compressed by a general extend. Potential authors of new X protocol exten- purpose method such as gzip [Gai93], further im- sions are often deterred not by the difficulty of the proving performance. Xlib contains a number of server-side work, but by the difficulty of adding li- optimizations designed to improve this bandwidth brary support for the extension: there is little sup- efficiency. Notable among these are buffered out- port in Xlib for extensions, so a great deal of new put of requests2 and a reasonable amount of local code typically needs to be written on the client side. caching of server state. This may be a major factor in the dearth of new ex- tensions over the last 10 years or so.4 The choice of the C programming language as the standard binding language for X clients was a natu- Xlib can also be difficult to use. For example, many ral one, given the C server implementation and the X protocol items are XIDs, small integers. Unfortu- efficiency and accessibility of the language. It has nately, C provides no way to declare incompatible since proven a fortuitous decision. Because most types isomorphic to small integers. This occasion- other programming languages provide an interface ally leads to type errors in Xlib usage that are not to C source or binaries, Xlib has been used as a statically detected: passing a window ID where a binding by toolkits and programs written in lan- font ID was required, for example. The use of C guages ranging from C++ and Java to Scheme and structure and union types to “wrap” small integers Prolog. can solve this problem, but in 1985 a few C compil- ers still had trouble treating structures in the largely 1.2 Xlib Areas For Improvement first-class fashion required by the standard: struc- ture return was particularly problematic, and some compilers even had problems with structure copy- While Xlib is highly successful, there are still areas ing. that could use improvement. Xlib is arcane: even experienced X programmers must frequently refer As another example, user memory management of to the documentation in order to use it successfully. Xlib data is complicated by a couple of factors. This is due to several factors: first, the difficulty of First, because the XAlloc() and XFree() inter- building a transparent API in C; second, accretion; faces are used instead of their normal malloc() but third and especially the fact that Xlib tries to and free() counterparts, traditional memory al- be a general purpose interface suitable for writing location debugging and leak-detection tools are dif- everything from small toolkit components to large ficult to use to detect and diagnose Xlib usage er- applications directly. rors. This may be one of the reasons why X appli- cations so commonly leak storage. Another is that Because of XLib’s generality and emphasis on con- Xlib routines occasionally return allocated storage venience functions, the library is complex and over- containing pointers to other unallocated storage: it sized; little of its code is regularly used by applica- is the responsibility of the Xlib user to free the ref- 3 tions. Work by Jim Gettys has recently reduced erents before freeing the referencing block, by call- 5 2Xlib contains a support for a timer that periodically flushes ing the appropriate destructor routine rather than the output stream to reduce latency. While XCB takes the po- XFree(). Needless to say, this is error-prone, and sition that this is an activity better performed by the API client, which may be able to do a better job with reduced complexity, 4Keith Packard, personal communication, August 2001. this mechanism in any case does help control request latency. 5Often the destructor’s name contains “destroy” rather than 3Personal communication, June 2001. “free”, adding to the confusion. the resulting errors are difficult to detect. proach. XCB is intended to be a simple and direct binding of X protocol transactions to C language The design goals of Xlib are somewhat contradic- function calls, with the minimum amount of ma- tory. Modern toolkits such as Gtk and Qt eschew chinery necessary to achieve this aim. most of the special features of Xlib, such as its com- plicated input model and i18n semantics, and use It is assumed that the principle clients of XCB just the protocol binding. This is not merely waste- will be of two types: toolkits intended for higher- ful: interference from Xlib also makes it difficult level program implementation and small libraries to do certain styles of toolkit optimization, such as intended to ease the direct use of XCB. Thus, cer- latency hiding and the use of multiple threads. tain constraints of the Xlib design disappear. Fea- tures such as i18n and most caching, that can be bet- While Xlib attempts to be re-entrant, its complexity ter managed at a higher layer, may be eliminated. and the “retrofitted” nature of the reentrancy sup- Controlling the syntactic details of the API inter- port make exploiting this feature difficult. In par- face also becomes slightly less critical (although the ticular, the Xlib API is not easily suited to thread- current design seems rather pleasant in this regard). based use. For example, it is difficult to obtain the sequence number of a request in a multi-threaded 2.1 XCB Structure environment, as the sequence counter may be ad- vanced by a second request between the time the first request is sent and the counter is queried. In The basic structure of XCB is in two layers, as illus- addition, many Xlib calls that retrieve information, trated in Figure 1.
Recommended publications
  • R&S®BBA100 Broadband Amplifier Open
    R&S®BBA100 Broadband Amplifier Open Source Acknowledgment 5353.8300.00 – 01 /RL/1/EN 01.00 / Broadcasting 3575.4620.02 M: - T - PAD Open Source Acknowledgment R&S BBA100 Introduction Contents 1 Introduction ......................................................................................... 3 1.1 Disclaimer ..................................................................................................................... 3 1.2 How to obtain the source code .................................................................................. 3 2 Software packages ............................................................................. 4 3 Verbatim license texts ........................................................................ 7 3.1 Apache License 2.0 ..................................................................................................... 7 3.2 GNU Library General Public License, Version 2.0 (LGPL 2.0) ..............................10 3.3 Boost Software License ............................................................................................18 3.4 GNU General Public License, Version 2.0 (GPL 2.0) ..............................................18 3.5 GNU Lesser General Public License, Version 2.1 (LGPL 2.1) ...............................24 3.6 Mozilla Public License, Version 1.1 (MPL 1.1) ........................................................32 3.7 MIT ...............................................................................................................................40 3.8 JDOM License
    [Show full text]
  • Release Notes for X11R6.8.2 the X.Orgfoundation the Xfree86 Project, Inc
    Release Notes for X11R6.8.2 The X.OrgFoundation The XFree86 Project, Inc. 9February 2005 Abstract These release notes contains information about features and their status in the X.Org Foundation X11R6.8.2 release. It is based on the XFree86 4.4RC2 RELNOTES docu- ment published by The XFree86™ Project, Inc. Thereare significant updates and dif- ferences in the X.Orgrelease as noted below. 1. Introduction to the X11R6.8.2 Release The release numbering is based on the original MIT X numbering system. X11refers to the ver- sion of the network protocol that the X Window system is based on: Version 11was first released in 1988 and has been stable for 15 years, with only upwardcompatible additions to the coreX protocol, a recordofstability envied in computing. Formal releases of X started with X version 9 from MIT;the first commercial X products werebased on X version 10. The MIT X Consortium and its successors, the X Consortium, the Open Group X Project Team, and the X.OrgGroup released versions X11R3 through X11R6.6, beforethe founding of the X.OrgFoundation. Therewill be futuremaintenance releases in the X11R6.8.x series. However,efforts arewell underway to split the X distribution into its modular components to allow for easier maintenance and independent updates. We expect a transitional period while both X11R6.8 releases arebeing fielded and the modular release completed and deployed while both will be available as different consumers of X technology have different constraints on deployment. Wehave not yet decided how the modular X releases will be numbered. We encourage you to submit bug fixes and enhancements to bugzilla.freedesktop.orgusing the xorgproduct, and discussions on this server take place on <[email protected]>.
    [Show full text]
  • THINC: a Virtual and Remote Display Architecture for Desktop Computing and Mobile Devices
    THINC: A Virtual and Remote Display Architecture for Desktop Computing and Mobile Devices Ricardo A. Baratto Submitted in partial fulfillment of the requirements for the degree of Doctor of Philosophy in the Graduate School of Arts and Sciences COLUMBIA UNIVERSITY 2011 c 2011 Ricardo A. Baratto This work may be used in accordance with Creative Commons, Attribution-NonCommercial-NoDerivs License. For more information about that license, see http://creativecommons.org/licenses/by-nc-nd/3.0/. For other uses, please contact the author. ABSTRACT THINC: A Virtual and Remote Display Architecture for Desktop Computing and Mobile Devices Ricardo A. Baratto THINC is a new virtual and remote display architecture for desktop computing. It has been designed to address the limitations and performance shortcomings of existing remote display technology, and to provide a building block around which novel desktop architectures can be built. THINC is architected around the notion of a virtual display device driver, a software-only component that behaves like a traditional device driver, but instead of managing specific hardware, enables desktop input and output to be intercepted, manipulated, and redirected at will. On top of this architecture, THINC introduces a simple, low-level, device-independent representation of display changes, and a number of novel optimizations and techniques to perform efficient interception and redirection of display output. This dissertation presents the design and implementation of THINC. It also intro- duces a number of novel systems which build upon THINC's architecture to provide new and improved desktop computing services. The contributions of this dissertation are as follows: • A high performance remote display system for LAN and WAN environments.
    [Show full text]
  • Porting a Window Manager from Xlib to XCB
    Porting a Window Manager from Xlib to XCB Arnaud Fontaine (08090091) 16 May 2008 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version pub- lished by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Contents List of figures i List of listings ii Introduction 1 1 Backgrounds and Motivations 2 2 X Window System (X11) 6 2.1 Introduction . .6 2.2 History . .6 2.3 X Window Protocol . .7 2.3.1 Introduction . .7 2.3.2 Protocol overview . .8 2.3.3 Identifiers of resources . 10 2.3.4 Atoms . 10 2.3.5 Windows . 12 2.3.6 Pixmaps . 14 2.3.7 Events . 14 2.3.8 Keyboard and pointer . 15 2.3.9 Extensions . 17 2.4 X protocol client libraries . 18 2.4.1 Xlib . 18 2.4.1.1 Introduction . 18 2.4.1.2 Data types and functions . 18 2.4.1.3 Pros . 19 2.4.1.4 Cons . 19 2.4.1.5 Example . 20 2.4.2 XCB . 20 2.4.2.1 Introduction . 20 2.4.2.2 Data types and functions . 21 2.4.2.3 xcb-util library . 22 2.4.2.4 Pros . 22 2.4.2.5 Cons . 23 2.4.2.6 Example . 23 2.4.3 Xlib/XCB round-trip performance comparison .
    [Show full text]
  • Gtk Drawing Area Example C
    Gtk Drawing Area Example C Abyssinian Cary always Indianised his examination if Amadeus is lowest or marshalling skywards. Ornithischian Rudd overruled, his deportation backscatters remilitarizing proud. Zodiacal Udale alkalizing: he repay his ceorl jazzily and observantly. End angle bracket iter to indicates data to c gtk drawing area Programming with gtkmm 3. You should only grab from gtk drawing area widget draws with either create. These programmatically hidden from the properties are put there are created and executable program that all gtk app into boxes, i am doing. This locus the 'traits' of the GtkDrawingArea widget are inherited to this class. GtkDrawingArea gtk-30 Valadoc. M cm else return cm m xm def drawself ctx area tops the egg. Gmcs pkggtk-sharp-20 rusrlibmono20MonoCairodll simplecs Here saying how we compile the example DrawingArea darea new. This source code of examples have thrown me at least we will create a button click to retrieve them into those who must be updated. How to integrate those header-only libraries and uses Catch as an example. We just ugly cast. The error comes from C I over no danger about tablet to drift this drawingrb. Useful for detriment to extract multiple copies of chair same dialog. For example if most have created a dialog box for entering some personal information you. Drawing operation draws the examples are the interior of. Application runs the example draws some way to be used for single cell renderer to this will execute it! This is prominent example in object-oriented behavior enforced in C by GTK. GtkDrawingArea getDrawingAreaStructbool transferOwnership false.
    [Show full text]
  • Writing Applications with GTK+ 1 Introduction
    + Writing Applications with GTK Owen Taylor April Introduction Graphical user interfaces have b ecome almost universally familiar However it may b e worth saying a few words ab out how graphical user interfaces work in Linux and X from the p oint of view of the programmer The X server is resp onsible for only the simplest op erations of drawing graphics and text on the screen and for keeping track of the users mouse and keyboard actions Pro grams communicate with the server via the Xlib library However programming applications in straight Xlib would b e a tremendous chore Since Xlib provides only basic drawing commands each application would have to provide their own co de to user interface elements such as buttons or menus Such user interface elemenets are called widgets To avoid such a lab orious job and to provide consistancy b etween dierent applications the normal practice is to use a to olkit a library that builds on top of Xlib and handles the details of the user interface The traditional choices for such a to olkit have b een two libraries built up on X Intrinsics libXt library distributed with X the Athena Widgets which are distributed with X and Mo 1 tif However Xt is complicated to learn and use the Athena Widgets havent lo oked stylish since and Motif while somewhat more up to date is large slow has an app earance disliked by many p eople and most imp ortantly is a proprietary pro duct without freely available source co de For these reasons and others much recent development has fo cused on to olk its that build directly
    [Show full text]
  • X Meets Z: Verifying Correctness in the Presence of POSIX Threads
    X Meets Z: Verifying Correctness In The Presence Of POSIX Threads Bart Massey Robert Bauer Computer Science Department Rational Software Corporation Portland State University 1920 Amberglen Pkwy, Suite 200 Portland, Oregon USA 97207–0751 Beaverton, Oregon USA 97006 [email protected] [email protected] Abstract and guide the development of resulting code. While this approach is not a panacea, it typically does dramatically The engineering of freely-available UNIX software nor- reduce the likelihood of defects and increase confidence mally utilizes an informal analysis and design process in the developed system. A more surprising finding of coupled with extensive user testing. While this approach most of these case studies, confirmed by the authors’ ex- is often appropriate, there are situations for which it pro- perience in teaching formal methods to industrial prac- duces less-than-stellar results. titioners, is that Z-like lightweight formal methods are quite accessible to reasonably experienced software en- A case study is given of such a situation that arose dur- gineers. In fact, in many studies, the savings in time and ing the design and implementation of a thread-safe li- effort due to reduced defect rates has exceeded the extra brary for interaction with the X Window System. XCB cost of judiciously-applied formal analysis. is a C binding library for the X protocol designed to work transparently with either single-threaded or multi- Thus, using the Z notation to construct a lightweight threaded clients. Managing XCB client thread access to problem model can enable the construction of an algo- the X server while honoring the constraints of both XCB rithm for controlling client thread access to the server and the X server is thus a delicate matter.
    [Show full text]
  • Fundamentals of Xlib Programming by Examples
    Fundamentals of Xlib Programming by Examples by Ross Maloney Contents 1 Introduction 1 1.1 Critic of the available literature . 1 1.2 The Place of the X Protocol . 1 1.3 X Window Programming gotchas . 2 2 Getting started 4 2.1 Basic Xlib programming steps . 5 2.2 Creating a single window . 5 2.2.1 Open connection to the server . 6 2.2.2 Top-level window . 7 2.2.3 Exercises . 10 2.3 Smallest Xlib program to produce a window . 10 2.3.1 Exercises . 10 2.4 A simple but useful X Window program . 11 2.4.1 Exercises . 12 2.5 A moving window . 12 2.5.1 Exercises . 15 2.6 Parts of windows can disappear from view . 16 2.6.1 Testing overlay services available from an X server . 17 2.6.2 Consequences of no server overlay services . 17 2.6.3 Exercises . 23 2.7 Changing a window’s properties . 23 2.8 Content summary . 25 3 Windows and events produce menus 26 3.1 Colour . 26 3.1.1 Exercises . 27 i CONTENTS 3.2 A button to click . 29 3.3 Events . 33 3.3.1 Exercises . 37 3.4 Menus . 37 3.4.1 Text labelled menu buttons . 38 3.4.2 Exercises . 43 3.5 Some events of the mouse . 44 3.6 A mouse behaviour application . 55 3.6.1 Exercises . 58 3.7 Implementing hierarchical menus . 58 3.7.1 Exercises . 67 3.8 Content summary . 67 4 Pixmaps 68 4.1 The pixmap resource .
    [Show full text]
  • Security at Extreme Scales
    SECURITY AT EXTREME SCALES Recommended Citation Eric Grosse, "SECURITY AT EXTREME SCALES", NAPSNet Special Reports, May 30, 2019, https://nautilus.org/napsnet/napsnet-special-reports/security-at-extreme-scales/ ERIC GROSSE MAY 30, 2019 I. INTRODUCTION 1 In this paper, Eric Grosse argues: “Much of the security progress over the past decade has been at large-scale, finding and patching vulnerabilities in widely used applications or defending networks of millions of machines containing high-value data. The lessons there may help military systems, but for the very highest security needs such as NC3, we ought to return to basics and harden small-scale systems. And we ought to do it as a joint effort, even between adversaries.” Eric Grosse was Google's VP Security & Privacy Engineering. Before Google, Eric was a Research Director and Fellow at Bell Labs. He has a Ph.D. in Computer Science from Stanford. Acknowledgments: The workshop was funded by the John D. and Catherine T. MacArthur Foundation. This report is published simultaneously here by Technology for Global Security and here by Nautilus Institute and is published under a 4.0 International Creative Commons License the terms of which are found here. The views expressed in this report do not necessarily reflect the official policy or position of the Nautilus Institute. Readers should note that Nautilus seeks a diversity of views and opinions on significant topics in order to identify common ground. A podcast with Eric Grosse, Peter Hayes, and Philip Reiner on NC3 and security at extreme scales is found here. The views expressed in this report do not necessarily reflect the official policy or position of the Nautilus Institute.
    [Show full text]
  • X Window System Network Performance
    X Window System Network Performance Keith Packard Cambridge Research Laboratory, HP Labs, HP [email protected] James Gettys Cambridge Research Laboratory, HP Labs, HP [email protected] Abstract havior (or on a local machine, context switches between the application and the X server). Performance was an important issue in the develop- One of the authors used the network visualization tool ment of X from the initial protocol design and contin- when analyzing the design of HTTP/1.1 [NGBS 97]. ues to be important in modern application and extension The methodology and tools used in that analysis in- development. That X is network transparent allows us volved passive packet level monitoring of traffic which to analyze the behavior of X from a perspective seldom allowed precise real-world measurements and compar- possible in most systems. We passively monitor network isons. The work described in this paper combines this packet flow to measure X application and server perfor- passive packet capture methodology with additional X mance. The network simulation environment, the data protocol specific analysis and visualization. Our experi- capture tool and data analysis tools will be presented. ence with this combination of the general technique with Data from this analysis are used to show the performance X specific additions was very positive and we believe impact of the Render extension, the limitations of the provides a powerful tool that could be used in the analy- LBX extension and help identify specific application and sis of other widely used protocols. toolkit performance problems. We believe this analysis With measurement tools in hand, we set about char- technique can be usefully applied to other network pro- acterizing the performance of a significant selection of tocols.
    [Show full text]
  • FLTK 1.1.8 Programming Manual Revision 8
    FLTK 1.1.8 Programming Manual Revision 8 Written by Michael Sweet, Craig P. Earls, Matthias Melcher, and Bill Spitzak Copyright 1998-2006 by Bill Spitzak and Others. FLTK 1.1.8 Programming Manual Table of Contents Preface..................................................................................................................................................................1 Organization.............................................................................................................................................1 Conventions.............................................................................................................................................2 Abbreviations...........................................................................................................................................2 Copyrights and Trademarks.....................................................................................................................2 1 - Introduction to FLTK...................................................................................................................................3 History of FLTK......................................................................................................................................3 Features....................................................................................................................................................4 Licensing..................................................................................................................................................5
    [Show full text]
  • Xlib − C Language X Interface Xwindowsystem Standard Xversion 11, Release 7 Libx11 1.3.2
    Xlib − C Language X Interface XWindowSystem Standard XVersion 11, Release 7 libX11 1.3.2 James Gettys Cambridge Research Laboratory Digital Equipment Corporation Robert W.Scheifler Laboratory for Computer Science Massachusetts Institute of Technology with contributions from Chuck Adams, Tektronix, Inc. Vania Joloboff, Open Software Foundation Hideki Hiura, Sun Microsystems, Inc. Bill McMahon, Hewlett-Packard Company Ron Newman, Massachusetts Institute of Technology Al Tabayoyon, Tektronix, Inc. Glenn Widener,Tektronix, Inc. Shigeru Yamada, Fujitsu OSSI The X WindowSystem is a trademark of The Open Group. TekHVC is a trademark of Tektronix, Inc. Copyright © 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996, 2002 The Open Group Permission is hereby granted, free of charge, to anyperson obtaining a copyofthis software and associated documenta- tion files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Soft- ware. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOTLIMITED TOTHE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTIC- ULAR PURPOSE AND NONINFRINGEMENT.INNOEVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,WHETHER IN AN ACTION OF CONTRACT,TORTOROTH- ERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    [Show full text]