From 6c515667a719c0fc30b333b6c96341589d20b6d5 Mon Sep 17 00:00:00 2001 From: "Carlos R. Mafra" Date: Sun, 13 Jan 2019 12:11:56 +0000 Subject: [PATCH] Add WINGs tutorial The original website is http://www.quantitativefinanceservices.com/OpenDir/WINGslib/WINGToc.html and it had the following notice at the bottom: Copyright (c) 2010 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". So we are fine. --- ... Steps to Make a WINGs User Interface.html | 42 + WINGs_tutorial/EighthWindow.c | 70 + WINGs_tutorial/FDL.html | 370 +++++ WINGs_tutorial/FifthWindow.c | 119 ++ WINGs_tutorial/FirstWindow.c | 17 + WINGs_tutorial/FourthWindow.c | 122 ++ WINGs_tutorial/NinthWindow.c | 206 +++ WINGs_tutorial/SecondWindow.c | 34 + WINGs_tutorial/SeventhWindow.c | 100 ++ WINGs_tutorial/SixthWindow.c | 58 + WINGs_tutorial/ThirdWindow.c | 46 + WINGs_tutorial/WINGGraphics.html | 119 ++ .../WINGGraphics_files/glframe.jpeg | Bin 0 -> 8977 bytes .../WINGGraphics_files/seventh2.jpeg | Bin 0 -> 11704 bytes WINGs_tutorial/WINGLib.html | 1188 +++++++++++++++++ WINGs_tutorial/WINGLib_files/2tabs.jpeg | Bin 0 -> 8546 bytes WINGs_tutorial/WINGLib_files/AlertPanel.jpeg | Bin 0 -> 9794 bytes WINGs_tutorial/WINGLib_files/Buttons.jpeg | Bin 0 -> 7144 bytes WINGs_tutorial/WINGLib_files/ColorPanel.jpeg | Bin 0 -> 14003 bytes WINGs_tutorial/WINGLib_files/FontPanel.jpeg | Bin 0 -> 29742 bytes WINGs_tutorial/WINGLib_files/InputDialog.jpeg | Bin 0 -> 8760 bytes WINGs_tutorial/WINGLib_files/Labels.jpeg | Bin 0 -> 7310 bytes WINGs_tutorial/WINGLib_files/List.jpeg | Bin 0 -> 12234 bytes .../WINGLib_files/OpenFileDialog.jpeg | Bin 0 -> 27133 bytes WINGs_tutorial/WINGLib_files/Progress.jpeg | Bin 0 -> 6492 bytes WINGs_tutorial/WINGLib_files/PullDown.jpeg | Bin 0 -> 6934 bytes WINGs_tutorial/WINGLib_files/Slider.jpeg | Bin 0 -> 4056 bytes WINGs_tutorial/WINGLib_files/TabView.jpeg | Bin 0 -> 9988 bytes WINGs_tutorial/WINGLib_files/TextField.jpeg | Bin 0 -> 7793 bytes WINGs_tutorial/WINGLib_files/scrollview.jpeg | Bin 0 -> 24978 bytes WINGs_tutorial/WINGLib_files/textarea.jpeg | Bin 0 -> 73441 bytes WINGs_tutorial/WINGMenu.html | 82 ++ WINGs_tutorial/WINGMenu_files/menu.jpeg | Bin 0 -> 13241 bytes .../WINGMenu_files/redirectmenu1.jpeg | Bin 0 -> 13150 bytes .../WINGMenu_files/redirectmenu2.jpeg | Bin 0 -> 14461 bytes WINGs_tutorial/WINGsIntro.html | 42 + WINGs_tutorial/WINGsRemark.html | 174 +++ .../WINGsRemark_files/ScreenSize.jpeg | Bin 0 -> 48384 bytes WINGs_tutorial/WINGstep1.html | 64 + WINGs_tutorial/WINGstep2.html | 59 + .../WINGstep2_files/FirstWindow.jpeg | Bin 0 -> 5838 bytes WINGs_tutorial/WINGstep3.html | 143 ++ WINGs_tutorial/WINGstep3_files/Buttons.jpeg | Bin 0 -> 7144 bytes .../WINGstep3_files/FirstWindow4.jpeg | Bin 0 -> 31747 bytes .../WINGstep3_files/OpenFileDialog.jpeg | Bin 0 -> 27133 bytes .../WINGstep3_files/ScreenSize.jpeg | Bin 0 -> 48384 bytes WINGs_tutorial/WINGtoc.html | 126 ++ WINGs_tutorial/glframe.c | 283 ++++ WINGs_tutorial/glframe.c.1 | 285 ++++ 49 files changed, 3749 insertions(+) create mode 100644 WINGs_tutorial/3 Steps to Make a WINGs User Interface.html create mode 100644 WINGs_tutorial/EighthWindow.c create mode 100644 WINGs_tutorial/FDL.html create mode 100644 WINGs_tutorial/FifthWindow.c create mode 100644 WINGs_tutorial/FirstWindow.c create mode 100644 WINGs_tutorial/FourthWindow.c create mode 100644 WINGs_tutorial/NinthWindow.c create mode 100644 WINGs_tutorial/SecondWindow.c create mode 100644 WINGs_tutorial/SeventhWindow.c create mode 100644 WINGs_tutorial/SixthWindow.c create mode 100644 WINGs_tutorial/ThirdWindow.c create mode 100644 WINGs_tutorial/WINGGraphics.html create mode 100644 WINGs_tutorial/WINGGraphics_files/glframe.jpeg create mode 100644 WINGs_tutorial/WINGGraphics_files/seventh2.jpeg create mode 100644 WINGs_tutorial/WINGLib.html create mode 100644 WINGs_tutorial/WINGLib_files/2tabs.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/AlertPanel.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/Buttons.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/ColorPanel.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/FontPanel.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/InputDialog.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/Labels.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/List.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/OpenFileDialog.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/Progress.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/PullDown.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/Slider.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/TabView.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/TextField.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/scrollview.jpeg create mode 100644 WINGs_tutorial/WINGLib_files/textarea.jpeg create mode 100644 WINGs_tutorial/WINGMenu.html create mode 100644 WINGs_tutorial/WINGMenu_files/menu.jpeg create mode 100644 WINGs_tutorial/WINGMenu_files/redirectmenu1.jpeg create mode 100644 WINGs_tutorial/WINGMenu_files/redirectmenu2.jpeg create mode 100644 WINGs_tutorial/WINGsIntro.html create mode 100644 WINGs_tutorial/WINGsRemark.html create mode 100644 WINGs_tutorial/WINGsRemark_files/ScreenSize.jpeg create mode 100644 WINGs_tutorial/WINGstep1.html create mode 100644 WINGs_tutorial/WINGstep2.html create mode 100644 WINGs_tutorial/WINGstep2_files/FirstWindow.jpeg create mode 100644 WINGs_tutorial/WINGstep3.html create mode 100644 WINGs_tutorial/WINGstep3_files/Buttons.jpeg create mode 100644 WINGs_tutorial/WINGstep3_files/FirstWindow4.jpeg create mode 100644 WINGs_tutorial/WINGstep3_files/OpenFileDialog.jpeg create mode 100644 WINGs_tutorial/WINGstep3_files/ScreenSize.jpeg create mode 100644 WINGs_tutorial/WINGtoc.html create mode 100644 WINGs_tutorial/glframe.c create mode 100644 WINGs_tutorial/glframe.c.1 diff --git a/WINGs_tutorial/3 Steps to Make a WINGs User Interface.html b/WINGs_tutorial/3 Steps to Make a WINGs User Interface.html new file mode 100644 index 0000000..e36cd3f --- /dev/null +++ b/WINGs_tutorial/3 Steps to Make a WINGs User Interface.html @@ -0,0 +1,42 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + +
LAST: ContentsNEXT: Step 1 Drawing a Window
+ +

Make a WINGs based Graphical User Interface in 3 Steps

+ +The WINGs library is the library with routines for a graphical user interface which comes with the Window Maker window manager. In 2010 the library's web page is here on the windowmaker.org website. You can download windowmaker with the WINGs libraries here. The library provides widgets which you can use to make a graphical user interface. A widget is a software module which is used to interact with the user. Buttons and menus are widgets. The WINGs library offers the possibility to programme these widgets in a few lines of C code, so that you can dedicate the rest of your time to the functionality in your application. + +

This tutorial shows in three simple steps how to write a graphical user interface with WINGs. Those three steps will cover all that is needed to write the major dialogs and widgets needed for communication between application and user. It assumes that you know how to programme in C, but you do not need to know anything about GUI-programming. + +

Step 1 in this tutorial will show the framework for an application which uses a WINGS graphical user interface. It shows how you have the WINGs library create a widget for you, and how you set its properties. Step 2 briefly explains what events are, and how you make your application react to incoming events. This is what makes your interface work. Step 3 shows how to insert two buttons and a text area into the application's window, and how to implement the handling of events for them. Along the explanations in the main text, there are a few examples of source code. Most WINGs function names speak for themselves, and therefore, not everything in the source code is repeated in the text. You can just read the code. The example developed in the three steps is a sufficient blueprint to allow you to use the other widgets in the WINGs library. To do that, just look up the functions in the relevant section in the library description section. + +

There are three programming detail sections after the three tutorial sections. They explain how to use Xlib code along with the WINGs code, how to set up a widget in which you can draw OpenGL images, and how to change part of the WINGs library source for your own needs, among other things. + +

To compile WINGs widgets, you need a C-compiler, the WINGs library, and an X-server on your computer. The first few libraries which you need will be libWINGs and libwraster, and the X11 library libXft. If the WINGs library directory is in the /usr/lib path, and your X11 libraries in /usr/X11/lib, you can compile the code with gcc as follows +

gcc -x c FileName -lXft -L/usr/X11/lib -L/usr/lib -lwraster -lWINGs -o FileName +

This will get you a binary called FileName which you can run, either by double clicking, or by running the ./FileName command in an xterm. +

To compile in C++, just replace the fprintf(stderr, ..) command with an appropriate cerr << , add the namespace command, and replace the <stdio.h> with the iostream header, then compile as + +g++ -x c++ -lXft FileName -L/usr/X11/lib -L/usr/lib -lwraster -lWINGs-o FileName + + + +

The function prototypes in the library description were retrieved from the information in the WINGs man pages which were compiled by Alexey Voinov. His page was here in 2010. + + +
+
+

+

LAST: ContentsNEXT: Step 1 Drawing a Window
+ + + + \ No newline at end of file diff --git a/WINGs_tutorial/EighthWindow.c b/WINGs_tutorial/EighthWindow.c new file mode 100644 index 0000000..628cd20 --- /dev/null +++ b/WINGs_tutorial/EighthWindow.c @@ -0,0 +1,70 @@ +#include "editmenu.h" + +#define WINWIDTH 300 +#define WINHEIGHT 400 +#define MENUWIDTH 80 +#define MENITEMHT 21 + +struct datacouple{WMWindow *window; + WEditMenu *menu; +} datacouple; + +void closeAll(WMWidget *self,void *data){ + WMDestroyWidget(self); + exit(0); +} + +void getMenu(WMWidget *self, void *data){ + WMPoint position; + struct datacouple *tmp=(struct datacouple *)data; + if(WMGetButtonSelected(self)){ + position=WMGetViewScreenPosition(WMWidgetView(tmp->window)); + WEditMenuShowAt(tmp->menu,(position.x>MENUWIDTH)?position.x-MENUWIDTH:0, position.y+MENITEMHT,tmp->window); + }else + WEditMenuHide(tmp->menu); +} + +int main (int argc, char **argv){ + +Display *display; +WMScreen *screen; +WMWindow *win; +WEditMenu *submenu, *menu; +WEditMenuItem * menuitem; +struct datacouple Mainmenu; + WMButton *Button; + +WMInitializeApplication("MenuWindow", &argc, argv); +display = XOpenDisplay(""); +screen = WMCreateScreen(display, DefaultScreen(display)); +win = WMCreateWindow(screen, "Menu"); +WMResizeWidget(win, WINWIDTH, WINHEIGHT); +WMSetWindowCloseAction(win, closeAll, NULL); + + submenu=WCreateEditMenu(screen,"Submenu"); + menuitem =WAddMenuItemWithTitle(submenu,"Submenu item"); + menu=WCreateEditMenu(screen,"Main menu"); + menuitem = WAddMenuItemWithTitle(menu,"To submenu"); + WSetEditMenuSubmenu(menu, menuitem , submenu); + menuitem = WAddMenuItemWithTitle(menu,"Main item"); + +Mainmenu.window=win; +Mainmenu.menu=menu; + + Button =WMCreateButton(win,WBTPushOnPushOff); + WMSetButtonText (Button, "Menu"); + WMSetButtonAction (Button, getMenu, &Mainmenu); + WMMoveWidget(Button, 1,1); + +WMRealizeWidget(win); +WMRealizeWidget(Button); +WMRealizeWidget(menu); +WMRealizeWidget(submenu); + +WMMapSubwidgets(win); +WMMapWidget(win); + +WMScreenMainLoop(screen); + +return 0; +} diff --git a/WINGs_tutorial/FDL.html b/WINGs_tutorial/FDL.html new file mode 100644 index 0000000..460b930 --- /dev/null +++ b/WINGs_tutorial/FDL.html @@ -0,0 +1,370 @@ + + +3 Steps to Make a WINGs User Interface - Licence + + + + + +
Contents
+ + +
		GNU Free Documentation License
+		   Version 1.1, March 2000
+
+ Copyright (C) 2000  Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+written document "free" in the sense of freedom: to assure everyone
+the effective freedom to copy and redistribute it, with or without
+modifying it, either commercially or noncommercially.  Secondarily,
+this License preserves for the author and publisher a way to get
+credit for their work, while not being considered responsible for
+modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work that contains a
+notice placed by the copyright holder saying it can be distributed
+under the terms of this License.  The "Document", below, refers to any
+such manual or work.  Any member of the public is a licensee, and is
+addressed as "you".
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (For example, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, whose contents can be viewed and edited directly and
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup has been designed to thwart or discourage
+subsequent modification by readers is not Transparent.  A copy that is
+not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML designed for human modification.  Opaque formats include
+PostScript, PDF, proprietary formats that can be read and edited only
+by proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML produced by some word processors for output
+purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies of the Document numbering more than 100,
+and the Document's license notice requires Cover Texts, you must enclose
+the copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a publicly-accessible computer-network location containing a complete
+Transparent copy of the Document, free of added material, which the
+general network-using public has access to download anonymously at no
+charge using public-standard network protocols.  If you use the latter
+option, you must take reasonably prudent steps, when you begin
+distribution of Opaque copies in quantity, to ensure that this
+Transparent copy will remain thus accessible at the stated location
+until at least one year after the last time you distribute an Opaque
+copy (directly or through your agents or retailers) of that edition to
+the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has less than five).
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section entitled "History", and its title, and add to
+   it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+K. In any section entitled "Acknowledgements" or "Dedications",
+   preserve the section's title, and preserve in the section all the
+   substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+M. Delete any section entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+N. Do not retitle any existing section as "Endorsements"
+   or to conflict in title with any Invariant Section.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections entitled "History"
+in the various original documents, forming one section entitled
+"History"; likewise combine any sections entitled "Acknowledgements",
+and any sections entitled "Dedications".  You must delete all sections
+entitled "Endorsements."
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, does not as a whole count as a Modified Version
+of the Document, provided no compilation copyright is claimed for the
+compilation.  Such a compilation is called an "aggregate", and this
+License does not apply to the other self-contained works thus compiled
+with the Document, on account of their being thus compiled, if they
+are not themselves derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one quarter
+of the entire aggregate, the Document's Cover Texts may be placed on
+covers that surround only the Document within the aggregate.
+Otherwise they must appear on covers around the whole aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License provided that you also include the
+original English version of this License.  In case of a disagreement
+between the translation and the original English version of this
+License, the original English version will prevail.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+      Copyright (c)  YEAR  YOUR NAME.
+      Permission is granted to copy, distribute and/or modify this document
+      under the terms of the GNU Free Documentation License, Version 1.1
+      or any later version published by the Free Software Foundation;
+      with the Invariant Sections being LIST THEIR TITLES, with the
+      Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+      A copy of the license is included in the section entitled "GNU
+      Free Documentation License".
+
+If you have no Invariant Sections, write "with no Invariant Sections"
+instead of saying which ones are invariant.  If you have no
+Front-Cover Texts, write "no Front-Cover Texts" instead of
+"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+
+ + \ No newline at end of file diff --git a/WINGs_tutorial/FifthWindow.c b/WINGs_tutorial/FifthWindow.c new file mode 100644 index 0000000..3260b7b --- /dev/null +++ b/WINGs_tutorial/FifthWindow.c @@ -0,0 +1,119 @@ +#define MARGIN 14 +#define WINWIDTH 300 +#define WINHEIGHT 400 + +Display *display; +WMScreen *screen; + +WMWindow *win; +WMSize ButtonsetSize; + +WMText *text; +WMColor *color; +WMFrame *controlframe; + +char textbuf[40]; + +void closeAll(WMWidget *self,void *data){ + WMDestroyWidget(self); + fprintf(stderr,"I've been used!\n"); + exit(0); +} + +static void selectFiles(void *self, void *data){ + int i=0; + WMOpenPanel *oPanel; + oPanel = WMGetOpenPanel(screen); + if (WMRunModalFilePanelForDirectory(oPanel, NULL, "/tmp", + "Search..", NULL) == True){ + snprintf(textbuf,39,"%s\n-", WMGetFilePanelFileName(oPanel)); + WMFreezeText(text); + WMAppendTextStream(text,textbuf); + WMThawText(text); + } + return ; +} + +static void handleEvents(XEvent *event, void *data){ + WMWidget *widget = (WMWidget*)data; + switch (event->type) { + case ButtonPress: + snprintf(textbuf,39,"Button down at (%i,%i) \n-",event->xbutton.x,event->xbutton.y); + WMFreezeText(text); + WMAppendTextStream(text,textbuf); + WMThawText(text); + break; + } +} + +static void resizeHandler(void *self, WMNotification *notif){ + WMSize size = WMGetViewSize(WMWidgetView(win)); + WMMoveWidget(controlframe, size.width-ButtonsetSize.width, size.height-ButtonsetSize.height); + WMResizeWidget(text, size.width-MARGIN -10, size.height-80); +} + + +int main (int argc, char **argv){ + +WMButton *Button; + + WMInitializeApplication("FifthWindow", &argc, argv); + if (!(display = XOpenDisplay(""))){ + fprintf(stderr,"err: cannot open display"); + exit(1); + } + screen = WMCreateScreen(display, DefaultScreen(display)); + + /* window */ + win = WMCreateWindow(screen, ""); + WMResizeWidget(win, WINWIDTH, WINHEIGHT); + WMSetWindowCloseAction(win, closeAll, NULL); + WMCreateEventHandler(WMWidgetView(win), ButtonPressMask,handleEvents, win); + color = WMCreateRGBColor(screen, 124<<9,206<<8,162<<8, False); + WMSetWidgetBackgroundColor((WMWidget *)win, color); + WMSetViewNotifySizeChanges(WMWidgetView(win), True); + WMAddNotificationObserver(resizeHandler, NULL, WMViewSizeDidChangeNotification, WMWidgetView(win)); + + /* Text area */ + + text = WMCreateText(win); + WMResizeWidget(text, WINWIDTH-MARGIN, WINHEIGHT -80); + WMMoveWidget(text, 10, 10); + WMSetTextHasVerticalScroller(text, True); + WMSetTextEditable(text, False); + + /* frame and two buttons */ + + controlframe=WMCreateFrame(win); + WMSetWidgetBackgroundColor((WMWidget *)controlframe, color); + WMSetFrameRelief(controlframe,WRFlat); + + Button =WMCreateButton(controlframe,WBTMomentaryPush); + WMSetWidgetBackgroundColor((WMWidget *)Button, color); + WMSetButtonText (Button, "Files"); + WMSetButtonAction (Button, selectFiles, NULL); + ButtonsetSize = WMGetViewSize(WMWidgetView(Button)); + WMMoveWidget(Button, MARGIN, MARGIN); + + Button =WMCreateButton(controlframe,WBTMomentaryPush); + WMSetWidgetBackgroundColor((WMWidget *)Button, color); + WMSetButtonText (Button, "Quit"); + WMSetButtonAction (Button, closeAll, NULL); + WMMoveWidget(Button,2*MARGIN+ButtonsetSize.width, MARGIN); + ButtonsetSize.width = 3*MARGIN+2*ButtonsetSize.width; + ButtonsetSize.height=2*MARGIN+ButtonsetSize.height; + WMResizeWidget(controlframe,ButtonsetSize.width,ButtonsetSize.height); + + WMMapSubwidgets(controlframe); + resizeHandler(NULL,NULL); + /* end of frame and buttons setup */ + + + WMMapSubwidgets(win); + WMMapWidget(win); + WMRealizeWidget(win); + + WMScreenMainLoop(screen); + +return 0; +} diff --git a/WINGs_tutorial/FirstWindow.c b/WINGs_tutorial/FirstWindow.c new file mode 100644 index 0000000..6d38916 --- /dev/null +++ b/WINGs_tutorial/FirstWindow.c @@ -0,0 +1,17 @@ +int main (int argc, char **argv){ + + Display *display; + WMScreen *screen; + WMWindow *win; + + WMInitializeApplication("FirstWindow", &argc, argv); + + display = XOpenDisplay(""); + screen = WMCreateScreen(display, DefaultScreen(display)); + win = WMCreateWindow(screen, ""); + + WMRealizeWidget(win); + WMMapWidget(win); + + WMScreenMainLoop(screen); +} diff --git a/WINGs_tutorial/FourthWindow.c b/WINGs_tutorial/FourthWindow.c new file mode 100644 index 0000000..66b98a1 --- /dev/null +++ b/WINGs_tutorial/FourthWindow.c @@ -0,0 +1,122 @@ +#define MARGIN 14 +#define WINWIDTH 300 +#define WINHEIGHT 400 + +Display *display; +WMScreen *screen; + +WMButton *Button; +WMWindow *win; +WMSize ButtonsetSize; + +WMBox *box; +WMText *text; +WMColor *color; + +char textbuf[40]; + +void closeAll(WMWidget *self,void *data){ + WMDestroyWidget(self); + fprintf(stderr,"I've been used!\n"); + exit(0); +} + +static void selectFiles(void *self, void *data){ + WMOpenPanel *oPanel; + oPanel = WMGetOpenPanel(screen); + if (WMRunModalFilePanelForDirectory(oPanel, NULL, "/tmp", + "Search..", NULL) == True){ + snprintf(textbuf,39,"%s\n-", WMGetFilePanelFileName(oPanel)); + WMFreezeText(text); + WMAppendTextStream(text,textbuf); + WMThawText(text); + } + return ; +} + +static void handleEvents(XEvent *event, void *data){ + WMWidget *widget = (WMWidget*)data; + switch (event->type) { + case ButtonPress: + snprintf(textbuf,39,"Button down at (%i,%i) \n-",event->xbutton.x,event->xbutton.y); + WMFreezeText(text); + WMAppendTextStream(text,textbuf); + WMThawText(text); + break; + } +} + +static void resizeHandler(void *self, WMNotification *notif){ + WMSize size = WMGetViewSize(WMWidgetView(win)); + WMMoveWidget(box, size.width-ButtonsetSize.width, size.height-ButtonsetSize.height); + WMResizeWidget(text, size.width-MARGIN -10, size.height-80); +} + + +int main (int argc, char **argv){ + + WMInitializeApplication("FourthWindow", &argc, argv); + if (!(display = XOpenDisplay(""))){ + fprintf(stderr,"err: cannot open display"); + exit(-1); + } + screen = WMCreateScreen(display, DefaultScreen(display)); + + /* window */ + win = WMCreateWindow(screen, ""); + WMResizeWidget(win, WINWIDTH, WINHEIGHT); + WMSetWindowCloseAction(win, closeAll, NULL); + + color = WMCreateRGBColor(screen, 124<<9,206<<8,162<<8, False); + WMSetWidgetBackgroundColor((WMWidget *)win, color); + + WMCreateEventHandler(WMWidgetView(win), ButtonPressMask,handleEvents, win); + WMSetViewNotifySizeChanges(WMWidgetView(win), True); + WMAddNotificationObserver(resizeHandler, NULL, WMViewSizeDidChangeNotification, WMWidgetView(win)); + + /* Text area */ + + text = WMCreateText(win); + WMResizeWidget(text, WINWIDTH-MARGIN, WINHEIGHT -80); + WMMoveWidget(text, 10, 10); + WMSetTextHasVerticalScroller(text, True); + WMSetTextEditable(text, False); + WMSetTextIgnoresNewline(text, False); + + /* box with buttons */ + box=WMCreateBox(win); + WMSetBoxBorderWidth(box, MARGIN); + WMSetWidgetBackgroundColor((WMWidget *)box, color); + WMSetBoxHorizontal(box, True); + + + Button =WMCreateButton(box,WBTMomentaryPush); + WMSetWidgetBackgroundColor((WMWidget *)Button, color); + WMSetButtonText (Button, "Files"); + WMSetButtonAction (Button, selectFiles, NULL); + WMMapWidget(Button); + ButtonsetSize = WMGetViewSize(WMWidgetView(Button)); + + WMAddBoxSubview(box, WMWidgetView(Button), True, False, 60, 1000, MARGIN); + + Button =WMCreateButton(box,WBTMomentaryPush); + WMSetWidgetBackgroundColor((WMWidget *)Button, color); + WMSetButtonText (Button, "Quit"); + WMSetButtonAction (Button, closeAll, NULL); + WMMapWidget(Button); + + WMAddBoxSubview(box, WMWidgetView(Button), True,False, 60, 1000, 0); + WMResizeWidget(box, 4*MARGIN+2*ButtonsetSize.width,2*MARGIN+ButtonsetSize.height); + ButtonsetSize =WMGetViewSize(WMWidgetView(box)); + resizeHandler(NULL,NULL); + /* end of box and buttons setup */ + + WMMapWidget(win); + + WMMapSubwidgets(win); + WMRealizeWidget(win); + + WMScreenMainLoop(screen); + +return 0; +} diff --git a/WINGs_tutorial/NinthWindow.c b/WINGs_tutorial/NinthWindow.c new file mode 100644 index 0000000..5680209 --- /dev/null +++ b/WINGs_tutorial/NinthWindow.c @@ -0,0 +1,206 @@ +#include "editmenu.h" /* This must be the MODIFIED .h file */ +#include +#include +#include +#include +#define WINWIDTH 300 +#define WINHEIGHT 400 +#define MENUWIDTH 85 +#define MENITEMHT 21 +#define LOGPROGRAM "xconsole" +#define ERRMSGFIFO "/tmp/WINGsWindowfifo" +#define FIFONAMELEN 20 +#define NOLOGWINDOW (-2) /* value when there is no console window */ +#define FIFOERROR (-1) /* value when there is a problem w/ console */ +#define FIFOLOWESTPOSS 0 + + +int windowCounter=0; +int fifonr; +int sibpid; +char fifofilename[FIFONAMELEN+5]; + +struct dataStruct{ + WMWindow *window; + WEditMenu *menu; +} dataStruct; + + + /* functions for the message window part: */ + +void redirectmsg(int sig){ + + // clean up after SIGCHLD, and set fifonr to flag it + fifonr=NOLOGWINDOW; + if (!access(fifofilename,F_OK|W_OK)) + unlink(fifofilename); + return; +} + + +int showMessageWindow(){ + + sprintf(fifofilename,"%s%i",ERRMSGFIFO,(unsigned short)getpid()); + + (void) signal(SIGCHLD,redirectmsg); // clean up if message console is killed + + if(access(fifofilename,F_OK)==-1) + fifonr=mknod(fifofilename,0640|O_EXCL|S_IFIFO,(dev_t)0); + else {fifonr=FIFOERROR; + wwarning("Fifo file already exists\n"); + } + /* fifonr == FIFOERROR if mknod/mkfifo or access failed, mknod returns -1 on failure */ + +if(fifonr!=FIFOERROR){ + + sibpid=fork(); + if(sibpid==0){ + execlp(LOGPROGRAM , LOGPROGRAM, "-file",fifofilename,"-geometry","250x400", "-title","Window Messages",(char *)0); + exit(1); +}else + fifonr=open(fifofilename,O_WRONLY); +} + return fifonr; +} + + /* general and menu handling functions */ + +void closeAll(WMWidget *self,void *data){ + + WMDestroyWidget(self); + if(--windowCounter<1){ + if (fifonr>=FIFOLOWESTPOSS) + kill(sibpid,SIGTERM); + if (!access(fifofilename,F_OK|W_OK)) + unlink(fifofilename); + exit(0); + } +} + + +void menuItemAction(void *self, void *data){ + + if (fifonrwindow)); + WEditMenuShowAt(tmp->menu,(position.x>MENUWIDTH)?position.x-MENUWIDTH:0, position.y+MENITEMHT,tmp->window); + }else{ + WEditMenuHide(tmp->menu); + WDeselectItem(tmp->menu); // remove selection before next pop up + } +} + + +static void notificationHandler(void *self, WMNotification *notif){ + +if(!strcmp("WMWindowClose",WMGetNotificationName(notif))) + closeAll(self,NULL); +if(!strcmp(WMViewSizeDidChangeNotification,WMGetNotificationName(notif))){ + //resize actions + WMSize size = WMGetViewSize(WMWidgetView(self)); + } +} + + /* main widget creating functions */ + +WMWindow * makeMainwindow(Display *display, WMScreen *screen){ +WMWindow *window; + + window = WMCreateWindow(screen, "Menu"); + WMResizeWidget(window, WINWIDTH, WINHEIGHT); + WMSetWindowCloseAction(window, closeAll, NULL); + WMAddNotificationObserver(notificationHandler, window, "WMWindowClose", WMWidgetView(window)); + WMSetViewNotifySizeChanges(WMWidgetView(window), True); + WMAddNotificationObserver(notificationHandler, window, WMViewSizeDidChangeNotification, WMWidgetView(window)); + WMAddNotificationObserver(notificationHandler, window, "WMWindowClose", NULL); + WMRealizeWidget(window); + return window; +} + + +WEditMenu * makeMenus(WMScreen *screen,WEditMenu *menu, WEditMenu *submenu){ +WEditMenuItem * menuitem; + + submenu=WCreateEditMenu(screen,"Submenu"); + menuitem =WAddMenuItemWithTitle(submenu,"Submenu item"); + WSetEditMenuItemAction( menuitem, menuItemAction); + menuitem =WAddMenuItemWithTitle(submenu,"2nd submenu item"); + WSetEditMenuItemAction( menuitem, menuItemAction); + menuitem =WAddMenuItemWithTitle(submenu,"3d submenu item"); + WSetEditMenuItemAction( menuitem, menuItemAction); + menu=WCreateEditMenu(screen,"Main menu"); + menuitem = WAddMenuItemWithTitle(menu,"1st main item"); + WSetEditMenuItemAction( menuitem, menuItemAction); + menuitem = WAddMenuItemWithTitle(menu,"2nd main item"); + WSetEditMenuItemAction( menuitem, menuItemAction); + menuitem = WAddMenuItemWithTitle(menu,"To submenu"); + WSetEditMenuSubmenu(menu, menuitem , submenu); + menuitem = WAddMenuItemWithTitle(menu,"Quit"); + WSetEditMenuItemAction( menuitem, menuItemCloseAction); + WMRealizeWidget(submenu);WMRealizeWidget(menu); + return menu; +} + + +WMButton * makeButtonsTop( WMWidget *window, void *AppData){ +WMButton *Button; + + Button =WMCreateButton(window,WBTPushOnPushOff); + WMSetButtonText (Button, "Menu"); + WMSetButtonAction (Button, getMenu, AppData); + WMMoveWidget(Button, 4,2); + WMRealizeWidget(Button); + return Button; +} + + +int main (int argc, char **argv){ + +Display *display; +WMScreen *screen; +WMWindow *mainwindow; +WEditMenu *submenu, *menu; +WEditMenuItem * menuitem; +struct dataStruct Mainmenu; +WMButton *menubutton; + +fifonr=NOLOGWINDOW; + +WMInitializeApplication("MenuWindow", &argc, argv); +display = XOpenDisplay(""); +screen = WMCreateScreen(display, DefaultScreen(display)); +mainwindow= makeMainwindow(display, screen) ; + +menu=makeMenus(screen,menu,submenu); + +Mainmenu.window=mainwindow; +Mainmenu.menu=menu; +menubutton=makeButtonsTop(mainwindow, &Mainmenu); + +WMMapSubwidgets(mainwindow); +WMMapWidget(mainwindow); + +WMScreenMainLoop(screen); +return 0; +} diff --git a/WINGs_tutorial/SecondWindow.c b/WINGs_tutorial/SecondWindow.c new file mode 100644 index 0000000..db31b4b --- /dev/null +++ b/WINGs_tutorial/SecondWindow.c @@ -0,0 +1,34 @@ +void closeAll(WMWidget *self,void *data){ + fprintf(stderr,"I've been used!\n"); + WMDestroyWidget(self); + exit(0); +} + +int main (int argc, char **argv){ + + Display *display; + WMScreen *screen; + + WMWindow *win; + WMColor *color; + + WMInitializeApplication("SecondWin", &argc, argv); + + if (!(display = XOpenDisplay(""))){ + fprintf(stderr, "cannot open display\n"); + exit(1); + } + screen = WMCreateScreen(display, DefaultScreen(display)); + + win = WMCreateWindow(screen, ""); + WMSetWindowCloseAction(win, closeAll, NULL); + color = WMCreateRGBColor(screen,124<<9,206<<8,162<<8, False); + WMSetWidgetBackgroundColor((WMWidget *)win, color); + + WMMapWidget(win); + WMRealizeWidget(win); + + WMScreenMainLoop(screen); + +return 0; +} diff --git a/WINGs_tutorial/SeventhWindow.c b/WINGs_tutorial/SeventhWindow.c new file mode 100644 index 0000000..75a4b54 --- /dev/null +++ b/WINGs_tutorial/SeventhWindow.c @@ -0,0 +1,100 @@ +#include +#include + +#define HOFF 40 +#define VOFF 160 +#define WINWIDTH 180 +#define WINHEIGHT 300 + +Display *display; +WMScreen *screen; +WMPixmap* pixmap; + +struct _pict{ + Drawable dwin; + XSegment segments[40]; + int seglen; + } pic; + +GC gc, g3; + +void closeAction(WMWidget *self,void *data){ + WMDestroyWidget(self); + exit(0); +} + +void drawProcedure(XEvent *event, void *data){ + + WMDrawPixmap(pixmap, ((struct _pict*)data)->dwin,HOFF,30); + XDrawRectangle(display,((struct _pict*)data)->dwin,g3, HOFF,VOFF,100,100); + XFillRectangle(screen->display, ((struct _pict*)data)->dwin , WMColorGC(screen->white), HOFF, VOFF, 100, 100); + XDrawSegments(display, ((struct _pict*)data)->dwin, WMColorGC(screen->black), ((struct _pict*)data)->segments, ((struct _pict*)data)->seglen); + XFlush(display); + return; +} + + +int main (int argc, char **argv){ +int i,j; +WMColor *color; +WMWindow * win; +RImage *image; +struct _pict pict; +Drawable de; + +RColor one, two={0xaf, 0x0f,0xff,0x33}; +one.red=247; +one.green=251; +one.blue=107; +one.alpha=0xff; + + +WMInitializeApplication("DrawWin", &argc, argv); +display = XOpenDisplay(""); +screen = WMCreateScreen(display, DefaultScreen(display)); +win = WMCreateWindow(screen, ""); +WMResizeWidget(win, WINWIDTH, WINHEIGHT); +WMSetWindowCloseAction(win, closeAction, NULL); +WMSetWindowTitle(win,"Graphics"); +color = WMCreateRGBColor(screen,124<<9,206<<8,162<<8, False); +WMSetWidgetBackgroundColor((WMWidget *)win, color); + /* end setup main window */ + +image=RCreateImage( 100,100,0.5); +RFillImage(image, &two); +RDrawLine(image, 50,10,90,90,&one); +RDrawLine(image, 10,90,50,10,&one); +RDrawLine(image, 10,90,90,90,&one); + +g3=WMColorGC(screen->gray); +XSetLineAttributes(display,g3,3,LineSolid,CapButt,JoinMiter); + +pict.segments[1].x1= pict.segments[0].x1=HOFF; +pict.segments[0].x2=HOFF; +pict.segments[0].y1=VOFF; +pict.segments[1].y2= pict.segments[0].y2=VOFF; +pict.segments[1].x2= HOFF+10; +pict.segments[1].y1=VOFF+10; +pict.seglen=2; +for (i=9;i>0;i--){ + j=2*(10-i); + pict.segments[j+1].x1= pict.segments[j].x1=HOFF; + pict.segments[j+1].y2= pict.segments[j].y2=VOFF; + pict.segments[j].x2= i+pict.segments[j-1].x2; + pict.segments[j].y1=i+pict.segments[j-1].y1; + pict.segments[j+1].x2= i+pict.segments[j].x2; + pict.segments[j+1].y1=i+pict.segments[j].y1; + pict.seglen+=2; +}; + + +WMRealizeWidget(win); + +pict.dwin=W_VIEW_DRAWABLE(WMWidgetView(win)); +pixmap=WMCreatePixmapFromRImage(screen, image,1); + +WMCreateEventHandler(WMWidgetView(win), ExposureMask,drawProcedure,&pict); + +WMMapWidget(win); +WMScreenMainLoop(screen); +} diff --git a/WINGs_tutorial/SixthWindow.c b/WINGs_tutorial/SixthWindow.c new file mode 100644 index 0000000..7e24581 --- /dev/null +++ b/WINGs_tutorial/SixthWindow.c @@ -0,0 +1,58 @@ +#include +#include + +#define WINWIDTH 200 +#define WINHEIGHT 300 + +Display *display; +WMScreen *screen; +WMPixmap* pixmap; + +void closeAction(WMWidget *self,void *data){ + WMDestroyWidget(self); + exit(0); +} + +void drawProcedure(XEvent *event, void *data){ + WMDrawPixmap(pixmap, W_VIEW_DRAWABLE(WMWidgetView(data)),30,30);XFlush(display); +} + + +int main (int argc, char **argv){ +WMColor *color; +WMWindow * win; +RImage *image; + +RColor one, two={0xaf, 0x0f,0xff,0x33}; +one.red=0x20; +one.green=0x20; +one.blue=0x20; +one.alpha=0xff; + + +WMInitializeApplication("DrawWin", &argc, argv); +display = XOpenDisplay(""); +screen = WMCreateScreen(display, DefaultScreen(display)); +win = WMCreateWindow(screen, ""); +WMResizeWidget(win, WINWIDTH, WINHEIGHT); +WMSetWindowCloseAction(win, closeAction, NULL); +WMSetWindowTitle(win,"Graphics"); +color = WMCreateRGBColor(screen,124<<9,206<<8,162<<8, False); +WMSetWidgetBackgroundColor((WMWidget *)win, color); + /* end setup main window */ + + +image=RCreateImage( 100,100,.8); +RFillImage(image, &two); +RDrawLine(image, 50,10,90,90,&one); +RDrawLine(image, 10,90,50,10,&one); +RDrawLine(image, 10,90,90,90,&one); + +WMRealizeWidget(win); + +pixmap=WMCreatePixmapFromRImage(screen, image,1); +WMCreateEventHandler(WMWidgetView(win), ExposureMask,drawProcedure,win); + +WMMapWidget(win); +WMScreenMainLoop(screen); +} diff --git a/WINGs_tutorial/ThirdWindow.c b/WINGs_tutorial/ThirdWindow.c new file mode 100644 index 0000000..218ebfe --- /dev/null +++ b/WINGs_tutorial/ThirdWindow.c @@ -0,0 +1,46 @@ +void closeAll(WMWidget *self,void *data){ + fprintf(stderr, "I've been used!\n"); + WMDestroyWidget(self); + exit(0); +} + +static void +handleEvents(XEvent *event, void *data) +{ + WMWidget *widget = (WMWidget*)data; + switch (event->type) { + case ButtonPress: + closeAll(widget,NULL); + break; + } +} + +int main (int argc, char **argv){ + + Display *display; + WMScreen *screen; + + WMWindow *win; + WMColor *color; + + WMInitializeApplication("ThirdWindow", &argc, argv); + + if (!(display = XOpenDisplay(""))){ + fprintf(stderr,"error: cannot open display\n"); + exit(1); + } + screen = WMCreateScreen(display, DefaultScreen(display)); + + win = WMCreateWindow(screen, ""); + WMSetWindowCloseAction(win, closeAll, NULL); + WMCreateEventHandler(WMWidgetView(win), ButtonPressMask,handleEvents, win); + color = WMCreateRGBColor(screen, 124<<9,206<<8,162<<8, False); + WMSetWidgetBackgroundColor((WMWidget *)win, color); + + WMMapWidget(win); + WMRealizeWidget(win); + + WMScreenMainLoop(screen); + +return 0; +} diff --git a/WINGs_tutorial/WINGGraphics.html b/WINGs_tutorial/WINGGraphics.html new file mode 100644 index 0000000..7edd5f1 --- /dev/null +++ b/WINGs_tutorial/WINGGraphics.html @@ -0,0 +1,119 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + + +
LAST: Programming Details 1ContentsNEXT: Programming Details 3
+ +

Drawing procedures

+ +
The drawable
+

The WINGs library has functions to directly draw an image in a label, button or slider. To write to other widgets, there is a function WMDrawPixmap (WMPixmap *pixmap, Drawable d, int x, int y). The pixmap can be written to any XLib variable of type Drawable, at position (x,y). This section shows how it is done to a window. The drawable is retrieved from the widget's view structure by the macro W_VIEW_DRAWABLE(WMView). You only call this macro after the widget has been WMRealizeWidgeted, or there simply will not be a drawable in it. To use it,#include <WINGs/WINGsP.h>. +

Images can be created from within the code itself. The WINGs/wraster library creates a structure for it, by the call RCreateImage, and there are a few functions to draw a line or segments in it. You would only use this if you like to store the image in memory for some reason. These functions use a colour structure RColor. There is a conversion function from a WMColor, but the RColor is a simple structure with four unsigned long members which are the RGB and alpha values. This example shows how a picture is drawn directly into a window, by the defined function drawProcedure. This function is called by associating Expose events to it, by using WMCreateEventHandler on the window's view: +


+void drawProcedure(XEvent *event, void *data){
+ WMDrawPixmap(pixmap, W_VIEW_DRAWABLE(WMWidgetView(data)),30,30);XFlush(display);
+}
+int main (){
+   /*  code   */
+WMCreateEventHandler(WMWidgetView(win), ExposureMask,drawProcedure,win);
+  /*  */ }
+

+ Try to comment out the line with the event handler function, and to call WMDrawPixmap(pixmap, W_VIEW_DRAWABLE(WMWidgetView(win)),30,30) directly from main. It won't work. When the WMScreenMainLoop starts up, there will be an Expose event. The window will react to the event by drawing itself, as specified in the WINGslib routines, but there won't be another call to WMDrawPixmap, unless you programme it yourself. + +

Xlib graphics functions
+

The Xlib library itself offers more possibilities to draw in a widget, like drawing curves. The Xlib functions write to the drawable, like WMDrawPixmap. Xlib functions need the Xlib GC type graphics contexts. You keep different graphics contexts at a time to switch drawing styles. The WMColorGC macro creates one from a WMColor structure, which will give you the color you used as an argument. In the example, the line width in this graphics context is set to 3 instead of one with the function XSetLineAttributes. You'll get this line width whenever you use XMColorGC(screen->gray) from that point on. The next lines are drawn with default line width. The example is here. + +

Useful Xlib functions and structures are +

    +
  • int XDrawRectangle(Display *display, Drawable d, GC gc, + int x, int y, unsigned int width, unsigned int + height)
  • + int XDrawLines(Display *display, Drawable d, GC gc, XPoint + *points, int npoints, int mode)
  • + + int XDrawSegments(Display *display, Drawable d, GC gc, + XSegment *segments, int nsegments)
  • + + int XDrawArc(Display *display, Drawable d, GC gc, int x, + int y, unsigned int width, unsigned int height, int + angle1, int angle2)
  • + int XDrawArcs(Display *display, Drawable d, GC gc, XArc + *arcs, int narcs)
  • + int XDrawPoint(Display *display, Drawable d, GC gc, int x, + int y)
  • + + int XDrawPoints(Display *display, Drawable d, GC gc, + XPoint *points, int npoints, int mode)
  • + + GC XCreateGC(Display *display, Drawable d, unsigned long + valuemask, XGCValues *values)
  • + int XFillArc(Display *display, Drawable d, GC gc, int x, + int y, unsigned int width, unsigned int height, int + angle1, int angle2)
  • + int XFillPolygon(Display *display, Drawable d, GC gc, + XPoint *points, int npoints, int shape, int mode)
  • + + + typedef struct { + short x1, y1, x2, y2; + } XSegment
  • + + typedef struct { + short x, y; + } XPoint
  • + + + typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; /* Degrees * 64 */ + } XArc +
+

The XFree XLib man pages are here in 2010. + + +

An OpenGL drawing area
+

Just like the Xlib functions, we can use a drawable for drawing 3 dimensional images with the OpenGL/Mesa GL libraries. This section will show how to use a WINGs frame for this. The application shall have a GL-window and one button which allows the user to turn the object in the frame. +

We realize a widget "glframe" of type WMFrame as usual, and get the drawable (win of type Window) out of its view with +

win =W_VIEW_DRAWABLE(WMWidgetView(glframe));
+To set up the variables needed to use the MesaGL library, we use the glX library. We shall also change some properties of the X-window win. We can retrieve the necessary information for both by way of an RContext, but what we need is so simple, that we shall use Xlib functions to get it directly. +
Window win;
+XVisualInfo	*xvVisualInfo;
+Colormap	usColorMap;
+XSetWindowAttributes 	winAttr;
+GLXContext       glXContext;
+int Attributes[] = {	GLX_RGBA,
+		GLX_RED_SIZE, 8,
+		GLX_GREEN_SIZE, 8,
+		GLX_BLUE_SIZE, 8,
+		GLX_DEPTH_SIZE, 16,
+		GLX_DOUBLEBUFFER,
+		None};
+xvVisualInfo = glXChooseVisual(display, DefaultScreen(display), Attributes);
+cmColorMap = XCreateColormap(display,RootWindow(display, DefaultScreen(display)), usVisualInfo->visual, AllocNone);
+winAttr.colormap = usColorMap;
+winAttr.border_pixel = 0;
+winAttr.background_pixel = 0;
+winAttr.event_mask = ExposureMask | ButtonPressMask  |StructureNotifyMask| KeyPressMask;
+
+XChangeWindowAttributes(display,win,CWBorderPixel | CWColormap | CWEventMask,&winAttr);
+glXContext = glXCreateContext(display, xvVisualInfo, None, True);
+glXMakeCurrent(display, win, glXContext);
+

The first thing to get, is an X XVisualInfo structure for the colour properties we need (8 bits for a colour) and depth size. The glX library has the
glXChooseVisual(Display *display, int screen, int * attributes)
function for that. We use these data to create a colormap,with the Xlib function
XCreateColormap(Display *display, Window win, Visual *visual, int alloc).
We then make an Xlib structure XSetWindowAttributes, to which we add the colormap as a member .colormap, and to which we set a member .event_mask by ORing the necessary masks. This structure, finally, can be used to set the window's properties with
int XChangeWindowAttributes(Display *display, Window win, unsigned long valuemask, XSetWindowAttributes *attributes).
Having done this, we collect the "environment variables" for OpenGL with the glX function
GLXContext glXCreateContext( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ).
Finally we select the glframe's drawable win as the window OpenGl shall write to, by
Bool glXMakeCurrent( Display *display, GLXDrawable win, GLXContext ctx ).
The frame's window Window win can now be used in the GL-call void glXSwapBuffers( Display *display, GLXDrawable win ). +

The source code is in the file glframe.c. You need to have MesaGL installed, and the glx library. To compile, use gcc -x c glframe.c -lXft -L/usr/X11/lib -L/usr/lib -lWINGs -lwraster -lOSMesa -lm -o glframe. If the compiler does not find the glx library, you could add -L/usr/X11/lib/modules/extensions -lglx, if that is where your library is. + + + +
+

+

LAST: Programming Details 1ContentsNEXT: Programming Details 3
+ + + \ No newline at end of file diff --git a/WINGs_tutorial/WINGGraphics_files/glframe.jpeg b/WINGs_tutorial/WINGGraphics_files/glframe.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7a63c001b771494454548339f9230b867eaa2ab1 GIT binary patch literal 8977 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 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGGraphics_files/seventh2.jpeg b/WINGs_tutorial/WINGGraphics_files/seventh2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..37c4d24b9afd07a71e6c02d921adbe7b2bbc8966 GIT binary patch literal 11704 zcmd^l2Q-}By71^il+mMwF**r?h-ec=8HO0fL=Qo<(QC9Mh!&zpCt6~3VRXKz5k&7T zN^}v?qg~%U=Y(_rv;Oma|2g-rb=SXV&8%nEe&4;H-u6BlJ^KQngej^h0&s9}0Lted zz}YN-4(efL0RX_^06qW!Kz#l^A7>K)c>n<(K0ZDk!TApX0RbV=Rbry^K|xA-p1X9y6(^Jzh(gJ}D>)cVan4!*%m5q!F5d5C{2GMBcmzcFS8&f~H7Ef%c<0ks zNJxkY@CeQy!NtMD2M`bfsfdWF>DX^0UCRe(Xz7K;wRK|S`WZkRU`{be{QE&J5ls`* zn9{ym@(Rx@L>*o3ANPo}%!C`HSM=kJkUccAh*ES5kjEzzoD-Sr3F7iIy-&MD zKDU-q2eAtS5i*Gz#SYj}5V3KY<_6~_-AWI!=?mS$uN64ZS#xcq2yiIZPdU`T$_-cf zsFoOYtvnl+t$@Mg&ljGKZaS6TSmu$4aJH?yvBuae_T8M8iP{Zc9!!HoLb_fH454mT zSkspK@tE!i=AX()17<6hx=LoIYW+;qnT)(U$xbFJ_h=b&a5(?m#HigKqjkdEdcD1j3TRpyO;K|>r-on1(Oe*AsKv0Z-e=x2ArQLh zy;1mxv=&>NTHTpqwFwco2yhpLnGuw6(o@eZcM+?Qigi=xtzWm0Kv8TY^@NmkR_5OA z4*zz5Q1E)0o4v2Ti;jH6rp##Lb%KBr$e)-Ubi8Juee_}^U8LF1ZQ~?R0`0jiaC_fw zW)$TzHr??Z-f8K@S2H{2o?F1s*?2Fis7pSPJ#9`Y0Iu1l5;&Yh4-wa+rRU)6m+#q& z^DiOCYhr*_3!2(AaJD=^=Z`f^E`plErik@FW?6T>Sd62+2RBKJ)z%(~#38*P@RCSw zOt2C(Kd@-VUGaau%rR>|9Dm8>P{jI}TGqpIBSxTD z6g<_&pU7WG70m}&Acom&L5W1V#6Y8DH6~$%ZF`0xtfNzT$;tF%{Q?K^J7rBa@!}|$ zU_B6se8VZtr<4fFc!Nn4%_K0Yp3X6HD2Pj>>K%J8DT&ik-WF;ZKw%LI7w3Cd%}rHg zpaL6F{GsD_>SEmN8%uZwU>z%_+7w!VR%rOdl#TCHO**q1WGF#9G)1;@?B349b9+)j zF6&|zaW_=6w>Rsbp>yYRRTHmKwRVLdkw{cH(t2_|>+vXwU8h4zM*;_#O7uxIQ?b-W zp8xHu2?QXJX7~AHNK`w*p0M`L4jzdYt8BFvi%Kc27JkOK^ryJt`xUc3XMpSao0Ss= z^=E(@5KgjN%gX_@NH`Yv=_oNE>>+P72*frl;AK&#TGt#!Hzd8M-f7c6@7NXS^o)g` zQ=zjh&exl9eW~{<@4Cn7SE&ooSMTMR*yFpFhdm!AAzdh0ZRaB`|0@54BHwpQd&OC- zWNyyOgfx3neoko@V0@N1G-V@eNtVcwNZ8;+vu8t{e2(0-`e#=9c*9E%v9X>E2CdPp zlTVkx^L^-?v7urwgx!XOz7|cOu`S;7dS)s4rs~b>aGo1cSAatHWoDnvaCLDrt>H#u z$hTL;E6)HOhbm3!82L2~i8BDj8K8aDkIcyUf>9b5psHpv=(Ag&T91{NcD1RRuuCi5 z>rG(E?)psuMZ30^d))2|o`XtyCdBUj-KuQ?x>RrYI4v5``Zhlt^XB-O?_lYYYP)Ja z1kru|B;MJNpUmN|3KC&a43YP7Q7%Io^dYV1FVS-e{2OUOTQ7#!nHe@UyyqQIHAkI0 z%GaItb-d01YvMJ#7LCREH{bL9=JDE^!bGQ}SigEKIcY&ih;ERhW?Nw% zFB=bR8%O}96)}>mzr^xO;9t0(`C`s%xUZBpLOOKT)+brblT(0gq5v)zQ5>1UpFQdJ zRBb1e1PH=#S%wDZr#${|lIB^Z0lAa$DzvmT%1FvGkb>yPK;km(!Rndx z3kCTQ%65WC+;#1fu` z@U9&RXm0IpzetG4SEwFFpqS))Wp=#1k^S`BUl1k>w%>rskzt=v;C-+@ju>$$CViq} zvAcM(dI4cX-(vDKg5CQFBD!+~-G9COcgsA%#2y6sQ2uu;vNKWaW)ri}TC-`NupCiA z2=))~PvY_f71LR#_%&dlF7=-q^wpLJjukP6x0hG-!Xv{(M?WJ?QHV_DTQvIY@~Esb zmLIV>-U*?+u=}(}?tWmMqV&i4A9HTI|A1Pr>^-RqMgF`iTo)vpCW&po1Nu;pLzEu~ zTjjkZ_&}q zmC+gzw>RHQf{4Y<`5{<>=v`!C=+61Z>{@m1_f9KBSu_-l>6EW#M89zi3zy_gD=$>1 zHIHAA_DC48Yr#I3Dy-tkIQmpA+Ml^a1$2yD3@!A>q*xg-?DKXRPSggxrt@;5Qf^pk z=X532$r(z^>3Q`^>U8{-_{aB-$VfvJ{VPG`;!nX9&enBFnjMS+jox>_ zCQO5)<|lEr3HNKg_oB7s2J`Em@x8g7v{mF!ZIAexuUJf#V{IK<=hhxD8b0vGDYx7Z z78as)Z|;uXf|Jhk*c@j@+WvjXL-egIjV;C^E5n=4#qk4@qGtdgX4^pMl>Bj-D|h|W ziIR5?uW=W5^tn0w>lVQGZa!VGxSo?^i=@!?lD-f5(0Wa_o6CF+Wj(417vqH;IW80M z>ZkB^3VwXDC7e4Ig2wmMchH3F$2nQ$KBveIlepe-+oG>^jciJVRY-y&|xB zgrFIg@l_S?) zNv-5n%?D&F!m2TtVn$5y#Dg`FNIHD5O?;&}ayUQS9TkJn4w`3rKK`1wzTAiVVWNf6 z?YXt8dnZ33cQa&K=4}bOhCC|6L5ZoB`O-B8VLnY#2NCv8k0fu3JkfMX!0;5Qw$xds zN$$`6bD6o$o=%&aY#WEms4sCHeN03;45_^>`B{E*M&tAZ4(EksI)$!yrFvr%``#Xe zqeP2dSC4dBr84>j4|x_b_z~S2lZ=`EcAC|Ih%H{E?l@On0^g~b4%+;;W2--S;Zw&^ zdNn?2#h^Ifh%S5fo~4MwOZIWuF}_h~$VvE%U!>J`?1>+lj*dDA)TzNl-1#wn)Q^y* z%wKH?t^f9@EZwPe`DK^KaY6rKnDrkAa+d$?z?Qny$LuZH%gqzxC?hHUI!U9h8 z5BT8`UplL!YbQSv5-z^3YRU0w;&~`VU49Il?hk-Ee;d8-EVdWBwr-8 zotrx!K^1k4ZxMs3v&J-{)!n~wMb(XZjFjhv+y;%D0pNy2R7V>5_s;V%sjDtId?BCs zy)1vKe-P=avu_=72t3+(?k?vO(l$z(h}p7dgx-?u)A4etraKDo++vD}5`+zu{ z`foGR*>RL&e47tp@8FAdHW@7wgVol3`7L>RNeizdM!zQmYg}$<4~OMxI`UZ>D6JVp zz`}L{WNEIVW{mZ3xT{a+(x_2h0vja^<7Vz z+;6AKg@!Ucs3=&YlEv-FrR{c|OVI`@ey4+uY?)ZvfDd&)(-_fp_Z=@x2OfIi;PMTT zO3a67pB3Kg!N^@>sL{Ugm`1f}P{X$@I80}Wq^#44wNA~d(o`S9sxwJ*-{-4Al9i@M z2yxX%XQ_g(EO9;!e@O&M2(fpV&K1&BUvoo?8yMOJZQZua{@QN?!h3j1zJEo-~vml!FiCPd?*|j~*WpL853Bkc>F!Xyaj@l@2O;jeur4sAZ zFT<=M+iLSW^7!Pp!atx@V-c}M9i`_nd3szXrbO-iO{Oi^Np{~8w$$G1rjA(LMe92K zwkWmF<;b+D8_~cRdTe<#6DQ(mU*KzQL)Bp8_uqJ7)Xn z5^X_F-7%-v9;jN{R8 z*LAEw`%T|vR^O!B%Jf*vzk}2F#)}~(VZ2ea!zk%B2d1qM3FiWd86=b~A0M|oyyWWc zmHu;a=GOl5l4-LFZtY)=TNGF9pq~=9GFP-90+{EBz-QZHLI8El@5CkeaOG&NF@H1*f z!sjieL1FyMHy?<(${+gSs9gQpbGNhlOFI4o7@zrv%?C z)2IDXW*%$c9_aUM%6_(gU;N~h(Ls-6XfsH!2>HNDZ#P!Q7p_yGJ|F3TSz5&2G-+PX zYsybg8m$kaC@X6GVod6JvUJ$J=kon#VBP8V@#2wW&l)RrDAq!T%@v7I%_X`-aEL{@Hy=QiD4<4)9f>VD07YKRe^VHcVRqA4i^a2mw6O~iTJ1+4(jvs$*qdkl4>9#d$4jMxlUts6)YX#W{-?e_m z9QQh{2&T=4PHnoA7PxVI`UbJMlZc(Pv~8#1fZRhWwrC>n6NUSkYA;=6ItdqO*b5o; z6pSL4H`=DSzN{4q6<}n(P_7`TdV;lH3By*jyhYz|^a*F@0QHKX3JPcyy+WH^1E0st zEyuMPHB6$%AwImYgKGTq%7K6H!bx9v?))9MN1o(GK@R2>`x|(YYArP3*KokFWX?epZSGL(yzz*Uh@33} zQkw~_?d24ml3C}f?P_7+5n77UUCeossk`yu$;e$Q)4h$U0S>R32N6xxtRmL^gO(c^ zt1g4D)U(NU=fMg<_)6|@K3KfAm~O60XH8zPP0S82w70!dQSD^}1hjlRj)0~|jId8s z9Fsg>>@HB0?w&YQUL$>~6dxB&i=C35YptvT+DiE1sY_D{yigRTv@}F4S}XKQ(!^eq zilm;eNnVVM2t-$Ec$A{Q;p>xMe>(6=A&fohr2-?pc6CyeD0v_!p#~WL;9KrtHb=qv z`U$@;uPBLHs@_mPO_=LkpL!FTOf z#KC3Q$&U0}SLVX9d(3%+?q53$u$ z&L#Hh*C&4-71o$NWNPP@)e_4qy5$J{;GOC=iT(^PYpqq^3dzRe%vgN14*!f%yRZ%kSG zyGww-L!zHeGWZgD##S$oJfF|6FH#PSen*X_0;ojSSP@Z;c0InE@>^DUakIr&=J54& z5%L2AMl}9liU?b{9hyKbjsQUH6i`;J|UjFbeH*ghSLi?I!SdRtW&AD$X zWNlH@34u^YTEl8wg0W%Qa+HuSPq-HnIJ+4@7b~{;}qNkl3D@n2# zqc9*Gn#`O?P>dr{iOK}k!B+?8GC3Z?MjiQ!q>VzCzHM>#8%&)N712Cq_9#ue#f5Gr zc*`0@w(sv*e(TNsX_xI@1Px8(BvjK@I~lEw9AW*iyR;(1{ga<;qQR4dW;3eC>tIFP zlvPjkYaupFa1-pwo02W^q+_E+yKz z(kD|v4{IidCv3XXPS`grUp5@^By|jlk#AGwfZ@LDuz?V`{|;RcXM)Y}V&O*o zev7m-G1LoLyzpvPl?mGLsxSU0^gk=4;UK~`Y0Er+?nu+XIcFQa!t|;O(kepda zHhh!q6|-i`VF^*{GpZ2>f5H`U>8KF?CT96}q3C|o$a2lB807#BAe)FnKi7VwQUuSO z_ry5?mG##~O!Wm{lX}xWnLzuPFPu!YSnf#vT&MVSXn3KQ zEwM%s7s!Ttg%{5hG$tNGn!Z8A(ArFC0Z*1*-Yi+E=F=+XC@$H0BjU%BN#o`mJXWUI z2PhXzQO@oayJ6tg>-f?@n9ywO{dB|;d2)1)1 zI3D6_d!(J;=<(scGL!N+w6fZ)t)uHs5DR3$h6Uu$z6Am5!q~>yGJ?z5MuWw}%Lf3r zW!HVZkFv?K(V&URvPWi%%*_!QD-{t@kjR6K;DQ`VH06B-JxW^zCdF~9i1zaId~`i{ zWQQ+yP~S>cXX1%U@iH>_HO=JRWvdk!Dps23JRbh*Ay8LfD<$13$g4HGyOLrofoQJ9 z=Zj*8F3pW^(Yh=BlCI_BMRLIr>7Oha4%Rr+ZpCZ}ZF-a^VrP$T0gfNMsv{ob2L(>` zt4d2MsbiCoAA!JuLpUC5J#Ej_oN9J;?J))FkC^xO?&ztGs8){xqe_#}8`xd!_%?T= zvX>sm&4y20Wv*~}kMJC26}j_54Pf#otoIKaT9N7>HeYw5{?g6#a_XxYWk1ZIXaCn6}!9=oks2l$WMuPXeH zni?_wnBZ?_1`b9;4V6yj$yr?Xl3R>;DE%0@=N2mr#0pP|!P#WNVP@mt8-C@?kLa&L z62)!zvl^On7xL8WA{v_80y>V}f;GoJb69jRDd6^E9YHa2gVl}`kTzk5mTNHh(8e8y6o?15BO)N)NZcMT$q2huJ%IgvTT}lS}&N z4ogA_<>#J*%3>kq5D3r`Qc8(tvdR@O=au6V{2ww+odIaF z8~8wjK?L=%+59B0G>KJ17~#8O{)g?WjY2Zvm3pOIT!%Zq0m6gOlnt8qJ8~3sdduH@ zax53)CRG+0F71L`_Z;6r$-0N!h+f?ME{*u3A?tro=Z88>mL4ipOtO8bfxj{{g?$gA zTm>b&BxDQHST6LlQ@1EzjS>y1UjWXBN~DW__!Hqp*|XEDFV&5+Y|NqZ1F8@^GDtWT z_>hfKpc;n%v}lZmq?V%+L;wdnGyh zAv+a-Ejm&hBp72E`ScIRtfiwrqsJ_N%0w2J()VO#eEJFd#iP*QbcM^D$xYhtyNtIh zXMFU&ub_hn77ykD2@;Eg$gi8< z_jfX5b8w6+f1N^TT^vmqXT4|o=zKVzf9b#}Gx<`1rg<~Zf@P2+osPEoNo&g4dYk+w;}b;OR|?p_rM-xvY-ea2dm(tUTX(&kjyT0h+dajV;TDy- z`+EdEOZ*qCZC(g&Ia#doLT`nLf$xk#m_?PK6bRO?55;~?Ill7wyVGbVY{BDs=<^t6 zEin|B5<8tTq*+SX;-olE$k%75&{XK^5o1M{Ut$gSCG2!QZC~oCksDX+7p(8(5?43r zl2|2Aey~DwjUtpd^phrG9|1n}4PgtU9G#m`8b>!VQSVx|jacpEFcOs`rF zuf-@#4o`tR1Aq_(Z6i_SNku{w)AOqC<`?VWmh*F$cxlRiOO^4DZxWpM;C{bjP(1PL z76I?Y)q>)_vG9dE$6G_#i<2Bp_@$O1&+EbWZ~LHvGRwq&dGb)vgy< ztpGhH(I83zhd{C$lu%MGyjP&efb>0W=*hb{?#=Zy)0ho@zeVeUhZ_xF*2IDD^*HtI z+m0EoD!L?_gzO{O z%wZDe9;`|*Clr>rl#Tdm-&ID-*>U&nI*`+NGPKcLXC}anXt4mgy1rNb$iUR>k0n7%J?^m7M~^sh@T%^2+pAo?7JFH{HeC)&cFhdFgp`l*o#i z-b6jF$Vmk_9kfROVw%+jc0=d`rH8)OEk;E>HX0X%zRw^xW+*c}iRnW4Po+GeXir}%Z3@oTmvInI_m{5 z_wmon?Fov4nSCUy&Fei^z=$MU2$abI2~_BC?iyG>DK8r2fd@>|ElBp6*6^34_??aY E2eS)gS^xk5 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib.html b/WINGs_tutorial/WINGLib.html new file mode 100644 index 0000000..000bc9d --- /dev/null +++ b/WINGs_tutorial/WINGLib.html @@ -0,0 +1,1188 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + +
LAST: Programming Details 3Contents
+ + +

Library description: List of Widgets and Sample Code

+

This section lists the prototypes of all the WINGs and a few libwraster functions, some of them with a coding example. + +

General widgets
+
    +
  • void WMDestroyWidget (WMWidget *widget) +
  • void WMMapWidget (WMWidget *w) +
  • void WMMoveWidget (WMWidget *w, int x, int y) +
  • void WMRealizeWidget (WMWidget *w) +
  • void WMRedisplayWidget (WMWidget *w) +
  • void WMResizeWidget (WMWidget *w, unsigned int width, unsigned int height) +
  • void WMSetWidgetBackgroundColor (WMWidget *w, WMColor *color) +
  • void WMUnmapWidget (WMWidget *w) +
  • void WMUnmapSubwidgets (WMWidget *w) +
  • unsigned int WMWidgetHeight (WMWidget *w) +
  • unsigned int WMWidgetWidth (WMWidget *w) +
  • Bool WMWidgetIsMapped (WMWidget *w) +
  • WMWidget * WMWidgetOfView (WMView *view) +
  • WMScreen * WMWidgetScreen (WMWidget *w) +
    +
  • void WMLowerWidget (WMWidget *w) +
  • void WMRaiseWidget (WMWidget *w) +
  • void WMReparentWidget (WMWidget *w, WMWidget *newParent, int x, int y) +
  • void WMSetFocusToWidget (WMWidget *widget) +
  • void WMSetWidgetDefaultBoldFont (WMScreen *scr, WMFont *font) +
  • void WMSetWidgetDefaultFont (WMScreen *scr, WMFont *font) +
  • Window WMWidgetXID (WMWidget *w) +
  • WMColor * WMGetWidgetBackgroundColor (WMWidget *w) +
+
Frames
+A frame can be used to group widgets. When moving widgets, their position will be calculated with respect to the upper left corner of their parent frame. A frame has a WMView. Title position definitions are here. WMReliefType WMFlat will make the frame's border invisible. +
  • WMFrame * WMCreateFrame (WMWidget *parent) +
  • void WMSetFrameTitle (WMFrame *fPtr, char *title) +
  • void WMSetFrameTitlePosition (WMFrame *fPtr, + WMTitlePosition position) +
  • void WMSetFrameRelief (WMFrame *fPtr, + WMReliefType relief) +
+ + +
Panels
+
    +
  • WMWindow * WMCreatePanelForWindow (WMWindow *owner, char *name) +
  • WMWindow * WMCreatePanelWithStyleForWindow (WMWindow *owner, char *name, int style) +
  • WMGenericPanel * WMCreateGenericPanel (WMScreen *scrPtr, WMWindow *owner, char *title, char *defaultButton, char *alternateButton) +
  • void WMDestroyGenericPanel (WMGenericPanel *panel) +
  • void WMChangePanelOwner (WMWindow *win, WMWindow *newOwner) +
+ +
Windows
+
    + +
  • WMWindow * WMCreateWindow (WMScreen *screen, char *name) +
  • WMWindow * WMCreateWindowWithStyle (WMScreen *screen, char *name, int style) +
  • void WMCloseWindow (WMWindow *win) +
  • void WMSetWindowCloseAction (WMWindow *win, WMAction *action, void *clientData) +
  • void WMSetWindowAspectRatio (WMWindow *win, int minX, int minY, int maxX, int maxY) +
  • void WMSetWindowBaseSize (WMWindow *win, unsigned width, unsigned height) +
  • void WMSetWindowUserPosition (WMWindow *win, int x, int y) +
  • void WMSetWindowInitialPosition (WMWindow *win, int x, int y) +
  • void WMSetWindowMaxSize (WMWindow *win, unsigned width, unsigned height) +
  • void WMSetWindowMinSize (WMWindow *win, unsigned width, unsigned height) +
  • void WMSetWindowMiniwindowPixmap (WMWindow *win, WMPixmap *pixmap) +
  • void WMSetWindowMiniwindowTitle (WMWindow *win, char *title) +
  • void WMSetWindowLevel (WMWindow *win, int level) +
  • void WMSetWindowResizeIncrements (WMWindow *win, unsigned wIncr, unsigned hIncr) +
  • void WMSetWindowTitle (WMWindow *win, char *title) +
  • void WMSetWindowDocumentEdited (WMWindow *win, Bool flag) +
+ + + +
Views
+
    +
  • WMPoint WMGetViewPosition (WMView *view) +
  • WMPoint WMGetViewScreenPosition (WMView *view) +
  • WMSize WMGetViewSize (WMView *view) +
  • void WMSetViewExpandsToParent (WMView *view, int leftOffs, int topOffs, int rightOffs, int bottomOffs) +
  • void WMSetViewNotifySizeChanges (WMView *view, Bool flag) +
      +
    • void WMSetViewDragDestinationProcs (WMView *view, WMDragDestinationProcs *procs) +
    • void WMSetViewDragSourceProcs (WMView *view, WMDragSourceProcs *procs) +
    • void WMSetViewNextResponder (WMView *view, WMView *responder)
    • Window WMViewXID (WMView *view) +
    + + +
    Buttons
    + WMButton * WMCreateButton (WMWidget *parent, WMButtonType type) +
  • WMButton * WMCreateCustomButton (WMWidget *parent, int behaviourMask) +
  • void WMGroupButtons (WMButton *bPtr, WMButton *newMember) +
  • void WMSetButtonAction (WMButton *bPtr, WMAction *action, void *clientData) +
  • void WMSetButtonImage (WMButton *bPtr, WMPixmap *image) +
  • void WMSetButtonImageDefault (WMButton *bPtr) +
  • void WMSetButtonImageDimsWhenDisabled (WMButton *bPtr, Bool flag) +
  • void WMSetButtonImagePosition (WMButton *bPtr, WMImagePosition position) +
  • void WMSetButtonText (WMButton *bPtr, char *text) +
  • void WMSetButtonTextAlignment (WMButton *bPtr, WMAlignment alignment) +
  • void WMSetButtonTextColor (WMButton *bPtr, WMColor *color) +
  • void WMSetButtonAltImage (WMButton *bPtr, WMPixmap *image) +
  • void WMSetButtonAltText (WMButton *bPtr, char *text) +
  • void WMSetButtonAltTextColor (WMButton *bPtr, WMColor *color) +
  • void WMSetButtonBordered (WMButton *bPtr, int isBordered) +
  • void WMSetButtonContinuous (WMButton *bPtr, Bool flag) +
  • void WMSetButtonDisabledTextColor (WMButton *bPtr, WMColor *color) +
  • void WMSetButtonFont (WMButton *bPtr, WMFont *font) +
  • void WMSetButtonPeriodicDelay (WMButton *bPtr, float delay, float interval) +
  • void WMSetButtonEnabled (WMButton *bPtr, Bool flag) +
  • void WMSetButtonSelected (WMButton *bPtr, int isSelected) +
  • void WMSetButtonTag (WMButton *bPtr, int tag) +
  • void WMPerformButtonClick (WMButton *bPtr) +
  • int WMGetButtonEnabled (WMButton *bPtr) +
  • int WMGetButtonSelected (WMButton *bPtr) + +

    WMButtonType: WBTMomentaryPush, WBTMomentaryChange,WBTMomentaryLight WBTPushOnPushOff, WBTOnOff, WBToggle, WBTSwitch, WBTRadio + +

    Button boxes
    +
      +
    • WMBox * WMCreateBox (WMWidget *parent) +
    • void WMSetBoxBorderWidth (WMBox *box, unsigned width) +
    • void WMSetBoxHorizontal (WMBox *box, Bool flag) +
    • void WMAddBoxSubview (WMBox *bPtr, WMView *view, Bool expand, Bool fill, int minSize, int maxSize, int space) +
    • void WMRemoveBoxSubview (WMBox *bPtr, WMView *view) +
    • void WMAddBoxSubviewAtEnd (WMBox *bPtr, WMView *view, Bool expand, Bool fill, int minSize, int maxSize, int space) +
    +
    Expanding and pull-down buttons
    +A pop-up button shows a list of buttons when it is clicked. Use the WMSetPopUpButtonPullsDown function with boolean true to make it pull down like a menu. When false, the list will shift, and the current item will be under the mouse pointer.WMAction has been described above. To make the list, you create the first Button, and just use WMAddPopUpButtonItem for the next ones. The numbering starts at 0. You do not need to keep pointers to your labels, as there are functions to get the item number, and,with the item number, the label. The action called is the same for the whole menu list. +
      +
    • WMPopUpButton * WMCreatePopUpButton (WMWidget *parent) +
    • WMMenuItem * WMAddPopUpButtonItem (WMPopUpButton *bPtr, char *title) +
    • WMMenuItem * WMInsertPopUpButtonItem (WMPopUpButton *bPtr, int index, char *title) +
    • void WMRemovePopUpButtonItem (WMPopUpButton *bPtr, int index) +
    • void WMSetPopUpButtonAction (WMPopUpButton *bPtr, WMAction *action, void *clientData) +
    • void WMSetPopUpButtonPullsDown (WMPopUpButton *bPtr, Bool flag) +
    • void WMSetPopUpButtonText (WMPopUpButton *bPtr, char *text) + +
    • Bool WMGetPopUpButtonEnabled (WMPopUpButton *bPtr) +
    • char * WMGetPopUpButtonItem (WMPopUpButton *bPtr, int index) +
    • Bool WMGetPopUpButtonItemEnabled (WMPopUpButton *bPtr, int index) +
    • WMMenuItem * WMGetPopUpButtonMenuItem (WMPopUpButton *bPtr, int index) +
    • int WMGetPopUpButtonNumberOfItems (WMPopUpButton *bPtr) +
    • int WMGetPopUpButtonSelectedItem (WMPopUpButton *bPtr) + +
    • void WMSetPopUpButtonEnabled (WMPopUpButton *bPtr, Bool flag) +
    • void WMSetPopUpButtonItemEnabled (WMPopUpButton *bPtr, int index, Bool flag) +
    • void WMSetPopUpButtonSelectedItem (WMPopUpButton *bPtr, int index) + +
    + +
    Text Fields +
    A text field is a widget in which the user can type text. Setting it to secure will show asterisks instead of the typed in characters. +
      + +
    • WMTextField * WMCreateTextField (WMWidget *parent) +
    • void WMDeleteTextFieldRange (WMTextField *tPtr, WMRange range) +
    • void WMSetTextFieldSecure (WMTextField *tPtr, Bool flag) +
    • void WMSetTextFieldText (WMTextField *tPtr, char *text) +
    • char * WMGetTextFieldText (WMTextField *tPtr) +
    • void WMSetTextFieldBordered (WMTextField *tPtr, Bool bordered) +
    • void WMInsertTextFieldText (WMTextField *tPtr, char *text, int position) +
    • void WMSelectTextFieldRange (WMTextField *tPtr, WMRange range) +
    • void WMSetTextFieldAlignment (WMTextField *tPtr, WMAlignment alignment) +
    • void WMSetTextFieldBeveled (WMTextField *tPtr, Bool flag) +
    • void WMSetTextFieldCursorPosition (WMTextField *tPtr, unsigned int position) +
    • void WMSetTextFieldEditable (WMTextField *tPtr, Bool flag) +
    • Bool WMGetTextFieldEditable (WMTextField *tPtr) +
    • void WMSetTextFieldFont (WMTextField *tPtr, WMFont *font) +
    • WMFont * WMGetTextFieldFont (WMTextField *tPtr) +
    • void WMSetTextFieldNextTextField (WMTextField *tPtr, WMTextField *next) +
    • void WMSetTextFieldPrevTextField (WMTextField *tPtr, WMTextField *prev) +
    • WMTextFieldDelegate * WMGetTextFieldDelegate (WMTextField *tPtr) +
    • void WMSetTextFieldDelegate (WMTextField *tPtr, WMTextFieldDelegate *delegate) + +
    + +
    Labels +
    A label displays text in its parent. WRFlat is the relief type which shows the label without a border. WRSunken and WRSimple are other relief types. +
      +
    • WMLabel * WMCreateLabel (WMWidget *parent) +
    • void WMSetLabelRelief (WMLabel *lPtr, WMReliefType relief) +
    • void WMSetLabelText (WMLabel *lPtr, char *text) +
    • void WMSetLabelTextAlignment (WMLabel *lPtr, WMAlignment alignment) +
    • void WMSetLabelTextColor (WMLabel *lPtr, WMColor *color) +
    • void WMSetLabelWraps (WMLabel *lPtr, Bool flag) +
    • void WMSetLabelFont (WMLabel *lPtr, WMFont *font) +
    • void WMSetLabelImage (WMLabel *lPtr, WMPixmap *image) +
    • void WMSetLabelImagePosition (WMLabel *lPtr, WMImagePosition position) +
    • int WMWidthOfString (WMFont *font, char *text, + int length) +
    • int W_GetTextHeight (WMFont *font, char *text, int width, + int wrap) +
    • WMFont * WMGetLabelFont (WMLabel *lPtr) +
    • WMPixmap * WMGetLabelImage (WMLabel *lPtr) +
    • char * WMGetLabelText (WMLabel *lPtr) +
    • char * WMGetTabViewItemLabel (WMTabViewItem *item) +
    + +
    Sliders +

    +The slider's orientation is set by WMResizeWidgeting it. A continuous slider will pass all the values along the way when it is being changed. +
      +
    • WMSlider * WMCreateSlider (WMWidget *parent) +
    • int WMGetSlider[Max|Min[]Value (WMSlider *slider) +
    • void WMSetSliderAction (WMSlider *slider, + WMAction *action, void *data) +
    • void WMSetSliderContinuous (WMSlider *slider, Bool flag) + +
    • void WMSetSlider[Max|Min|]Value (WMSlider *slider, int value) + +
    • void WMSetSliderKnobThickness (WMSlider *sPtr, + int thickness) +
    • void WMSetSliderImage (WMSlider *sPtr, WMPixmap *pixmap) +
    + + +
    Scrollable views
    +This widget can have two scrollbars to navigate the widget inside of it. +
      +
    • WMScrollView * WMCreateScrollView (WMWidget *parent) +
    • void WMSetScrollViewContentView (WMScrollView *sPtr, WMView *view) +
    • void WMSetScrollViewHasHorizontalScroller (WMScrollView *sPtr, Bool flag) +
    • void WMSetScrollViewHasVerticalScroller (WMScrollView *sPtr, Bool flag) +
    • void WMSetScrollViewLineScroll (WMScrollView *sPtr, int amount) +
    • void WMSetScrollViewPageScroll (WMScrollView *sPtr, int amount) +
    • void WMSetScrollViewRelief (WMScrollView *sPtr, WMReliefType type) +
    • void WMResizeScrollViewContent (WMScrollView *sPtr, unsigned int width, unsigned int height) +
    • void WMScrollViewScrollPoint (WMScrollView *sPtr, WMPoint point) +
    • WMScroller * WMGetScrollViewHorizontalScroller (WMScrollView *sPtr) +
    • WMScroller * WMGetScrollViewVerticalScroller (WMScrollView *sPtr) +
    • WMRect WMGetScrollViewVisibleRect (WMScrollView *sPtr) + +
    + +
    Message pop-up windows +

    A message pop-up window is shown by calling: +int WMRunAlertPanel (WMScreen *scrPtr, WMWindow *owner, char *messagetophalf, char *messagebottomhalf, char *defaultButton, char *alternateButton, char *otherButton) +The first argument should be the widget's screen, the second the window we are working in. The last three are labels for three buttons. The default button will return WAPRDefault (0) from the function, if clicked, and is the option selected if the user presses 'enter'. The middle and left button return 1 and -1. Only those buttons are shown whose labels are not NULL. +

      +
    • WMAlertPanel * WMCreateAlertPanel (WMScreen *scrPtr, WMWindow *owner, char *title, char *msg, char *defaultButton, char *alternateButton, char *otherButton) +
    • void WMDestroyAlertPanel (WMAlertPanel *panel) +
    + + +
    Input dialogs +
    A pop up which asks for input, with a cancel and OK button, is provided through the self explanatory function: +char * WMRunInputPanel (WMScreen *screen, WMWindow *owner, char *dialogtitle, char *message,char *defaultText, char *okButtontext, char *cancelButtontext). Cancel returns a null pointer. The defaultText is presented in the text field in the pop-up, and can be changed by the user. +
      +
    • void WMDestroyInputPanel (WMInputPanel *panel) +
    • WMInputPanel * WMCreateInputPanel (WMScreen *scrPtr, WMWindow *owner, char *title, char *msg, char *defaultText, char *okButton, char *cancelButton) +
    + +
    File selection dialogs
    +File selector and file saving dialogs can be called from the WINGs library rightaway. The file selector window allows the user to browse the file system, open a file, and to delete or create a file or directory. To use it, there are three functions: +
    • WMOpenPanel * WMGetOpenPanel (WMScreen *screen) +
    • int WMRunModalFilePanelForDirectory (WMFilePanel *panel, WMWindow *owner,char *initialpath,char *title, char **fileTypes) +
    • char * WMGetFilePanelFileName (WMFilePanel *panel) +
    • WMSavePanel * WMGetSavePanel (WMScreen *screen) +
    • void WMSetFilePanelAccessoryView (WMFilePanel *panel, WMView *view) +
    • void WMSetFilePanelAutoCompletion (WMFilePanel *panel, Bool flag) +
    • void WMSetFilePanelCanChooseDirectories (WMFilePanel *panel, Bool flag) +
    • void WMSetFilePanelCanChooseFiles (WMFilePanel *panel, Bool flag) +
    • void WMSetFilePanelDirectory (WMFilePanel *panel, char *path)
    • WMView * WMGetFilePanelAccessoryView (WMFilePanel *panel) +
    • void WMFreeFilePanel (WMFilePanel *panel) +
    +

    +To open files there is a struct WMOpenPanel, to close them WMSavePanel. As for the WMView, we take the nature of the Panel as given for now. We just open a pointer to one on the screen we have opened. To open files, the WMOpenPanel pointer is passed to the function WMRunModalFilePanelForDirectory, which makes the file selector pop up. The owner can be set to NULL. initialpath is a string containing the starting directory name. The title is the dialog's title. The dialog has cancel and OK buttons, which make the function return False and True respectively. If True, the selected file name can be retrieved with WMGetFilePanelFileName (WMFilePanel *panel). To save files, exactly the same functions are used, with the only difference that you pass a pointer to a WMSavePanel. + +

    Text Areas
    +FreezeText and thaw before and after appending will make the appended text appear immediately. +
    • WMText *WMCreateText(WMWidget *parent) +
    • WMText * WMCreateTextForDocumentType (WMWidget *parent, WMAction *parser, WMAction *writer) +
    • void WMAppendTextBlock (WMText *tPtr, void *vtb) +
    • void WMAppendTextStream (WMText *tPtr, char *text) +
    • void WMFreezeText (WMText *tPtr) +
    • void WMThawText (WMText *tPtr) +
    • char * WMGetTextStream (WMText *tPtr) +
    • void WMPrependTextBlock (WMText *tPtr, void *vtb) +
    • void WMPrependTextStream (WMText *tPtr, char *text) +
    • void * WMRemoveTextBlock (WMText *tPtr) +
    • Bool WMReplaceTextSelection (WMText *tPtr, char *replacement) +
    • Bool WMScrollText (WMText *tPtr, int amount) +
    • void WMShowTextRuler (WMText *tPtr, Bool show) +
    • Bool WMFindInTextStream (WMText *tPtr, char *needle, Bool direction, Bool caseSensitive) +
    • Bool WMPageText (WMText *tPtr, Bool direction) + + +
    • void WMSetTextHasHorizontalScroller (WMText *tPtr, Bool shouldhave) +
    • void WMSetTextHasRuler (WMText *tPtr, Bool shouldhave) +
    • void WMSetTextHasVerticalScroller (WMText *tPtr, Bool shouldhave) +
    • void WMSetTextAlignment (WMText *tPtr, WMAlignment alignment) +
    • void WMSetTextBackgroundColor (WMText *tPtr, WMColor *color) +
    • void WMSetTextBackgroundPixmap (WMText *tPtr, WMPixmap *pixmap) +
    • void WMSetTextBlockProperties (WMText *tPtr, void *vtb, unsigned int first, unsigned int kanji, unsigned int underlined, int script, WMRulerMargins *margins) +
    • void WMSetTextDefaultColor (WMText *tPtr, WMColor *color) +
    • void WMSetTextDefaultFont (WMText *tPtr, WMFont *font) +
    • void WMSetTextDelegate (WMText *tPtr, WMTextDelegate *delegate) +
    • void WMSetTextEditable (WMText *tPtr, Bool editable) +
    • void WMSetTextForegroundColor (WMText *tPtr, WMColor *color) +
    • void WMSetTextIgnoresNewline (WMText *tPtr, Bool ignore) +
    • void WMSetTextIndentNewLines (WMText *tPtr, Bool indent) +
    • void WMSetTextRelief (WMText *tPtr, WMReliefType relief) +
    • void WMSetTextSelectionColor (WMText *tPtr, WMColor *color) +
    • void WMSetTextSelectionFont (WMText *tPtr, WMFont *font) +
    • void WMSetTextSelectionUnderlined (WMText *tPtr, int underlined) +
    • void WMSetTextUsesMonoFont (WMText *tPtr, Bool mono) + +
    • WMColor * WMGetTextDefaultColor (WMText *tPtr) +
    • WMFont * WMGetTextDefaultFont (WMText *tPtr) +
    • int WMGetTextEditable (WMText *tPtr) +
    • Bool WMGetTextIgnoresNewline (WMText *tPtr) +
    • int WMGetTextInsertType (WMText *tPtr) +
    • WMArray * WMGetTextObjects (WMText *tPtr) +
    • Bool WMGetTextRulerShown (WMText *tPtr) +
    • WMArray * WMGetTextSelectedObjects (WMText *tPtr) +
    • char * WMGetTextSelectedStream (WMText *tPtr) +
    • WMColor * WMGetTextSelectionColor (WMText *tPtr) +
    • WMFont * WMGetTextSelectionFont (WMText *tPtr) +
    • int WMGetTextSelectionUnderlined (WMText *tPtr) +
    • Bool WMGetTextUsesMonoFont (WMText *tPtr) +
    +
      +
    • void * WMCreateTextBlockWithObject (WMText *tPtr, WMWidget *w, char *description, WMColor *color, unsigned short first, unsigned short extraInfo) +
    • void * WMCreateTextBlockWithPixmap (WMText *tPtr, WMPixmap *p, char *description, WMColor *color, unsigned short first, unsigned short extraInfo) +
    • void * WMCreateTextBlockWithText (WMText *tPtr, char *text, WMFont *font, WMColor *color, unsigned short first, unsigned short len) +
    • void WMDestroyTextBlock (WMText *tPtr, void *vtb) +
    • void WMGetTextBlockProperties (WMText *tPtr, void *vtb, unsigned int *first, unsigned int *kanji, unsigned int *underlined, int *script, WMRulerMargins *margins) +
    + +
    Split windows/views
    +
      +
    • WMSplitView * WMCreateSplitView (WMWidget *parent) +
    • void WMAddSplitViewSubview (WMSplitView *sPtr, WMView *subview) +
    • void WMAdjustSplitViewSubviews (WMSplitView *sPtr) +
    • void WMRemoveSplitViewSubview (WMSplitView *sPtr, WMView *view) +
    • void WMRemoveSplitViewSubviewAt (WMSplitView *sPtr, int index) +
    • void WMSetSplitViewConstrainProc (WMSplitView *sPtr, WMSplitViewConstrainProc *proc) +
    • void WMSetSplitViewVertical (WMSplitView *sPtr, Bool flag) +
    • int WMGetSplitViewDividerThickness (WMSplitView *sPtr) +
    • WMView * WMGetSplitViewSubviewAt (WMSplitView *sPtr, int index) +
    • int WMGetSplitViewSubviewsCount (WMSplitView *sPtr) +
    • Bool WMGetSplitViewVertical (WMSplitView *sPtr) + + +
    + + +
    lists and Property Lists
    +

    WMListItem has a member .text, which contains the string added to the list with WMAddListItem. When making a (multiple) selection in the view, the items are added in a WMArray in the order they have been clicked. The WMArray is a dynamic array with functions to retrieve its elements, or the number of elements. WMList provides a WMListSelectionDidChangeNotification event. Sample code using WMAddNotificationObserver to add a function which handles all the selection events: + +

    /* global*/
    +static void listSelectionObserver(void *observer, WMNotification *notification){
    +WMList *lPtr = (WMList*)WMGetNotificationObject(notification);
    +WMListItem *item;
    +int i;
    +
    + item =  WMGetFromArray(WMGetListSelectedItems(lPtr),0);  /* 1st selected item */
    + i= WMGetArrayItemCount(WMGetListSelectedItems(lPtr)));   /* number of items   */
    +    
    +     /* do something */
    +}
    +  
    +     /* in main :    */
    +
    +WMList *list;
    +int i;
    +char text[100];
    +
    + list = WMCreateList(window);
    + WMSetListAllowMultipleSelection(list, True);
    + for (i=0; i<20; i++) {
    +     sprintf(text, "20 times same item");
    +     WMAddListItem(list, text);
    + }
    + WMAddNotificationObserver(listSelectionObserver, NULL/*(observer)*/,
    +                              WMListSelectionDidChangeNotification, list);
    + WMMapSubwidgets(window);
    +}
    +
    +WMSetList[Double]Action specifies a WMAction to do, when a list item is [double]clicked, e.g. +
    static void doubleClick(WMWidget *self, void *data){
    +    WMSelectAllListItems((WMList*)self);
    +}
    + + +

    Functions: + +

      +
    • WMList * WMCreateList (WMWidget *parent) +
    • void WMClearList (WMList *lPtr) +
    • WMListItem * WMInsertListItem (WMList *lPtr, int row, char *text) +
    • void WMSelectAllListItems (WMList *lPtr) +
    • void WMSelectListItem (WMList *lPtr, int row) +
    • void WMSelectListItemsInRange (WMList *lPtr, WMRange range) +
    • void WMRemoveListItem (WMList *lPtr, int row) +
    • void WMSortListItems (WMList *lPtr) +
    • void WMSortListItemsWithComparer (WMList *lPtr, WMCompareDataProc *func) +
    • WMListItem * WMGetListItem (WMList *lPtr, int row) +
    • int WMGetListItemHeight (WMList *lPtr) +
    • WMArray * WMGetListItems (WMList *lPtr) +
    • int WMGetListNumberOfRows (WMList *lPtr) +
    • int WMGetListPosition (WMList *lPtr) +
    • WMListItem * WMGetListSelectedItem (WMList *lPtr) +
    • int WMGetListSelectedItemRow (WMList *lPtr) +
    • WMArray * WMGetListSelectedItems (WMList *lPtr) + +
    • int WMFindRowOfListItemWithTitle (WMList *lPtr, char *title) +
    • Bool WMListAllowsEmptySelection (WMList *lPtr) +
    • Bool WMListAllowsMultipleSelection (WMList *lPtr) +
    • void WMSetListAction (WMList *lPtr, WMAction *action, void *clientData) +
    • void WMSetListAllowEmptySelection (WMList *lPtr, Bool flag) +
    • void WMSetListAllowMultipleSelection (WMList *lPtr, Bool flag) +
    • void WMSetListBottomPosition (WMList *lPtr, int row) +
    • void WMSetListDoubleAction (WMList *lPtr, WMAction *action, void *clientData) +
    • void WMSetListPosition (WMList *lPtr, int row) +
    • void WMSetListSelectionToRange (WMList *lPtr, WMRange range) +
    • void WMSetListUserDrawItemHeight (WMList *lPtr, unsigned short height) +
    • void WMSetListUserDrawProc (WMList *lPtr, WMListDrawProc *proc) +
    • void WMUnselectAllListItems (WMList *lPtr) +
    • void WMUnselectListItem (WMList *lPtr, int row) + +
    +
      +
    • WMPropList * WMCreatePropListFromDescription (char *desc) +
    • WMPropList * WMDeepCopyPropList (WMPropList *plist) +
    • char * WMGetPropListDescription (WMPropList *plist, Bool indented) +
    • int WMGetPropListItemCount (WMPropList *plist) +
    • Bool WMIsPropListEqualTo (WMPropList *plist, WMPropList *other) +
    • WMPropList * WMReadPropListFromFile (char *file) +
    • void WMReleasePropList (WMPropList *plist) +
    • WMPropList * WMRetainPropList (WMPropList *plist) +
    • WMPropList * WMShallowCopyPropList (WMPropList *plist) +
    • Bool WMWritePropListToFile (WMPropList *plist, char *path, Bool atomically) + +
    • void WMPLSetCaseSensitive (Bool caseSensitiveness) + +
    + + +
    Colour Panels

    +
      +
    • WMColorPanel * WMGetColorPanel (WMScreen *scrPtr) +
    • void WMCloseColorPanel (WMColorPanel *panel) +
    • void WMFreeColorPanel (WMColorPanel *panel) +
    • WMColor * WMGetColorPanelColor (WMColorPanel *panel) +
    • void WMSetColorPanelAction (WMColorPanel *panel, WMAction2 *action, void *data) +
    • void WMSetColorPanelColor (WMColorPanel *panel, WMColor *color) +
    • void WMSetColorPanelPickerMode (WMColorPanel *panel, WMColorPanelMode mode) +
    • void WMShowColorPanel (WMColorPanel *panel) +
    + +
    Font Panel

    +
      + +
    • WMFontPanel * WMGetFontPanel (WMScreen *scr) +
    • WMFont * WMGetFontPanelFont (WMFontPanel *panel) +
    • char * WMGetFontPanelFontName (WMFontPanel *panel) +
    • void WMHideFontPanel (WMFontPanel *panel) +
    • void WMSetFontPanelAction (WMFontPanel *panel, WMAction2 *action, void *data) +
    • void WMSetFontPanelFont (WMFontPanel *panel, WMFont *font) +
    • Bool WMSetFontPanelFontName (WMFontPanel *panel, char *fontName) +
    • void WMShowFontPanel (WMFontPanel *panel) +
    • void WMFreeFontPanel (WMFontPanel *panel) + +
    + +
    Tabbed views
    +

    The label on the tab itself should not be empty, or the tab won't be clickable. The view in the tab takes the view of the inserted widget. A frame expands to the tabbed view it is in. The widgets which go into the tabbed views should have the same parent as the whole TabView widget. Sample code for a TabView containing two tabs, the first with a frame, the second with a label: +

    
    +/* WMWindow *window created */
    +int x,y, Width, Height;
    +WMFrame *frame;
    +WMLabel *label;
    +WMTabView *tabview;
    +WMTabViewItem *tab;
    +
    + tabview = WMCreateTabView(window);
    + WMMoveWidget(tabview, x, y);
    + WMResizeWidget(tabview, Width, Height);
    +  
    + frame = WMCreateFrame(window);
    + tab = WMCreateTabViewItemWithIdentifier(0);
    + WMSetTabViewItemView(tab, WMWidgetView(frame));
    + WMAddItemInTabView(tabview, tab);
    + WMSetTabViewItemLabel(tab, "1");
    +
    + label = WMCreateLabel(window);
    + WMSetLabelText(label, "Text in View");
    + WMMapWidget(label);
    + tab = WMCreateTabViewItemWithIdentifier(0);
    + WMSetTabViewItemView(tab, WMWidgetView(label));
    + WMAddItemInTabView(tabview, tab);
    + WMSetTabViewItemLabel(tab, "tab 2"); 
    +
    + WMMapSubwidgets(window);
    +
    + + +
      +
    • WMTabView * WMCreateTabView (WMWidget *parent) +
    • WMTabViewItem * WMCreateTabViewItem (int identifier, char *label) +
    • WMTabViewItem * WMCreateTabViewItemWithIdentifier (int identifier) +
    • void WMDestroyTabViewItem (WMTabViewItem *item) +
    • void WMAddItemInTabView (WMTabView *tPtr, WMTabViewItem *item) +
    • WMTabViewItem * WMAddTabViewItemWithView (WMTabView *tPtr, WMView *view, int identifier, char *label) +
    • void WMInsertItemInTabView (WMTabView *tPtr, int index, WMTabViewItem *item) +
    • void WMRemoveTabViewItem (WMTabView *tPtr, WMTabViewItem *item) +
    • void WMSetTabViewItemView (WMTabViewItem *item, WMView *view)
    • WMTabViewItem * WMGetSelectedTabViewItem (WMTabView *tPtr) +
    • int WMGetTabViewItemIdentifier (WMTabViewItem *item) +
    • char * WMGetTabViewItemLabel (WMTabViewItem *item) +
    • WMView * WMGetTabViewItemView (WMTabViewItem *item) +
    • void WMSelectFirstTabViewItem (WMTabView *tPtr) +
    • void WMSelectLastTabViewItem (WMTabView *tPtr) +
    • void WMSelectNextTabViewItem (WMTabView *tPtr) +
    • void WMSelectPreviousTabViewItem (WMTabView *tPtr) +
    • void WMSelectTabViewItem (WMTabView *tPtr, WMTabViewItem *item) +
    • void WMSelectTabViewItemAtIndex (WMTabView *tPtr, int index) +
    • void WMSetTabViewDelegate (WMTabView *tPtr, WMTabViewDelegate *delegate) +
    • void WMSetTabViewEnabled (WMTabView *tPtr, Bool flag) +
    • void WMSetTabViewFont (WMTabView *tPtr, WMFont *font) +
    • void WMSetTabViewItemEnabled (WMTabViewItem *tPtr, Bool flag) +
    • void WMSetTabViewItemLabel (WMTabViewItem *item, char *label) + +
    • void WMSetTabViewType (WMTabView *tPtr, WMTabViewType type) +
    • WMTabViewItem * WMTabViewItemAtPoint (WMTabView *tPtr, int x, int y) + +
    + +
    Progress Indicators
    +
      + +
    • WMProgressIndicator * WMCreateProgressIndicator (WMWidget *parent) +
    • int WMGetProgressIndicatorMaxValue (WMProgressIndicator *progressindicator) +
    • int WMGetProgressIndicatorMinValue (WMProgressIndicator *progressindicator) +
    • int WMGetProgressIndicatorValue (WMProgressIndicator *progressindicator) +
    • void WMSetProgressIndicatorMaxValue (WMProgressIndicator *progressindicator, int value) +
    • void WMSetProgressIndicatorMinValue (WMProgressIndicator *progressindicator, int value) +
    • void WMSetProgressIndicatorValue (WMProgressIndicator *progressindicator, int value) +
    + +
    Event handlers
    +
      +
    • void WMCreateEventHandler (WMView *view, unsigned long mask, WMEventProc *eventProc, void *clientData) +
    • void WMDeleteEventHandler (WMView *view, unsigned long mask, WMEventProc *eventProc, void *clientData) +
    • int WMHandleEvent (XEvent *event) +
    • WMEventHook * WMHookEventHandler (WMEventHook *handler) +
    • void WMMaskEvent (Display *dpy, long mask, XEvent *event) +
    • void WMNextEvent (Display *dpy, XEvent *event) +
    +
      +
    • int XPending(Display *display) +
    +is a function in libXlib. It returns the number of events in the queue, if needed, after flushing the events buffer. If there are any, WMNextEvent can be called, and next WMHandleEvent. + +
    Selections
    +
      +
    • Bool WMCreateSelectionHandler (WMView *view, Atom selection, Time timestamp, WMSelectionProcs *procs, void *cdata) +
    • void WMDeleteSelectionCallback (WMView *view, Atom selection, Time timestamp) +
    • void WMDeleteSelectionHandler (WMView *view, Atom selection, Time timestamp) +
    • Bool WMRequestSelection (WMView *view, Atom selection, Atom target, Time timestamp, WMSelectionCallback *callback, void *cdata) + +
    +
    Screens
    +
      + +
    • WMScreen * WMCreateScreen (Display *display, int screen) +
    • WMScreen * WMCreateScreenWithRContext (Display *display, int screen, RContext *context) +
    • WMScreen * WMCreateSimpleApplicationScreen (Display *display) +
    • WMScreen * WMOpenScreen (const char *display) +
    • WMPoint WMGetViewScreenPosition (WMView *view) +
    • int WMScreenDepth (WMScreen *scr) +
    • Display * WMScreenDisplay (WMScreen *scr) +
    • unsigned int WMScreenHeight (WMScreen *scr) +
    • RContext * WMScreenRContext (WMScreen *scr) +
    • unsigned int WMScreenWidth (WMScreen *scr) +
    • void WMScreenMainLoop (WMScreen *scr) +
    • Bool WMScreenPending (WMScreen *scr) +
    + + +
    Image functions
    + + +
      +
    • RImage * WMGetApplicationIconImage (WMScreen *scr) +
    • WMColor * WMWhiteColor (WMScreen *scr) +
    • WMColor * WMCreateNamedColor (WMScreen *scr, char *name, + Bool exact) +
    • RImage * RCreateImageFromXImage (RContext *context, + XImage *image, + XImage *mask) +
    • RImage * RCreateImage (unsigned width, unsigned height, + int alpha) + +
    • RImage * RGetImageFromXPMData (RContext *context, + char **data) +
    • RImage * RLoadXPM (RContext *context, char *file, + int index) + +
    • RContext * RCreateContext (Display *dpy, + int screen_number, + RContextAttributes *attribs) +
    • RContext * WMScreenRContext (WMScreen *scr) +
    • WMPixmap * WMCreateBlendedPixmapFromFile (WMScreen *scrPtr, char *fileName, RColor *color) +
    • WMPixmap * WMCreateBlendedPixmapFromRImage (WMScreen *scrPtr, RImage *image, RColor *color) +
    • WMPixmap * WMCreatePixmap (WMScreen *scrPtr, int width, int height, int depth, Bool masked) +
    • WMPixmap * WMCreatePixmapFromFile (WMScreen *scrPtr, char *fileName) +
    • WMPixmap * WMCreatePixmapFromRImage (WMScreen *scrPtr, RImage *image, int threshold) +
    • WMPixmap * WMCreatePixmapFromXPMData (WMScreen *scrPtr, char **data) +
    • WMPixmap * WMCreatePixmapFromXPixmaps (WMScreen *scrPtr, Pixmap pixmap, Pixmap mask, int width, int height, int depth) +
    • void WMDrawPixmap (WMPixmap *pixmap, Drawable d, int x, int y) +
    • Pixmap WMGetPixmapMaskXID (WMPixmap *pixmap) +
    • WMSize WMGetPixmapSize (WMPixmap *pixmap) +
    • Pixmap WMGetPixmapXID (WMPixmap *pixmap) +
    • WMPixmap * WMGetSystemPixmap (WMScreen *scr, int image) +
    • void WMReleasePixmap (WMPixmap *pixmap) +
    • WMPixmap * WMRetainPixmap (WMPixmap *pixmap) + +
    + +
    Application wide functions
    + +
      +
    • void WMInitializeApplication (char *applicationName, int *argc, char **argv) +
    • char * WMGetApplicationName () +
    • void WMSetApplicationHasAppIcon (WMScreen *scr, Bool flag) +
    • void WMSetApplicationIconImage (WMScreen *scr, RImage *image) +
    • void WMSetApplicationIconPixmap (WMScreen *scr, WMPixmap *icon) +
    +
      +
    • void WMSetApplicationIconWindow (WMScreen *scr, Window window) +
    • WMPixmap * WMCreateApplicationIconBlendedPixmap (WMScreen *scr, RColor *color) +
    • RImage * WMGetApplicationIconImage (WMScreen *scr) +
    • WMPixmap * WMGetApplicationIconPixmap (WMScreen *scr) +
    +
    + +
    Notifications
    +

    A typical sequence to have a window handle messages which come from some widget, is: +
    (global) +const char *WMRequestName="AnyName";
    +At the point (in some widget function) where another window (widget) should act on the notification, put: +
    WMPostNotificationName(WMRequestName, self, NULL);
    +This call will put the notification in a queue. +

    In the WMNotificationObserverAction(void *self,WMNotification notif), with name "notificationHandler", put +
    if(!strcmp(WMRequestName,WMGetNotificationName(notif))){do something}
    +This will do something if the incoming notification is one with the right name. To put it to work by a widget "window", do: +
    + WMAddNotificationObserver(notificationHandler, window, WMRequestName, object)
    +Arguments "window" and "object", and also the notification name, can be NULL. +The last argument (object) to the WMAddNotificationObserver function selects an object where the notification is allowed to come from. To handle all incoming notifications with the right name, set this to NULL +

      +
    • void WMAddNotificationObserver (WMNotificationObserverAction *observerAction, void *observer, const char *name, void *object) +
    • WMNotification * WMCreateNotification (const char *name, void *object, void *clientData) +
    • WMNotificationQueue * WMCreateNotificationQueue (void ) +
    • void WMPostNotification (WMNotification *notification) +
    • void WMPostNotificationName (const char *name, void *object, void *clientData) +
    • void * WMGetNotificationClientData (WMNotification *notification) +
    • const char * WMGetNotificationName (WMNotification *notification) +
    • void * WMGetNotificationObject (WMNotification *notification) +
    • void WMEnqueueNotification (WMNotificationQueue *queue, WMNotification *notification, WMPostingStyle postingStyle) +
    • void WMDequeueNotificationMatching (WMNotificationQueue *queue, WMNotification *notification, unsigned mask) +
    • void WMEnqueueCoalesceNotification (WMNotificationQueue *queue, WMNotification *notification, WMPostingStyle postingStyle, unsigned coalesceMask) +
    • WMNotificationQueue * WMGetDefaultNotificationQueue (void ) +
    • void WMReleaseNotification (WMNotification *notification) +
    • void WMRemoveNotificationObserver (void *observer) +
    • void WMRemoveNotificationObserverWithName (void *observer, const char *name, void *object) +
    • WMNotification * WMRetainNotification (WMNotification *notification) +
    • void WMSetViewNotifySizeChanges (WMView *view, Bool flag) +
    + +
    Text balloons
    +
      +
    • void WMSetBalloonEnabled (WMScreen *scr, Bool flag) +
    • void WMSetBalloonDelay (WMScreen *scr, int delay) +
    • void WMSetBalloonFont (WMScreen *scr, WMFont *font) +
    • void WMSetBalloonTextAlignment (WMScreen *scr, WMAlignment alignment) +
    • void WMSetBalloonTextColor (WMScreen *scr, WMColor *color) +
    • void WMSetBalloonTextForView (char *text, WMView *view) +
    • W_Balloon * W_CreateBalloon (WMScreen *scr) +
    • void W_BalloonHandle[Enter|Leave]View (WMView *view) +
    + +
    Drag/drop functions
    +

    +

      +
    • void WMDragImageFromView (WMView *view, WMPixmap *image, char *dataTypes, WMPoint atLocation, WMSize mouseOffset, XEvent *event, Bool slideBack) +
    • WMPoint WMGetDraggingInfoImageLocation (WMDraggingInfo *info) +
    • void WMRegisterViewForDraggedTypes (WMView *view, char *acceptedTypes) +
    • void WMSetViewDragDestinationProcs (WMView *view, WMDragDestinationProcs *procs) +
    • void WMSetViewDragSourceProcs (WMView *view, WMDragSourceProcs *procs) +
    • void WMUnregisterViewDraggedTypes (WMView *view) +
    • Bool WMRequestDroppedData (WMView *view, WMDraggingInfo *info, char *type, WMDropDataCallback *callback) + +
    + +
    Network connection
    +
      + +
    • WMConnection * WMCreateConnectionAsServerAtAddress (char *host, char *service, char *protocol) +
    • WMConnection * WMCreateConnectionToAddress (char *host, char *service, char *protocol) +
    • WMConnection * WMCreateConnectionToAddressAndNotify (char *host, char *service, char *protocol) +
    • WMConnection * WMAcceptConnection (WMConnection *listener) +
    • void WMCloseConnection (WMConnection *cPtr) +
    • void WMDestroyConnection (WMConnection *cPtr) +
    • void WMSetConnectionClientData (WMConnection *cPtr, void *data) +
    • Bool WMSetConnectionCloseOnExec (WMConnection *cPtr, Bool flag) +
    • void WMSetConnectionDefaultTimeout (unsigned int timeout) +
    • void WMSetConnectionDelegate (WMConnection *cPtr, ConnectionDelegate *delegate) +
    • void WMSetConnectionFlags (WMConnection *cPtr, unsigned int flags) +
    • Bool WMSetConnectionNonBlocking (WMConnection *cPtr, Bool flag) +
    • void WMSetConnectionOpenTimeout (unsigned int timeout) +
    • void WMSetConnectionSendTimeout (WMConnection *cPtr, unsigned int timeout) +
    • void WMSetConnectionShutdownOnClose (WMConnection *cPtr, Bool flag) +
    • Bool WMEnqueueConnectionData (WMConnection *cPtr, WMData *data) +
    • char * WMGetConnectionAddress (WMConnection *cPtr) +
    • WMData * WMGetConnectionAvailableData (WMConnection *cPtr) +
    • void * WMGetConnectionClientData (WMConnection *cPtr) +
    • unsigned int WMGetConnectionFlags (WMConnection *cPtr) +
    • char * WMGetConnectionProtocol (WMConnection *cPtr) +
    • char * WMGetConnectionService (WMConnection *cPtr) +
    • int WMGetConnectionSocket (WMConnection *cPtr) +
    • WMConnectionState WMGetConnectionState (WMConnection *cPtr) +
    • WMConnectionTimeoutState WMGetConnectionTimeoutState (WMConnection *cPtr) +
    • WMArray * WMGetConnectionUnsentData (WMConnection *cPtr) +
    • int WMSendConnectionData (WMConnection *cPtr, WMData *data) +
    + +
    Draw functions
    +
      +
    • RContext * RCreateContext (Display *dpy, int screen_number, RContextAttributes *attribs) +
    • GC WMColorGC (WMColor *color) +
    • RImage * RCreateImage (unsigned width, unsigned height, int alpha) +
    • RImage * RCreateImageFromDrawable (RContext *context, Drawable drawable, Pixmap mask) +
    • RImage * RCreateImageFromXImage (RContext *context, XImage *image, XImage *mask) +
    • RXImage * RCreateXImage (RContext *context, int depth, unsigned width, unsigned height) +
    • void RDestroyXImage (RContext *context, RXImage *rximage) +
    • void RBevelImage (RImage *image, int bevel_type) +
    • int RBlurImage (RImage *image) +
    • void RClearImage (RImage *image, RColor *color) +
    • RImage * RCloneImage (RImage *image) +
    • int RDrawLine (RImage *image, int x0, int y0, int x1, int y1, RColor *color) +
    • void RDrawLines (RImage *image, RPoint *points, int npoints, int mode, RColor *color) +
    • void RDrawSegments (RImage *image, RSegment *segs, int nsegs, RColor *color) +
    • void RFillImage (RImage *image, RColor *color) +
    • void RCombineArea (RImage *image, RImage *src, int sx, int sy, unsigned width, unsigned height, int dx, int dy) +
    • void RCombineAreaWithOpaqueness (RImage *image, RImage *src, int sx, int sy, unsigned width, unsigned height, int dx, int dy, int opaqueness) +
    • void RCombineImageWithColor (RImage *image, RColor *color) +
    • void RCombineImages (RImage *image, RImage *src) +
    • void RCombineImagesWithOpaqueness (RImage *image, RImage *src, int opaqueness) +
    • int RConvertImage (RContext *context, RImage *image, Pixmap *pixmap) +
    • int RConvertImageMask (RContext *context, RImage *image, Pixmap *pixmap, Pixmap *mask, int threshold) +
    • Bool RGetClosestXColor (RContext *context, RColor *color, XColor *retColor) +
    • char * RGetImageFileFormat (char *file) +
    • RImage * RGetImageFromXPMData (RContext *context, char **data) +
    • Bool RGetPixel (RImage *image, int x, int y, RColor *color) +
    • RImage * RGetSubImage (RImage *image, int x, int y, unsigned width, unsigned height) +
    • RXImage * RGetXImage (RContext *context, Drawable d, int x, int y, unsigned width, unsigned height) +
    • void RHSVtoRGB (RHSVColor *hsv, RColor *rgb) +
    • RImage * RLoadImage (RContext *context, char *file, int index) +
    • RImage * RLoadPPM (RContext *context, char *file_name, int index) +
    • RImage * RLoadXPM (RContext *context, char *file, int index) +
    • RImage * RMakeCenteredImage (RImage *image, unsigned width, unsigned height, RColor *color) +
    • RImage * RMakeTiledImage (RImage *tile, unsigned width, unsigned height) +
    • const char * RMessageForError (int errorCode) +
    • int ROperateLine (RImage *image, int operation, int x0, int y0, int x1, int y1, RColor *color) +
    • void ROperateLines (RImage *image, int operation, RPoint *points, int npoints, int mode, RColor *color) +
    • void ROperatePixel (RImage *image, int operation, int x, int y, RColor *color) +
    • void ROperatePixels (RImage *image, int operation, RPoint *points, int npoints, int mode, RColor *color) +
    • void ROperateSegments (RImage *image, int operation, RSegment *segs, int nsegs, RColor *color) +
    • void RPutPixel (RImage *image, int x, int y, RColor *color) +
    • void RPutPixels (RImage *image, RPoint *points, int npoints, int mode, RColor *color) +
    • void RPutXImage (RContext *context, Drawable d, GC gc, RXImage *ximage, int src_x, int src_y, int dest_x, int dest_y, unsigned int width, unsigned int height) +
    • void RRGBtoHSV (RColor *rgb, RHSVColor *hsv) +
    • void RReleaseImage (RImage *image) +
    • RImage * RRenderGradient (unsigned width, unsigned height, RColor *from, RColor *to, int style) +
    • RImage * RRenderInterwovenGradient (unsigned width, unsigned height, RColor colors1, int thickness1, RColor colors2, int thickness2) +
    • RImage * RRenderMultiGradient (unsigned width, unsigned height, RColor **colors, int style) +
    • RImage * RRetainImage (RImage *image) +
    • RImage * RRotateImage (RImage *image, float angle) +
    • Bool RSaveImage (RImage *image, char *filename, char *format) +
    • Bool RSaveXPM (RImage *image, char *filename) +
    • RImage * RScaleImage (RImage *image, unsigned new_width, unsigned new_height) +
    • RImage * RSmoothScaleImage (RImage *src, unsigned new_width, unsigned new_height) +
    • char ** RSupportedFileFormats (void )
    • RColor ulongToRColor (WMScreen *scr, unsigned long value) +
    • RColor WMGetRColorFromColor(WMColor *color) +
    • RColor col = {0xae,0xaa,0xae,0xff} +
    + +
      Other used graphics functions which are not libWINGs/libwraster: +
    • Status XmuCreateColormap (dpy , colormap ) +
    • void XmuDeleteStandardColormap (dpy , screen , property ) +
    • Status XmuGetColormapAllocation (vinfo , property , red_max , green_max , blue_max ) +
    • Status XmuLookupStandardColormap (dpy , screen , visualid , depth , property , replace , retain ) +
    • XStandardColormap * XmuStandardColormap (dpy , screen , visualid , depth , property , cmap , red_max , green_max , blue_max ) +
    • int XDrawRectangle(Display *display, Drawable d, GC gc, + int x, int y, unsigned int width, unsigned int + height)
    • + int XDrawLines(Display *display, Drawable d, GC gc, XPoint + *points, int npoints, int mode)
    • + + int XDrawSegments(Display *display, Drawable d, GC gc, + XSegment *segments, int nsegments)
    • + + int XDrawArc(Display *display, Drawable d, GC gc, int x, + int y, unsigned int width, unsigned int height, int + angle1, int angle2)
    • + int XDrawArcs(Display *display, Drawable d, GC gc, XArc + *arcs, int narcs)
    • + int XDrawPoint(Display *display, Drawable d, GC gc, int x, + int y)
    • + + int XDrawPoints(Display *display, Drawable d, GC gc, + XPoint *points, int npoints, int mode)
    • + + GC XCreateGC(Display *display, Drawable d, unsigned long + valuemask, XGCValues *values)
    • + int XFillArc(Display *display, Drawable d, GC gc, int x, + int y, unsigned int width, unsigned int height, int + angle1, int angle2)
    • + int XFillPolygon(Display *display, Drawable d, GC gc, + XPoint *points, int npoints, int shape, int mode)
    • + + + typedef struct { + short x1, y1, x2, y2; + } XSegment
    • + + typedef struct { + short x, y; + } XPoint
    • + + + typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; /* Degrees * 64 */ + } XArc + + +
    + +
    Browser functions
    +
      +
    • WMBrowser * WMCreateBrowser (WMWidget *parent) +
    • int WMAddBrowserColumn (WMBrowser *bPtr) +
    • Bool WMBrowserAllowsEmptySelection (WMBrowser *bPtr) +
    • Bool WMBrowserAllowsMultipleSelection (WMBrowser *bPtr) +
    • void WMSetBrowserAction (WMBrowser *bPtr, WMAction *action, void *clientData) +
    • void WMSetBrowserAllowEmptySelection (WMBrowser *bPtr, Bool flag) +
    • void WMSetBrowserAllowMultipleSelection (WMBrowser *bPtr, Bool flag) +
    • void WMSetBrowserColumnTitle (WMBrowser *bPtr, int column, char *title) +
    • void WMSetBrowserDelegate (WMBrowser *bPtr, WMBrowserDelegate *delegate) +
    • void WMSetBrowserDoubleAction (WMBrowser *bPtr, WMAction *action, void *clientData) +
    • void WMSetBrowserHasScroller (WMBrowser *bPtr, int hasScroller) +
    • void WMSetBrowserMaxVisibleColumns (WMBrowser *bPtr, int columns) +
    • char * WMSetBrowserPath (WMBrowser *bPtr, char *path) +
    • void WMSetBrowserPathSeparator (WMBrowser *bPtr, char *separator) +
    • void WMSetBrowserTitled (WMBrowser *bPtr, Bool flag) +
    • void WMSortBrowserColumn (WMBrowser *bPtr, int column) +
    • void WMSortBrowserColumnWithComparer (WMBrowser *bPtr, int column, WMCompareDataProc *func) +
    • int WMGetBrowserFirstVisibleColumn (WMBrowser *bPtr) +
    • WMList * WMGetBrowserListInColumn (WMBrowser *bPtr, int column) +
    • int WMGetBrowserMaxVisibleColumns (WMBrowser *bPtr) +
    • int WMGetBrowserNumberOfColumns (WMBrowser *bPtr) +
    • char * WMGetBrowserPath (WMBrowser *bPtr) +
    • char * WMGetBrowserPathToColumn (WMBrowser *bPtr, int column) +
    • WMArray * WMGetBrowserPaths (WMBrowser *bPtr) +
    • int WMGetBrowserSelectedColumn (WMBrowser *bPtr) +
    • WMListItem * WMGetBrowserSelectedItemInColumn (WMBrowser *bPtr, int column) +
    • int WMGetBrowserSelectedRowInColumn (WMBrowser *bPtr, int column) +
    • WMListItem * WMInsertBrowserItem (WMBrowser *bPtr, int column, int row, char *text, Bool isBranch) +
    • void WMLoadBrowserColumnZero (WMBrowser *bPtr) +
    • void WMRemoveBrowserItem (WMBrowser *bPtr, int column, int row) +
    + +
    Menu items
    +
      +
    • WMMenuItem * WMCreateMenuItem (void ) +
    • void WMDestroyMenuItem (WMMenuItem *item) +
    • void WMSetMenuItemAction (WMMenuItem *item, WMAction *action, void *data) +
    • void WMSetMenuItemEnabled (WMMenuItem *item, Bool flag) +
    • void WMSetMenuItemMixedStatePixmap (WMMenuItem *item, WMPixmap *pixmap) +
    • void WMSetMenuItemOffStatePixmap (WMMenuItem *item, WMPixmap *pixmap) +
    • void WMSetMenuItemOnStatePixmap (WMMenuItem *item, WMPixmap *pixmap) +
    • void WMSetMenuItemPixmap (WMMenuItem *item, WMPixmap *pixmap) +
    • void WMSetMenuItemRepresentedObject (WMMenuItem *item, void *object) +
    • void WMSetMenuItemShortcut (WMMenuItem *item, char *shortcut) +
    • void WMSetMenuItemShortcutModifierMask (WMMenuItem *item, unsigned mask) +
    • void WMSetMenuItemState (WMMenuItem *item, int state) +
    • void WMSetMenuItemTitle (WMMenuItem *item, char *title) +
    • Bool WMMenuItemIsSeparator (WMMenuItem *item) +
    • WMAction * WMGetMenuItemAction (WMMenuItem *item) +
    • void * WMGetMenuItemData (WMMenuItem *item) +
    • Bool WMGetMenuItemEnabled (WMMenuItem *item) +
    • WMPixmap * WMGetMenuItemMixedStatePixmap (WMMenuItem *item) +
    • WMPixmap * WMGetMenuItemOffStatePixmap (WMMenuItem *item) +
    • WMPixmap * WMGetMenuItemOnStatePixmap (WMMenuItem *item) +
    • WMPixmap * WMGetMenuItemPixmap (WMMenuItem *item) +
    • void * WMGetMenuItemRepresentedObject (WMMenuItem *item) +
    • char * WMGetMenuItemShortcut (WMMenuItem *item) +
    • unsigned WMGetMenuItemShortcutModifierMask (WMMenuItem *item) +
    • int WMGetMenuItemState (WMMenuItem *item) +
    • char * WMGetMenuItemTitle (WMMenuItem *item) +
    • WMMenuItem * WMGetSeparatorMenuItem (void ) +
    + + +
    Utility/redefined functions
    +
      + +
    • char * wdefaultspathfordomain (char *domain) +
    • char * wexpandpath (char *path) +
    • void wfatal (const char *msg, ... ) +
    • char * wfindfile (char *paths, char *file) +
    • char * wfindfileinarray (WMPropList *array, char *file) +
    • char * wfindfileinlist (char **path_list, char *file) +
    • void wfree (void *ptr) +
    • char * wgethomedir () +
    • void * wmalloc (size_t size) +
    • void wmessage (const char *msg, ... ) +
    • WMPoint wmkpoint (int x, int y) +
    • WMRange wmkrange (int start, int count) +
    • WMSize wmksize (unsigned int width, unsigned int height) +
    • void * wrealloc (void *ptr, size_t newsize) +
    • void wrelease (void *ptr) +
    • void * wretain (void *ptr) +
    • waborthandler * wsetabort (waborthandler *handler) +
    • char * wstrappend (char *dst, char *src) +
    • char * wstrconcat (char *str1, char *str2) +
    • char * wstrdup (char *str) +
    • char * wstrerror (int errnum) +
    • char * wstrndup (char *str, size_t len) +
    • void wsyserror (const char *msg, ... ) +
    • void wsyserrorwithcode (int error, const char *msg, ... ) +
    • void wtokenfree (char **tokens, int count) +
    • char * wtokenjoin (char **list, int count) +
    • char * wtokennext (char *word, char **next) +
    • void wtokensplit (char *command, char ***argv, int *argc) +
    • char * wtrimspace (char *s) +
    • char * wusergnusteppath () +
    • void wwarning (const char *msg, ... ) +
    +Other used functions:
      +
    • int calculateCombineArea (RImage *des, RImage *src, int *sx, int *sy, int *swidth, int *sheight, int *dx, int *dy) +
    • void convertCPColor (CPColor *color) +
    • void destroyNode (void *data) +
    • void drawClip () +
    • char * generateNewFilename (char *curName) +
    • unsigned char getShift (unsigned char value) +
    • char * getStream (WMText *tPtr, int sel, int array) +
    • WMArray * getStreamObjects (WMText *tPtr, int sel) +
    • Pixmap makeMenuPixmap (PopUpButton *bPtr) +
    • Bool requestDroppedData (WMView *view, WMDraggingInfo *info, char *type) +
    • WMData * requestHandler (WMView *view, Atom selection, Atom target, void *cdata, Atom *type) +
    • RColor ulongToRColor (WMScreen *scr, unsigned long value) +
    +

    Data types

    + +
    WMColor
    +
      + +
    • WMColor * WMCreateNamedColor (WMScreen *scr, char *name, Bool exact) +
    • WMColor * WMCreateRGBAColor (WMScreen *scr, unsigned short red, unsigned short green, unsigned short blue, unsigned short alpha, Bool exact) +
    • WMColor * WMCreateRGBColor (WMScreen *scr, unsigned short red, unsigned short green, unsigned short blue, Bool exact) +
    • void WMReleaseColor (WMColor *color) +
    • WMColor * WMRetainColor (WMColor *color) +
    • char * WMGetColorRGBDescription (WMColor *color) + +
    • WMColor * WMBlackColor (WMScreen *scr) +
    • WMColor * WMWhiteColor (WMScreen *scr) +
    • WMColor * WMGrayColor (WMScreen *scr) +
    • WMColor * WMDarkGrayColor (WMScreen *scr) +
    • unsigned short WMBlueComponentOfColor (WMColor *color) +
    • unsigned short WMRedComponentOfColor (WMColor *color) +
    • unsigned short WMGreenComponentOfColor (WMColor *color) +
    • void WMSetColorInGC (WMColor *color, GC gc) +
    • WMPixel WMColorPixel (WMColor *color) +
    • void WMSetColorAlpha (WMColor *color, unsigned short alpha) +
    • unsigned short WMGetColorAlpha (WMColor *color) +
      +
    • void WMPaintColorSwatch (WMColor *color, Drawable d, int x, int y, unsigned int width, unsigned int height) +
    • void WMSetColorWellColor (WMColorWell *cPtr, WMColor *color) +
    • WMColorWell * WMCreateColorWell (WMWidget *parent) +
    • WMColor * WMGetColorWellColor (WMColorWell *cPtr) +
    + + +
    WMFont
    +
      +
    • WMFont * WMCreateFont (WMScreen *scrPtr, char *fontName) +
    • WMFont * WMCreateFontSet (WMScreen *scrPtr, char *fontName) +
    • WMFont * WMCreateFontWithFlags (WMScreen *scrPtr, char *fontName, WMFontFlags flags) +
    • WMFont * WMCreateNormalFont (WMScreen *scrPtr, char *fontName) +
    • WMFont * WMCreateAntialiasedFont (WMScreen *scrPtr, char *fontName) +
    • WMFont * WMCreateAntialiasedFontSet (WMScreen *scrPtr, char *fontName) +
    • WMFont * WMCopyFontWithChanges (WMScreen *scrPtr, WMFont *font, const WMFontAttributes *changes) +
    • void WMReleaseFont (WMFont *font) +
    • WMFont * WMRetainFont (WMFont *font) +
    • WMFont * WMDefaultBoldSystemFont (WMScreen *scrPtr) +
    • WMFont * WMDefaultSystemFont (WMScreen *scrPtr) +
    • WMFont * WMSystemFontOfSize (WMScreen *scrPtr, int size) +
    • WMFont * WMBoldSystemFontOfSize (WMScreen *scrPtr, int size) +
    • unsigned int WMFontHeight (WMFont *font) +
    • XFontSet WMGetFontFontSet (WMFont *font) +
    • char * WMGetFontName (WMFont *font) +
    • Bool WMIsAntialiasedFont (WMFont *font) +
    • void WMSetWidgetDefaultBoldFont (WMScreen *scr, WMFont *font) +
    • void WMSetWidgetDefaultFont (WMScreen *scr, WMFont *font) +
    + + +
    WMArray
    +
      +
    • WMArray * WMCreateArray (int initialSize) +
    • WMArray * WMCreateArrayWithArray (WMArray *array) +
    • WMArray * WMCreateArrayWithDestructor (int initialSize, WMFreeDataProc *destructor) + +
    • void WMAddToArray (WMArray *array, void *item) +
    • void WMAppendArray (WMArray *array, WMArray *other) +
    • void * WMArrayFirst (WMArray *array, WMArrayIterator *iter) +
    • void * WMArrayLast (WMArray *array, WMArrayIterator *iter) +
    • void * WMArrayNext (WMArray *array, WMArrayIterator *iter) +
    • void * WMArrayPrevious (WMArray *array, WMArrayIterator *iter) +
    • int WMCountInArray (WMArray *array, void *item) +
    • int WMDeleteFromArray (WMArray *array, int index) +
    • void WMEmptyArray (WMArray *array) +
    • int WMFindInArray (WMArray *array, WMMatchDataProc *match, void *cdata) +
    • void WMFreeArray (WMArray *array) +
    • int WMGetArrayItemCount (WMArray *array) +
    • void * WMGetFromArray (WMArray *array, int index) +
    • void WMInsertInArray (WMArray *array, int index, void *item) +
    • void WMMapArray (WMArray *array, void (*function)(void *, void *), void *data) +
    • void * WMPopFromArray (WMArray *array) +
    • int WMRemoveFromArrayMatching (WMArray *array, WMMatchDataProc *match, void *cdata) +
    • void * WMReplaceInArray (WMArray *array, int index, void *item) +
    • void WMSortArray (WMArray *array, WMCompareDataProc *comparer) +
      + +
    • WMPropList * WMCreatePLArray (WMPropList *elem, ... ) +
    • void WMAddToPLArray (WMPropList *plist, WMPropList *item) +
    • void WMDeleteFromPLArray (WMPropList *plist, int index) +
    • WMPropList * WMGetFromPLArray (WMPropList *plist, int index) +
    • void WMInsertInPLArray (WMPropList *plist, int index, WMPropList *item) +
    • Bool WMIsPLArray (WMPropList *plist) +
    • void WMRemoveFromPLArray (WMPropList *plist, WMPropList *item) +
    • WM_ITERATE_ARRAY(WMArray *,itemtype *,WMArrayIterator *iter) +
    + + +
    Trees
    +
      + +
    • WMTreeNode * WMCreateTreeNode (void *data) +
    • WMTreeNode * WMCreateTreeNodeWithDestructor (void *data, WMFreeDataProc *destructor) +
    • void WMDeleteLeafForTreeNode (WMTreeNode *aNode, int index) +
    • void WMDestroyTreeNode (WMTreeNode *aNode) +
    • void * WMGetDataForTreeNode (WMTreeNode *aNode) +
    • void * WMReplaceDataForTreeNode (WMTreeNode *aNode, void *newData) +
    • WMTreeNode * WMGetParentForTreeNode (WMTreeNode *aNode) +
    • int WMGetTreeNodeDepth (WMTreeNode *aNode) +
    • WMTreeNode * WMFindInTree (WMTreeNode *aTree, WMMatchDataProc *match, void *cdata) +
    • WMTreeNode * WMInsertItemInTree (WMTreeNode *parent, int index, void *item) +
    • WMTreeNode * WMInsertNodeInTree (WMTreeNode *parent, int index, WMTreeNode *aNode) +
    • void WMRemoveLeafForTreeNode (WMTreeNode *aNode, void *leaf) +
    • void WMSortLeavesForTreeNode (WMTreeNode *aNode, WMCompareDataProc *comparer) +
    • void WMSortTree (WMTreeNode *aNode, WMCompareDataProc *comparer) + +
    + + +

    ENUMS and #defines

    + +
    List of event masks and corresponding events
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Event maskEvent
    KeyPressMask KeyPress
    KeyReleaseMask KeyRelease
    ButtonPressMask ButtonPress
    ButtonReleaseMask ButtonRelease
    EnterWindowMask EnterNotify
    LeaveWindowMask LeaveNotify
    FocusChangeMask FocusIn
    FocusChangeMask FocusOut
    KeymapStateMask KeymapNotify
    ExposureMask Expose
    ExposureMask GraphicsExpose
    ExposureMask NoExpose
    VisibilityChangeMask VisibilityNotify
    SubstructureNotifyMask CreateNotify
    StructureNotifyMask DestroyNotify
    StructureNotifyMask UnmapNotify
    StructureNotifyMask MapNotify
    SubstructureRedirectMask MapRequest
    StructureNotifyMask ReparentNotify
    StructureNotifyMask ConfigureNotify
    SubstructureRedirectMask ConfigureRequest
    StructureNotifyMask GravityNotify
    ResizeRedirectMask ResizeRequest
    StructureNotifyMask CirculateNotify
    SubstructureRedirectMask CirculateRequest
    PropertyChangeMask PropertyNotify
    ColormapChangeMask ColormapNotify
    ClientMessageMask ClientMessage
    PointerMotionMask|PointerMotionHintMask|
    +ButtonMotionMask|Button1MotionMask|
    +Button2MotionMask|Button3MotionMask|
    +Button4MotionMask|Button5MotionMask
    MotionNotify
    + + +
    Frame Title Positions
    +
      +
    • WTPAboveTop +
    • WTPAtTop +
    • WTPBelowTop +
    • WTPAboveBottom +
    • WTPAtBottom +
    • WTPBelowBottom +
    +
    WM Image Positions WMImagePosition
    +
      +
    • WIPNoImage, +
    • WIPImageOnly, +
    • WIPLeft, +
    • WIPRight, +
    • WIPBelow, +
    • WIPAbove, +
    • WIPOverlaps +
    +
    WMAlignment
    +
      +
    • WALeft +
    • WACenter +
    • WARight +
    • WAJustified +
    + +
    Reliefs WMReliefType
    +
      +
    • WRFlat +
    • WRSimple +
    • WRRaised +
    • WRSunken +
    • WRGroove +
    • WRRidge +
    • WRPushed +
    +
    Colours
    +

    +typedef struct RColor { + unsigned char red; + unsigned char green; + unsigned char blue; + unsigned char alpha; +} RColor; + + +

    +typedef struct RSegment { + int x1, y1, x2, y2; +} RSegment; + + + +
    +
    +

    +

    LAST: Programming Details 3Contents
    + + + + + +
  • \ No newline at end of file diff --git a/WINGs_tutorial/WINGLib_files/2tabs.jpeg b/WINGs_tutorial/WINGLib_files/2tabs.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ed7cd6058f2806402f28265199dcfca408194da8 GIT binary patch literal 8546 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 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/AlertPanel.jpeg b/WINGs_tutorial/WINGLib_files/AlertPanel.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7ebaf4264bb7e924dfee3cd6a7b63de662197b35 GIT binary patch literal 9794 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 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/Buttons.jpeg b/WINGs_tutorial/WINGLib_files/Buttons.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2a3b0f7da68e245938760a81654655eaef2b80a1 GIT binary patch literal 7144 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ĸQ3w{y3hXRYjF&Wo1? z7m9Zu{OBl&ifjset9bvS;dk_Z-wRHoPqtnrw1{pMMpgzDHvX=@EV&(%GKF`zfO*we z_+R%D_nSt)|L&jrkF%m>^AJWRn0#l35mMAFdD2}9G{GtdK-(*{HU*3&bQ^c*&jwDt zGE@`oLveFoq){ic1io*A@uLMvbk{UM*I)9GpIwC?4FczaA#eWH;FdZ{n3$TX<_}{q z?1r(S9n)`u^t?+kG`R!Id|72Mbd!2bOWB>8)|+v!Ox}anfvpmD4R>6>%v;&5{!Nb=QW)`unZR zU=IF&oNVz#c-thF)jc1LNxzUhXSG7{`57TIA~8YcpM{<0?&dN1;BT{NRoH7R+XX)> zWL#2&dgd@})m8RWI%am`$`Qi9J`trd(cKmnIeDg;5DG#vsS|u`{Y4jh5@zp(N#Q{~ z8)}?cq9;kp>jgQu7s+qwC8=Y~zBuhZ&R>TU+F>o4?~t{f!j3VEUr#~Dz0Cgp10%_@ z8sc-FdQrK!k>lKv7_mrW7t|6a7I-1F zjwYZYM3(MTc%6=um0f5BkcP1f(MGOl?={fn92Pr7uJV$6Lm&(gnPw-BRVdT_o{A&C zs#K$Aj~;wk^cGoT)5;YoawM!{7%dAnXbo1!FAai|hXn1zYs@_*g%n!KdEAlG2?R0bgf0c_n%s5=>M%ILwj7XVZrS*c8)bNKi^MvI@)}RrVb|w zy099rk23MGKDm_oZ4@IIf-*pZl>Sy_%YXQt^bK8t)M(x8oGO>M2_nEkZguVB zY#0bKZJqX12m}mC#8HZy`NUGvazmVq1SHY_u1GdR!s*(%FlU{;S;wEBYu{MLVBOA? zZn;;oCfNDOUFePFvI)KoIgJqAAY*X3K z9ZfttY7LNcOHdSjT*}^ZT5*&yf0-zTP0)sg5d|B}3;-?GH{RX${B(`4n@U%JXWL&M z+|54NRBSVzu-5l%7sRZH-3Np-TnkZ^q0(soNpXvn2cSon2+Jn7~6g`hKy zqT*lH;YNhknSH{1c10G8#G03)pUd+XE%$uaV1zp8%i8pXaVZ$7&WifBY1BI#sOGLCIIUtyJ4Ks`T>3s|zexMoe)eLKQG+Zm0xaqy>&AGVzT z>8RBV@mRXQB;nmYJ)XM)pCZrl#1m~er&3&yUs2%6MjBsCj42$9gceWGAu0F?9)`yD z_xZ~pUd@ifU4D4i!9>;$(%Rhbb(Ddp9fsHRo0olGS!6>xZeIb00tU~uw9Q&9MUHCk t#m+pO)J(dY_t3jGr?hM=m<}O>)}hO?QXzie0k!yoiZg4Fy2Eib^&cFuUabHC literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/ColorPanel.jpeg b/WINGs_tutorial/WINGLib_files/ColorPanel.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..577bb802575b4a965d10806fb7a514cfbbc0a2d1 GIT binary patch literal 14003 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 RkkUrEaujC3syv@Y{s$}KefIzW literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/InputDialog.jpeg b/WINGs_tutorial/WINGLib_files/InputDialog.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c0f97a4642631bc57f72560224646e22a484122d GIT binary patch literal 8760 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 RA#M* literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/Labels.jpeg b/WINGs_tutorial/WINGLib_files/Labels.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f9d031ecb3d3f759d4f1eb9b45f0f74758d9a01f GIT binary patch literal 7310 zcmeHLXHb({w|)^26#*ksMfe0%I)@Sv5V25{DkVgzM-+qvP(m+)4GI0A1WZCvkd_d7 z=m7;p1gS~r(px|&N)Zrp|exbOwN4oMwhZ{bRieJ}{E;7&r8D^Mw*Vv_`!u~ z4>O3HN70P+u&D#fk>d&;aiWFSI~OmUr}qN~nVA?)FoOUs;7x8puJRpfc+TTHGQ^81qg}y4=WMgo7nEWxELubYv*KVh|nc`O_sF(7gX`=4fMDL87 zAKUnQO;sJG_22a+DHM#kx9GR5#LKi_Q>_~;S+-3`PAtB9>w3e7c!GwiQ$bsOc$F-> zQumc&&71aYvYLFMj@X}iX_+l-y*1~_kHxv|*BBUaK|+O{ewO_jYL83BjruNRq!&Mf zJ7|AM@J^hQxE5R_|6pdO8fT@U@pzS?*57*CH>g@D>fWN*vVy8B&vhvgKOqI_M(Nf@ z;D)$G(&k!yLXK%ER(E89Rka7Hvvc;h7N_1sR!KtpH?_i4WNiCN7w1LF{`}VT{=Ev# z?4|YSsDQi`GTN%e=u@n@$s|-%%jm8UCe=z!>+#v(*-Y|?o?jQOD=ZU zlr`#IZC#2k4F^WXAObX5JnPhEX2=nnx2|0O5Xt9bMwCrHALhfbRI-pzb<9-_<#Tjv zBVO7h-p(0X-i44pEt4<-$IM%3BhpUo_tw^f&s?;bibg-P2bq_3m6<#=erXAH&`0Y- zg?gk*a*Q)h67w9=P9|YyBh+3fQw{0B*bq^cbTQ0F*|txgTIS6u+}r8v80War%xj

    q8&~u;iEaZmH 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 HX7)b-X2;q* literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/OpenFileDialog.jpeg b/WINGs_tutorial/WINGLib_files/OpenFileDialog.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..bee009f6e0eacd7f3b3308080bac32ce02b1c9de GIT binary patch literal 27133 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 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/Slider.jpeg b/WINGs_tutorial/WINGLib_files/Slider.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..730952104c9abe3c11866989c5fb660c62a8fe3a GIT binary patch literal 4056 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 P2F7Hani7+9*yH~IsV5%4 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGLib_files/TabView.jpeg b/WINGs_tutorial/WINGLib_files/TabView.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..8bbf63398652cfa994d833e14a82960c8fe2d446 GIT binary patch literal 9988 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 X|027A;%f^i$jTsk?vG>QHzxiCsstaI literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGMenu.html b/WINGs_tutorial/WINGMenu.html new file mode 100644 index 0000000..f1d1e9f --- /dev/null +++ b/WINGs_tutorial/WINGMenu.html @@ -0,0 +1,82 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + + +
    LAST: Programming Details 2ContentsNEXT: Library description
    + +

    Change a widget: a cascading menu

    +

    The WINGs library offers functions to set up a structure for a menu with submenus. However, the mapping of the menu itself is left to the Window Maker window manager. Without Window Maker, a menu which has been programmed this way, will not show. The easy way around this, is to use the source code for the editable menu in the WPrefs application, change it to give it the usual menu functionality, and compile this modified source code with the application's code. The two files you need to do this, are in the Window Maker's 0.92 source code directory WPrefs.app. Copy WPrefs.app/editmenu.c and WPrefs.app/editmenu.h to your current directory. A couple of little changes to editmenu.c will be sufficient to give adequate menu/submenu functionality. +

    Change the editable menu widget struct W_EditMenuItem. The EditMenuItem structure is the structure which is used to programme the editable menu in the Window Maker Preferences utility. To use it as a regular menu, it needs a pointer to the function which you want to execute when you click the item. Any WINGs widget structure needs to keep W_Class widgetClass and WMView *view as its first two declarations. Insert the line WMAction * callback; somewhere after them. The widget declaration will now be: +

    
    +typedef struct W_EditMenuItem {
    +    W_Class widgetClass;
    +    WMView *view;
    +
    +    struct W_EditMenu *parent;
    +    char *label;
    +    WMPixmap *pixmap;		       
    +    void *data;
    +    WMCallback *destroyData;
    +    WMAction * callback;
    +    struct W_EditMenu *submenu;	       
    +    struct {
    +        unsigned isTitle:1;
    +        unsigned isHighlighted:1;
    +    } flags;
    +} EditMenuItem;
    +For convenience, add this function to editmenu.c, too: +
    void WSetEditMenuItemAction(WEditMenuItem *item, WMAction *callback)
    +{
    +    item->callback= callback;
    +}
    + +

    We shall make a window with one button which will make the menu pop up. The code to create the menu is as follows. Have editmenu.c and editmenu.h in the same directory as the window application code, insert #include "editmenu.h" somewhere at the top. +

    
    +WEditMenu *submenu, *menu;
    +WEditMenuItem * menuitem;
    +
    +submenu=WCreateEditMenu(screen,"Submenu");
    +menuitem =WAddMenuItemWithTitle(submenu,"Submenu item"); 
    +menu=WCreateEditMenu(screen,"Main menu");
    +menuitem = WAddMenuItemWithTitle(menu,"To submenu"); 
    +WSetEditMenuSubmenu(menu, menuitem , submenu);
    +menuitem = WAddMenuItemWithTitle(menu,"Main item"); 
    +WMRealizeWidget(submenu);
    +WMRealizeWidget(menu);
    +The function to map the window w's menu at point (x,y) is WEditMenuShowAt(menu,x,y,w). However, it will not show anything unless it is used after the intial window has been mapped. To do this, we use WMSetButtonAction on a button, and make the WMAction map the menu. We pass it pointers to both the menu and the window, so that we can map the menu in the window's neighbourhood. The WMAction will look like : +
    void getMenu(WMWidget *self, void *data){
    +  WMPoint position;
    +  struct datacouple *tmp=(struct datacouple *)data;
    +  if(WMGetButtonSelected(self)){
    +  position=WMGetViewScreenPosition(WMWidgetView(tmp->window)); 
    +  WEditMenuShowAt(tmp->menu,(position.x>MENUWIDTH)?position.x-MENUWIDTH:0,\
    +               position.y+MENITEMHT,tmp->window);
    +  }else
    +    WEditMenuHide(tmp->menu);
    +}
    The used structure is struct datacouple{WMWindow *window; WEditMenu *menu;} datacouple; +. Realize the window before the others. The code with details is here. To compile it, you now type cc -x c EighthWindow.c editmenu.c -lXft -L/usr/X11/lib -L/usr/lib -lWINGs -lwraster -o EighthWindow. editmenu.c is, of course, the modified source file. +

    To use the callback functions, we need to execute them somewhere. To do this, search the static void selectItem function in the editmenu.c source. After its last line, insert the line: if (menu->selectedItem->callback) menu->selectedItem->callback(menu->selectedItem,NULL);. Define the callback before main as, eg.: +

    void menuItemAction(void *self, void *data){
    +fprintf(stderr, "Selected\n");}
    +and add it to the menu items in the main code with the WSetEditMenuItemAction( menuitem, menuItemAction);. There is also a little addition to the getMenu function, to reset the menu when we hide it. + +

    The function WCreateEditMenuItem in editmenu.c associates to ButtonPress events on the menu item widget, the function handleItemClick. This event handler function calls the function selectItem when it gets this event, and does a few other things we shall not need any more. The selectItem function goes through a few things. If the clicked menu item is a submenu entry, it checks its location and maps the submenu. At the end of this function we have inserted the line which calls our callback function in case the pointer to it is not NULL. If the menu has to appear, legacy-style, below a fixed bar in the window's top, we would just need to calculate this position, and also need to hide the menu whenever we drag the window itself. For a free floating menu, the latter is not very important. +

    The application source code is here. The editmenu.c code with the first few changes in it, is here. The changes are marked by a comment starting with /* MOD . There is one change in the new editmenu.h file. +

    Window manager hints
    +

    As the menu does not have the functions of an ordinary application window, we would not want it to have the same window frame. The buttons in the titlebar may be omitted, or limited. This can be done by the window manager, on data obtained from the X server.The X server, in its turn, gets them from the application. The XLib function XSetTransientForHint will, in xfce4, make the menu widget look like the one in the image shown on the left. The window manager gives it a title bar and button. It also allows to drag the menu. The code must provide functions to handle the event that the close button on the title bar is clicked, or the menu window will have the same problem as our first window. The window manager can also be bypassed. To do this, there is the Xlib function int XChangeWindowAttributes(Display *display, Window w, + unsigned long valuemask, XSetWindowAttributes + *attributes). As shown in the example code, it can be used to set the window attribute override_redirect. This will block window manager interference with the placement of windows. The menu window will now in all window managers look like the one in the first image at the top of this page. +



    +
    +

    +

    LAST: Programming Details 2ContentsNEXT: Library description
    + + + \ No newline at end of file diff --git a/WINGs_tutorial/WINGMenu_files/menu.jpeg b/WINGs_tutorial/WINGMenu_files/menu.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..fd8352a503124277a4cc5be4ad667803b18f91b1 GIT binary patch literal 13241 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 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGMenu_files/redirectmenu1.jpeg b/WINGs_tutorial/WINGMenu_files/redirectmenu1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4ace77ca6e5e127d8745a6ffd01ab3d70321eabc GIT binary patch literal 13150 zcmd6Nby(ER_x94LfUXGAAf+N9-6bV0B@NQCu*A}-sFZXp4br{jQcI{vcX!9q-4ZYQ ze2wq>JimPZd1tSkYj)zCGxzMw=bU>!SEE<6fIBjh(vkoa6coVo>kr^+4nQd3VqppZ z$jbv50002?_4hhmO#s9I7-;C|=x7+%83qOhCKe7h)^)ml>(&h%;O)D2fwzG`d_uDO z`1eQ%fIy-LL?qADQL+kC@H=RLAf4^g^7iSjg3cf4|tE_f1Iv90f5+m zOB5+I6lwq}5Csj0a`hEJ4nP5*qM}_-<5$AOLc>5o$G(Aj-K>2FfP#jKijH{`=O*^G z^?>i)(a}6`1iBn`bo#UGlI6Wlu^X|29;%oH2r(c=@0Q75Z7}rfKK$P!_(J-)onTCpj zb`Pj@7oQ#d0h?$EtAU|icbzw>I`atOVg6ZOEG=nV`16_vy;ubyUE+#xt@0I(!IGQ zW2aHWa9f1CPmPj`ZC6T?xkqY}MI)D&W9pu-W1g^%eS`yj)e`NB?#==NDp#RL#%_kx zqI_hg^|P~O=m=Rx(hV4|G#@@5e;nJ`e=0_fXUn+5WbUVeY@D&vVZV0b;hc-_=EN^V zMW#MosE%Zc@%!15_)}r}Vawx(&p;u{3hx?2mj8b@B_KcNj!KQZtB#}yPE{K(MyIXJ znrHr&8dD78A-XjqWx@yHLruLl64#2DC4IW}zXS68iF6iJI*CRX&u#YhTkp#bI$HZd zu?py%3R=icvt&PD+bs6s#Y^?l=43M=Z5A)$vi-u_QS600raj%|LNB`E&-zvC`lWGt zylOpnW~}&It^kf*H#{M7-G#Z?LEl74Nu()nblz(UiC=>(m7dNe2=n!xit&xubC*7! zptS*w&XSFAEMp6Z6Ch)=!=pnop_-HkE@5@*xtUIfCurjEfm@ksRXjCVpG>#PI(cCr zXPXWerz^my5XL;xG{c}trtZrHi0O$$n17(e_kVW_Zoz`p1vmAFzHD zvi}!92N$;8)EXME0Csut6JDhXp;`!*-2q)|_7_eXexUrRwfiQKZ|0|V9*M`^jNsyv zX5~sJxdBO13^OO+bBwNwKX`ykr_V7`*seV6|8n9m!oh98`mBvl5aelIKKrc+v|>&2 zynK=&ZgVa(f>&>5e7Ni%KFw#pwx<_TVW>!X>1$n@a^n_=m`b*+$3 z{YW4F?4IE(K%K%LWjTZywRQcURw|8>=GsoQgnFyKpAk_xAP*qprvwkXck*7$;G{Lm%3QuFCyrFO1zc{%cXJ8#EtE z6&n2z_M`n;+35PR?Q33G_;?ZMgZ%=aFwyzL<4hJu5Rv-^f8y=WF(f0<2sSq1Oe2oo z7!aY47n#q#ULUyLMzw_RY1}tzk~SJP*3!gr>}`{nD?nyt<;FXBDyGTT;7p!C^&C{tPRV_(G?miVndmz#5`L zHnW0HvQbTWl-|hkd8Cu8bBn9vc$dEA@$FIdxr1HdiC~*?6a~*h!E9=<<&)esSgD}$evF9E#YsXAoVOhPfPfENI&YO zbln}A{;&Eu`n`kchq;(DR>F_6b_J#Xr6uQI^*qwGb=T5FD<^KZKdx0&w)R`Pcir9c zU-b(Am-1ZUFZSDx(4yN03GNFK$;BNis-Gs~m^+JEL#N`vVCIg4XKcH`+eOv=vfs7f5VXtmUJ?bB^;0ZorG~Pw*m$ctmysgQEhn=$hR+2ibQz1SUS*9oqj86k#(Zwh-YBjk zca8SEeRh#uGM&Mio@oKAarTHeFVDs(!ZXN;GmUT??>OKh&P7mh4t7qkQMB6)@s3wTCw zjimjl3UjiGaw7&bAKBg&$E7Wn*_7O3awyDxAL3-@pp=M+xNZ75okW(N0ftZt5<0P5 zXIOWN)FfFCQdV7$L$mz)wt6Id4E2knG}zTxBGi9O(;>-+;?}19Q z4v2Pa;11a*S-nf71{j^6jZ;CHpI~~*qcZ-Ru9UIL4P-XUAjF#(rzlWzaTX6*vLHkQ zHDV1{tE2Z@N-t6A9WZ=(Gfx&wnUS3=gKK)jnqBB+>+%g0h%qyun1}GqW{7)M4PT@E zoWK)usC#&IJHy&qin0Oleob1IW{>?1G#X~@s=b~E$s)82i7hGPC078-%QZ*4JP3ui zWy`tux7^{raw#PssMp^g+yC{S*-e|YZO=%L_g4Vjz&lxI%*SKgt@?+fIq-pa&@@lM zqPQ{w+utYS{6Ws@lboFkTt`L%)o7l;p?f=WpH7yHU>u*jAPV!?w0E5EsQ2g_*GhF& zv3GVTrn97xIMXJwHf<;OHC+MXl#7TjF-F`#c%r8TEQCW~5{m+SjlS0O14guYZ&d}1}dpPiM(d59C}CX?sq=R>kX zM|_v$7(}?uM78|lg;$$PXo9U-95h8z@wefR!6`d1g3`HKUgt(9$#F_e$GR7aqzsvH zMJ9CORsmmIk#{!L6ZcvvUq9a8p$}fMl`e`zR~b_4o3r9}^eEM_Y@T*o)x0rxJjlFa1CHE&Dib(PMr0*N>DxjO9Z+AA4W$%r* z9pD5J6}c0oq(wp|2I__nj10xrw%RQlu;(K#&J8F^a*mQsfa@)4Y4zLuf=Pb(p$Iw5fAO=M5`D2j= zXWr2DryW}~kC4=Wbnt7&M93a7l^-Y}9)kh+WH?5*N?SoD$s#tB_XA=|8vurqM9m)h zW92&D7wbN^#zRTel>5bGM%33DNsUO#o?*^GH|8F)j4N(FVX<-aCRw-w=-sY*ar_PP zO??S891!!nQek@SlC$NqmeMvgC%BJobE{}U$9w(r@l8R`s){A0dxe3|4~b^wBCx8v z9YS609u$(<@W0kt6cYs!`uxrHe_a2e?nr*`{)N+{X9+6}GdeR5yhjYvMieZHT;|Kd zfifG^)Hfq{{0cHs(;E+mhFv{(rqcYd+fVzn+yrFpIqdfje~g`)_1gcv&&0Pm72xNraX z&Dtr*x%-Z1`K(*L*3|wxN^4L2xrrG89goZl5CJ`X^-yC)X2Y-|k$YSbxltl#{QL;c z=LI};%GW-XVp2U6KNS!B6a+s|^t18UwcCq1EP%}Oe`N%vIM;+B;ct~S^&oZtFxVCM zThATRZV`Il&}6dP>K)qkwr@AH(T4Vhw-c$pfmTxRrcdV=mRQzxjXp5r=2#2FtiMyP zH^Q-orb!a(5yQmTY4oenmnWN%9$4RH)c$8O6v*rLn_AlShvP|voNNX4nZT!CZdWA! z98#3#!S9az5E|7`$m4X}bD#3Dx0bp2>DZ@34>$seEi`_VJ=^39b7TK9qQT;R;|chn z_}K}ymuGO9!}jz>DWoC8SY(oun|Ew0Wv6Rize(1y$irq!XGB%N53L!y$3@qyY8`$sfAl_1>Jg53g@`)Zrdoah)me8g{`jV5~ zllqKic;)sWa&o5chkO+?$|vXfNk+R1yPnboUIJb$xvYiO-wt_?xex5hLZdHL$6DI2 z01U{#3;;gI$wrLKU(*?V z6<7Yns1&jUE=$yIu5E9saTQcPY(G5{X1pVq+L?oAF;8WBe`#}wKg6i^*ip}X1^2b^YkNi`$eni#(zLyX)#{aaJ ziWFv%@ArFV1k;1A0AF*})HB*a@4YY(6HL(6{I&I5x~veM8B$K!*jcjqV-8DX4569# z-7;@%(;;aozcDe!dxvH~t#^03h@o77dedIB%lK9kbS@W?bFhAzbE${K=$2;ic!pZ-?~ojj7?o}E2OtjtSb zk|14nC=bpmj2kmPAIqmnR50e#qe7xOFFSJ;P^y5N?Q|@d>;?v;JfM=TE#;PdH8Z(Y zX33K2Y}(DbQ@|NzieLCRRR?-Jx&VIY?|t4U#jn#ObkEDbY1QHvl47b*76+TnTLBsE z>cLL#MwbMsABzp2gL0Qso?pb^(}7YH$II=kweU>h=X1y7g2%_m%6e$Nrd|Qw5r~;T zX1?$AVuB%W^TaL9QcT~*r<5moJsL*6OV;Vm38!_3&^#rxe|hAdNVvpwcP5l%UewpaSu#5H2?gzw+vSAKMI(>9Ga|9&{FuChCFN#)M=Ci(Aq3-{O2a){S7P%R} z?Gx6zZJSMR1z`fN?^e``{<9ZgdM@n!Ie6RMwI7S4yk2mD#j>P#a*ONa2-t`rCpI3j zsVqDY;1cuu5#RP(j!E=pR8fVnccaDFx*|9H>!BlOQuND{_>EE!2|KQ4V`DP^M|-U6 zvw;P_e*w`o6zz1@0lqsbFQH6k@CDjxOzH26Q7WZC(SnMCXMql^DzX{&*09+sQmvDP zE@g7`A!9z<3vN93Pu2N{ljJ{mDi~S;Si~muk%if!b6* zebMM^*&JWqo}U+vQxL|stdaGkpoGEle4r62K&`A~*JNTcIqT-w>TbKqUI1-m6(Hwa zEW|;{JJUCQHDHxC6I|t?tNtnli-%mOI#UK!aX88QIQn7~zQ7#pjnWh51{U+YFEM)xg>v?C%Si zQ!I17$=1w_C?}g_AEu#!UYO`H^1we9L-#@YY0Dq2$ zgGxk4eZCHFL>Hqy|IUm0Y#Ur@>O9lp4j?A)Efid4l8>g6t~eo^ty9VZjvtVXYNR~Y zOfVxRI5%;krISSXrbBEw=Vp+MME&ByV@FgpBp1VNJ zr9qrPF?!#SgxnRx&)H)lSKu^ZOg)T|0ZcSfeNz>*Pufm`*lZ~kdY~<94Rsn+)}r@G zmhmk{(|t0EX%Oc#>FXMSCq^~3xM8^~2kR>wz;}AGicI${(t4DI_h3ip`BdKV)8J(` zQAPnH)@h}99r@IF^YlQ{O*BoSOb|+L+<02N7%jlmB^G%X>vI_IYt+pK(v|Qdl6?FU z+^UJZqX`$MerI^jzP=bN!+Nxk*-Dy_{tfR%lxihAo#ZdT|k zGeoLp5Qo^yv&t_29LF_eNR~QV)=MBe3CS3dmSp;&2uW9K7^Z7c(@VzQ3td*9B4Gdb zr54xaG~Ragybvfyzp`Z2~Oj|(c~$z=&~aT(Q$$Gwwz(Jh7Z+7l41`KN3fpKijXTn7j&C=>iLv; zg2YzvMXH+qyP~@M<8wI66@bZH`Ga1>4!LJH)Hf8rS6)Slo!XZxGGQ7C=;gMH5K&V6 z@>0vrth!%XT~<-hlp>kIwC6=@MgOg&yl2BPVYlE!$0jY2(%TFMeK7~|$d|(7xF_t2 zE`?tRh)g3of~^mtN3swVwaoKlk7>tB5DaMmylit@SB$O>Hs`{*J_?e&FKV$qE;J3& zvW89U>eHGUJL3uOndH*qt(E9Cp&SBF!Boq$E+dIN6h+WVk2$Ofg`fWJAgo8mLim;z z%#A0lPQQ3DD(r=Me-CHn9U)B(+Ctob!i-m);uogXUxStBpssHsW^_69(_-z)D_n}n zaI-@xl;@hS0Q1rBVjrfn^CEZar(js>jJ{G{724+szr4?14y(^j{VXo!L^&fkiVH`~ zty)@2`IPzKDY0SYP}7U$jWx2k zl5nv_W*_4Dd!KyfNh2w|P{rQxZZX7b|2+sOCt3V|t;G?%@X`+-@-Cr1yREskc`-Em zL>Ijr(xs#%2nbRhJZ#{TT}Rk;z1z$Sc6$QONPROtbJ`LS}zLv+6KObC5)LQT{IsEiB-m+YC zRq%ofv0czUhVu|4vy)fXwRSw8-1nO~TvSw7k*>_*mLo&v=!PX*beF{-PIUF#f+?6a zmfM<9BBgWHN*T`B`s%vP2twuY)RRPo1q;fL~|WgYc8Dlb@|Ke z8#61rOi3d$M92`rp&@0$&R+5&MJ3wX`~k%G#pk(qfw5S&xi+z~q>2HL9-0zmvJN%9 zPtrJJh)vH*bHs3nR4oaDyzLM(27d(j^g1u2=@QqkG!Up8fVwcsuw+GD!cPMBN9tj* zwux%sybVhy!gd`Jx#G5{H^CM`$8EHNjDhjREAus78C5J?>-RVuZ0F+x;yCOjIhlIO zt@hBg1=ZCeWZ60q2pZ;9$-*<1uTkTCO)qnqV%me`b$uB&O9$)SA&+2=cpWcARt`-e zlaL38q~l~ex(#d;ffCY#uRNqoYe^7?X33#nwCACem6qp^g`EA$wRowapfigkfCfeg*h z14H7oz`?kj@xi_{PGO_kcu{Z@jCgoLa-Lw{=I25`^p>Z^^UNGAm22RP?m zkGkNg8Pt6UeS7Ug4`Skku*v- z(9hCGYon|~AVf#jjQsN8Wc+9v%m)Jmtx*W~Mgy9i+K|=p6OMT&6aHDi7Tb!KVuY^u z@3axqd~!iwW(SoH^EwYhHw~L0)2qn%8FKA4ZDU6hId<0Y<}CfDQ5S zCrn3Kw#Fc^bAoGOX3bO_QBE>WMvg6CpUg?3GtU;Y0nNTi(^tg#&uCnUTMpkNw`9`7 zym)^VjORGjKg8$aoz=pdVub(PmDh|G+&1@-km6LCRPT0fr4i2-2efK+b)jCC#@J|V zvY+qYg91q=y`MZl;!h3A9I^EKc)MJ+CYpTPbiQbwq;mlL-u8w|-5x{0gS+C)yK`RPu1 zVQnyrnc6$gY3gq%2llMvUJPLl#2iZp2uXSstHl4PkVsCv0yxV%=MvJ2tKds?!mPztxE| zRkhc6JnN7*31P6>x~o0)1mqMaGY)Peg=1O|PAV8Z1QQ3Zr^|;<>5OTNvy!G2RFstV zcO#`Z9MwpvmTNS$3#OOGpg!0~MOZH87UIY6%2VbdSJb#OvTs-jH$LpmvyoQPVflcp zojwr)$y(5a!(l#3D&;KqhN!VjrA zpB4V)C6{SADiKnMYPkB74=2uB#^bG-;tC^@)m<{Dzz#Bp&m%XOwxXjGM9F@y^`p0^^G-ko*S!(7ukN` zo?Uixh8w2Eogl#T9)ZB#nOtUg)e#YsdJba`k6Trj@;7HwezP&?)>6=TGuj8Zd)o63 z4U;(Z=hVlNm%Z@r%U!8+xb79e-CDIVon=*E^$Jj+RsVPDVPt_)RVUZnD53|FOd929 zCL!LM?rxdcNtRO3Kl_QDnTe^@6f&!dn*ZLL++w<*@#Zd2q{7%DZ#%}G&yxM zB*Rly94gu?nVC7>DC)i~YT;pOgNv`2TfuGbGm^UTc;C!y=yC*WiZVG0#JX`0YQM@) zt}ZOv(ila@;|pP3zA#ng2x@c=3jKmA`ip=0&18+J8O7yVm|7hfGUFg@wJqkO_uxIF zH-oKBC3T^l+iiX>C)}{QiRT1Sgllfu2D$MI*7;ScO#)l*cS@5bSwCS(6>M62OvHkX z7(eycg5Cel^=K?K#h>_V@uM+r->$HBnj!R8vt}DQKZ`Rv-QQ;RebRJa+j=X@cT65< zI}oITotyAdP%AHh+9?Ng>n$RToi_ON&1Beay4gP%zdFI1QF-fN@P)?OlmxkiJhv&P zY~IM{0x}&r!>9erydML|ARSNHrwYq02y05p*?RnpvVHUTtzZz)VF$6+UTcUpYaAXH zE5hk~f9r(};_t>QbBIZpWg-Z+5+q}N+(W{q^yS(g#;9=LY5_(qO;+ltMf4TMIEHtG z(tNch>2bE%%Hc|EsF9Q2V?Xps{K0nQSsft1)wtI^FQKMRdj3D~ixt0+ltO(%Z;z-C z4)iPk>;9pUCXnmL{R4g&09Bg*_05l7(H!)QeUVdwkL4snN*PwDI;-b4HD zyaMU6&%j&)=E0i_bKA^SeuQ`zDWMB(M@lud(G(AR2MwbO>U%lMi~B#{Az(KqmfJZ& zAwHG}A@+grx6=BEZVLaG0rjEATSByCCoh4E+7uJpS51D5T`5l93y~XHSw##u)@h=) z8<(TjQ;}mKg(DNvTg|v{oOJY%lS@rA9fIrWQr^9V^w~x;=HtYpXCH?ZX3_6jKOn}3 z$~nWyL`-=CZjES@X+kx}_BvQ>9*&7(GLlL5T$`_=q8`mOIwKA}tIEq|#jW8@vli3X zEcbgLkY?dbJ~i-3IKkhTo28=!=0BwY;y3(AfLW!(6`cISY5oCW#nx^RCiI&!dnZ}@ zp}|{%Wd$dXp4GM^b$T)lm#&mh;cHFu@_I5v>0)VtrLPV73?wvh!sKPghDgb!zP)Na zglnd(yn&iAbB=?#`)I(_v#bPFs)3E#MHP`#LHwxaRdqep9UmH??jw0$d5TTK%eF3f zh1%ze4V#0TdzxY@e_+Gm{=|Iyd79-9i@x1Vz#=c=bqGF{ywR`rMqja4}Np zu5HL`bJD6dD(3EoU%BMCgBM^8x{sL#_YBrXjXd@+Hz`0&Updo*yW3#AINkCO{Rzxf z7u?QjG%Y9mg?8rnN$L*- z9WFQNO|g0fFsu7-6YykljYuh2j4=r|XQ9$C4>PrMbJ+0WBiO@EP&+5B(CQtQeE0U$KeiikjJ;WL`Ye83QST`1@3XBgv+JZscV+#`B@!fs!!}<;HUvVt(mvw z#m)01E>|@VSA`8P4~GE&&ZV8Oj@|A+eHZI-9VJ;Nl^d*^49gyN5mV2!iTQ%*GJ-x~ zxt_?tPk!D@tr(ISK}tqJMV!vsWveT>GXjNysZC3T=wT?f#9P~8es1a6wJVazAzIH_ zqQaXVW#ciya&D7{%&$1=7ZyxCb2gR~LAidxaVCI+`ONiI#Hq+p*L85(?Wx-B5#Fg` zf@jCq&CFU>^H9Sw$Y1^8Pv7p>4Vs@@MqaZPb#6#*#5~FERW<8^=*^tyP<(jst8f@G zArEITc^mmPH;xR+Cp7nh#eP=zU$xXSUru9=FLkbMWRG7Z(UG?6EJ3t&nuJk3@&20^ zDOUI5XexDURN@LyaT5<{)ojONESpEmY9;%YeW>%A=jreg6Pz`PSO|8IvQ5r%E07R5 zwMY(l!Ho4zPvArD7~=tc{JzIFHa}#L(f`ms&js* z-SSnz*wnp+x##B;#p;wBgB|2C+O{@E1()+7N-9MIcsGNY!B9{thpS0s-T1fNr!HClAwlou|>i4&6Zk(0NDc5pAEulyD0O_upg0h`?R`5up4(ny#Vaw#MAQf5FR!YTt^6noJyUeVOqOkB2Q1G@y=Q|}p#aWM% zeRoABSkZj89R~M~1bWO>?GqOLFZsjj@!gRC4PDr@}^E5*TGN=e6`MvUK*XzXW)+E)wKRe7H`6a2p4-LtEF!cE%T{Z1de zT&a|cvsVDI8*C2Iku|gfy=`4sn7m#lvMWICe*j}|hi~Xs#Kig(Ih0+KlVA}(q4C*K zF4{*%%B--NNJq=NF>anthktAnE5;L3ehT_i^t7kMXP*^7f>RAO`IBOA?2<0q)J>}`@Mh@fbWC}*Ca^79 z&(RgD@-cHi50sZLbE<1-M=^B-w5!wbhtC;_OHh9X-noumf5)rOuEW^rzrt7o!WxLY zdkaCLf1tX-k8Zy*%ny|A1BI8A--1;eFUA$8)rEwPGqul!k4bX^I=wc?11_WhUXo8<;*|IqeB$t(!!J^BLz*37?V{(Boq{enlv!9vXT z?cFXxwffR{p+*Q=*85KM_2Q*C%Gd+usLGB?CeS7%y4!dmQ}6>Z@E(J>xX7<3+<&(u IdNuZc09z^11^@s6 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGMenu_files/redirectmenu2.jpeg b/WINGs_tutorial/WINGMenu_files/redirectmenu2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ad965faf8d45fae075f87efbf27aba6b470f3ed4 GIT binary patch literal 14461 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 bO-814Wwuu}5TseO^gkbPew}n~UyuJkLk~P_ literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGsIntro.html b/WINGs_tutorial/WINGsIntro.html new file mode 100644 index 0000000..e36cd3f --- /dev/null +++ b/WINGs_tutorial/WINGsIntro.html @@ -0,0 +1,42 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + +
    LAST: ContentsNEXT: Step 1 Drawing a Window
    + +

    Make a WINGs based Graphical User Interface in 3 Steps

    + +The WINGs library is the library with routines for a graphical user interface which comes with the Window Maker window manager. In 2010 the library's web page is here on the windowmaker.org website. You can download windowmaker with the WINGs libraries here. The library provides widgets which you can use to make a graphical user interface. A widget is a software module which is used to interact with the user. Buttons and menus are widgets. The WINGs library offers the possibility to programme these widgets in a few lines of C code, so that you can dedicate the rest of your time to the functionality in your application. + +

    This tutorial shows in three simple steps how to write a graphical user interface with WINGs. Those three steps will cover all that is needed to write the major dialogs and widgets needed for communication between application and user. It assumes that you know how to programme in C, but you do not need to know anything about GUI-programming. + +

    Step 1 in this tutorial will show the framework for an application which uses a WINGS graphical user interface. It shows how you have the WINGs library create a widget for you, and how you set its properties. Step 2 briefly explains what events are, and how you make your application react to incoming events. This is what makes your interface work. Step 3 shows how to insert two buttons and a text area into the application's window, and how to implement the handling of events for them. Along the explanations in the main text, there are a few examples of source code. Most WINGs function names speak for themselves, and therefore, not everything in the source code is repeated in the text. You can just read the code. The example developed in the three steps is a sufficient blueprint to allow you to use the other widgets in the WINGs library. To do that, just look up the functions in the relevant section in the library description section. + +

    There are three programming detail sections after the three tutorial sections. They explain how to use Xlib code along with the WINGs code, how to set up a widget in which you can draw OpenGL images, and how to change part of the WINGs library source for your own needs, among other things. + +

    To compile WINGs widgets, you need a C-compiler, the WINGs library, and an X-server on your computer. The first few libraries which you need will be libWINGs and libwraster, and the X11 library libXft. If the WINGs library directory is in the /usr/lib path, and your X11 libraries in /usr/X11/lib, you can compile the code with gcc as follows +

    gcc -x c FileName -lXft -L/usr/X11/lib -L/usr/lib -lwraster -lWINGs -o FileName +

    This will get you a binary called FileName which you can run, either by double clicking, or by running the ./FileName command in an xterm. +

    To compile in C++, just replace the fprintf(stderr, ..) command with an appropriate cerr << , add the namespace command, and replace the <stdio.h> with the iostream header, then compile as + +g++ -x c++ -lXft FileName -L/usr/X11/lib -L/usr/lib -lwraster -lWINGs-o FileName + + + +

    The function prototypes in the library description were retrieved from the information in the WINGs man pages which were compiled by Alexey Voinov. His page was here in 2010. + + +
    +
    +

    +

    LAST: ContentsNEXT: Step 1 Drawing a Window
    + + + + \ No newline at end of file diff --git a/WINGs_tutorial/WINGsRemark.html b/WINGs_tutorial/WINGsRemark.html new file mode 100644 index 0000000..f80a0ca --- /dev/null +++ b/WINGs_tutorial/WINGsRemark.html @@ -0,0 +1,174 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + + +
    LAST: Step 3 Adding WidgetsContentsNEXT: Programming Details 2
    + +

    Programming details and WINGs functions

    + +
    Count the windows
    +In the code up till now, we had just one window. When it receives notificaton that the window is requested to close, it shuts down the whole application. In an application with more windows open, we might not like it when closing an arbitrary window shuts everything down. An obvious solution is to exit the programma when the last open window is requested to close, and keep a count of the number of windows open. The closeAll function becomes: +
    int windowcounter=0;
    +void closeAll(WMWidget *self,void *data){
    +  WMDestroyWidget(self);
    +  fprintf(stderr,"I've been used!");
    +  if(--windowcounter<1) exit(0);
    +}
    +A second window should be opened with the existing screen as an argument. After success in opening, you increase windowcounter by one. +
    Icons and images
    +

    Defining an icon which will be used for your application, and drawing an image in a widget, are quite straightforward. Suppose, there is an XPM-image available, and it is the file /usr/include/pixmaps/picture.xpm. The following code sets an application icon and draws an icon in a label. +

    RContext *ctxt;
    +RImage *img;
    +WMPixmap *wimg;
    +      /* code to open screen, window*/
    + ctxt=WMScreenRContext(screen);
    + img=RLoadXPM(ctxt, "/usr/include/pixmaps/picture.xpm", 0);
    + WMSetApplicationIconImage(screen, img);
    + wimg=  WMCreatePixmapFromRImage(screen, img,0);
    +     /* code to create a label */
    + WMSetLabelImagePosition(label, WIPImageOnly);
    + WMSetLabelImage(label, wimg);
    +RContext refers to the X-server's so-called graphics context. This specifies which line width, fill patterns, etc. will be used. That information is not contained in the XPM-file. With WMScreenRContext, we use the existing context. RLoadXPM loads the xpm from a file, and stores it as an RImage. +

    The image is set as an icon for the application with this RImage. We transform the RImage into a WMPixmap. The WMPixmap can be shown in a widget. Here, we show it in a label with WMSetLabelImage . You must specify its position with the right option first. +

    An X pixmap is a text file. You can insert its code into your application source code directly, and handle it with RGetImageFromXPMData + +

    Virtual screen and resolution
    + +

    +WINGs provide the function unsigned int WMScreenWidth (WMScreen *wmscr) to get the screen's width in pixels. There is a similar function to get its height. This is information about the virtual screen, and is not always what you are looking for. Many (or all?) Gtk+ interfaces have bigger font sizes when the virtual screen is bigger, even when the monitor is the same. If your monitor runs at 1024x768, and your virtual screen measures 1800x1440 pixels, you would often want to adjust your application to the monitor's resolution, and the view it has on the virtual screen, rather than to the screen's size itself. To get the used video mode (ie. the 1024x768 in our example), and the position on the virtual screen, the X-library libXxf86vmode provides two functions. +

      +
    • Bool XF86VidModeGetModeLine( Display *display, int screen, int *dotclock_return, XF86VidModeModeLine *modeline) +
    • Bool XF86VidModeGetViewPort( Display *display, int screen, int *x_return, int *y_return) +
    + The returned modeline is a structure which has members hdisplay and vdisplay. The monitor's current resolution is hdisplay x vdisplay. The monitor's left uppper corner is at the position returned by XF86VidModeGetViewPort in *x_return x *y-return. The screen parameter in these function calls is not a WMScreen variable. A WMScreen variable wmscris a structure, defined in WINGsP.h, which contains the screen number in a member wmscr.screen. The follwing example defines a function *WMGetModeViewSSize() For simplicity, it is assumed the application is using the default screen. The argument to the WMScreenWidth function should of course be a WMScreen type. + +
        /*   extra headers    */
    +#include <X11/Xlib.h>
    +#include <X11/extensions/xf86vmode.h>
    + 
    +Display *display;
    +WMScreen *screen;
    +
    +int *WMGetModeViewSSize(){
    +int *result;
    +XF86VidModeModeLine modeline;
    +int dotclock_return;
    +
    +result=(int *)calloc(8,sizeof(int));
    +
    + XF86VidModeGetModeLine(display,DefaultScreen(display), &dotclock_return,&modeline);
    + *result= modeline.hdisplay;
    + result[1]= modeline.vdisplay;
    + XF86VidModeGetViewPort(display,DefaultScreen(display), result+2,result+3);
    + result[4]=WMScreenWidth(screen);
    + result[5]=WMScreenHeight(screen);
    +
    + return result;
    +}
    +To compile this function, you need the libXxf86vm library. For the GNU compiler, your command would now be gcc -x c -lXft FileName.c -L/usr/X11/lib -L/usr/lib -lWINGs -lwraster -lXxf86vm -o FileName. When you run the function (after opening the screen), and print its results, you will find something like:
    result 0 and 1: 1024 768 
    +result 2 and 3: 126 171 
    +result 4 and 5: 1800 1440
    +meaning that the monitor is running at 1024x768, its upper left corner is at (126,171) in the virtual screen, and the whole screen has a resolution of 1800x1440. The user is seeing the screen part from (126,171) to (1150,939). In the illustration to the right, (X,Y) represent the Viewport coordinates which are obtained from XF86VidModeGetViewPort. The bright part is the part of the virtual screen which is visible on the monitor at that moment. + +
    Message log window
    +

    In all the applications up till now, error and other messages have been sent to stderr or stdout. when you start the programmes by (double-)clicking in your file manager, the messages may disappear, or pop up in a window. This makes starting the application from an xterm command line the most practical. To get rid of this disappointing feature, you can programme another window to send the messages to, or, more logically, use a named pipe to send them to a different application which you already have on your system. This section gives an example how to code this last method. +

    The method is simple: when the first message needs to be written, the code creates the pipe with mknod. If successful, it forks. The child process uses unix' execlp to start the logging application. In this example it is xconsole, with the pipe as its file argument. The parent process opens the pipe for writing. The application now can write to the pipe. +

    The first detail is in the function to close our applicaton, closeAll, in the examples. This function should terminate the child process, and also delete the file which was used for piping the data. The second detail is the way we keep track if the child process is still running, or whether the user has clicked it away. For this we declare a signal handler each time we start up the child process. At the SIGCHLD signal, which indicates the child process has been terminated, we call a function which deletes the pipe file as well, and sets a global variable to a value which allows us to check if the child process has terminated. When writing our second message, we check first if the child process is still running. If it is, we can write to the pipe, if it isn't, we create a new child process and pipe. If there is any problem, we fall back on the usual stderr. Here is the (extra) code for a simple implementation: + +

    #include <fcntl.h>
    +#include <signal.h>
    +#include <sys/stat.h>
    +#define ERRMSGFIFO "/tmp/WINGsWindowfifo"
    +#define NOLOGWINDOW (-2)
    +#define FIFOERROR (-1)
    +#define FIFOLOWESTPOSS 0
    +
    +int fifonr=NOLOGWINDOW;   /* the fifo nr, or an error value */
    +int sibpid;               /* the child's process ID  */
    +
    +
    + /*    clean up when closing: */
    +
    +void closeAll(WMWidget *self,void *data){
    +
    +  WMDestroyWidget(self);
    +   if(--windowCounter<1){
    +    if (fifonr>=FIFOLOWESTPOSS) 
    +     kill(sibpid,SIGTERM);
    +    if (!access(ERRMSGFIFO,F_OK|W_OK))
    +     unlink(ERRMSGFIFO);
    +   exit(0);
    +   }
    +}
    +
    +  /*     handle the case the child terminates. Set fifonr and clean up:     */
    +
    +void redirectmsg(int sig){  
    +
    +  fifonr=NOLOGWINDOW;
    +  if (!access(ERRMSGFIFO,F_OK|W_OK))
    +    unlink(ERRMSGFIFO);
    +  return;
    +}
    +
    +
    +   /*   have the log window pop up:    */
    +
    +int showMessageWindow(){
    +
    +(void) signal(SIGCHLD,redirectmsg); /* use redirectmsg whenever the child process stops  */
    +
    +if(access(ERRMSGFIFO,F_OK)==-1)
    +  fifonr=mknod(ERRMSGFIFO,0640|O_EXCL|S_IFIFO,(dev_t)0);
    +else 
    +  fifonr=FIFOERROR;
    +     /* fifonr == FIFOERROR if mkfifo or access failed, for mknod returns -1 on failure   */
    +
    +if(fifonr!=FIFOERROR){
    +
    + sibpid=fork();
    +
    + if(sibpid==0){
    +   execlp("xconsole" , "xconsole", "-file",ERRMSGFIFO,"-geometry","250x400", \
    +        "-title","Application Messages",(char *)0);
    +   exit(1);
    +}
    + else
    +   fifonr=open(ERRMSGFIFO,O_WRONLY);
    +}
    +  return fifonr;
    +}
    +
    +
    +    /*    usage:       */
    +
    +void someActionWithMessage(void *self, void *data){
    +
    +  if (fifonr<FIFOLOWESTPOSS)
    +    fifonr=showMessageWindow();   /* (re)start xconsole, or try again in case of FIFOERROR  */
    +
    +  if (fifonr==FIFOERROR)                                  /* if still error, use stderr   */
    +    fprintf(stderr,"%s selected\n",  WMgetSomeInformationFrom(self));
    +  else{
    +    char textbuffer[100];
    +    snprintf(textbuffer,99, "%s is the information\n",  WMGetSomeInformationFrom(self));
    +    write(fifonr, textbuffer,strlen(textbuffer));
    +  }
    +}
    +
    +

    +The someActionWithMessage function is a WMAction in this case. Of course, there must be an xconsole in the user's path and he needs the correct rights. The example catches the events that the user clicks away the xconsole before he is finished, that the fifo file already exists, and that the fifo file is replaced with something which is not accessible during run time. There is nothing to change in main. + +
    +

    +

    LAST: Step 3 Adding WidgetsContentsNEXT: Programming Details 2
    + + + \ No newline at end of file diff --git a/WINGs_tutorial/WINGsRemark_files/ScreenSize.jpeg b/WINGs_tutorial/WINGsRemark_files/ScreenSize.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..456f8a76e1ac4122be49a8383aae0c19c786fc2b GIT binary patch literal 48384 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 H@Bi|D37LL$ literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGstep1.html b/WINGs_tutorial/WINGstep1.html new file mode 100644 index 0000000..61c35bb --- /dev/null +++ b/WINGs_tutorial/WINGstep1.html @@ -0,0 +1,64 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + + +
    LAST: Introduction ContentsNEXT: Step 2 Processing Events
    + +

    Step 1: Six lines show a window on the screen

    +

    +The WINGs library allows you to get a window on the screen with a few lines of C-code. The following source code will give a non-responsive empty window. By adding a short function and just one extra line of code, we shall enable it to be closed by clicking the destroy button on the title bar. +

    Application FirstWindow
    +
    #include <WINGs/WINGs.h>
    +
    +int main (int argc, char **argv){
    +
    + Display *display;
    + WMScreen *screen;
    + WMWindow *win;
    +
    +   display = XOpenDisplay("");
    +   screen = WMCreateScreen(display, DefaultScreen(display));
    +   win = WMCreateWindow(screen, "");
    + 
    +   WMRealizeWidget(win);
    +   WMMapWidget(win);
    +
    +   WMScreenMainLoop(screen);
    +}
    +
    +
    +

    The order in which things are created is display -> screen -> window. A display is your pc, with keyboard and mouse. Its name is what you may see if you type into your xterm echo $DISPLAY. The answer might very well be::0.0. Your PC may have more than one screen. So, after connecting to the display with XOpenDisplay, you must open a screen with WMCreateScreen. The display knows which screen is your default screen, and there is a function Defaultscreen to tell you that. Your application will need to open a window in that screen, and that window is what you would like to interact with. + +You complete the window, and put it on the screen with WMMapWidget(WMWindow *window), and WMRealizeWidget(WMWindow *window). Omitting either of these two functions, will have as result that your programme is stuck and you won't see anything on the screen. IN general, a widget is complete when WMRealizedWidgeted. As long as you do not map it, you will not see it. The other way round, it won't work. You cannot map a widget which has not been realized. After WMrealizing the window, you set the interface in motion by calling WMScreenMainLoop(WMScreen *screen). WMMapWidget makes a widget visible. You can also WMUnmapWidget them. +

    The source code is here. There is an extra intialization line which organizes the data the WINGs functions work with. Compile it: The application will show a grey area inside of the borders which your window manager provides. If you started the programme by running ./FirstWindow from an xterm, you can stop it by using ctrl-c from the command line. If you started it in the graphical interface by double clicking it, you may or may not be able to close it with the close button on the title bar. You'll notice that in Windowmaker the button is disabled, and you need to kill the application (double click). If you are using a different window manager you may be able close the window by clicking on the close button. More about this in a moment. + +

    Setting some properties
    +

    After creating the window with WMCreatWindow, and before mapping it, its properties can be set. Function names speak for themselves. +

    • WMResizeWidget(WMWindow *window,size-t WinSizePixels,int WinSizePixels) +
    • WMSetWindowTitle(WMWindow *window, const char **titlestring) +
    • WMSetWindowMinSize(WMWindow *window,int s,int s) +
    • WMSetWindowAspectRatio(WMWindow *window,int t,int t, int t, size-t t) +
    • WMSetWindowResizeIncrements(WMWindow *window,int Size,int Size) +
    • WMSetWidgetBackgroundColor(WMWidget *window, WMColor *color) +
    +A WMColor colour can be created and undone with +
    • WMColor * WMCreateRGBColor (WMScreen *screen, unsigned short red, unsigned short green, unsigned short blue, Bool exact) +
    • void WMReleaseColor (WMColor *color) +
    +The resulting colour is a RGB combination.. +

    After inserting whichever functions you like, compile the code again. + +

    Something is missing
    +

    Let us go back to the difference in behaviour under different window managers. Open an xterm, and run your application FirstWindow) from the command line ./FirstWindow, that is, if it's in your current directory. We have seen that under windowmaker, the close button is disabled, and you can only close the window by using ctrl-c. Now switch to a different window manager, like xfce4 or (yes) fvwm2. Run FileName from the command line in an xterm. Click on the close button in the title bar. The window closes, but that is not all. You are getting an error message in your xterm, when you close the window. xfce4 says Broken pipe. fvwm has more funky messages like XIO: fatal IO error 104 (Connection reset by peer) on X server ":0.0" after 1320 requests (1319 known processed) with 1 events remaining., or X connection to :0.0 broken (explicit kill or server shutdown). So one window manager disables a button, and the others give error messages. We have a problem to solve in any of them. + +

    LAST: Introduction ContentsNEXT: Step 2 Processing Events
    + + + \ No newline at end of file diff --git a/WINGs_tutorial/WINGstep2.html b/WINGs_tutorial/WINGstep2.html new file mode 100644 index 0000000..7b802c1 --- /dev/null +++ b/WINGs_tutorial/WINGstep2.html @@ -0,0 +1,59 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + + +
    LAST: Step 1 Drawing a WindowContentsNEXT: Step 3 Adding Widgets
    + +

    Step 2: Processing events

    + +
    Closing the window
    + +

    Every widget can process events if it wants to. An event is a structure with information, which is created by the X-server, when certain things happen, such as a mouse click, a pressed key, or the raising of a window. These Xevents are queued. You can select for a window or widget, which events, sent by the X-server, you want it to use. The other events will be ignored. The widget takes these events out of the queue. You must specify which function will be executed for which event. In our FirstWindow application, we have not done anything of this kind. + +

    In the FirstWindow application, the WMScreenMainLoop(screen) call puts the application into a loop to wait for events. We had not specified any events to be processed, however, and the application does not react to the event that you told the window manager to close it by clicking on the close button. For this, there is an easy fix. It is the function +
    void WMSetWindowCloseAction (WMWindow *window, WMAction *action, void *clientData)
    +This should be called after the window's creation and before its mapping with WMMapWidget(). The argument WMAction must be a function, which looks like this:
    void action(WMWidget *self,void *data){ commands}.
    It is automatically called when the window is closed. Typically, it handles the data, it destroys the widget where the CloseAction event arrived, in this case our only window. In our simple programme, we would simply exit the application. If there can be more than a single window, we should keep track of their number, and exit only if we are on the last window (if we wish to do so). Widgets are deleted by void WMDestroyWidget (WMWidget *widget) Now , to the FirstWindow code, we can, somewhere before the main function, define this function: +

    
    +void closeAll(WMWidget *self,void *data){
    +  WMDestroyWidget(self);
    +  fprintf(stderr, "I've been used!\n");
    +  exit(0);
    +}
    +
    +We write a message to the standard error output when the function is used. After the WMCreateWindow() line, we insert the line: +
    WMSetWindowCloseAction(window, closeAll, NULL);
    +

    Compile it. The source code now looks like this. Do the experiments above again. In Windowmaker the close button now is enabled. In the other window managers, the error messages have disappeared, and our function lets us know it has been used. +The title bar reads "untitled", because we have not used WMSetWindowTitle. The destroy-button now is enabled, however. The colour was created by the red, green, and blue values : 124<<9, 206<<8, and 162<<8. + + +

    Closing the window in a different way
    +The WMSetWindowCloseAction() hides many details. Suppose we like to close the window and end the application in a different way. We can use the same closeAll function as above for this. We are going to close the window whenever there is a mouse click in it. When there is a click, the system notifies the window that there is an X-event "ButtonPress". To use this, we must specify which events we want to use for the window, and specify which function will be called in case such an event arrives. The function to do this, is
    void WMCreateEventHandler (WMView *view, unsigned long mask, WMEventProc *eventProc,void *clientData).
    The mask argument in it will be an "OR"ed combination of masks. Here is a list of Events and their event masks. For the moment, we just need "ButtonPressMask". The WMEventProc is a function which must look like void eventProc(XEvent *event, void *data). The clientData is our window to which we like to give access for these events. (WMView *) is a member in the WMWidget structure. It can be obtained from the window by the function WMWidgetView(WMWindow *window). +Now, insert the following function after our closeAll function in the programme +
    
    +static void handleEvents(XEvent *event, void *data)
    +{
    +    WMWidget *widget = (WMWidget*)data;
    +    switch (event->type) {
    +    case ButtonPress:
    +        closeAll(widget,NULL);
    +        break;
    +    }
    +}
    +
    +It says that if the incoming event for the window is of type ButtonPress, it will call the function closeAll. We really do not need the switch statement now, because we do not specify anything for ButtonRelease. Usually we define functions for all the event types which we have specified by the mask in the WMCreateEventHandler function. Now, after the line with WMCreateWindow(), insert the following line in our programme: +
     WMCreateEventHandler(WMWidgetView(win), ButtonPressMask,handleEvents, win)
    +The full source code now looks like this. Compile the code. Run the programme, and find that the window closes as soon as you click in it. We have given window access to the ButtonPress Xevent, and specified that in case this event comes up, the closeAll function should be called. We'll remove this annoying feature again in the next step, when we shall show a button in the window, which will duely close the window when clicked. + +
    +

    +

    LAST: Step 1 Drawing a WindowContentsNEXT: Step 3 Adding Widgets
    + + + \ No newline at end of file diff --git a/WINGs_tutorial/WINGstep2_files/FirstWindow.jpeg b/WINGs_tutorial/WINGstep2_files/FirstWindow.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..79b96e20b07a6602138d75cf05fea44c8e772d9e GIT binary patch literal 5838 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 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGstep3.html b/WINGs_tutorial/WINGstep3.html new file mode 100644 index 0000000..f0be0eb --- /dev/null +++ b/WINGs_tutorial/WINGstep3.html @@ -0,0 +1,143 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + +
    LAST: Step 2 Processing EventsContentsNEXT: Programming Details
    + +

    Step 3: Adding widgets to a window

    + +
    Adding buttons to a widget
    +

    As a window is a widget, we can create a button for it with the function
    + WMButton * WMCreateButton (WMWidget *parent, WMButtonType type)
    +To make the button visible, the function WMMapSubwidgets may be called on the window. A call to WMMapWidget on the button will do the same of course. Before mapping the button, its properties can be set with functions whose names speak for themselves + +

    +

    • void WMSetButtonText (WMButton *bPtr, char *text) +
    • void WMSetButtonTextAlignment (WMButton *bPtr,WMAlignment alignment) +
    • void WMSetButtonAction (WMButton *bPtr, WMAction *action, void *clientData) +
    • void WMMoveWidget (WMWidget *wdiget, int pixelstoright, int pixelsdown) +
    • WMScreen * WMWidgetScreen (WMWidget *widget) +
    • WMSize WMGetViewSize (WMView *view) +
    • void WMMapSubwidgets (WMWidget *widget) +
    + +

    As windows and buttons are both widgets, WMResizeWidget() is the same as for the window above, just as the function to set the background colour. Sizing and moving is in pixels, movements are in pixels from the parent widget's upper left corner. The default action on a button, which is a mouse click, will call the WMAction function, just as happens with the CloseAction on the window. WMAlignment can be WALeft, WACenter, WARight or WAJustified. + +

    The different WMButtonTypes are +

    Touch buttons:
    WBTMomentaryPush, WBTMomentaryChange,WBTMomentaryLight +
    Alternate on/off buttons:
    WBTPushOnPushOff, WBTOnOff, WBToggle +
    Checkbox with label next to it:
    WBTSwitch, WBTRadio +
    +Particular behaviour of a button can be obtained by using the function
    +WMButton * WMCreateCustomButton (WMWidget *parent, int behaviourMask)
    +By default a new widget will be placed in the window's top left corner. WMMoveWidget is used to place it correctly. +

    Buttons can be grouped together by using a WMBox widget. You would do this when you want to do something fancy with the buttons, eg. filling the width of a part of the window, and resizing with that part. Create the box before creating the button, WMMap the button, and next add the latter's view, extracted with WMWidgetView() to the box: +

      +
    • WMBox * WMCreateBox (WMWidget *parent) +
    • void WMSetBoxHorizontal (WMBox *box, Bool TrueorFalse) +
    • void WMAddBoxSubview (WMBox *box, WMView *buttonsview, + Bool expand, Bool fill, int minSize, + int maxSizeor0, int space) +
    • void WMSetBoxBorderWidth (WMBox *box, unsigned width) +
    • void WMSetViewExpandsToParent (WMView *boxview, int leftOffset, + int topOffset, int rightOffset, + int bottomOffset) +
    +

    In the WMAddBoxSubview function, setting expand to True will stretch the button to the height of the box. space sets the space after the button. To resize the widgetbox with the window, you can use the WMSetViewExpandsToParent function. Otherwise, you can calculate your own positions, and move the box to where it is supposed to be in a resized window. There are other ways to group buttons, or other widgets, eg. by a frame. + +

    Resize events
    +To know the current window's size, and the size of any other widget, there is the function WMSize WMGetViewSize (WMView *view). As before, the function WMWidgetView casts the widget into a view. WMWidgetScreen returns a pointer to the screen in which the widget was created. + +

    We thus can get the window's size, and place widgets in their correct positions. What is left to do is a function which handles the event that the user resizes the window. The buttons, or the box containing them, should move to their correct positions in the window again in such an event, or resize with the window itself. There is an event WMViewSizeDidChangeNotification when the window is resized. For a WMWindow win, passing WMWidgetView(win) as the last argument to the function below will define what to do when this event occurs. +
    void WMAddNotificationObserver (WMNotificationObserverAction *observerAction, void *observer,const char *name, void *object)
    +The third argument should be the event's name (WMViewSizeDidChangeNotification), and the first argument is the name of the function which will be called. This function should look like void observerAct(void *self, WMNotification *notification). It is all done in the sample code here. + +

    Adding the event handlers and widgets to the application
    +In the FirstWindow code, we insert the following lines to handle the resize notification:
    +
       WMSetViewNotifySizeChanges(WMWidgetView(win), True);
    +  WMAddNotificationObserver(resizeHandler, NULL, WMViewSizeDidChangeNotification, WMWidgetView(win));
    +

    Before the main function we define the function (resizeHandler) which will handle the resize event for the two widgets, the text area and the box with buttons. There is a global variable ButtonsetSize, which contains the size of the box with buttons: +

     WMSize ButtonsetSize;
    + static void resizeHandler(void *self, WMNotification *notif){
    + WMSize size = WMGetViewSize(WMWidgetView(win));   
    + WMMoveWidget(box, size.width-ButtonsetSize.width, size.height-ButtonsetSize.height);
    + WMResizeWidget(text, size.width-MARGIN -10, size.height-80);
    +}
    +static void handleEvents(XEvent *event, void *data)
    +{int i=0;
    +    WMWidget *widget = (WMWidget*)data;
    +    switch (event->type) {
    +    case ButtonPress:
    +      while (i<40)textbuf[i++]=' ';
    +      snprintf(textbuf,39,"Button down at (%i,%i) \n-",event->xbutton.x,event->xbutton.y);
    +      WMFreezeText(text);
    +      WMAppendTextStream(text,textbuf);
    +      WMThawText(text);
    +      break;
    +    }
    +}
    +
    +
    +The buttons keep their size, but are moved to stay in the bottom right corner, the text area is resized along with the window, but stays 80 pixels away from the window bottom border. We also do something useful with the mouseclicks on the window itself. This is done in the function handleEvents. The event ButtonPress has the click time and position in a member .xbutton. When the button is pressed, we get that information, and print it to the text area. + +

    The text is written to a text area. Function names for it are self-explanatory. We create this widget after creating the window. It will be WMmapped by the final WMMapSubwidgets. The code for setting it up is just: +

     text = WMCreateText(win);
    +  WMResizeWidget(text, WINWIDTH-MARGIN, WINHEIGHT -80);
    +  WMMoveWidget(text, 10, 10)
    The text is written to the area by passing character strings to the WMAppendTextStream function. + +

    The important functions in creating the box and its widgets are: +

     box=WMCreateBox(win); 
    + WMSetBoxBorderWidth(box, MARGIN);
    + WMSetBoxHorizontal(box, True);  
    + Button =WMCreateButton(box,WBTMomentaryPush);
    + WMSetButtonAction (Button, selectFiles, NULL);
    + WMMapWidget(Button);
    + ButtonsetSize = WMGetViewSize(WMWidgetView(QuitButton));  
    + WMAddBoxSubview(box, WMWidgetView(QuitButton), True,False, 60, 1000, MARGIN); 
    +  /*-- make and add another button --*/
    + WMResizeWidget(box, 4*MARGIN+2*ButtonsetSize.width,2*MARGIN+ButtonsetSize.height);
    + ButtonsetSize =WMGetViewSize(WMWidgetView(box));
    + resizeHandler(NULL,NULL)
    +Application windowThe box is created before the button is, because the button will have to be created with the box (its parent widget) as its first argument. The box is the "outer" widget and will be mapped with WMMapSubwidgets, but we map the buttons separately. The function which will be called on the default button event is closeAll() for the quit button. The file button will call the selectFiles() function, in which we open a file selector widget. We have left it to WINGs to decide what size the button will be. We temporarily use ButtonsetSize to store this size. We add the button's view to the box. After adding all the buttons, We store the size of the resulting box, and use it in our resizeHandler function to keep the box in the corner. File selector widget.Following the source code, pressing the file button will pop up the file selector dialog, and the name of the selected file is printed in the text area. Notice that, without the box widget, we would need two global Button pointers to change the position of both buttons in the resizeHandler function. We now need one Button pointer, which can remain local to main. + +

    Here is the full code which we have now. As we have a text area, we can print text to it, as long as we are sure that the widget has not been destroyed. The scroll bar next to the area is obtained with one single function call. + +

    Frames
    +

    The WMBox needs quite some configuration. It is not really intended for putting two simple buttons in a corner. We can use a frame to keep widgets together and move them with one single pointer. For buttons, we could also use the WMGroupButtons function to handle a group of buttons with just one pointer. To use a frame, use this code, instead of the WMBox functions: At global scope: +

    WMFrame *controlframe;
    +static void resizeHandler(void *self, WMNotification *notif){
    +     WMSize size = WMGetViewSize(WMWidgetView(win));   
    +     WMMoveWidget(controlframe, size.width-ButtonsetSize.width, size.height-ButtonsetSize.height);
    +     WMResizeWidget(text, size.width-MARGIN -10, size.height-80);
    +}
    +In main: +
      controlframe=WMCreateFrame(win);
    +  Button =WMCreateButton(controlframe,WBTMomentaryPush);
    +  ButtonsetSize = WMGetViewSize(WMWidgetView(Button));    
    +  WMMoveWidget(Button,MARGIN, MARGIN);
    +  /* (code to create a second button of the same size, with the same pointer)  */
    +  WMMoveWidget(Button,2*MARGIN+ButtonsetSize.width, MARGIN);
    +  ButtonsetSize.width = 3*MARGIN+2*ButtonsetSize.width;
    +  ButtonsetSize.height=2*MARGIN+ButtonsetSize.height;
    +  WMResizeWidget(controlframe,ButtonsetSize.width,ButtonsetSize.height);
    +  WMMapSubwidgets(controlframe);
    + +

    As we created the buttons inside the frame, we WMMoveWidget them along coordinates with respect to the frame's upper left corner. We have left it to WINGs to set the buttons' size, so we get their size with WMGetViewSize. With the button sizes, we calculate what size the frame is to have, and how far we need to move the buttons from the upper left corner to get them to the right place. We WMMap both buttons inside the frame with WMMapSubwidgets(controlframe);. The frame is the outer widget, and will be WMMapped just before the window. Replacing the box with the frame, we get this source code. After compiling, we get the same application. The obvious frame properties are set with the frame functions + +

    Next sections
    +

    The three steps up till now have shown the important points in programming with the WINGs library. The basics are all the same all the time. Create, specify WMAction, define the WMAction function somewhere, WMMap the widget. If this won't do, use PostNotification, and AddNotificationObserver to the widget which should react to it. +

    From the next sections, the library description gives a whole range of widgets which you can fit into the window this way, and related functions and data structures. There is sample code for those widgets whose code seems a bit more involved. The only thing which cannot be obtained by a simple function call is a menu with submenus, which is to work under any window manager, not just Window Maker. The third programming detail section explains, how to programme this kind of menu. The other two programming detail sections are not about the WINGs/wraster/windowmaker libraries themselves, except for a short section on the use of the WINGs functions to insert icons into widgets. Detail section 1 contains an example of how to get rid of the disappointing xterm window which you need to start your windowed application from, to read its messages on stderr or stdout. It shows the standard code to open a logging window on the screen when needed. For convenience, it uses xconsole for this, a standard application on unix systems with X11. The same section 1 shows how to get the correct information about monitor resolution when a virtual screen is used. Detail section 2 gives code samples which demonstrate how to mix Xlib code with the WINGs library. Xlib is the library which gives direct access to the X-server, and which is the underlying code to the WINGs library itself. It also contains a section which shows how to use OpenGL 3D graphics code in a WINGs frame. These extra sections do not explain all the details on the used libraries. However, by just following the code examples, you can reproduce their results, and change them to use them in your own programmes. + + +
    +

    +

    LAST: Step 2 Processing EventsContentsNEXT: Programming Details
    + + + \ No newline at end of file diff --git a/WINGs_tutorial/WINGstep3_files/Buttons.jpeg b/WINGs_tutorial/WINGstep3_files/Buttons.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2a3b0f7da68e245938760a81654655eaef2b80a1 GIT binary patch literal 7144 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ĸQ3w{y3hXRYjF&Wo1? z7m9Zu{OBl&ifjset9bvS;dk_Z-wRHoPqtnrw1{pMMpgzDHvX=@EV&(%GKF`zfO*we z_+R%D_nSt)|L&jrkF%m>^AJWRn0#l35mMAFdD2}9G{GtdK-(*{HU*3&bQ^c*&jwDt zGE@`oLveFoq){ic1io*A@uLMvbk{UM*I)9GpIwC?4FczaA#eWH;FdZ{n3$TX<_}{q z?1r(S9n)`u^t?+kG`R!Id|72Mbd!2bOWB>8)|+v!Ox}anfvpmD4R>6>%v;&5{!Nb=QW)`unZR zU=IF&oNVz#c-thF)jc1LNxzUhXSG7{`57TIA~8YcpM{<0?&dN1;BT{NRoH7R+XX)> zWL#2&dgd@})m8RWI%am`$`Qi9J`trd(cKmnIeDg;5DG#vsS|u`{Y4jh5@zp(N#Q{~ z8)}?cq9;kp>jgQu7s+qwC8=Y~zBuhZ&R>TU+F>o4?~t{f!j3VEUr#~Dz0Cgp10%_@ z8sc-FdQrK!k>lKv7_mrW7t|6a7I-1F zjwYZYM3(MTc%6=um0f5BkcP1f(MGOl?={fn92Pr7uJV$6Lm&(gnPw-BRVdT_o{A&C zs#K$Aj~;wk^cGoT)5;YoawM!{7%dAnXbo1!FAai|hXn1zYs@_*g%n!KdEAlG2?R0bgf0c_n%s5=>M%ILwj7XVZrS*c8)bNKi^MvI@)}RrVb|w zy099rk23MGKDm_oZ4@IIf-*pZl>Sy_%YXQt^bK8t)M(x8oGO>M2_nEkZguVB zY#0bKZJqX12m}mC#8HZy`NUGvazmVq1SHY_u1GdR!s*(%FlU{;S;wEBYu{MLVBOA? zZn;;oCfNDOUFePFvI)KoIgJqAAY*X3K z9ZfttY7LNcOHdSjT*}^ZT5*&yf0-zTP0)sg5d|B}3;-?GH{RX${B(`4n@U%JXWL&M z+|54NRBSVzu-5l%7sRZH-3Np-TnkZ^q0(soNpXvn2cSon2+Jn7~6g`hKy zqT*lH;YNhknSH{1c10G8#G03)pUd+XE%$uaV1zp8%i8pXaVZ$7&WifBY1BI#sOGLCIIUtyJ4Ks`T>3s|zexMoe)eLKQG+Zm0xaqy>&AGVzT z>8RBV@mRXQB;nmYJ)XM)pCZrl#1m~er&3&yUs2%6MjBsCj42$9gceWGAu0F?9)`yD z_xZ~pUd@ifU4D4i!9>;$(%Rhbb(Ddp9fsHRo0olGS!6>xZeIb00tU~uw9Q&9MUHCk t#m+pO)J(dY_t3jGr?hM=m<}O>)}hO?QXzie0k!yoiZg4Fy2Eib^&cFuUabHC literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGstep3_files/FirstWindow4.jpeg b/WINGs_tutorial/WINGstep3_files/FirstWindow4.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4ab3fbbb8f2528714321bf79aedbfe28e9ee7779 GIT binary patch literal 31747 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 literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGstep3_files/OpenFileDialog.jpeg b/WINGs_tutorial/WINGstep3_files/OpenFileDialog.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..bee009f6e0eacd7f3b3308080bac32ce02b1c9de GIT binary patch literal 27133 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 H@Bi|D37LL$ literal 0 HcmV?d00001 diff --git a/WINGs_tutorial/WINGtoc.html b/WINGs_tutorial/WINGtoc.html new file mode 100644 index 0000000..7f9490d --- /dev/null +++ b/WINGs_tutorial/WINGtoc.html @@ -0,0 +1,126 @@ + + +3 Steps to Make a WINGs User Interface + + + + + + + + + +
    NEXT: Introduction
    +

    A WINGs based graphical user interface in three steps

    +

    CONTENTS

    +
      +
    1. Introduction +
    2. Step 1. Six lines show a window on the screen +
        +
      1. First application +
      2. Setting properties +
      3. Something is missing +
      +
    3. Step 2. Processing events +
      1. Closing the window +
      2. Closing the window in a different way +
      +
    4. Step 3. Adding widgets to a window +
      1. Adding buttons to a widget +
      2. Resize events +
      3. Adding the event handlers and widgets to the application +
      4. Frames +
      +
    5. Programming details +
      1. Count the windows +
      2. Icons and images +
      3. Virtual screen and resolution +
      4. Message log window +
      +
    6. Graphics programming details +
      1. The Drawable +
      2. Xlib Graphics Functions +
      3. An OpenGL Drawing Area +
      +
    7. Floating hierarchical menus +
      1. The menu widget +
      2. Window Manager Hints
      +
    8. Complete library description +
      1. General widgets +
      2. Frames +
      3. Panels +
      4. Windows +
      5. Views +
      6. Buttons +
      7. Button boxes +
      8. Expanding and pull-down buttons +
      9. Text fields +
      10. Labels +
      11. Sliders +
      12. Scrollable views +
      13. Message pop-up windows +
      14. Input dialogs +
      15. File selection dialogs +
      16. Text Areas +
      17. Split windows/views +
      18. Lists +
      19. Colour selection panels +
      20. Font selection panel +
      21. Tabbed views +
      22. Progress indicators +
      23. Event handlers +
      24. Selections +
      25. Screens +
      26. Image functions +
      27. Application wide functions +
      28. Notifications +
      29. Text balloons +
      30. Drag/drop functions +
      31. Network connections +
      32. Draw functions +
      33. Browser functions +
      34. Menu items +
      35. Utilities/redefined functions +
      36. Data types +
        1. WMColor +
        2. WMFont +
        3. WMArray +
        4. Trees +
        +
      37. ENUMs and #defines +
        1. List of event masks and corresponding events +
        2. Frame Title Positions +
        3. WM Image Positions +
        4. WMAlignment +
        5. Reliefs +
      +
    9. Appendix: list of examples
        +
      1. Minimal window +
      2. Responsive window +
      3. Clickable window +
      4. Window with buttons and text area +
      5. Window with buttons and text area using frames +
      6. Pixmap drawing +
      7. Xlib drawing +
      8. Menu creation +
      9. Menu and submenus +
      10. OpenGL in a frame +
      +
    10. GNU Free Documentation License +
    +

    +

    +
    +
    + Copyright (c) 2010 + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with no Invariant Sections, with no + Front-Cover Texts, and with no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + + + +

    diff --git a/WINGs_tutorial/glframe.c b/WINGs_tutorial/glframe.c new file mode 100644 index 0000000..5c86d89 --- /dev/null +++ b/WINGs_tutorial/glframe.c @@ -0,0 +1,283 @@ +#include +#include +#include + +#include +#include +#include + +#define CONTENTH 300 +#define CONTENTW 300 +#define CONTENTMARGIN 30 + + +struct couple{ + WMWindow *window; + WMFrame *frame; +} datacouple; + + +float red=252.0/256, green=88.0/256, blue=16.0/256; +float redb=252.0/256, greenb=242.0/256, blueb=80.0/256; + +int Attr[] = { GLX_RGBA, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 16, + GLX_DOUBLEBUFFER, + None}; +Display * display; +float alpha=0; + +void init(void) +{ +glClearColor (256/256, 256/256, 256/256, 0.0); +glPolygonMode(GL_FRONT, GL_FILL); +glPolygonMode(GL_BACK, GL_FILL); +glEnable(GL_DEPTH_TEST); +glShadeModel(GL_SMOOTH); + +glEnable(GL_LIGHTING); +GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; +GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; +GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; +GLfloat position[] = { 2.0f, -0.1f, 2.0f, 1.0f }; +GLfloat position2[] = { -2.0f, -0.26f, -4.0f, 1.0f }; +glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); +glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); +//glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); +glMateriali(GL_FRONT, GL_SHININESS, 98); +glLightfv(GL_LIGHT0, GL_POSITION, position2); +//glLightfv(GL_LIGHT1, GL_POSITION, position2); + +glEnable(GL_LIGHT0); +//glEnable(GL_LIGHT1); +glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); +//glColorMaterial(GL_FRONT, GL_SPECULAR); +glEnable(GL_COLOR_MATERIAL); +glShadeModel(GL_SMOOTH); +glCullFace( GL_BACK ); +glEnable( GL_CULL_FACE ); + +glEnable(GL_POLYGON_SMOOTH); +/*glEnable(GL_BLEND); +glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE); +//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);*/ + +} + +void normvector(float a, float aa, float aaa, float b, float bb, float bbb, float c, float cc, float ccc,float *result){ + float v1[3];float v2[3];float tmp; + + v1[0]=(b-a);v1[1]=(bb-aa);v1[2]=(bbb-aaa); + v2[0]=(b-c);v2[1]=(bb-cc);v2[2]=(bbb-ccc); + result[0]=(v1[1]*v2[2]-v1[2]*v2[1]); + result[1]=(v1[2]*v2[0]-v1[0]*v2[2]); + result[2]=(v1[0]*v2[1]-v1[1]*v2[0]); + tmp=sqrt(result[0]*result[0]+result[1]*result[1]+result[2]*result[2]); + result[0]/=tmp; + result[1]/=tmp; + result[2]/=tmp; +} + + +void redraw(XEvent * v,void *xw){ +Window win; +float z[3]; + +win = *(Window *)xw; + +glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); +glPushMatrix(); glShadeModel(GL_SMOOTH); + +glRotatef(alpha, 0, 1, 0); +if (alpha > 360) alpha =alpha-360; + +glBegin(GL_TRIANGLES); + +glColor3f(redb,greenb,blueb); +normvector(-0.85f, 0.0f, 0.0f,0.0f, 0.0f, 0.85f,0.0f, 0.6f, 0.0f,z); +glNormal3fv(z); +glVertex3f(-0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.0f, 0.85f); +glVertex3f(0.0f, 0.6f, 0.0f); + +normvector(0.0f, 0.0f,0.85f,0.85f, 0.0f, 0.0f,0.0f, 0.60f,0.0f,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, 0.85f); +glVertex3f(0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.6f, 0.0f); + +glColor3f(red,green,blue); +normvector(0.85f, 0.0f, 0.0f,0.0f, 0.0f, -0.85f,0.0f, 0.6f, 0.0f,z); +glNormal3fv(z); +glVertex3f(0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.0f, -0.85f); +glVertex3f(0.0f, 0.6f, 0.0f); + +normvector(0.0f, 0.0f, -0.85f,-0.85f, 0.0f, 0.0f,0.0f, 0.6f, 0.0f,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, -0.85f); +glVertex3f(-0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.6f, 0.0f); + +glColor3f(redb,greenb,blueb); +normvector(-0.85f, 0.0f, 0.0f,0.0f, -1.0f, 0.0f,0.0f, 0.0f, 0.85f,z); +glNormal3fv(z); +glVertex3f(-0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, -1.0f, 0.0f); +glVertex3f(0.0f, 0.0f, 0.85f); + +normvector(0.0f, 0.0f, 0.85f, 0.0f, -1.0f, 0.0f,0.85f, 0.0f, 0.0f ,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, 0.85f); +glVertex3f(0.0f, -1.0f, 0.0f); +glVertex3f(0.85f, 0.0f, 0.0f); + +glColor3f(red,green,blue); +normvector(0.85f, 0.0f, 0.0f,0.0f, -1.0f, 0.0f, 0.0f, 0.0,-0.85f ,z); +glNormal3fv(z); +glVertex3f(0.85f, 0.0f, 0.0f); +glVertex3f(0.0f,-1.0f, 0.0f); +glVertex3f(0.0f, 0.0f, -0.85f); + +normvector(0.0f, 0.0f, -0.85f,0.0f, -1.0f, 0.0f, -0.85f, 0.0f,0.0f ,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, -0.85f); +glVertex3f(0.0f, -1.0f, 0.0f); +glVertex3f(-0.85f, 0.0f, 0.0f); + +glEnd(); + +glPopMatrix(); +glXSwapBuffers(display, win); +} + +setsize(unsigned int width, unsigned int height) +{ +glViewport(0, 0, width, height); +glMatrixMode(GL_PROJECTION); +glLoadIdentity(); +glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); +glMatrixMode (GL_MODELVIEW); +} + +void DoRotate(void *self,void *xwindow){ + XEvent event;int i=0; + alpha+=15; +redraw(NULL,(Window *)xwindow); +} + +void redo(XEvent * event,void *xw){ + switch (event->type) + { + case Expose: + if (event->xexpose.count!=0) break; + redraw(event,&event->xexpose.window); + break; + case ConfigureNotify: setsize(event->xconfigure.width, event->xconfigure.height); // assuming there will be an expose afterwards + break; + } +} + +void closeAll(WMWidget *self,void *data){ + WMDestroyWidget(self); + exit(0); +} + +static void resizeHandler(void *data, WMNotification *notif){ + struct couple *tmp;tmp=(struct couple *)data; + WMSize size = WMGetViewSize(WMWidgetView(tmp->window)); + WMResizeWidget(tmp->frame, size.width -2*CONTENTMARGIN, size.height-2*CONTENTMARGIN); +} + +void getargs(int argc, char **argv){ +if (argc>3) { + redb=red=(float)atoi(argv[1])/256; + greenb=green=(float)atoi(argv[2])/256; + blueb=blue=(float)atoi(argv[3])/256; +} + if (argc>6){ + redb=(float)atoi(argv[4])/256; + greenb=(float)atoi(argv[5])/256; + blueb=(float)atoi(argv[6])/256; + } +} + +int main (int argc, char **argv){ + +WMFrame *glframe; +WMScreen *screen; +WMWindow *window; +WMButton *Button; + + +/* Xlib and glX variables */ +Window win; +XVisualInfo *xvVisualInfo; +Colormap cmColorMap; +XSetWindowAttributes winAttr; +GLXContext glXContext; + +getargs(argc,argv); +WMInitializeApplication("GLWindow", &argc, argv); +display = XOpenDisplay(""); +screen = WMCreateScreen(display, DefaultScreen(display)); + + if(!glXQueryExtension(display, NULL, NULL)){wwarning("X server does not have GLX\n"); return 0; } + +window = WMCreateWindow(screen, "Main"); +WMResizeWidget(window, CONTENTW+2*CONTENTMARGIN, CONTENTH+2*CONTENTMARGIN*CONTENTH/CONTENTW); +WMSetWindowAspectRatio(window, CONTENTW,CONTENTH,CONTENTW,CONTENTH); +WMSetWindowCloseAction(window, closeAll, NULL); +WMSetWindowTitle(window,"GL Frame"); +WMRealizeWidget(window); +datacouple.window=window; +WMSetViewNotifySizeChanges(WMWidgetView(window), True); +WMAddNotificationObserver(resizeHandler, &datacouple, WMViewSizeDidChangeNotification, WMWidgetView(window)); + + +glframe = WMCreateFrame(window); +datacouple.frame=glframe; +WMResizeWidget(glframe, CONTENTW, CONTENTH); +WMMoveWidget(glframe, CONTENTMARGIN,CONTENTMARGIN); +WMRealizeWidget(glframe); + +Button=WMCreateButton(window, WBTMomentaryPush); +WMSetButtonAction(Button, DoRotate,&win); +WMSetButtonText(Button,"Turn"); +WMMoveWidget(Button, CONTENTMARGIN,2); +WMRealizeWidget(Button); +WMMapWidget(Button); + +/* get the frame's X window value */ +win =W_VIEW_DRAWABLE(WMWidgetView(glframe)); +WMCreateEventHandler(WMWidgetView(glframe), ExposureMask|StructureNotifyMask,redo,&win); + +xvVisualInfo = glXChooseVisual(display, DefaultScreen(display), Attr); + if(xvVisualInfo == NULL) {wwarning("No visualinfo\n");return 0;} + +cmColorMap = XCreateColormap(display,RootWindow(display, DefaultScreen(display)), xvVisualInfo->visual, AllocNone); + +winAttr.colormap = cmColorMap; +winAttr.border_pixel = 0; +winAttr.background_pixel = 0; +winAttr.event_mask = ExposureMask | ButtonPressMask |StructureNotifyMask| KeyPressMask; + +XChangeWindowAttributes(display,win,CWBorderPixel | CWColormap | CWEventMask,&winAttr); +glXContext = glXCreateContext(display, xvVisualInfo, None, True); + if(!glXContext) {wwarning("glX cannot create rendering context\n");return 0;} + +glXMakeCurrent(display, win, glXContext); + +WMMapWidget(glframe); +init(); +setsize(CONTENTW,CONTENTH); +WMMapWidget(window); + +WMScreenMainLoop(screen); + +return 0; +} diff --git a/WINGs_tutorial/glframe.c.1 b/WINGs_tutorial/glframe.c.1 new file mode 100644 index 0000000..9fd9ef3 --- /dev/null +++ b/WINGs_tutorial/glframe.c.1 @@ -0,0 +1,285 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#define CONTENTH 300 +#define CONTENTW 300 +#define CONTENTMARGIN 30 + + +struct couple{ + WMWindow *window; + WMFrame *frame; +} datacouple; + + +float red=252.0/256, green=88.0/256, blue=16.0/256; +float redb=252.0/256, greenb=242.0/256, blueb=80.0/256; + +int Attr[] = { GLX_RGBA, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 16, + GLX_DOUBLEBUFFER, + None}; +Display * display; +float alpha=0; + +void init(void) +{ +glClearColor (256/256, 256/256, 256/256, 0.0); +glPolygonMode(GL_FRONT, GL_FILL); +glPolygonMode(GL_BACK, GL_FILL); +glEnable(GL_DEPTH_TEST); +glShadeModel(GL_SMOOTH); + +glEnable(GL_LIGHTING); +GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; +GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; +GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; +GLfloat position[] = { 2.0f, -0.1f, 2.0f, 1.0f }; +GLfloat position2[] = { -2.0f, -0.26f, -4.0f, 1.0f }; +glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); +glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); +//glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); +glMateriali(GL_FRONT, GL_SHININESS, 98); +glLightfv(GL_LIGHT0, GL_POSITION, position2); +//glLightfv(GL_LIGHT1, GL_POSITION, position2); + +glEnable(GL_LIGHT0); +//glEnable(GL_LIGHT1); +glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); +//glColorMaterial(GL_FRONT, GL_SPECULAR); +glEnable(GL_COLOR_MATERIAL); +glShadeModel(GL_SMOOTH); +glCullFace( GL_BACK ); +glEnable( GL_CULL_FACE ); + +glEnable(GL_POLYGON_SMOOTH); +/*glEnable(GL_BLEND); +glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE); +//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);*/ + +} + +void normvector(float a, float aa, float aaa, float b, float bb, float bbb, float c, float cc, float ccc,float *result){ + float v1[3];float v2[3];float tmp; + + v1[0]=(b-a);v1[1]=(bb-aa);v1[2]=(bbb-aaa); + v2[0]=(b-c);v2[1]=(bb-cc);v2[2]=(bbb-ccc); + result[0]=(v1[1]*v2[2]-v1[2]*v2[1]); + result[1]=(v1[2]*v2[0]-v1[0]*v2[2]); + result[2]=(v1[0]*v2[1]-v1[1]*v2[0]); + tmp=sqrt(result[0]*result[0]+result[1]*result[1]+result[2]*result[2]); + result[0]/=tmp; + result[1]/=tmp; + result[2]/=tmp; +} + + +void redraw(XEvent * v,void *xw){ +Window win; +float z[3]; + +win = *(Window *)xw; + +glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); +glPushMatrix(); glShadeModel(GL_SMOOTH); + +glRotatef(alpha, 0, 1, 0); +if (alpha > 360) alpha =alpha-360; + +glBegin(GL_TRIANGLES); + +glColor3f(redb,greenb,blueb); +normvector(-0.85f, 0.0f, 0.0f,0.0f, 0.0f, 0.85f,0.0f, 0.6f, 0.0f,z); +glNormal3fv(z); +glVertex3f(-0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.0f, 0.85f); +glVertex3f(0.0f, 0.6f, 0.0f); + +normvector(0.0f, 0.0f,0.85f,0.85f, 0.0f, 0.0f,0.0f, 0.60f,0.0f,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, 0.85f); +glVertex3f(0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.6f, 0.0f); + +glColor3f(red,green,blue); +normvector(0.85f, 0.0f, 0.0f,0.0f, 0.0f, -0.85f,0.0f, 0.6f, 0.0f,z); +glNormal3fv(z); +glVertex3f(0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.0f, -0.85f); +glVertex3f(0.0f, 0.6f, 0.0f); + +normvector(0.0f, 0.0f, -0.85f,-0.85f, 0.0f, 0.0f,0.0f, 0.6f, 0.0f,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, -0.85f); +glVertex3f(-0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, 0.6f, 0.0f); + +glColor3f(redb,greenb,blueb); +normvector(-0.85f, 0.0f, 0.0f,0.0f, -1.0f, 0.0f,0.0f, 0.0f, 0.85f,z); +glNormal3fv(z); +glVertex3f(-0.85f, 0.0f, 0.0f); +glVertex3f(0.0f, -1.0f, 0.0f); +glVertex3f(0.0f, 0.0f, 0.85f); + +normvector(0.0f, 0.0f, 0.85f, 0.0f, -1.0f, 0.0f,0.85f, 0.0f, 0.0f ,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, 0.85f); +glVertex3f(0.0f, -1.0f, 0.0f); +glVertex3f(0.85f, 0.0f, 0.0f); + +glColor3f(red,green,blue); +normvector(0.85f, 0.0f, 0.0f,0.0f, -1.0f, 0.0f, 0.0f, 0.0,-0.85f ,z); +glNormal3fv(z); +glVertex3f(0.85f, 0.0f, 0.0f); +glVertex3f(0.0f,-1.0f, 0.0f); +glVertex3f(0.0f, 0.0f, -0.85f); + +normvector(0.0f, 0.0f, -0.85f,0.0f, -1.0f, 0.0f, -0.85f, 0.0f,0.0f ,z); +glNormal3fv(z); +glVertex3f(0.0f, 0.0f, -0.85f); +glVertex3f(0.0f, -1.0f, 0.0f); +glVertex3f(-0.85f, 0.0f, 0.0f); + +glEnd(); + +glPopMatrix(); +glXSwapBuffers(display, win); +} + +setsize(unsigned int width, unsigned int height) +{ +glViewport(0, 0, width, height); +glMatrixMode(GL_PROJECTION); +glLoadIdentity(); +glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); +glMatrixMode (GL_MODELVIEW); +} + +void DoRotate(void *self,void *xwindow){ + XEvent event;int i=0; + alpha+=15; +redraw(NULL,(Window *)xwindow); +} + +void redo(XEvent * event,void *xw){ + switch (event->type) + { + case Expose: + if (event->xexpose.count!=0) break; + redraw(event,&event->xexpose.window); + break; + case ConfigureNotify: setsize(event->xconfigure.width, event->xconfigure.height); // assuming there will be an expose afterwards + break; + } +} + +void closeAll(WMWidget *self,void *data){ + WMDestroyWidget(self); + exit(0); +} + +static void resizeHandler(void *data, WMNotification *notif){ + struct couple *tmp;tmp=(struct couple *)data; + WMSize size = WMGetViewSize(WMWidgetView(tmp->window)); + WMResizeWidget(tmp->frame, size.width -2*CONTENTMARGIN, size.height-2*CONTENTMARGIN); +} + +void getargs(int argc, char **argv){ +if (argc>3) { + redb=red=(float)atoi(argv[1])/256; + greenb=green=(float)atoi(argv[2])/256; + blueb=blue=(float)atoi(argv[3])/256; +} + if (argc>6){ + redb=(float)atoi(argv[4])/256; + greenb=(float)atoi(argv[5])/256; + blueb=(float)atoi(argv[6])/256; + } +} + +int main (int argc, char **argv){ + +WMFrame *glframe; +WMScreen *screen; +WMWindow *window; +WMButton *Button; + + +/* Xlib and glX variables */ +Window win; +XVisualInfo *xvVisualInfo; +Colormap cmColorMap; +XSetWindowAttributes winAttr; +GLXContext glXContext; + +getargs(argc,argv); +WMInitializeApplication("GLWindow", &argc, argv); +display = XOpenDisplay(""); +screen = WMCreateScreen(display, DefaultScreen(display)); + + if(!glXQueryExtension(display, NULL, NULL)){wwarning("X server does not have GLX\n"); return 0; } + +window = WMCreateWindow(screen, "Main"); +WMResizeWidget(window, CONTENTW+2*CONTENTMARGIN, CONTENTH+2*CONTENTMARGIN*CONTENTH/CONTENTW); +WMSetWindowAspectRatio(window, CONTENTW,CONTENTH,CONTENTW,CONTENTH); +WMSetWindowCloseAction(window, closeAll, NULL); +WMSetWindowTitle(window,"GL Frame"); +WMRealizeWidget(window); +datacouple.window=window; +WMSetViewNotifySizeChanges(WMWidgetView(window), True); +WMAddNotificationObserver(resizeHandler, &datacouple, WMViewSizeDidChangeNotification, WMWidgetView(window)); + + +glframe = WMCreateFrame(window); +datacouple.frame=glframe; +WMResizeWidget(glframe, CONTENTW, CONTENTH); +WMMoveWidget(glframe, CONTENTMARGIN,CONTENTMARGIN); +WMRealizeWidget(glframe); + +Button=WMCreateButton(window, WBTMomentaryPush); +WMSetButtonAction(Button, DoRotate,&win); +WMSetButtonText(Button,"Turn"); +WMMoveWidget(Button, CONTENTMARGIN,2); +WMRealizeWidget(Button); +WMMapWidget(Button); + +/* get the frame's X window value */ +win =W_VIEW_DRAWABLE(WMWidgetView(glframe)); +WMCreateEventHandler(WMWidgetView(glframe), ExposureMask|StructureNotifyMask,redo,&win); + +xvVisualInfo = glXChooseVisual(display, DefaultScreen(display), Attr); + if(xvVisualInfo == NULL) {wwarning("No visualinfo\n");return 0;} + +cmColorMap = XCreateColormap(display,RootWindow(display, DefaultScreen(display)), xvVisualInfo->visual, AllocNone); + +winAttr.colormap = cmColorMap; +winAttr.border_pixel = 0; +winAttr.background_pixel = 0; +winAttr.event_mask = ExposureMask | ButtonPressMask |StructureNotifyMask| KeyPressMask; + +XChangeWindowAttributes(display,win,CWBorderPixel | CWColormap | CWEventMask,&winAttr); +glXContext = glXCreateContext(display, xvVisualInfo, None, True); + if(!glXContext) {wwarning("glX cannot create rendering context\n");return 0;} + +glXMakeCurrent(display, win, glXContext); + +WMMapWidget(glframe); +init(); +setsize(CONTENTW,CONTENTH); +WMMapWidget(window); + +WMScreenMainLoop(screen); + +return 0; +}