From b7b17e6067b492862faa3d370146021af338abd5 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. --- .../3 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 ++ WINGs_tutorial/WINGGraphics_files/glframe.jpeg | Bin 0 -> 8977 bytes WINGs_tutorial/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 WINGs_tutorial/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 WINGs_tutorial/WINGMenu_files/redirectmenu1.jpeg | Bin 0 -> 13150 bytes WINGs_tutorial/WINGMenu_files/redirectmenu2.jpeg | Bin 0 -> 14461 bytes WINGs_tutorial/WINGsIntro.html | 42 + WINGs_tutorial/WINGsRemark.html | 174 +++ WINGs_tutorial/WINGsRemark_files/ScreenSize.jpeg | Bin 0 -> 48384 bytes WINGs_tutorial/WINGstep1.html | 64 ++ WINGs_tutorial/WINGstep2.html | 59 + WINGs_tutorial/WINGstep2_files/FirstWindow.jpeg | Bin 0 -> 5838 bytes WINGs_tutorial/WINGstep3.html | 143 +++ WINGs_tutorial/WINGstep3_files/Buttons.jpeg | Bin 0 -> 7144 bytes WINGs_tutorial/WINGstep3_files/FirstWindow4.jpeg | Bin 0 -> 31747 bytes WINGs_tutorial/WINGstep3_files/OpenFileDialog.jpeg | Bin 0 -> 27133 bytes WINGs_tutorial/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 HcwPel00001 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 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 Rx<$!;(^~%0RKN4_{{^!PWLf|K literal 0 HcwPel00001 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 zcwX&Sc{J30+aF}f+F;0%$r7@LtchgoTQg(qOZJSdkdSDz?_1Wm?Za5I#gvGwV+%uw zDC-D`p(wng#eKi0p8Gt{AMg8~_niBhIltd^zSrk-?dN-D_DA=p0mrn}wbTJ5BqRV$ z;s>z*7QmwB>+A>s=;;B30000L;G68f2B-qa$&MU3LPkz}kdu>BP|{LS5`}?=<|r+Y zfsql&00c6zaI!Knvx9)ZpzzL=KvrTi9SgJ83_-76i7k_B-w8TZ~{mGWF!Xy_$lNRR3xNilt+kGgJS>^(jz1k zM=9vYNGK=|FhtW4ata_NOHy+65F-<}tRcea`XH->vCROE=d6qh6bAS9iBCwZ0@>y; z^YTevyOU3KQ59lWv(`*>$VNi)--8`EB({cV;sufbNJ);6l9C--Nq~%`WXw=*8(xVc zOe(PbaR4pRND3qa0+a!0s6Fb8TM3hw`r)I%U0M|O@aV{?VT21`7-Q!$1%P!8@h^RH!ISj1(biZ3RqsWk_E?tjRxA51Zk zQ!9$TwtAgQop*{QRuuT*We*7jsX)@CqfBxa)O}@hAVACek zImcbwx55Tm1$&8OuRVyIKB2*z=iHWvZm6n*CayW|+SebL&5WJOdbNa~Dx!-mv+ATp z%D=I9u6LgkOcRcj@`R#l#@o~tkJlWRl+;a$8S^&27H@kM4horV=6HcX7$S7xNr@$l zNaYCFla#S9UNG!xztEDk(@L+7@Ka@#xH?hH*X&V6c5+)EjAisCC+ZBDb_H=JP(zHX zI_8YJCr@rI$698CxP-F(__|T-9=9uAUT%Xvr5KuvlLOkR#w-eLJBMI0?G@RW$ZeEgA{yfhp2e)>XY zS}--AX|Zov$Y_9P^&PrOIg?xrD=kO@zVUQjZDjYgvc`2K|4h7-G+Oi=TfChr!d6^( zH0%}6OoR|Wb;LbEq=0TOgnGy6lKB&2uxqyP@4>3*9Cw|PGd81gN@5Zt88dJ!tA)wL z^%9juxvl64KRr3(F+yy!?KBE6SLr;d>Vb5&9GkNpdJ^&mH+aZS6x5DMM6+k(jJCe9 zrIk@--`Ed4zQht2luZRX=w}DtiJ2mjs<9n$OXq^%+N+(QjLl5qpd^VKutYr6IXLVS z@uSbL+f*!HzVm$p>;#1r3`AN(VV9(dhwpkcH&2nlv8$crf0EaGIyXfR4*NuUQeZC+ zaJPSudGhjidbO^LQWCBG!qNh`niB@Z#8^B={7jox*^YPUkoIbAN`EuY=d~q-y1{by z0a|%Ve64~5wvDGGEmysoaP0=?QtNq$;ujADQV|z7GdXSA+)!p_A5as%4;YKlO+z&m z+;N;!$huc@s*c!`q$PhA)Pu=%Ft4|n7{c?0N_4V9fRHyeWR}{p$w;eETdDG>oMwVh ztt60DW>3=ntUe7#OW4BY_B^xHik|S!@TCg@6ZIJ55!%Lp z-KML1WvA)0wL|drbY9LdQA3lkh=_!jk$i6uLU6c*V`1KF;7q%JYb47l`mBX#*m`s( zng)chLLkJ)$PcO8RB1xSI%15jP6F&UAG5Q^_&A&K3FZi_g2iMi_oWInt-p`2Rz9d!u});Y=_!y zNlp&O1@Inbo7UAu=zaeycF^=!tdoGikaU@&PGR@n(oF;5Lz0f;uh}MLX6wHEnWW-R zlActmkFuTUq$y>K6n)3C!&CIh&+0JGTT(o~7Pk6pVf+VB>hI8;ITyxTl9a35s6Ra& zGO+MOe2P(}z|hIScQ^G#Z4C-9?6yjC{pyibfZyMtpj3;{39b)KCcf*z^&v%vX11SA z;KRsE4GD`{85BIR+n^~uUclpK%ger4td|(dLGiX3647~u0BL4AVl69> z`jYL}7Fy(gnEIH#Qd&N-HK}Bz9(%R>!W{w7M+fNINi}au$P}RW_P(bWAaG}>r&kjVUS~= zf$q~_cByx=tYTE*^RtixAwE^1zZvtKU0`EQqEVUf;2(SMxW2z@qziv-G?zYv&?SsW z#$O6D<1#{v4%!6PNVoqU*V&DDfIrhj#1((Xz4;e79m8)pPP6^GA>a5#*-6gZY$OfRa=@LFn=d3*}%-UkrIep8igcB4B! zK`diy8Z%qWh`)tg69_r&IkoKpC=)}PabhBPCFTC&$G6S4xeC1TDD-@rF=?XZ zL$`}%T+Y!(FFf;XatmpmBYDkZD~{;i@(tHYdgHBm-LNlxa%?RV^LEXqv`mKgs=o*% zpyj+p4=b}rGm^Km+0U3>S6-q`S?UST;Pe}x7rAXop^DW89xYxl0hUGJKrvyu!h#8J zq2!5!)GZnjOoeKB=scO7AO&r~)FQH#pz?@#_VSRh7+te+2%-%h5A*|FMeYNFPC%A+ zVlsONfRMr$Ic7=YA_5qEOEfHOK}>mtf2yN|XF8jleV+fgZDh-wm74I42Gdkox;(}c z`bcflO}V(d$LzIitZY}X?M=)U*Sw&pY#odeD>zIaA*k5 z7}GgYD-pbaFoYO9L>$}sh|{k?;d>_8_H36k(S!Wv=gjQoeR>C+9PD%(X>xV)7S4oK z%F%}4jINrtAZMBp&6eF=JEFxVGglC4;{{sPNnNK?yC`zEDjCmK+tl{?qk-(Gh)Rw~ zD9{&R^?6Ca80S6j9;OhjZe>(UidgnO?f1FCFy-ik?6q*ZelJc`cz1KiC*DVpW)S*r zuJDqd=q(l>QCNjaq`@6txi}W)`*~w~ZDkrZjJzD3o$(TL21>L@aUr2o5i5lqB`@u; zSS1dp_Pe-ii z6hJ(*6B9>K13Vq!bd1bCFVyom=mLGtfj+xzGnXDB`|M^XQl|Ko?=wE0c{gB5A;K4j zs*4U;M9yY83dZQN(%RTyQ;T*3GnvEoLR|>jeUCyhO4H1rgH&sGPC1#VPCRsDAGM2L zi7Re3Di<8BUN$<1n|0+c2kTQu5`_HvA2BC0l;V7=r6e5fo`$jr4}b8XO2rt1tW;-7 z42h+XeBByWP>*N#i-*}NCbc^0s@$RHwRv*HB=+V^fV4}!p4Y<`h+$hv#hek^tSd_) ze0cMOd`7Mu32z5fp)s#W%3JQ|Xs3_F{#f9bGpL8w(4n*^ytf$@uQQ>S6ue|rV{)(G z($IHYi~(r=+%@|DFYY*kCKwI1-Odx1Tw8kdhx2El1M>sRcDC&~jD#<<9cy=u2A-4N z{?{A%L#VBc_PE{mP8F_2&8X zBQ~4rs^7$P)Y-17{gMv1ZCQ|5ch~ul2yQuQt^uI_+Z?{hX+QJN!B0Ow$f$Gn{;PiS zPx6^SL;3C}=jJ_J*Cc;tbWcRa=QlBRyMkmMG2=*&xBILjd}W&C!rx@@ zUC70SgO1e&F%J2xhz0*ezYjPhQ!rpdqXLJ zc64FH8+C)IPPuVXKa}*xNBSB-=aFZfbUM4SJ)b)F;(6+^f8;?lCJ z+6X0EfAzBSj4;j_tM+ON6>qgL9HOnaEyh4H==rk5XTcA(j>`}75dsB;Cwq1Is_miN z&u>R;dgHFdrQJpEv9=&>Q~ALM!rB5gd}pT9rgZM#yLvy^(VRnvrIrVNV!23rBp8|A%G*M2zf#}@W-76ZKlkLplp#y}w&CE##74pDWWl6u zqh7VB(S%ZD9@9OhSmd*k;f`eX5sW3_a^qEz>3==S|COCO>TlRUy}V*m5mC8tYWjKD zu;DbXjffgD*Cs}|{VA7qn&OnAeR46ielkluX*I$@`X!4MbBO{YUxT#aXAys?kW_wA zU5k32bXoO^JOGt7^JH zCOo{hc#}HcKkCYmUL@PPxTi#~dM;Mo`--n^_PH$7hk`RN7~~ZId+Z=Ft5^fm)5dK9 z(y6iF;}H=Jf|b^wuFmkT7XMuTM;qIn&Kz9Pr}QGZ#kL=}gc}CK=fWb&0_38?I-R?^ z=;R*PauDpgV^2E)RN+^S;fJXPW|!bE=Xg89B^XtAGyV|KOhvy+&OF8vyXvtNEX6`k!n1 z7x|yMrWqD7i(a+;gk^_UR{7oCYsrsJe>_t2fNjuw41(|l&nKdOnonAi==8`pX&M)%ka=kdP}rcz?@Riy)UC@Zf7# zQun+SEKOMOQ6b`Tv%PdPM`$xrU}#C{ebP~n%Jf~)t%vbNj#*3<*Ge|p4RRnuvvqIl z?&oDixkeewLlHoM{A2_W)V&X=*x(V`2XrxGU4puIqh8@XYId|7sEud|a;x`b%3S4o z4b|&7tx5UL?gM%W&y?}u*T$qKkpUYCi%@U8=yng`hmth1duI!7op`H=wRyp?w% z@qBw}zbRKRtA4^%)K>ft;DfKl-21`T`GC&v3YI3|;+NC0UFVBfJ_T=i zffH`3xu&^G2i}73(7Gw;1WK)DzqG>-nr{e{tuQRlEAwq-nva9WdIGgpPPwtUONRs! zfwzc2FJa>^qXYpWPNyi&S-vIMB1irnE1|H0qZmSkv59rI_{XnUh z3s-1#(u@Cek6&~=8zwuOH5BP1@TbcxsPiprslv`L&HaKkjTLD__P3_Hbgu6M?5z)4 z^nP!&X=Ys5*>hy%4Yc?WNhtq;6uvG#9JxmX;;qrFUvFx(JCv0* zihO4IPNnkm&poxZ9Z6UNV?BJ8(wZ06jTc==7$cUg9=!4!*KX23f4Y7I(b@T9jfNGx;&0c8YjO55GCHUg5r7W?A=j%BdOZeV{h!J(P z2005X)8Pcg0EhQ36+&m-%QFv(TSyj?HP&|~#c&6>1VAm8mU_O-d3Y1@F4ce&RI4d6+z- z@gM($ea3`#^6mor%FkJa4_802C-&*6i^Q%IOEvh_b^?L5tYS!rfN;r7!fd*LfY`(Y zIi7MkyS;I~x6-&jP-q5Q-aI{Y2?TCek0xJilA+Z^J%#K81UAa7 zlq)t^|9GZ%YYrJYoH%YD+Q1;}EmoQ}#CLwW6Fgj~{I!S$EwK-nBZ3T;n)u)1#3Kk_ u`7v?xNH1XeEBO*sOvD@nfkYekZwM8=ETQs^HHqi^U%LJI^4%@7o+frKU~2zUSy5kfTypaDebU8LHu z(u>p>1S}Nk7OF>@ym&lv&Kte=z5Ad4oq2cWEhd?rz1RNM_pRUBo8Q`dxiRha3p33Q zva_>t01xu;01pCzyaFPJc=?3+fj~hCL19r*adC0pLz2>xV$vdF;$q)G=xAG+4={7F zuyBd-0r|xK%eMCf0AvC5(GeNwBmwk5ItC!!UMoNZKnI{__$FiDm=4gNus5-jy2})`nLpmG}CDjk{gNcLoXIZ4w zG(3W1>kdg9*@Y1rifB+mbl>goI5a3mrf*Tifq!xMdzlW%BZ1_jcUNWP-5UdNFwh); z3_ySZpc3hB>)cdkG5@@&Q6ZhFt$Iw&N1(9+g0ssg*1#013z5k;ilUgs;_E&?rpNbi zFVA2GpbxHXcPs0hf-V=kb*XW>y5Y#Bkf%u=+ z%B|)8whU=j=7%li5w-BG#y<1*w0p z;?C$kn`qa%riN_7jZOq>d)k|bV?N|D^JYo(oeHOX+v^Yv#umPR-S}iGq`f3tzt80a zkDQ{h$fK3=o=@x-3-N^rDIcX%Q^dX?SjZr23|}j5JaSDm%u^G{F}ig=a&G{WtDC zm0WEvsc`Cd$rVshG|K%e?xXM=b-T~euO@0EJnbD-d_MHCAIg&8`V$(T!N1lzdFyKZ z=Q*b29^veT>#>2$sODOh@3~ZF+nn+rv3k#b?qb_a%HfQ@CwIaXT~Tq`QPcKU-^kiJ z1ZxG_pQnF4F-U_B%Xz8s$ARP?ZXcCqHyZ1w$kxdR*6$CWk29G`MU0(u8-FFNqIm2( zEnazenjB&=#@*%HBreE)o9zt^#e-#L50Hop*=~_n(8|*+-%SWw_HC{$f6Q?E!&lBj zSx0CYdHQX)g4T7-i7=VRPYYJtIlqYFgO{EB=zsA1Y77AQ$ zj~<~O&y!X+iApo53c=9eKt1J*?slw}Tf0>Q@nZiQe&lEU{Xv(hqtnA#+%3$3z3fHW^QxLxHA>O3A z#uCcBpVG5j9WQ&%U50$VY?pVVL;1S{`yYZjtp@&{v)qgNKSyUL4MRf)sS?|s;=f%k zMJ0Uj|NWV$&48}Br_vk2{xMO8+RxzElPS9eC-TVCnQ1i#$6jt;`Ykj(kJ`~I@#5r< z<^25}hvZ7aXCRfWpPTgEIYeDm8f$43gMOwM-!-47ZMe7+Rh@p#*uK)_b5pcCSMASf zAJmAHOGD^1oWl9ca#I!uqsnhkjjMHj&bdY&ewt`qd1#Eh>!q$!6@>NMxU!V?vtmw~ zA0e&s@EH1=U(t8JN5A&Fl2-nw-*2JjUk65(Bt~BUESO)eAbfhQ!tC?q$IhJAWgQLb zTb*Htej!*4Kb_81($S!~)rkw$(93^JHLi{PSqEH?w?jk}kv@HAtJ7`KY7Zd#m||S_ z3&Ha1HX^uC*_f1ciZL_N=S$}`QPV1W^E6A zTAAjKLv(>~?&m!~QaVM~@)yU8cW|RaKx93J-(XufcRdDZuq|5oi-PfpdApRxMW>g6 z5lqfFnx^RF;(i%7l!Gl9vM}PYF2hTklqDu3fq+}bvF{!~FRoekyg;mhB~g{sQ1%wTYdwh@SiU5S1lG1_iN@kLf8rTRn7HqSuLg0F5l#)f~mg&VB2j zq1^y%f9++kI0zBeB}(gDcE-xy5kccYaPwLSM87~{_Tx+mHOysjzM&^+Le_@qfmLZv zqRIxcXb&(#x4Z{{kEL7_Iy%sSzCs=zOIayeZWF3>6<_p~IMd}V%YR5NL(3Lz#Cy+bWFGd?C4Z;&b^R4k;d6xO~~iY*0yibM$_#!8V_gq`>A~DRkC# z_#|=gexm;z56iN8S-(1K$6!*1NqQl0dPP~J#sM7p75Va(-OI#Fw~Rny^d$H-qm+z@ zxtT-AJi#T&CAv?BP>8&?W7T7Vj?#2Mr^1O%N9nc6qF$X14rAc^|Bt0P6Nb0%N6#nGx3R_;OfyULd2{i!z?q91IJ&!PZuh9m}ECSBBw8=-d6q@5icqZA#DtAz`8iop8 zL{7&Zd?0lXk>i9v({isEc5S2CGJFmu*-Pv`Q=f&3klPHFQe^2e`C9O%S?$WU>bRyf zblhCIQ3*zS@T2K`wSM=I-F}dx85O(wBSm+PjHV5_6&O*yU_SV&hm79%#gQ~di9JA3 z^WhQ=OW%_cw@h=_98DxmFRDtYl$$#@JgSi%%BV_7M$S#oAF({Ez?YeS)Cg~Z^e{EU z3q`h@*voKN+WKFUucnfmg4@SKbh^RL19bs~>Q%g(x1a13Qp1x`75{1F(v0h1cS7!i z!fEi=x+mcLIpz5;y^pJI3%QSu{^NLjwA>j(?*R_r*KHMzngD>Ce{EK{cf0|3eiS^9 zcBq#yz3Qn`KuNHFksiDx^%25%RPxiq_lqKaxcRP)r?w{;c{!|#>nB-*8x}3Zgc}8z z(hO!{o}*8W%{Gd+uU_{$an^#`+Y@k=?0ZvN&pU7JQsJqLi;A|eBB_zhbc%e&R_Z3A z3zm|jBDZk|SJHFaCF}A^Qh=6EQfhw>o+su0@*>pC=mOuIRsOrr_e{Rhu9Of_eMh^J zr2F2MfxHUg1Gs?qq0%YK)*x#=)E?m4wn33P{X>VY4`cx{tlTO=s;63LxFhbN@~>|kXlmwF<_B?P=%WJeFU&Ph0~M>eRW#@F>)(Ti4Wep z(}>Ds;Y+$y7VKrF%_Ef3*wn>Ggs96WGftp4wwRj$N>H}VI=KOGqwLC2ZOy0yMWp3x zSZ@`bXT2mmkt3bAO^ZMX6(UShm8f25lW6t8tIV>)N`m#+rIdH~xRFAE#LgkCG{GYr zNT%VHUXXzvl;sUl%rYVSQT-!dc!*yrpC4LKTfCt4rC$*Jk{;SH@zU~e+?G)9bWe|!DE{9~2jSDpt(=~91;g@ptA$D3&_2xlF` z{#Z@z^^HH9hr?b6_Q$^12L|8zjoTWX9Q)&e;jrk}v}VOE;ELdnvHK66PsWd^{usCX zpcec8Y5uD;Fa2FR;w4U}!mJ&YM^!5IM*K)ljcz7MsT<_Ho4^Ebum9KHAO19YJX=P0 zP|~|oTvfNAI%h!~YBR2O1DVw!XHq&}fstaVf`lpb{l;rGqjyBnO4nf}`iV)Fz<_CQ z1eQAzq)ak}gPnck@y$`J(D$6OsOiNv0af!b3p2002-biRR;JvBQV|MygDenoTWYb- z0JTXlE7G_m!B+-?^K{#qh%#DO$|b|ljXWGHHoK)SE?g9TUHwA(#9F!fB?z#UbgR`J zn7Ql6dYX9E;)6snIwQqCnMv>S3woVKGx&LpSe1 zw2v;wn;pBCd!swzr6)d8&nQXv5NE$$j(&wBn;-C~4X8u15olU;XQD<2QQmR}o%~y3 zFJ2!RnK%@aah`hXb*;d8B_p`|_?3#fobcS>5X6*|QbVDuw0EHa$axmiFukNZe3p&Z z4?SKmY+KxH$A?Y2sIG&WsDDvyl3N`W*-zCt$&*xf*|Ny~#RN#YwHW-FC9P;@B&Z=UCJ7Im4P&Cewsu0NNYl9u0x}C#jrS0*BL!LR;OVTfE`LzJ& zeGsLGx6Z`!S_K{6La?1_xST3fBcj@;79qGXySON9UNlr>M}QNoE^X+s8UgwJWvq(j zTh#CeP(T5u%hf1uHr=ajIKI)_vZ^*wQ&D5TA0lIYVfgq0jUg{TB+)AGNe?f0;BNR9 z`%?76t=i+)^Bmd?@h8&ZgCtA2TsgG2X&rQjUF~&W3qu=7ze-hC;lrZyJPK{3#Ysx^&wx$a`6alOonQ0kC?Hp=y1HxE*0YvHkG zk!lfZJW8c6HEI5+)1Xi@IZ%j*N?a~}b}DZE?0fx2LRF4tx(N4ZxwPN0N**ccjT(e_z=FV~qo^VSGAn8)EM>D4=N=(N4DCU)Hu5b00g~rqw zryC4GOaftH2T*>BA7bXJqSFR^t?%&P@og9Z9^3{y@*lABlUijzC|7p>p`kwe(4?+6 zcLk4KTyeQyAiCa)8aG&u$PS&Xw&-nPXr&UE(f2>H`GFC$pyv-Qi_FUUyb)D>M!EKQ zd#k(%%w!?B59}mcv?vi+Jyhr<*(l(AFF(-Oj+3>8DaTKyC=)ME%FQ4X+$owlmL=B2 zR&v8U@l;wwuhtp}oeec#u^@Y(JMTXNH zXUnywm%tQnip*-pbBiT?#^Y}<1{pYApcH6z+bc`h2z17bldHsj&vDTSe9@E2z>&6;+Q-hiv%es zMoD{_n$3fyxRKR<7ps*kt%^GWc~!6L6xPhibnuy{YLSg>F%MD2uDRw98DTKO>d+_4 zTaNXTGhxZ171(3T@04Jn>O;ySp@LO+FPL@0e3m z6vyrN@2_q)G=Ameoxh2SKPU4wKq)2;_6^K`5BVW{P3SvF@U;QJpKY-5g$L6TB;hp5;3BX~b#`b)GXo<^Z3EiCkeREO#=y)DZu*2JDi^}1;N6$f82AoIBAuXa@xAH|v7AGa| zl)ZoxA&%e-a=)bZtiZXr1q4Xl#|=g60P~rL=*-_-5arY8q)H0HqRgVr#?<=Vcg1@Et�c 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 literal 0 HcwPel00001 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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 literal 0 HcwPel00001 diff --git a/WINGs_tutorial/WINGLib_files/FontPanel.jpeg b/WINGs_tutorial/WINGLib_files/FontPanel.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a16554c2a81db7614ee963fa007fcf7068073671 GIT binary patch literal 29742 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 literal 0 HcwPel00001 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 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 W3(@PLVtdYr``1?Op217cXZ{P-GXpyS literal 0 HcwPel00001 diff --git a/WINGs_tutorial/WINGLib_files/Progress.jpeg b/WINGs_tutorial/WINGLib_files/Progress.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9ea879cd5e1c52b72d025d8767c70b112bce44c9 GIT binary patch literal 6492 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 literal 0 HcwPel00001 diff --git a/WINGs_tutorial/WINGLib_files/PullDown.jpeg b/WINGs_tutorial/WINGLib_files/PullDown.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4eef4c0abcd402867055dcf5257102debea093df GIT binary patch literal 6934 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 literal 0 HcwPel00001 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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 literal 0 HcwPel00001 diff --git a/WINGs_tutorial/WINGLib_files/TextField.jpeg b/WINGs_tutorial/WINGLib_files/TextField.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..88660b3c128a64f7d07d213cc98309e92cf93158 GIT binary patch literal 7793 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 S5IJB)rp`Y*5BgIllm7u9!o(;5 literal 0 HcwPel00001 diff --git a/WINGs_tutorial/WINGLib_files/textarea.jpeg b/WINGs_tutorial/WINGLib_files/textarea.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2b5e0798fa4c336908ed140c9438e9339f5d375a GIT binary patch literal 73441 zcwX$fXH-+)w>BE2qaZ{;r6V8&2r5eNpg@AO(3^;WNJ;1&r1us=0!VM6hfZh;(wp>7 zXaa(C0RaVp*K@x7f9H<#ALG35hdb`L_s%``{xH|rYtH%1XYW1dTKjtTdIdlWRfZ@7 zh=_;)s(%l_^;ZDn3oqNZ0D!tWfFA$=Pyqf@t_c7o04XsE2?;Uj-wP=zDH-`K3i7{l z`{qr`TXeU9K)Ty>baxn8?%ttiVxXhD$9a#5m6e^H{m$J7+z;5eS=iXw{$moNzqgW; zk<(C6(6G_d(X;(;%k^gf9R<-Ekry%11HcVBB4RqC>n;Eb0C3|5@!u%^CFG=J#3U3q z{$tdH7C=NoL`+O{gOr+@go5-2InfPb5>h$<8Ib%A=L7mD42)dD3KXJZ+Av*xH+OVR z?ZjQ~r;2(OZ!pOPW8;%N;vV(Sl%5+n2L+>4bixulU0jp$?>!W$oBBIBBN5SmvHMqu zZv55Xqa*sij?fW3;k=#)+#)9W>p3wUKn}36IMc{8J`!eTX5KKy%D^z}hr7kAue<(G zzaC`&uH<iiH8gY8siJ+=_~ze1SBDF?p*(v~LIMg~qNBW#_z;*hK8_NcaXf3q~@-9X^2y7c{&3h(Q8? z*l^c<$=OBUU^BsAdQ(#u{&Zv7rkew!9q!f|iq`h9WPCIliq3=ZE|*+YFAglU>C&_I zO5jaW?3u#tzgyAH>+e#;XsL1|Gm6)^GyHjVEAlU$y8p!JT>~B^0YGjiVWw%x^m-DiFtO&5dkYrxx`Yk)=RbR22QTK&k9 ziQ|Qs`2{sQYsLE`Lcm<}HDK1RK3~E5pLq1zXMe;mpCZ~$nQ-q$jo$x1$6`e`j8t83 zbLvk0_Wlm1(dU5qi|V(JQ_@^xRnQWg@*!aWWtES_W#sA}?quJ-GtR$tBl`>Mlvmxs zY|Q{kUAG6nV!9fZJM`NN1zym%O>+6Nf8)iLI%X7+Jm(Ii2#;%*OlCW(p2t7NVY$%t z)uy|FM|W973sEU1T9gCP5kRP4zIL`wn}#UOd0yTJp)9+SO-FBrfr``%8Y#kyrtDfB6WXWW-qb=NfeE&^0Y!gpR`1v>8`kjotBcrz#Ar?iMG>xIw`yf~cj6UZvRWOY5 zIB0)d?f)!i|M#=xf6F3Vf8X~ePk)#Y&9YzsqF3w@OBqAc`<1XsAb*BhkY71L$F3R@bi!p9sHICP<=j$Fo zL%5UHlPbcuh6m@yn|&L2p!05zT2EdYu(}UypzDk4P`VHe2yZ{H&NA((+{)XC*^kx6?6mbpEe|lxc$@1dR(&6j(=BhIX0HiGreo!*#j+hkY-;|(B@v0hN(J~vzGKjRqthqnb> z$zL5?YdX9&l`!u2rx4^~OvzJrTKTV6sTj97+tLa^5b!mCOfeGFK1S?!^1kWG80>vvC;E_-Dzzl^nf(?&74$?0*Nki`(Mh6r~8LFD z6rU22Fs$5$CM?h|mR)jN^PkwU|HHDP1i7E#3AxX3$W!N;A=EAfc&1BDgd&#kguu@S z=d-RW;C9iM_WkG^I7$95E>tZ3d#oZ`|B*rVe{rG3^Pfpq`DbR4@elsN$7law!`|}0 zbzD5=UxXa{7qjgf-v0wkzkl#_i(>WBzxb%~|Eg$ACf#P}cvKVlOMP$U-D=g4V6|2K z;tA;IVmq!F`S;PG#bV)8+SB%#?P?}(78*^$ej^JW-gn~ZQiY9HQ9*TuiH<1bMsNWU zKG=)gtM4+4?T7jE{zYHe-2cEvLf|8m0?ojOxMIDU50)WlwnSF_5T+ON5tE_zqZI8^Gw`+AkJ(-B60vr`J zU)YU1NQEPcv0}vYGqtOpbn~NUnv?n3zJo6Nd{THB26|&pi5Vfg8JQXFcp+>nXb<}W z%47SvH+z$t8tT@zYg>N};Cg-u6){;{wtky*W@5X(wqGkO-Xoi_d9R~3!}*n0TC?mE zck*B5yY>DR!i54U^F8;EGm7q=9XsCN$k>@jEM5a{l)|I)9L@+4_vZxEgs}`D>KvS@ z%P89l1$WSnN(PvF^Y=Ai;@dT#EIHuJM*13n&DuP?$ZpL)Gbpp!C-plxeKuvY88EjX zF;cdFoN*0cmrjs{J<#EQHL?8@@@kOZTy6I6C}!Sc6=pE!PyqhI__Un|Li*}!pUsj; zh$DQz6v3yK*{~<6q=dlkanMqTpZ#WfcfxEt(7M#2^D};aT%r!g z|E+Ek{j5R%q8e%pfd!F5;9mqjlX!D+nXo?7Kd-}VVK}Ik zILFgqD#Y7xWR=CQn1I9qlf<-q(qHc7iwZY;4c0rTB!X|~MNcL#8>d?pJOl}>*MT^= zc)9K!i4>SG2QxTK*iQt!t$iaH8SiTr&$y5Ro1l{Wzk=>H%Nz7PJ z^(j)9s`~4rR;t@5S~42t7YYyCilcMQ&OPs{3`rpvXQUB#FEa(mNqL4xXkFLtPk;3A z{FB*h)R1rPmh~dDTx2+~Q%rbfPmp^BM|F$7*h`Ko`^rM^z-FJy~e29(}T@N=PK4aCPh^$o+cL=*_qzG_Ilp@@NUEXbcZrh-HL8- zsW>zv9!*EbjicU7$+*i9tU8LtRxeK_%GBufzQoW^wINd0W;OlmyR22!;<4&IT3V!C zUL;A`fR$BSDa$hccg-Iz1;J6Tdh~uwmQ%7cp4QG@-AN=)Xp?T-f{Ueta=0H&L#cg0vr!Vie1Oi{B}WF%d%i_`c%|W_2%y>G<;G6T4mmRqw-e zj?qYu(pKrY=?TNmg-;K3eY;5YJs(+%HobE0rZ6FTq3{Zo;X*}1OVNX?Ghz4ZUEs?U z%^QHx9Jowr4kS`Y7a!T_-NM;gVTsh6g6pudFqinR!+EdWI=y%i9YKyJ&CiX}jhj&p zP;Wi6Y144VkbaoAMLm#3G0jkm`$$#m9zzL#ZSf&{I@{mwUe(a&26RJoV+Dy(R{e@v z5j+R%iyiciXcCx4*dj`WMGqGoOx!Z(b@2`A(T}W3A1gwr4BVdd0)i<=Vp+{M9K3}( zwwZSEC!tuAebtGTv^nkhRQ%ieD_+j~2KL#)$+eL9yuM5Q8 z%n3vAU)2b8B-iw?@`RN7ob*5HapA@k^1+J?Rki&aYQjfz6t!R|zl=NNlY4Oi-fiV( zZzBySjmi)uz4SXWRgwBa5}ft9c2p9!OG=a+p~b#GC`upLpGTH5EEhSu`Ay)z!d-j5 z2F#6DIl)YK56NYpWZL)I1oSVsr~8PULDr4tJ59gedg=;(Ki;81HJZ~7jR<>f!_8@B z#ra&gQ2SszN(!^hG=m%}{PD6|h$&CVpz04>r}gw5PP2l_kIQ!!j(Za+CGL-Hkqs?g zIJ)fh;|yo7mb zA^9e!Hx|4B?(S2wb*k@v(tmRm|AU57NR$jZPO~OrrslCBbFX1b%@fE(Q*XRCS-3%u zb{(;JNlsqG9h?zJ<3HcVYqRgQsI0M~uDBE#ciJMzc^Vw6VmooWmB{c%3S{8@d!Q=h z$E_}?SvPU{{_Oa)VP}4|x8{-r&#&RYNBsx~aEpvA_nm;}3kU z6vZWzTL$1pHXR`WdkIGhn?k84xtyDa67qaGQq<0HhZdM$*5~ z`8Ms&#Cr4Y(HXfa*Q6@PlfU&1=aa=@=kAUX1{?B)_i?uH&Q?zbbm_c$|2X9M!QiRb zeY<^aZC||EYS8S-Ij|PJ?!)*L%}2&KH*Zo2S0i{<>=of!Z>2OcyWpi$ziuQ6dwWNL zQ&`ljPA9s8t8!Q`UdQ=|)SkULPn$~nz7#=ZQsVhgv#v_%WsC9~=T%0%q1)WtflqcI z5UxbkQXM@rRreUN`PQwQak}e9V5wk*m(n&eYjeM)U;o+ljsK)vw5^*u4YYja7Pldw zt1UBqunu~nEAw^ye#h;cHP+4{8 z;75j(skJ5bo@)Sn|2*cBU|DOM&)FoRi(KJhjis;plkiSW9j8F_&bABfDV|f7fFc^j zmK&O>q}urhuVItMoO$}HSR>%VN{*7@$=l>B-)FoX z>KocDJGHiZr<&O7OAJ=Jy+te;!sPJKgVHcuIOw)IIVx+oshPH_GB2 z{3HBxu<3e1d4d8$rHC8F&?_CpLpHJW_^fpy{%YZ2Yo&(?VX*NO@61{9a&Wg;Y_L)F zAh-SonRpRP5-L&m0;*A@XWUs**R&c?k(wy+K>3pw0XFv#g)Jw)WYo zxqBEQD~@N{#CgU+#_6Y?m~ViNY}RhQYl1@aUZev{ij`1z)#ys#NE-(<*SIB(t7*nG*!b1lV18X z@`-XqHo8h?j48si7~6U$NyydO~=_LdZ=SS zs%5~L^JkMKE{O{T>_~Th;RkFWFK}jazxmg-R;JQYJ2T=~Dd5AA*i{2?nAP-F20SPFBn#Cf3B?HeDYM%B%X(OAR1<* z3aiezkwbZ|(q?i-mq@c@r5qjOAd4T@JK*H!u=)MRcB-irzbALc^CwM`Z~6{u;;=X1 z<@TCkp}W$qZL=Jg+9mYoyX}bC3AgvkDd(8)6FMsYYF6|ZJ1 z4LipQNc1vnM%Db!Iuz6ayKKPE-vQg-vM=XG@{=DBjD88K9p1TM#m%5A-G5WoH z>Ph3eeerQqu6KlM1RZrd`%>2YyvgPo;Nd!QZnPi3-gL1o=k9}lzhW?a4X{+#fA4vj z*_mj$X)Ua;)P#Rm(N^>FYNn6!Q zWFZt-K_akmG+fHu`)1Zq#}R_E2OpHL?(!Fw+Q<;COFeM4P1fCJl6atM;IK9@YTBd1 zh1^nSQbtgzg}LiLuU30=vO`G5t6SGRD6i>OWU_)-wUU#yukkTPk=i+P6R*TkNa(xw8*JXRVu=^#SxH2OqB5_*-MoG!d7pO4vN$eK5s1D~T5(8t6 zFre$#%nc0_FW}^P&J83IXNNGQkaMs%RLJ<`_KUdkTkJ85dfJ^^yqlVzG0o-g@yUv& zca3)uuBySrLpTi~;vBN)p7=5Rc~OfIuGEKGI=U2#--IhP0TrZcin3DV`cfFxrof@%)&5j;UEqb5;*6E{im#&nV~4u(~0=?P)q>Qj=Cp zaL3K>8dYi)Dt{BeMQGKRtGggLWsMYF|JK2`B>xMnSIbZUL0QZ3@3>rK`405>@e3mTDZM{EHHt+e`MCStp9J%;Lz`GT4G#1uHZfLPJQRg zln@=(GU(`bt5zu5Doa%@h#LTK%W4&`!_Q|J2g8tmU%LR2Vc%>AiMtkiyv!j|Uc+V2 zCzZ;o=V7rDksk6OTew8O*7Q6O{cNZ7N1!WGBO7xXY@ZzG$NIXr{pgm9xn;1`pR~I} zC`}w&t90uYKf7`;xy?ak92rR}vySsq?Kd+%tYzQhxtix7FoW(#ceUuB#KVgu*mk#< z3lKAb>(q;8<`du3d&rhkC+ik;2s3?eZ_y{~8$X#m2PnoY=(J-?SakD)0^Ofynl!YvJR#tsY_EXw`d$BfxSNa{V2W&Bge6#xJ}ZAdOto zTO|N2zZR)Y8cMu?O@$P8TffMQ(9K7rA~TISp}JAgr(w-V zt%2aGnzd*uIZ!YZeQR%c1l@w0a*JyL58geGc!{_2<)5rqgzJ?$zZ1Wr0M%poynf4R z|MViqh3t0+{|V=mlb9aWjohUtXXWsl#FT*guTX&(R`#+@Wv+WoxS11;<|O+sb)ve- zh{CbG)?-H5(VZsRkO9quo+(rTy-l-I}7vA>;}_z z*pDB_dHtBv^cDikQYcVy^M027CY^eiiL8PeD;Ni!t=!s{vwih^fuLXH{26|_YTWVG zp2C|$94#4G7Y0zJ>IipI9T|5YQDmZ_ULXIwSEcD=K99G zSAwJsR-|&u!O&&msvCsfh)gUN6btpnG~++LYl}aEvc&zcV-gC>IgfA`5@UTO{hBzA zT)DAM^gr08^`GpL&6M9;{Hosgh-XSqyh(P%jHVB&0_^+(-9L@7Bj@ep=jFIXzmkz* zFW-V&nlh=#EuG^LIa-H(dE-k7WjD0tUI8km!OS!$dlb$rO*geCwr;z%I0-tGi8|!C zo#LW5^bB{@)YD(hzS2=g$7@D7RoIf6gZfw`FyzMH$H@?LA6?7GiwKgtM&wRiABt2jijx<*AvizzG6=TKxj}eW^P|5g8`XA7Rokl)pr4PCMf9QE#i7CSyu@2v zu$6V<)1T>0xz#F@x&94bg$A~bOE&8n$gsZ>%0U{*^UrOlGF72aEi?)Og}u*wM}R@* zMF}VL%-}()CUFnmJbxd)?OJLf`k;csi6kHx&n&k##lO9t}~@NPv)l-S5c zc#G59)yrudFnoQk2|7RT)zNWB|i+*$q86O+|xbN6%jT@HXQIY0fp05L5icD zm8g$M`PK1=K)=K_w&y*VMbFA8$r+0_xSAzg9k?~)U>srk=Zom;enoHmfNoxJJtsFU zOtH%E4)#;{$U@s)547*VNgCtI+_Ti0(?2mGuZpZ)qXwjCc)G+R|7fL<3(Y|zijv(} zpXQs+e8k7EC0R0v;$5??Os*Y!@W^<*Ttp=nQt#`0#5@){%bQFHRCZWH#VxEMGZT&eb12|Nh~@ zch-kzVlzBNYw=efCX)Uefb4STer+c%BUihd**|L+uH;nN8HV#@VXf!8i-O7fx zWGeu+$^3i18yNF+rZkp;)}J=M$-Cu!5%+6p${03k;?PdbSio@P`Ay)oo-IT;yex{(7;D`D1MIcpr$ z?;7kKdF_W@Ab!O*0xM7dc<5-ia2u%oPXe7!Gm?*z^zm30YoSp1HP0c;a$NYfFYNzN=wQK_J_LiMI23q+xA*R1^*ijkGC60j1bfGi2I18H1b%c0cyZGb%UPX8z?=C z_ame&mkhcY!lx&{b=gWq&4Qp3#UDQ$Q$5aJV+jiSc~M6#KBHITxT#gkn;A=XKanSk ziiO#$k=fvZct&!@4@$0t46C??&_KYq3{WN3mH+P$w@Za8|7$a$@OA zcsYV)LvV4ff^mHpdvNWRhVCK3yQh0=)eA4uk&9K}m)5lUUg(lu-G1n2HthOE2l_T{ z%y*LL!Kd`Sc5^(AX0H4_NsM~OiK(+RR#_V?I-ZWMumI_(aZ&c%+2$X0>#5&a>8Oa? zo%*rXW!cyu7>?G>03R43|YSLtybw1IaY%-@#wM8vEQ*8Za-g%O%Dy@R2@iO@kXm z)e*?W5fV&v;iCvQ>ueTk@O3IMGUji-Eb?@F-M|Q(az-eDd)WLz{lQ;V8ZnijzxJRY(lY zXx5>N%2SN@jb3L}T)<~!{p8O5vBRen4NEmP;d~+Q>=e&0n}kF`{j6w|B&R*~>hU7( z6IQ2KiS5w+#^mJfBqW6f?fkF?d8}_A)5fp#bT@+5%w4e;UEX&}@xsX$Ks1K4 zAGY{10x0`VCxqprg*+ffCC+~d)*#Is5OVsnj2TpSvE=5H%Mbge3a@RL+zzJSj!v#J zb617NQ$_0_W!lFWQN?__MpbE%hi^?}hg_^4%9{GWubHqjR(7H^XHx+bU-BOp@1M;N z`B`lumOMHXD*$k-9@2{MKkn=dNPlJd`0MP~lv;6od+mAllsA4u?rpcJ_>9Prsk_F< zgK8X*2!`1f;LO9g9HSJDGX*RRG?XPy1K;J#ymDhB9Npx<0{`D1ui>9Ph|hH z>4+G|@cB!Q)E?LvmMWioDo(s1V-AyQIP_w;VCt4~Mt|*rz#AqpE*BXB-$$i9ggxj9 zEduHd_z$>-A8-3S9i_~8hQIRi>)<%;NeVK4A4zZbzDfJe?{WT|&4sH6c60Z+&bX8j z6`!i2S~N+Z7dH!1+6J=M*=mgl7psTAx+Kt*>?9gJpk9F7jPKiT-SQ9^M{YNwlC^@@ z{OGgxo%g4|^?dce29$`NIZg1-mnwpaBv^aFZ0HMn#SEe@sL{SSN~ixOFAph+<>yhc zycaR_;tzVP19zg`KNBpZrz`ojdq1gc@%B%{c~^~7+jPa+YaX#QKb_8J5;Q3qEp>_v zECF(odZ5SqV5p-AAq2O79>@8}!>@N`G^(PS9=*=|RJSr~@C4Z2V}yX{PAu?2h|Jr$ z=`*lOo5Z0j>}f|0%!vD`!yRwH!K!pQ|Q-y$+TI8n#IL+lQSH`keCwgJ74WcB)OayruXLW&olu2 z)0&BICi3i4nZxU1iw{-##o6UacKldk6N*ezCd~#e+f*`stp!+(7yKN*wT(|p-FYzJ zifh^vFgD?8)d`0pD{ zcD&TNjfVPvqcmXZep-WI#fxUXW|T{Ur6Wu;5!};16EMNTr${=Yf)$?n!vGw zdgZf48iXp0y&8BSZZ4G zt?x&IMTrT~E?2j$DI?cj4S3^|N9oJ4Ck)&us=!sCj3jyJ@6nuR5jI~E7#diWD0GHN zNX6?(asf%-pxTtgOAvs)r76Lt>5MdEtM0Ba;#IHbr{W)9M~qisHx7><-4-1R`rSih*IBU?k_gvv*%m=g%;B;!-IT622c%`LeG#KWfQgP;)KHRj(~PDH=7KX zpDrP0>Vafi<+%uS)!55qo@X5?9K}UVU+yLs9BOGY(o@K)lEu{3SM2j$g!RqU#?j3> zv<Q%8%$Y*NAg z@;2*al*vQ-nB?qq>!yP@>e0#bG@lqBHJm1O@q$*3U%TAnCFWk=2x@7F|N3!jD568E zS|5y{`7pZ#EmNZ#pSqGs!mTXjGm!K#9@>xal5u1FRs7qiM$Er3sMyTW5yx=re- zn(?ke{7)TDlYgU9Xpx}_Nxwry9eO!*_E z@CyMteu@;ZOs!tQ8?;);8%lXUZLJ&6rZQ-daE;snEu3|yk?OX4ew47mjZc;e|#Id9Db#nKlx(kz*?jY1ZHQ+941MwFEBl6GrLH;gCE+ zI`!OvJi_E=atH0&7oN|i@SFS;u%rW`7dP8wuXx$k%Fj2K@@MydE5BR+8n;FGNCKZxr@%|o8sB~(h^x=Fj(Mlr`E#Bzvr&!59)Z{)#7zC7 z9VEQ@wZd-ihM~rZtTfGN&=e1qaj=4H9xaA1XrGdIfhMtKyl2_*q`}2h{u64z^j8V> zwEhH@t)SeSV~tzMzi+F$lBWb8jf}?MgNq5q^-l5yd4M${j9LXb6m=9>OyE-9-6i)` zPb|8d*4Nk9!~p=WPrj<%fQ8$p1`Qg8uwPkCd~}1*cIZXu;i}7H*O0{WdPesKS~?4D z3t$IxG)((}K)-uEeKA%Z#2u^{M7~F>oaphy{KJXR&ysLKtN})*9%UMzjLuKV=k{`@ z(hOGYO~?q{1g$4A;Lq6h0O~kMrk;za#xLVL8`F&Gchzb{y(?FtJq~obb{F6dFTnB}YPi6tMk&v3 zZ0O(+q;D%3jM^SPDstI}?QD9w-Ij=jHG7!{Pw| ze_r!9>S5r1a90YO;%dtrGC6}vu&JAWrApSWv4p?-D*oG#2v5n zrBoSj?t8JdyN>8Obm-~0w0Md^meI+xyezKqN3IQ7n;xefVJ(#*9}-*Xl&1pY$8_&4 zlh$){vY=r44KAT2pDTrYQpEcEj^ zP_xk%JdN9Quj3QEm%BiSAJ}x9{KEt4>Z;fU@jHK>OUCB1(VG~H_Y%EFIcM0LJDMY) z!{xJG%3rH9se1kTA{#Za7#_ig3G-S6D-IBG_HE}g(QK>+L&%zP)6i0Zqv4{=2Ny94 zjA*X~WC3^e(~9bYs*Z(V4vA0VQK<&&MtN1G><{oAhx7QM!XE^^^f1w6r>~Rh(QC2F z@pTtUBZX=&tyzfpUY}lk{E@#63lHkAjDcx|f$b=v$`D?_?FMWTp|E>DP<^rG{q(fy z?2~2mtLivbVYH=m#j$|WJ8G9s4G}ai`4Wv2P7gn$eWo|OuLl#<-aXZ9@-(bdQHj=V z;Hd*Z{Y^8i!%+V6sy)te#03kJRI~WE)3>X>fFBBGzf-Y2+9Jvc+oamiMP}UTON`w# zDf=%@RA~4Nx*;BN%nvU2Kq7YlC=7>WXkv!XK&<|z`@1I9Y zd$TR8q}Z0}1g!-L8o`DSwlttN%lKa#%!*p7Is^A9*#N_usJp4ct0SRZ--V4Zj7qld z5p#wnh+L(=osBfD0twy9j%Z@$tp&zpDV%3Zwg<$?&|$IhcLLAL`ui{}c{>b9n*ml+ z2~1jVR;Hj1mHtV0k-meNI1~$z-x6zTZ34@&c>WyDNdIq?6(Z3#|0wq2i~ZxoRMu?+ zN?yf@Jo}&RL8kNmk9IVL4v#ml0h%dS6-L*9#f;;tWZ&%G{rBeyi?49mjSRC>C4z8k zZr3s1A+E_Pm$;U0Y5r3o?f$Axq)H&v<@O`R6E)F~MkM&6)#!rz_UR*U8QWiqwusfl@ zI-_phJL4lhxIewWl9RWfHF4VsHcjYJ>=^&@z1W{fX(0y_{PfQ`WN6t#+fhJlZ;?K- zb_dV%Cncw`vwAT4jg>rwQVy8Xi9^ukKBeKXyO`&s`W|#B?&&UkD?M0nUYX#He`WW8 zP>nQN)meZABegcm5=rRG5tHKJGc`55c8zKH%;iIl-Y=;EV`Y-Y=N!^j{to7jRz=CRu#UdBE zm+QaKN8hU38>29bFO~I+(0M7e@kCxEpcjVsCc_EKzVpXUaLIgavJwx5q)np+S^Ds- zE~A$r&Bg)%(HK*-qy~h_{F|Z|kJMvUWwuCBm@*(QCSFWni@fxaC zz}VaON1jaAb}e2~t-b^<=ui;0@X7LiUqYUPc%-emWI@Sf3I0C(rU0J`k03}T@_tWz z{C>;gm+lbX4}IDQ&T#*V+~(fAPp0)@Yyu|n<+33OO2w4W#4Ycued-H*gUl}5r>jvUXK|&P{ zTVJ0M?18B+cYVK^8W}-RZErotX;B&Z10TQNJ9VErbswHFQiu_~)4#IoP0iDjoLyH? zOsjItYCo7)kn$s5>1A3!rAxB}a6S1+fC64zl=q{jkxH78N1WVn0a?6KY zx!fNo26W$|QULIKHk1Zg_u8SyTjZGJ<=onrlXEcrp*!>N55doMCHAQCP~^Wn%TIV; z-A!P&<8_?#I8kCPQX4w`Dw;*Z*urB;+|gprn;mdlv!y4g(w*5$XFs!B_vf!;65M?A z{8VA|%eL3?(WeDvg1tu0N8VTt8gZF!j58-?TG_VfVY(%Lt*G_?EuO*JdYdIr$v;0zaj7+OOZ8g=egGiRp0EEQa6 z+Sl@WR*DNDwA4gdlunww9*ByxdoTZ$qgb56xs@aI(dT=TlZkC-FC*}#8)B@kar~!N z_Qi2pa&)7~_KQeMaFID|bY-t>*a&r5HW*`Cg*0?q^*yPGq{)dDGeYIm>y?)3xzucYp51)n#@c#!30)m|3z@M5q;DV~ds(iHca2Jj?sy$yJ0OzZG^qwP@I{%?5Mc0_l3HpXd5|jqg6P z5TVMQCpEoE4l3-30mPG6tsTSzWdzn)93wgFv&7p+%|tyl@E+51Tk}(O3-Jf@-%_76{pdBz|5m1@2oRgUM zKTCwf)617jc*qAmJ!dnvmr|Ln%+3GuThNE)Z(Ff1Ubd}wNz*O#Rzsy=( zHo-eY(zhU5?4}CUOu{V(O?lPesUH65V$p~@{Ti-3?{hJHm9pZ+O#E|FPax44IMa>P zSbpi(_C}px0qJy=qVc4DBh?=+@0V&j=Lv6EHj26k=)-R{%+#`z4@Xyt;U$HiwKP;1 zr|WL{qVmXtmC**D%ob4|EOFfp`D2P64b~kC6N$1EYy1x)wDnQMXRzUUxI$# zW=mY_X&_ut%l)GEA64?xnP2Qf_!$>&l7{DZ8C2D$?mer+;R(|IAjQ!z9xecV@MHPO zP@i9PQ(*0t9;+eO7QWnqg4R}$3eSoUrW>T8p#dasq;~lJKb>p%|6etxOL;4$X1u?e z&}bT$EzYH$ z!F=v~T55e%EWs>PsuJQy?q!oh^PjSz>D*K-!16zjTm;g^HN3Fa^+!f$Br5?DOa%iw zmRFxox~OwX=tocYJXSM#1_6ZF9?Sv{$T4VR6*#9a0mxz4hEP(G#i@hgFUurE4qJrg z)lU1PH?W?s_Hru>xz|R=$;ilK*SM1?dNn-knM-iPQwr+&!b_=xS(AtGqAW$^_V|qK zJaoL?r9*`)j0H(iDK|y=1<`b}zxNuHgW#*XZ5RX4e}yFQ+d^y_zHvI{@(+X)k+>Y) zF`Sc8vO_hwoH3PeTyV>bSnbwpI{O($*?$(9^{^Io zHmkRj^XV^jEIIpd97w2%g+2J0FnK7C_?d5g8GDh5sOV@&-Kx$7Slt!-UA>xTdLi~J z46RS-*K(#BnAxTxr{Y?0#zB~iTxZ}0`<35Mr}%>$YCfdL;s;>mn;*C0iS5|PfGi~0 zvUpTaxJY3Wr`S$a&eA@z`Dn_u?~_Q&tZJ_{?Et*XBJAZ+Qe~lEe;_E8(4N zAV_Q3KM^_%8`H_11D=gR-7G*@E@2oZ{VsbF^I{Rk@enDYPP59x-NJ6)8To;Sx}*-9 z#a7tvk1nx(9o$CAaRWp6IV8~itJHadkt%_+Y zSyVgvj2Ws#^NN`ZL@FYOpigPPr~W{FAeZn`y?NlN`GD&85l3Q%*YuRfSYC)I%ZBBE zi>bI{$J^&0Mq0mHZ_=(s!7_}aqjcU$qapV`b9haPLBzV^&a^J`>rbkf6%?O)2x1=S z+~mNB@Z^n4(G*Rfzr8=+1l*~fl=;!~#fPd$L8uGEW*@fR5}d+SWlkNsawMS0+M5{9 zww6uARgcFo&Uu)eJXw#}AnS_wrv6^1Ozm|jZ~7oCSf}4mRh%WBJPF6^<6g6PaK`t+ zpw2As_d?@lsgL-f?`FVrpZB)MiR&9_2PV1I_^`TW{oLl%s?hLtLo7aDJ&|*ELn^;1E|wpS>) zgEQhtCN7@B<@Pe?mtGMZy1NomoLo~!?CTDO592#uC5C3nD)f)^NeMV~EbJpxr?8A_ zIx*{3;)SCPPZo@s`1f+{Kd;vnfXpEhk_GKMFPU%NwP?qhv^(#x1a6^jST})Rl5+TH z5JNDmP=kyk+5bh}dq%_IegD5|v=EsfdI*A1A|i|$-OMP%V3a{3NTLiz7m*L5L?2^@ zh|UZ~ucM1zqnBW`C=o;nK@ySN&+k6C|L<7nY*9 zTQkHq9P?E^!liB6$C_SOct+S!mJVM|C;?y#^x0}3)C81DmXk)GK>d7lS=dq1xoP{oAFzKkK12GYx|$ikxlt-IHRQgS zbK31FWoY~?$AEozKuA03Wor1Fq|#GuuEB;Fv;J&z=bjf{7w}Jr*VH_0@D3dLzf&Ic49wv80AJ*w{ZcVK@z8dW#3iL_W+HCPF!I4#Eh zYs)|NUq$C3skUEUbsNH0&>2%c~oXXteyyzipm}%;_5xI zAxwcfYb@YtyKv{onD79A2x{QmGS1tw5#gr0#v7O1x-T7ws<3|`YOuQ_+Q>WAZ5fdP z=QjrjYo%eQF0znlx?{Ln*3}Km2mbkU0a?pkcijV!h{X_}>3V5pptJt47F*8z*XH9y zL6Ii8_ph{gSt=YlDV!d|$&Up46>OwsmE+=FwW5(`bkVj4-cEzuGLb3YogN8)zi{n) zB4YG$5E%RHs0`Mup}omtr|QzzMoi})R;QEE<@f~_>CX#nG|#1cMBwiQe5!c`AYmqM z=-8iHL(pMrd67pl+e4>51I0WamzQUX1IQZ%B@Ho+-CwtKqW4%I(cWVlv_)>t_$#nf zh`I6DNPvbmHh7tKE5aMx=F_?Od2U~AI?(f>B?APa)9ikJ(e*E{Uxc+XLSH(EB-MIc zCXy9#L#YyZYP}gBYCja`y!{>{prdx71@(6me}mS%^-4~C2+XN9Yjca+eJbF$-#%%M z%$c}Q+IfC~S;REjoq10RbeLs<)j#AiBu`egOYWWqTy*FeO3#uv-@T6#VMOeYqRHA5 z*jP!Zf#atouStBe`0S1fi;Kg+;;9b>f2FGS#MsD%`LL<{HuBR?T6*0V%hZoX4@?*m zpZzFqOd5Iiw6dmA!X|p@&bo}7si905yYh_@NhTA{9L+G_Tou#B!^CrOQcW2poX4Yc zWqejQ5zvQX^7zfR(Fq==VuBz&vC3-^G!PWfj_{|YH{RU3(VdiU3-t_19;oZk)#p1? z1}4=j9%ufvtZ-Gk(WOj<=h)EfB`k!z${CFZm5&AZ1s&>p>W)atFR`i=&D7)7)??{v zSKluW^vnB_Sc;MQ{F1X@KMp;ZE@-~KdoJy)d|kTv1Vdr=CQm$^fTF)USx|E7H9qk1 zxuJ@WqVximUN;dS0ljkXpJD~9=o%>qd#2|Yc|fQp3B+H?cQ;^u=^&({-Ag+z7GJY& z2-ckx0)0sOVsM)slTPj82;mR=7A2(>ZZEaKVwAMyw{3?Rk#0LlJDxl4k&Ur2^KKo_ zbm!4N84?j+5n`O! zaad0$L49Iap<-HIB50uEvH+j6v7VhbPFzlf|Ju}k^gz6R{T&htqN8_VlYYDzJl;lI z>Y`+>-s+=;)|HZW&noS+V`;T(xa+4J33XxSrQ=qi4`WpVUezMIbKkEP2)0 z{aHJ<+Wk&0gE-%j8e+2Z+gfFHlh8O&R6qFJX+wt9owOScBmP1kM)^BCoQJ9MIb1CRKTkVO!4P<||}^wCzj?1|^@ z?wb(Ty?5^<5tEj@M@ELOj{Ot$gW9$b*G_(BsC-`e^&yQ*+NP^luNCT7TUDB4M4FY; zY;Z-`N2qke#C&Hq2y_^3K|M%E6io&R?mwI0Re1h?E`tNFidIJFO0tiH1l$lO5Az3;xy>ckCeT1l+q7RVNkA$w2YD?H*7LSTbs5hk zME6ShVX@uP-3RxCbkJVaAHle7yyLU*db-hVtB|25vtujQid?_oA`UJ z@=Y#R%-o^-X(Hm)znB(qVuQj}KrI3bB1`yv26d9I(ok=0FEL)Neery$gtO-Jq0G3< zZbsrr1@5>&a=ui@Q;}+fAHmFTD%M-!urYW&TW{n`8YKmB>e{*_;rQhYZ55LNl!n>b zg|?9jyam8$@ojo%fcehcXu7#eUuHeFA_K)Ma~WS_7hqKKkI?XK(w`qP9rYwS(Od>K zr0;+%ll6<9MoM9IGaeQSkan|N=|7a4u#6OSlC7nUxuqS3`(of534 zEW?@N{;n?}ZW9#FrAr3j>VI_^Xh0afx)A_FS5d%&v-iao)n?!{vH5?ay5gB_zgVve z%h;LYEdB$Js2ZkjsFRwE_-g8w`|Dp|PlfHkCjA zq)CVp6Lqo-vPYD;UU$?lU$&YS`wcvi)P3GHCij_303!SxB}w;-xdun@5p$-$g6wz) z{(Kj;&*@|Xm~R<$tnZH(#ZZzM?4fVI zmy{^taT|lj)UPS_Pq-|er%F9tiGT3k>Cf1kl7ptV6PsL!pJEdjn(7?oO#}x!7luO{ zos*7A%X`%4>O0|CslkKX31WCM%nY3>0t;f&0SM}Ge3de@2m;lLl&u78eCVic^*7j;Az zBaF}_jYKW~`z6@C1%o0A+5_=Dw9o9(vnLb}?#bR*X&*=XK3^$wlWP*%P3Hig)C1Ph z*2(2Uy>E}^@lQ+^Qh~a%8$;?nBHLmgM17#%t5o-rreFOIP6?lW0m{VL-LZ@>Z@6vI z)KCdZc1ie+$-5|_rhb_|I?ikZKDhgaXXd?WAWc9{U;EOY(;~fP$O)~@fHyfJFYA&= zgy&DF<&$PtGe_#yKO`~Ag6T5mId17r=F8|bn4>`TUn&lE6X?fJ3=d6S>*YkF2(!wz zmw!H|by3Fm=R%I(X^b;XO|H$e(nX2XWAN+{y5p_z*!Y#SDT=4qlI-FEP@pc#<2Uy> z`R%x29CE)U&(y*v4TBd?2T*~SskK~dRLWY5zxRii?NrpYS~_WO#!U4%-Y+X2a%O<% zsOg(F@>;QjD(DiN-KNEZJ#|A(_!cnA;5%?4IG$jV0sKk!WU!1mqa2#Y5-(S$@0dl-0XKgLJ{dBa@5wvNc^tD8p{;t?1{cw;A7E0287y=XEg? zbNs=wE)Y1JvnNLEamnKphx|QbzlwaDV3$TuZdnVxhDPZt_HGsFClqvFAT^u=Knx2b zMn0~P&`{u-tlg+<74u}?YkhI(i7xhdTwP?z>qY@0pTgxx11x~W+Q%)*YT+@(9`nP+|G6n;_ zO{!s{GyttfcZETWgO{R3MhoVjR}Z8lr#2DbSGvutl7{vnyTQ3k9%4dxM=c>5h9sbv zfy_CyRHjl!x`VGRqD=CeN4A^%{8|RO)xH>un8K$l8014G&U2KNXZ8bjEVA>Jd?1v$ z3EQ}l5+WRW^m_8iDFAbLr$(dhaW6-{)1H;NFnRtekn>u zxYlyZscpyYr*x6WC6dyCiV-mBr} z%@k<)c4tD^j78&<-v}4U{^JHb9W6Je+6>Rt1v;SX`I^(L>^bym`>8F0TIX`3 zAstN{Wz>8Wa7WD$rGU>Xq)?j9B=K9|iIC=PI!LU zuJF2{K*@ph%VKvbj;Jyz5m6ubn|^=jvjRR8r}V6HVAHLLKDAQ)1!Os0(Tz{S#xHE> zaHM((>0d+OP2$x=&;79yGw`BowPY)%2)K7gd@;jC{%MhqW|B5ixWnC7LI@4E77FT` zNxW-D+7G*M&2^zrxH;Gtq=w9zk=2?Il zB4xxHz(Jy*9V(gzZ>ag;#W?#FSlGV>@vKP5;xc&UJ0CD<$P!o`E8FdHwxE-&(8KJ) z&&wtTX8AX8NDx!%{|cPi{oxDdd8tH~P}%*l9k}SQOWG2nkfW%4q|n;-Ao%=?XuTU> zfWt$bNBbVA3-@w*NtD%DaK0oDQ2is{t)DcIU(~a*0~N@p($9(vNbjp7`$P>F0EPNq z*HF zm#pL)6xNO-rIOL&k{X|*|9`9}oD2Er25Bajyf1F#yondsG{9_nJ$LEPW@1y=dx^D( zFpUa=gC*#01<7%Q-p{;=?p;z0iH-H8EWsQGukXdPf{LXs-zY?;BTQ+6s>Gl}bU|Z! z1AYh4iUy|pGDZhe&HqeFt)}Gx6K-9F0K2c4x-T11d+(?P@Gfw!e@9t(Yl=;o%g1jk)q;YG(_ILAfQ zOF4{uey)c2y2r@5m-B&Y`-r{brlqPCU5%+tyg(xtzQWKICSxKAMYa8!lFOo!Hz`hS z4LEN8Ry~~JdZeAQ;EPG$*!=NryeZ1(XIrSv#=6a4?>(Bn?HS6whV|P$E0iDiOM{!P&s=-p z=mzX!NXkR0+`FAhyeNwI)TZ1QgHooXq-MFIN)XqM!E5PTfuQCb5%CCWklC?9f8tDb z`fW~J{{aV2#n%jaw4nBzAY3gHiec&MX4LYKkp5v}LXbN5r@L%WLhHZXsR|R2A6{>v zeBcU~74sko_m)%Vh^e(DTochMu03np&CCq#3Un77UZ1_b5Ii{X;VGX>SjQs!0=nnW zzYl=$vHVVTCGV`!NQ0J~`0&&C^RK#1i9HLT;~&~SF302df8P@1{-fx-bM6*&c$p_= z6epW$KJhkI_`6s!2YiW$ew-jagYcG<*Voq^9K9CeUnC>InQEy^p)|r!E&#Zjvl1OQ zj8rh4AsT_F!ArfRBU~S7Sp-AwO~p#Y);yLyYd1SfWjCFPocWfuUMNaW_i*{=oops* z)Heq>csy%Q+e-I#%Z5CsY(&?ORB8UW`0S31$=+Ze^?c)s+Fb~mjq{s7vjNdsQscOL zF|)_(An>yRF{}BSwxN3{Flo;rh9=%q{GEZ~Y@Zz>i|`F3&U>tsw)$gcZr(1#*rtP+ zAK6NMwipVAJs>vX!lq^bOp?%8s#}6=5wG9>l9)S8{)(*tzKed2EHUzh;v4C~EImgU zJEkO<5M%c^hbX-`&)in7p-d442wwhB!)7^)+K)u+o~)+dsOId_n?kyF2?%CMLJ-$( z%cuI)E`K*wl2S!)7pXqowY7OF^D>s2&{P{evrEy&PFWC2=s|FG@h=Rvg`xY+T+<|> z`52FN;t_kv0kN3>-_tm;14i`~ieOC(2$w?76+dcjeUgsT z`#L1Whxy=UBP&72M<%5n-%orVs(SubY8SE5q6`O{4s?k%!#Mi_rS{c3 zhaY@wkDYmoP}O+wXQQz)ZjFKunBKV0IujyK6n18>B{I;=U~!5V1hY3ZZaP->otNIh zMBu1ZC?EfS`d|d{fhp}~*U2FB=Pmy1_Dy}!!*bX6 zEBXf-Yj})hj4Jqli@7^CTm!BdOmC|Ogv!<8jnNGv2Wi%eN`TcA;Pr|v879n*|5;|r zG82@8ShcNCK=X!SIdL@BzatQ3kNE1i|DGm#Br;8EIr0RXpvRx@a&!bngS(r~-thFp z-di#Lzbbm2f#eYCJz1jOa_!eO#Toq-*P`{gGolJ5A#DT(K49O_#MT#wbw`-I3@+*Y zqWiq2^ylCrdFs>504aE+qB6FkY33Eg1x19>D{Rx#l^??q@M|0w_4A4T$UA@hS>%J~ zI~_9sHf#A^jq%|PJ|eM0uH#f#(9eE-H`UdWlz?PYx1IgD=u($yYH- z9GN31610oo0WpqgGH9__PVaZAzVKAOd0(W5GIlU{jxM+jGC!W_eV*Tt{+b|My{BP{ z+%)`0m3g++dtaGLwJ&iLF#2|UfRKTpz;q9V(w7_^``BCuVNUe7`nL|bPg1=PN2|21 z$VB1Jr>_`FhThhfMV8pt}IBzC2vpqx0megZ<^)*l$WtV0g+~FU<`%+ zF)lC*MSu19Jjo4~tZ}Hq`s(f1uDa*jA7w2dxBbqaO1{Nhrit)R;nEhID?;mE1Usdi z${6hQm-4|1*uPlS-~1N-^WXF*3i@W@t=`-~cZJWYHD z820CACm-Z&hNwTkY79}$91#g$WMQAs63!3afGQUJ8nkZt;d zr&b!zwX+c5bLBy@c1$sY(ACt$EBHVob1ubY$3VRqbNhwGvg=Lhy_3=be}Xr97XJih z9i3nOQF(8I0E}(P6zBr@%9zi6EN+H#V7EfXWTi^Am*5syN}Nt2M*DKD@bga0%}|u9 z)$#MU^}uZI7W`|0iACI;YKaa}jo(&YS(q6Jo4V4l}zlZR*I~+1lU(=b^{RpAd(q;xw7d5^btbu3?-4kkN9h{e7t6~-y({s*> zj9d#j#UEq^s%V8yA4a2(nrkmFzP|4Yv5U$1b1kBedpzkl0-niF7d+O$^e{vi~PJTP(j)G1e zw2|B5<5kKQ<8@~pECbDXby8aQWs0?R5>-}3IfeBYt)fJughg)!J*b$Tjf+-{SB>{- zD|Tdo_TR#5v>0BWm<~^{WPJY z6MJL_9G(dd{>HlvLtXh+pi92_ba=mLdDS+O+#AUCoxzb9opB&JgTYRmr1Xj6@jh`JqMk8p&T?pbQ_D~T+e`*K`NI3_+;At) z3n)S-u3Jk~F{_0BmI%C#Ec>ONLw4DV`6qnm&iO{$vi!RPa>=2AzpQwN&pPItu5E9&N^>94>r5H^h^dq%Hb5g4zxfCg6~N#wGN#mH zwxHNo|IKC2Xsx-o`E5~#beS9JGSYOCRXI2UgFJRs)|F9^C?=|5`5mjKjHExcZ(0u^ zA}x=R*CWiHEokeoSd|>@H*u^9Rss9{51;xKymvd;@UrWlw{QgN7A^UD6@F42SsKRN ziJ@L+iM&d-9GJ2Q{Z;4LenM7kNO0RD9X?RB2y`Au`k+Jr?V&hgnBh|#5SRj%AvF$x6|eQ{&Sd~0algW32d5a-I`=K#{1&YOv}C$E61A5 z@%WN`gOmoA9oWub$FUm_@!#g5f*i^-KV9h7hX zAAOdWMSrP+xc^ce`KRxQ=*@MXLC5d@rD`HsWnJ{JM|-H>u>G?!Wkw z@^+IJmidxGZGqCSEhXG^eAnZZ**O}j!cY?%R27a?%ExvX&OsN42l^E|T)SSyA<144 zJUD}_dglryj=bt`9P^|Isv0j=4aYMe5mcgrI%Cx4uP%J{hiT{!)=Eo(9xdu*Cyy;^ z2*j#984RCbI(LEG0)JfGA8Pb?1_^%@YAJ7rnED#c{g#p>A9a;z2v!CQMKGQ3%I6O( z0z^+gkIh1Gar$K$X#`1Z+EN|5QRF7l=BVK9AS3A97nb#dv+eK z|I8Mn8?$>On~*)n3|^Z_+#YC{?~u)SlWX0rK$J4aZgX<;j$parx=PXQ5U8^X80=9l zm3-TRfqz@{TCv0YGScxv0-xZi68Oy6QT}$n?%YUKJ>i&5nA!#oKIWk2KFQ1TI!IqQ zFud4P6gNl`tutz(mKSuf|8jQ_4Y7T!8M*1VPcnNpoZRFl@T5WS{*vz8%-cA@qa6lDkzdvm5@avEs@+?Q z0BO(1kbn;DKm2g!akBil(>#q&3SQ|ex-RRQtdqurxRb)xN|U9OM{F*)bJJ~__OfLM z{h2(hjn9g>uzX^=Xefe_dlL-oWcE~QI}5>kEH<`$Nq6`)7wvMVt6(Hf+oFLewG{!! zk#uR-L{rxUAXW==^Rtcaj~oFmAteV&k}=o~LxW}d*AZ$VCwbunO6ud&yWXBw{0WXW zmLGc@>m|+sO?xeAEMqzzXgs*FB!1=!^(Uc$7#{yNOce28%i& z<&@~vE2Pf82YAaADBL`*-prpH#;6rzAw0KWixU=&MU!pyy8?=9M9+@;-T)B(Y3!kr z*q1>x)Cagh6llccf$81p>Gd?9t=>RR$NxB=$nddz)`?e4BUk4bR`S4FmG34^zxmWB zsf9f(kFSLM!OU>^6q+w9a(Br{0k_mIxsi z>i;xgF~nOOFI(Gu!b}Z8wZp_$pf9PsvgIj(4J^w(jrYnd;`fNwVkNRNsQSrx0nCCF z6e3icpY=F_UtCRhKWTUIv}@Y2S@Ki#qkGwhV<>(>)^o#Wz@zE~mW{)W?d5IjXI`w0 z3@@}7ruGZ(2P^WWI`tvLBvFc*W<0-Mp=oy*Z3NlN=>s26d1VtVZR#`iS9A4j`qe^i z-cgHn715s7`A-p264rk#t^zKcW3v;P^ma7ctBp#ct ze%VKw!RAqqJjT9!vY-=a_z$c3^NPLwCq$P9b!Mobru8|2M3<0|%p1OQa9O-u4w`cA zjP+Q`NCZ|J>m)~S3i~@MauI#y7~*V-fbSJ z^}(8D{r*%IrN2%&zxLrt(OGTR7vLwErdo=>+3a?AH$+n7+UsQW3=+BRVO?L>c&;&D zj|6P!V{dq`@Z1HlGxE=XHbXjP&d0&$_C?d~Pc2s!TeuYK6ee}Z@FxMz zicvys8%Bg!YS;Y;e2JJEWW9U?QCiX5R$5i%te2?$TVQxkemhWHCH--Sh(b@S*Hz3f zxhW_#-r4!bESYVWa--sgCCk5oRBi2DBy~R%Im}v;-_6dM+6RHdlIcZni9GTM)L5*j z^Q;{3p3%u!&xGE7|A4$~=3Syl!$gPYkP=k;209m@akyoyBsjQp?O!}~kC%BHT`*MH z18@OJKdFc~(PLF8=1;2ahFSnD!U{m&pqeW?l^>S_GsCmDyjb5&C=tpcdPduZXL&5O zc|pRx^xL_AsqV>Oad@SubzB}&&(Xd&T~-!<*@L37^mW6H^5OT}8Y0v8 zwpxXVOQN3|PPDaPx7D(OsK)%pJr8&-J%?JOETI{}K4o0*BG>1p!S|eM`OIwL5PB@r zK+5azoZDu|ZD)c+S)?0BLPKty2H<}=h+~>_xLs>sxl=dxwT-`vuF^QIR2Jz^>g zB_`0B(uc`mk~~i`0APQGHu1dAZQ5HYd*K^Wzp9yVaiBO|0c>DTqm;3hkgGm%FvF|m za>-~vrvNyN6DwJzcp1r4Yv;6h{rT&`d}0N}{f()=Q?x}^F%vT)6r{>QDfUSY@@izPCG?R?kV}FbD3Ijw_VhN{1JCyt`dZk7AY-PyL> zp!SlH2BmnANGL-_AVfk~G*XKB!fB}0b9vmpF(8wYc;G7{CKG*~JE|1A3^$$PJBdIv zes+E3Me|^qKGLLu;ER+JD;nniguhBJ8d=8tErRbR z#o^_j!tSL+RSw(CdLiggbLD7=Es+VtfuJ(sX(>~lFTxJ5N zDO=0Wi1`AMAw1j0g@l8CJ#Y#1o_O$LmbMX}xTKb}Vah2(qdgrFEY@}`(sj%*nP;au z^%He^#ig;f#@$k7CqC<8Q*oc%idVy?o`+=2pt+VSa4mF5nM&X#apzz^y!8t+VM@wt z>OfUBvU%C>L+E`zd?fB@4I4EivMmTX*%67WUqUMuE#QOirEdyj zDX8jB`hjJ%E2=0J%OED>3Lc^z&!(G8v^tx)Tn0YLTvGL{tyOl<^z3c4Ao>h`mjSwT zh|^^eN`lUJyZ$%S5>>d>L)u$^*lI6D-4FkVO#6}K`;{vXe+#($0#Euo{oh#M-PQb5 z`!5x}AYRq&BJ{IM=2z>Ic8LcRH}GG7=~))rW&5W`I?l#;8! z*e<8Nc6VoMneXx$P3_+R%Yn%T$E<)w}^PxL}IRiFY`PAawf@Nisd`YdvVz&EuvmUYH z*7zrb)si6@*V;hEHJ|>j{URw5WI5x@-Tj@t3+6lDPvIc&&cv;UiwdSaYEHw5aN>6o^P1 zwjLmVFN>f5Q+zr5tpKA}dlR|Q9qusK^@wsYJz<9^2}e!(Ys%fxn#xql`W0`wN|H9{EDH$cAA*8`V>gP@Mk#0b+7}VdJy#pO0-8ZD2Tu{FlC%8+31r##%WM*3C4Y{tpiHU0hSmK4(5n0J}+oI1r zDXv~DcMg>3LJ2L~SNGe#yTRO(mx8Q@4%7%FDH&0cs4zc{iB(+fCDqAf9@xxdl%f>c z+tEfb)=diRIhS&UXM{9xPc!a=ykC~9;UcI+C7fM^B*y&XpB}J|G{L%9Icgrd+L={a z`!ih^OqoX-T8m2LompT_IkZIj<#n#;eXy8UM_vc!YCLp=->%+p?B@-3gW8+grhfSj zdg+XbLNkM|7;3)XNz|K0mU$mYsc@pcoUB{*CfhZ>Lu;8$d_le!B?{3lL2qoU+49hK zawKL~H_DewIf5zUsJ~RNWxdL8k?#&zHN-|kdG@2T;6rOCQ1#A)0Jz$Zo>l$V*-|Yb z|2&$eyj5abLCp6o$d_c~Dq6Y$F<9JVvJ>&{w_$mXV=XB31nc7;aNe!1yA+6MeUTWQ z*Pl^O(RLb3x`5~^SGEg@&869zp_s=xWDMvvwgg3p{`O0hv83>s0qk)ue&73cv*1Hc z(B#{{RE|+40J(?`htMC;YPNfM4k*^BV8ovfp?(zx0bGZzb#=CO?wF_A&xq+9+U+io z08r-;RYG|0`Yn<|8ecl;Qj>zWV9AuHc+6@Wrz@H+yCHse+u7Lm^NKCI6=~=E$n7^YHFBoiArJU}*Z1z7=pn%Gy6`Fua zDND%wh%erOKVt4-y`j;$i!mupj`!O>q4XMrMl&2PUwhIeO`y_wP?}lWDR&ELxjQus z5+VZgRbTCTjFz=-nb$8lYc3fY##;*)6Bmh}gSJ_OQS_MV+;=ZGFjpA7zgCtVFmeGZ zT*V^XXFAHd1&cT-4w$>eYq3w~%3QzduPD@11bNjSP6r}7 z|DHM9d~q#xw^J?J-d2I>8Cmi3k6)*${+il|Z|P6*F^jYdOND0^%}F-Lf2oSO$EWnw zcCWxps>)uV%~%%lC*Fk0<-#q}9&@#&h1I}Wu+flvrp62+vS}DMDS05?ZBb5>wT4Zp zsQncZdJ{co+*s(|$i}q=q6Q zb3GGC4I{CV`ow5=gc;%Qj~J}U_)X){2Dd=|E32Mj<#(P|$6#q=bxK&krgUND63^%o zF2%KUoLp80f90HY%*)i>M4Ma9v_H ziahzZ%AGARRBSkDua>APfS$r#v9o54Z21H+f>m7HvhTji8_(rUcRLX19QFOI zFl6~9i5IoGk?PcP%(0%DCAet$I^~e=Is3;8x4HO2shfV1iw9jh7n$}Y<3kC>G9C{5 zRjmK+YDFUAHls>f3I|rpE-tS86fns7z3FMwV6Mb(*mUqw-S+K1iBO9X4aABjsn^O) z;W%E0M}TLKlS^7(Yy=)8mT?bzPNV36PA2&xEm4X$N6RISX)z2Sp_K3JCdRSvUC&cV zp0x^RP|}*+wddM5j_=b(5q?>OI@MR|EXm8kCRq0Di(AG`ln%Pw-CJ)PkEBgKvA<*F z-TPY1q-n~I*;^%@L80LU6ov_QT8**3{S;o%17cYsia~=LN>7Ww_ zoe2+f7#tdUejNiheD>^s8(Dy(STzV2(KVZaIxw7Lst0m)Ybg;$GX}Y69;zR6-}$(2 zc$7gmkAALj~DitF84Cwq_hgT9?r z^ek^W=_k^?`uvMh|J!(VLdE#NtI`lQAaHrV_|AW0EK7Wn@gEOQ3jad~Yium=|8P6| z=*54CVt*R{IlA|kYHjcClzx1fApW7n-6P9Kv3CEAJeo#Ab4zdj09N%@KHRGM;!bGH zrXOvzJ^NjHp;~JF0Y$m8ToW#U4{HEN!-sJfCPF?;@UTv^HE(aWQh_IwM$hH>S4T}9 zb@p`NR>TndMYI6+mS4;9+!QT(rqXQ2t{VW45)EnEsc1eYURkP-wQ_D17dLbqx;pUM z66hZ1+8``tb5*ex!}5j)^s@(!4A`ymp6YKdN{jUtC6J2YjAKj?I(9~(2u2}xEr!7v z7sH+CWnJ})8P%V7sV5$-6K|$+oC(c*^99eyuy*?15;8wRzsbS>H_(8I&5xME%9@W{rZ=jWv{sSNHm# z)Rb;NLIOBJ7qsC70!i|!m@Dc7S`%&pXH;1TboP?`;OPo~Jm_%b^?0Ty_HlKnd8^N~ zgu;P#NO3wKFAvUt9#*A(tx&V`LiPkc2O7F70*2~BM?Ml*e)C2+G) zYvg;T?5PF3+!+=8mx@un{wx*YZozrSf}H8E-~aG7P1+}ydNI^?%6eqViGFbzIX-PJ z(^Klg;YmRHfK6?_W(swGW<2fM06b>{2$rrV@gGG+M({(?QBL;sRk9!ogcGcqDNpp#ASmJ!h&)`sRQS>Y_dJYc+Yqsobg>&;QK7&lMCf%48Cp;cx;!fTwUCVIVSt=8nV!8ZGFXhx&dj8ZjQ{ zXS3t5RksM27di7l&#jLl6+rp!PaKNBaPs`%L%MtiI3^E6)p^=Pl9`y5<*wZ4Im_#~y0 z*3j2)9)&-bPWj>j{Ynz)hT`y7@y?%i`#)IxDYJukxqk>o3{ym5G4vluMILX`(;$)6>|Jm81&ZKe5T|9<`HM;%xwh#XszN8D z_%YjZ29&af+L<5;A2wq}iWD9Qr#Z<+7B?lZNos`}!i3kF3N+9kE8os{??jI-ld)$X z&Lv&v<7(ViR_yqs6n=I0?6>x|ZP?Jmen2B;Lf3Y_{`aGJ^}U#8{6n5}Py3v`Vu&0{ zl`*MyfSRtBrD)QXagT?Y7$njh?uO~9HZCjc{bstq$9l5$qg*Edo_&j9SXe9#ORP{H z5d9`ptQNz+8~@EPG_jpVz%mr4{Fmy+-HmP_GbACsc)&;c$!ATSjxibj+7f~YA#9*R8eE`WzcV#79Hs0l6!P4R(Q=NjQ ztA*skwEJy?Q=HmS()yA`YL}LYSV3?=*s*1{WP~ zwU#f5GBuD-i_cy+ACYP9gEET#TgaB_gzn#eWT3VreDAP`@j;xq3C+cy_XdD0!tZwj zB~*+9Z3z(uFHng+&s;b!R953BS1I^G(wTA1on=2CQx1DK<%IRnjNX#MIRdUi5-25Qq z?sWevi_JGx5(?82j-F+bTFmPi(mx>LAH(E1=u$(oI zXKNp{mxVNu@1s+z`ND`_RpZiS(KMixV1+O-btPCx zRMMJg21{?{@Gn5^ub*4RWE$b#cw-6)gZJnk&3m=ieEu=z%MNDKt7|4QGy$C?$b^ z-Nab{h)n>~Bs~@;W>et0Hyaz#k5P5GuqpNaOD`3bW*zU@10^v{S7XUr%-Z&Tikk)y zk-2|q1|UycA-*s0bmz8*qKF^)=69v_2T22kQE%~ZF=asu3-u+Jxp&%GDC=Ml5X{3& z7ol)AnfJN1z08U4$^OuEKz*ir8WCyaKOYbp zG^eVci`H&hmM(O6xFf=pmqv-REi(9;*KhTpK2l7J(Y%;xeK9V4-G3tVVJwQ)asS87 zvGj^U%l@anQ7_|G4Iym&m&&FZud*SPSHHj3Aj_?05obWjFa?R;4RoC1jLgGz?I`CD=qqWlafTq7xY43~3|4CL8 zAGJ@Zv-|&2*_B*xD0f@4PAq#4--;9)a@ARMd=ZpCHw=^2C@-VB1sRV@@3~R1zu#aw zn%jvV)vtA1ps@DtgOXo3i+K_kt}5h#&66s~vwbYky4_CRU3K1s6vdn7`G@vzPFMDx zoc=s=+h|3a2mQ8;m9mk_qOjtM>|C(QF*hRfdCmb3lD$^!+h@3*+}Rzy?7VE4RzLgGAr?}9i#294sOVNaE;eI)}mqiLnPp{NpNw-m~yc5Qe|yn ziN}N&>#DD%?&y8C8I{w$Z=oGeRznt{E6^!>v`9@K7OIU1DioyEX4{}lA2`FiI?C|R z_|jkT$y1Q~Xi4VHuwZd|R|b&*;j@0C0;6n(oo8&eY0`54dU@;<>94l+q|~NWyYzX1 zl}@*2<133$ZCg`+X0?<-yhK^=xmm@lt9u%&hbzhtV%=jnOF@mW-c+7GjrXgs#ug)7 zEW!wZYgsk<@M!2a4pFPc zQaLG42)#i2wu+rf5^N55o90M0wQj=&h>cLVv%KocSX$Z41d31`4`jtwEVd`Su5TL!3WKQ8J7ons)pp6QYN4fIQq9T{(YP{-kP%KPs_z zZy$9z1oPZ{8905#*DI~=V3WNt`S+9u2pA zz0J(9!^;+|8twK4n6=DTxn7$HJ9s(n**C}4Ts~jHz937~(!Fxg#w#AzME4CuYfC8_ z4;-enb{x$8`Bl4;S$xVB!EaM(;F`%cbegutAr1KFuc1&zQWmJmpIAD=z&s{MxOKyW)!7O%7Z+#}A-DG4w}C$dsBh z>m&Ak|7EA0WJwZc#TL|b)ReP>+HR+Ym2uN3+7|U!C&t|iU&+s^ zawh7vEjvDj+Mo_^t+#*N+JI_g(TmkKm|{i1PJ3l7uFXAQ@59}J__dGp##(9O^Tvws z`JeV+UFSf8keCbYHU|G#>q%x^;&hR=y`6RA9F*}7N2B|Rm(}8&84adk;`=SPOrfJb zWiCLKu?ZentdDaJqS7swQ!25CTRk5BQXAozd+XkzD9}rI1-(z!vv|iGRJ81-rVIOz z>r0vd2KRlv!$HA2yZhAT-cjv-w%qN`iy`{e=73*6GRLFh&`g_&PMr@zlS>DJ1;6&) zLQd$rNW2T18&3QZ^86xcubzkXSI!-a*1q2@v4!5(QMfS0JzEYs{k0)@TlCE?rxn-R zZ+~_O{7$sgnG&2Sz`p=REAfAcqd_ga+A|=|>QZ&sA)A6cH+a5 z66~Yu&cLIDy7=iLwS&W70V4(hbaQnLWl0_U@9XiM#RW51g~x`n6G#6c6#`78#?d0M zr1V{rH0^q{oaM5=aJ!|Qyx@{gR#q=rS zakf0(hL!4rISX+8dLZJbb_C-rvu@pXifN8QRYT&`v@{oY7RXon)HD0g5&I?IPys+moV@q_^q z+ELn1d%e#^+15VUODVT0C3zFxMYw&5VHQ`QVuzt|85a!dXEKdN=KlAemwWoF76-^S zIhc(v2Rw7b)xH4g(G7|VQ5#N$ruoGKswpgf`fDzSMp|)yv$;Wjkl2`jDI&0@s|WGt z*6HixWtAAwyPOD}z>WftXQ2Y$g;xqWVs*uIIVRv)d0q~zs$l2&M+V#_jt^M-)`-0i z{vtU|^*3xER#nzp>t{~-z{L*_w!!;?B|3{RSSIKnFdT3NNT&pFtbXK>slWGJq{(qO zQ%Z^cy-z!PI~R?~J`H@_h-N$A6lgvn29^xR{iwNqm9wA8*yVJ|WpYju;d1Q0KUX=mk zHR}YvWFK=0O%m~>+OGDa?ZHgH$L7wzWc(7h2`SxWEa|?HMKA-kGsz>4q|!xe$MOJc zud-^VxBjm8iRLnwoF)gql8^z*e(`YY%|&J37nSzj9Ld?MimN?Zy{oquyZ*y2{h;Q5 zwM+k+#3)ud+r+-P+xkziY;=u$9*?^b4Z!10z}Ho;=L;U*F~`E6u>`R_>z5spj`7os z0)EuNm>1cBAlU4*s8zgzYG$&m$^XnQ)ZX6rUPo~6ZNvLh6hQ~l8`C3Ah zjf6&5VrCr4GheHFbLF$PWZymEzh4_?XKOW~`#hHPjV=@k)xeHz){y@?$hY5^hHHc| z@qbzv4sPj=mY;Rzhw4sJaRVaKSsPgEJB`N1W*uc&hqb8or<*P}9Y%xi_i&jtaiV5- z6K4zL!R+$FqhlZao*t~o=9W6b+B$*_4S&RRZYgfg5D`T~$pLT#hfwchaa;jas$Ux0 zr$p6nEAD$yJu0R{>>B;D5q}1h;aL$|=cvMG6v@AigcY_QR*x>-K<>e`=Sv4$6jw4% zLM?(NPLJ>}3ytiNToKnRck|XgfVOXGQkLcX0(k?TS9lH#j0Z`5a<_^!0+9QfL{|fM zX|A3;;|nPGTqqngzP2zO&HkZTpse%O3;AYh$T*@ESm5E;vRrV&Ky5&>4eL*feiVSa zC$t(9O7~qr1K7;f#wa8Zkxgo|otbg=!bft$U67U+c;vI2EbWyjTYa9Pdk-aN59SolN9}YEYbclR2=nuCbxIX)nI)zicXF+y;~sgh zJe~h?RBLumNzJ^S=6+T_EHX4kryBad|rpM0+k7Soa!i7NCV15n8M zdgcH83xJ@%XPv*fxyqN$eAzmZIOwk(R_`p>W|XQXe!t>A@cJzEbGSs;rx(_xi6D-ZQ@QpcbU{KB@q-2x>NOk?d6l%AbO zr%Xb%(i+}Mza`?ly>Ho-c)6=qur^7I&$b%3i2Uin#FaRs%@m8xE9MI#ktc&ZPOHe` z%wNMHkmI)F-+^)ghbd8ej)HWAa`pfzYmh{-`lEqrRcgMBT*$+ zwRc0|N+#3mJ3{Tw8|jPbw#FT?TaSz!KY9UFMh%amL&Qf9htG&NG1*Y$RjxKp77B|ziI5WqT`$AAjTewCQKwLfuO)EIO8vM`D;ZB5wy`V$&2U-)qW9}=rH z{x{3;s4Y66nA1uTeYdN9AjLpkkqX5gaj^#4;5hIsd4x=I7(vWjRZ#9fl+C=r;DqI8 z7#-JSmx+bA<(IHS&bW?p;@k-4tfY8Q%0@gjK4zCz zI!N%VLo6uln6ZGOu=Q~5mR&E|a?N}?uf=8GQVT_%HxnO8r-k}3IPt;EnCe6ZDPJE< zT9F&|Qbh1u;fbYO#LuzcwN6f~W7kbfUV>;lQ`huZD+A3MArIu_-hf8qkh*;TaPpn$ zS<6+8T-rv~%wm%@tvWQ8c3aDrC0KzWC7nX*AItF>Xig@Uca(8(UP_A}&!8X<9{sGf*uq*%c%!XU6i0=RvGVC=;O#ZdZObyGj^#>^p>KL8 zWEhCG%}=D$S-h~k?(D;Ao9PSd^szgIbCJ1?{tHYz7+D<@=x_~ zyo;O7_M-#Ug|Yg|!P2Hs9w88cV4_VD7_o?X2E;N^4NR?_ZNwhr^gD|r;p z3y;Cy14Gf!4B7$3P% z>;vG7XRRTJ)XD9@P#N@qhHgq_Ix~++B0tae&!Ci$nmsDhdQosDY!0)m9gw0=(0Xnz zJ9zb31G9(Axur2PEwZTuKnZCTzR7o9(I57cNra9bbrAIVK4ZIc6RC4x;7j@mYm z!C>WO5rnCM-!9xsx8miSvXX$wWmbl7TO~3f!fKaM+$}&Mej(?K4Z*2%H|oLdo^!f) zuV7^>=2AH+-H*bwkw)*!_!7U^8pZQ^w~vAbT|`GkyoXs$@$CVz>lLl#WqKZihMBUJ zxs;)Mn!Y$4xJlgXj9QR9te3K{mrjn9i z<`@yuu)e&|@8AEa6AXUXIc;l`#45^ySYS;wir*O|n1uU=K@6mPB-d}}72gezTh3~) zrtfQSYk1le>@R&s(+j-OUAA$><*sey%)gE!tn;f=@C$xUcSkAK6Rek?%igvaX>Z_u zkVz=l)J5(rRp@CD=NU*KLf&+sJ_S|f+j}AbQbpjOo%*^$S=W+ z;gk*O=Cx@V)3O^I+;5~~r5{jW!AESncNC_=ncs0`)`Y2QM{;5xEq!|5 z&T4W4he6m6 zcpM=gBH8V%Qy0*Y2$L;Vwvo`$f@fvfz%d&j+Wu|4NVV!&iQ!v_mWuYbJ@KTj@yIIw zsv5pV6N$GQ7;_o9cK!v;uR6}Gq?l!U;Z*|->^|G@8x;wH*Nu}}v-`m0E0m#Zdrgi@ z2miC+XI5OgAl+aMG|q*LD%IByUC$(lfy0^-})$TfQXf|CVb(ugRRIDb?;5@^JjMti?p&uqDLIQQER3#`H(Uhm_kptzRhg?m;OEupDUQdst_yK?>0Tj7Hb4dKhXh4rufTV0eTV}vJ3Q#LaL%uVK1Y*`EXzwrEf z%W?w+tm8m5f`lufEkMvDWl^Q|5({%PX!BsfHb$Zwp|~=Uz!V=(LJ|$y#LF&{Z;0^G zzxpU0J%44^-ge~V`+oT*V4$;kvHY+b;ww-HAN*F=w8yHH!1YqUd5bE+ViXL^e2Zw=^&i3nTOJhtc5=^?zhbaAt55>G9=4qpvm1;T#}eos(~{ zbahQHUa%XGUkeR~Dr$J_ESSrA%w8!aMp6i}n1yP0`BqleDsCNxYS>$q?ubHovbyi{ zpjF+kL%fXJk$(Y4onMw(Out_ZG5ts>ppdXJ?Dn-EL`IyOc!Mi2%8{5@&C? z%N1o>EIDO*hk88B{BpfQQ}Cm;RAfj%x;%ND4Z8t-;j4(`lB1|ClhB+{U)?r+77$j+ z=O#r8FW81}8*d^q8)L9SeCdXT!VrCnKNaoeI$sUGzicx~5@MdAevU)m?K>x~#1_AEb|x~px$!-04~(wZ)0cVGRAP9CP;R>6jqcH^!3E31jPmlF$C26J zz@2uzh59&KtnOFzN_3U`^or&YVe=#Pcpvvb#-1=BSa=eb+rBKmdMo-+%z#z5h3=QY z#_zL=wefPvf|;pw>t9N; z9x&0qxSqZj#p*c|+I1mTrVU(1I=JK~h4S;F`PZI< zLz2eatOXPH99F-xs&qGlpNnkZWnq?FCKxQ%IWLTSZ$70|ZB@{;aq}(fEd%jEIS!}y z1-fAHczQz#4ZQnqn*2yaJ-jXd?iWc$yJROFy{E|vUc)MwU-M&b(Cv&1vUI7JYl#cX zvh(w~Nj{Q-iy8LT50}_soaVvq2Q9loBGqi%1IqLYJO?4oUN>&7`&CgEum3E&$t_t0 zXu#fh+^HP`LCIM{toeimfoY0Egv%6U@8`}69g&iqj|b&&Jm~Qge&x98{!OCVNE$oe z^?UrBe%O2I!Nw<@L>t|B5K6zcwR{Cv3j~3AJsJETYod;-f0~Oi)JFknVP9&*SPu5p z(b-%+ZCbu-EmDfQIKtNtl+=}slGg(B3T@-YYwOXcLF z(;U0{G1r9nScE-Tn`7L4|2&#>yB%W#v44;aMc6{j^X{ilHjOV!qph>z9L3mu2Nw{_ zNBj;a(M9rDygEeLDC3*p@XMu9bCGuB>W2?ptnBrv35;KqRCG1wgSFAI%p3!8F-$eC z@}sJ#C~?)9FNmX%*!=Mym2r0};XGLbYZ8HoO?b4BsJ0~07!17W8^(FG{Z8^%+7hXI;#wN`1sj$~GR0g%T{kTxTRBorrM0#cw z8P-lp<`6rJZ}auRgLD!M37HY@NiAPD`!Z;inBHi`@EZ_vrmoU%lLL-bp8#(Im;pSL zz4xDeWP7ktBKTf_(K2<5Y1M7pPr-h?Slu<_tfqSQMc&tn!*+t#k(_$$Hspj~#*EJI zKzZgjUP6_7LT8j_)94{)x1a4CGv%d3ZZTAT2l{lshRYPuQZYS)&3*2xf%!tI!p-p5~7alt?fRG1gHV16SCl3X5U*`B`SLe3` zStSTjfmA6UP?mu8-nU0h=cn(8eQ_A|F==Qe^gm~ow^C=LHB2*_Diq{_a&d66HlfJUyMswr)(`an!}m{%@Gbww+SXXH)8 zYF0Umt-upyW(>X|R=Hfr4)H>mtbY>EyR?j&XCA9PEY^E4%pN>^lEpHX$6Vn6QQe_8 zx(Qk7EUhJ2)9JgdU%a%)O*^Zzn9trN2%da^zTs z6slAviyM;uv?0NyLf3JZb6AFYAf4iJ$mOCpLO{)wno)Z@Ky0v`0Xw1Lfxbip->&aB zc$M?E7zmyVY`R?i1a+SzLo*4)C%!LNM-^`iIg7BYUsG7}U6b=F67807HudfgW_d49 zomO-wh3r0Z-tiqZClrxme$6~g_kI4Df3nD~vCY0MM8-W2+iu%kufb`@4x?3tezvdK z7!1iASt(8{*K?mjUQ+fl+W3zPO0Y7(BQnx6&CZ^U2`9=Y?+qy5cCVN&)s7hZ3wZbHPugF=#!T~n(s1d&fFIs}0n>j0 zzZ4N(|E-;~GU5NpB12o-@a*z|clGK}N3p<8&Y{df<7{34CU!txB=cOV;7J-^#gD7A z;;{coA%fr+W-N!^@cO~R;**>00Ipmj>*8yQedFc~daMpsn1~0E>&_`d>5hBi4cWdZV${@5jC3Nx zX|)0DRDebQ#_D^+Zg64z_=2dDPSy`y)K>MF3$2C%Ir{FN@+_&z?r@Z!$I&fO(Fu+u ztN8E7?@~A*2k-Bn=??XgOg!5xCMt~Z?|!b*zjv_O?7a>R=zTcFmNh2HQGnCoPeAfZ zh+$rA3_-|+w9cqLjj79~79w*)LY1toD|@H!`57<5!f?ItSdA0d4KmWu=La>}@C&p- zJGjjSiA3){1pAI@4f5kFDem0Ut?=*51M(ImCugQ=1+(=%_M$6!Xx_3Pc)!^^zL`(J z%~2n1kq*bj__%S=qn_{vm=v~GhUKF?+`K!S79|-8-{)UWFzONTAjm=6TO$ygYJ)G$ zS;?bB=8D~)D7^!6^}C0hX(yV`kA>*uvKKu?1T#c{BEG^O;q)`qre2ioxe{XyBJPbGFvSNHZ)(C|x?bTC zMB^`cFE);EtgZ&f$a zmSfhO(<6$z^QzjYz%x}cpJrTH?t&Q@!;8>C>!cW3B4?qkW;ju6j!J{3EPGRpY5HOy zCWeZkF=NcasQ>)to5j%3GVb&@3$Q zC!%=!m3;p!ZKtEpf%5*d{U9;F|Q?H*16FAMs z?{lHiRD|Tb;3h8^rNkhMg!8Cjf5zuD0Wg{s%M2n9K^I42D|mSglim44DG7%-_Ol3O7m=q_TxUCQl&!k3Q3P~2DbRi@|pwH4L8zd05oGLb7_YI(E>x-w0L^PsR&umLzF zDN8sL6BYAcz!&y*ij|6h6St~;V!o4PxjjvYxJMs9F5Blk)^+GV+US4Dz}S=$BmL#qn*jQaCo;r_xv)_IBFKZb37+d7kqGb1^=Vt zBn4w{vf`G|4w4QvD1Ic3eo&;&|Du~Yyt?MFN_a4KWqIF?saWrlaLz0k$7xTRjJiWP zI)FV^S5TNlRkZ)~Fu3@KKUdVbWy{0@!R3jb#Zz=9V|YoPi17xgp6R5hUus`v&2zi(~cf4zD%w!wlc7 zx@`W%6Bfr4{1a9APg{ydiG|78Nb9ns`xn+i`iI2LjBnR*O?hdrGPi?{K=JJK-iSa}EssSW<=loK4732AuwpbaeH!Mn~&4#4J-l5cWK|wXWIMTaAZfxs@ zg2`cuxdbB1W%kphB@-)@Hb1Hi6TY07{1*^h;*0jBF_PzFD7{!uLkEO~){kRm$EKe? zayW?uHnsRUtc_bLOQF%|=yklh+V)?7EN$G1b&feV3t`3ItAp{AJ+RpG5qdf0TwMgE zdcvF;bKCjJe&~ydY@S_@b{>=W#n))2J!>DFJUNJ#L@l%r4uA2RkGIsMtg`%TetC2H z@7((>ZT2<={9gEAavmC(PE;DeU4m!Yp#z2cKxk`zuxyRGD~?Pbkv@UPkpnAjpzM~$ z{f|7qN?mMfp8X7M7lMV2d=9C4nA*9SnAOUPh9#&%g(nTFy2yM!KYC?vbo^A0opkl8 zFzkEwjAcRDMt%;dX!NMAcQbF1qX3z^{PeCpcj47$a(0F2 zE(WfbE|JshO-{1MC=Zai3y+3;^j5}Hst)4T#3$pn+}4+1yYvl*vaN;_IO4nt#t>Z- zfjKk!{v_x;t<(Z|h(N5CI9Xe2$ojso1Ut9*>WVxoqG&4~!~<@c^RDOL=eJw@nR7*A zy5o(P+{$RV_=me}blqXS--JMXzZq}RqN=yO)9rgAnYjgE@92{3m>kJ? z=(E}-lvUth7{`wEYC5LV7ma#CzSHs_BRT#86o=>g%DhsM8qQM(dgW$3v+rImunmF!BtoqBJf-ykZUiema-hC<$!- zApclAHz8w)Nsl^^aW5b9)ZwuqC81JeW0zt&9da5;b4LClYgH@P%u1uRu?n*fa`~<$ z&hV273Nb?6V&}rf+~!sN?fA+K(Q}wrn59y;lw|&(t zzBf)f3m73#@VN>DGqyNVYL@1{2hdqO4$=?>Bdi6OZ39+gVlar?+m) zANO9eZ5%8ki4wcbuGtSpkG8Ut1A4t)r5vAbJHC|IaYSt77;^Ob^$s+wbZEA4xIAuH zCug~$Q|Hm39vgnarQO)Qxj3yw@Dl1~lfu7q7Yi4xCX!7F(e!<(1C5c`L?TE|cUPMQ zJ>Ck246o?sGxCgM@wnz&QTw#saa6Wnf{X5s3df&O6>=n}G}yrKir;ajO7{kC&y@k` z-YF!1^(pv_vTNOA8LoZeD=gzmq zBbn|?Y1`9XY->Fd!P7aEwe!x`Q^8xPVK&RC1z0I>X)%QY`oeta{OjqTQrDXDo7@bv zjeDLIOe(ESAMy&H_b7+{`3q3kI$}Si`Bd9Qcya`Ri@izzfHYIw=P!d<>c$8SC%%eA z^_4Jvq|ho?eUPz@7H_vs=uD!X-kG;xn*qwO>8p7*#c>QMnyQUL$y9%99CLrT zR~l+Q7(9k@TdKi2Nq#Y!iM(+~@>6A*ry(9hj8;DD??XH|k|>l|_IZRl!5N)qb2yug zMyv%$Es5~c*h|JHXv5%4P~-1m99gTO8WLL#CZC)uB^S&DI*>wSkHBr%_ab?u1q+0z zynn+5jlJNpJPiFBz3*A1ds!w}n?UWI8Ma@G4j%#zo*C$ISta zL#*8=@s{b$uZh_|O2@;vUL`lDm-uREtDC>Ac71z?w27$XyAl?=7K{_(zJ#~RPY;Z3 zlX;wxK>5OJ_CHxG#qQ`&4JZsvWQEm@tZFiL1@BxqWsAL%Rn2$waH&#O9G-SqHS>@D z))#5d=>ej+T-<%$!c<*A6&z<^c#?r z?qRyNI+b0)XYA?z=L~QiQ8|`3d3*ze`{ysEJd{%1Uqk3$Pw!oDv2P)A~S1 z*)nHoca5nZR}wJ4hJoF&9B#eOE(6KD@Xj?tK#{_7Djqrr)t$+qkmr?0avogT*-uv! zlI}73<0~Gp!?{TYuNZ=g)q(~xce4qc)($Tygs=i1+S$@LowOzyOD^gE}YQrAfwPfl~NP<7uw5R1`KHF9n9!U!^%L@s9EIG?IeZcAR zwT*86Mm)NF_brjuV+ogqNu}n?D1`KZm2@kl)f8okJg&a>DS#bzxw{ zE=N1;>*SYL8}x>}o;@kv$DSt#m#T(83>6Mu9G7Mjw#FE{LQ&1ZveriXU*e|={G%iX zKDrsm_R^}6xb*oI=A~1!-&iiKEEvoF);RdWKi8Jc`Ha7)0A`&;4H=JzjANA1fS(3U zsTtlu?EyEjiUJ8|d|lkpLk?Mq7(<}=ngOP>WgTG180mL>3RDbyTXrzoAm*rMRn(S;a7ir%V_Kfn9L-3 z%=cqHPyZW}pZ{=O*-ZaZ14n~cQ&wbY!|{6w76K;Hr#KqR3!T64iuGnQcF(QPb5f$^ zsxTl}yE*8qZrboS*j%d$0fd$NAY@e5(!bf)S`un)m18+xs+hWuxm+4;0{O#(#6k4H zVmthAFq=7HOOXY!#Q9+?Rwk?_cp?Kl{zCgHt5FtnnQaihF_MPA>`x#U6Pjix-_WaP zaBVfdW2Wi=IN;KBki$5$q)W~7T?FK2Jo1)?R-We&inws~)BN$zr>XTWXco`qNFY(^ zPuhku>VJpzaMtgycH66&&RzVsg%TK4(q(V-Rh_EAD)Ueua*;E3WhlQO`7?w_Xi82l z+7<}Au4gl##KS0xK8cFQ0r+am;^vEP0rz)1;PfKWM4+ zsyr#_-EuePy;n#A{ps(f0}0IR>ZROx^BNq$>27%Z?67HnC3hX(t~9>A1~t-F<_eZS zKMI6(hRZ4MS0y~ypqaKv-s4G*!xT*W#PF+Mgd0A;nJHd>W_B<4RizpBgF$7k6j76D zcFTtosxE1F(5Y_K2N9l?LZz`!l3d%nxOBFQHJfw@BNk}m?-mzVycZF9yQW})Y8CmR zp-e$vZfM{8IY@w9wW^I7(Xc_3v!wS@E@(byoY z55q)7R7@azcB@!v^Unkc*GbE61Z?XZ)^v7ARJPy*)6KiX>No3uD%UoKIQ3TIkmE%8 zD&|w&zW|ymI|toYXc|~zV)JNcFpnUWu>1)f=bvP+T$RBt#E*vMs_=G8{#JAa`qmh~ zZGU(X9+=Eq^qZW~C@Q$0RV04LKk3ZVW?`Jz-?Pw#_H+>B73mv2Lfj=C)8lp1bK`Fb z*r^RK*+Txj_Pw}Iq0V>9P z;UTg1)qhUtG@rE~19dZ{jFli$B^K<8;UIJ`Rw~l|JxsYG%k7jK?d?j&H+toW31coU zqdcWUFa!xw?yd;roa!QRyV{$p0P|M<`B`fnX0sY*c3-ibMx5SVgK(K%Z=d?vEss~> z@HhKhA=1;UxOl?J|Bgg4LIO<5euC8 zz=zUJ#FsyMe*xEre*w9V%l?gycm4u?KKcuYgMIiHUA@4yCGiilTgTCY>;B==qMfPs{%d03QR&Vi~BGRi!&}doOEbP$3JC zdaPdSdMa*e(z!+NCS9bR9-^QGV0bcrZh$<~uKq~`cwk;>@$F&tE=zcB; zY|c2beU=`4J73h{BJG9XvlY`GEApIBFL5QXrZ=;n%YETD37!mSF7*={D#1w-K_=^W zK{^%Ltes3<=PM0y?AxIatC2Y6GlpPs!9umFmG)e%KxvcPqRIolB z@ZZiWL*e(y_Tu|sy+f^G|IE?)vSNEqka9u4vv>n3^%*<)zdV5Ld{oyvETgARNJEc0 zfI9r&r&}2rTA&hU&O_(tri>k-y>Q_>JA3g=diyxPmPgZ5$z4H#JBJ_QFjOSe0k_Ec1N`_O+le8{G(~xZIE-DpR=}I-cSq7y zp$Kh&ARN_hruF9gl+y;wh&qHE0o~peI~6Z)AL~OMLj;YG7g7Ey>|g!(N0Hh4ha0s> z9e)@!M@*R*4q_kBDOCLnAQPO#*9K&pid8x4_!diYIcnVc8h1}u!&;q|mV2;?b*iG+ z!tg$dt9w_S({)zy-VJgXbB=s#DG=(nV0T_4m1Q<$JBXuj=GsvpXCUc^tLKOM!kYu$ zxZZPg$6!#0V#T8HU?EyRE~X|*4Jdh<&z#Irs`uw`+gkSyFnryr|CS$-W(&04O&k+P zLySO1z#rdzg@7Arafvr%YL4aayQ zj=4LWoL8SKQ7G|`#|fuzmX0X!IR~AW><1kZ-Hz283(A}y%Eir7H*l<^gs8nMC~3?u1pnNv2uTx{R?P0p}7b)Iu=yu zJMl40{=FI|vzj%&`bEWK?1y{KYss!;MS1zuKd_Ui=wDS~ORDr~ZK4mAM!b|bJfjyG zRwO=$<^?j$XN|!DEI|;iO^LA0ddN5T(0Zns01Oa5O6*+tG;N&&0D*I@%g9}lUAMeg*k?Xk1 zS0RhZ9_(OZxIpARm3HNVlgCuvsh-Kqz})W}8zp0ht9yOVuF^k%Ee{nLkYbpPJ;khia>%&Wvh=H^IbfosuYE~JKLQ`+~_a+6ZpL8|prFg(pgbJ@o&KPXX zw-oT_eL7a(Qjipx1y28jp4~Rj9pDB^<0$z4fp3uW>z~~cqyg?P_h=B2pLAL;uXWw^ zS~c8a_i++dI3Nh-v4mdwmx^j&;Ku2chAD`vID^_cIo6G~B#B#gvqOT|uPEJ-7W45C zoqyB}W9Jdk+sr1l(ks&)H%*)WkHzO+fw`B=u)*b`|rVVXK z?z`Q%&MWzks9iA<++Om~!SR>>Sn6yZ_|{)Q57FPo+9pls*az=SdQ8uk79^k5u_8Tt zE;!iy=Jn*L!}T2sej8m+9O%>N?b{S&k-plfJT7qkPu)O8w``SpImMbv{so(Mfj|Cm zp5SN@I5hbQt`mE%fOKOUi3y3HYp>}N2)L{(OR<$u))82Y(Y40ggJ|aS98I8os(9JG z#ymQ;V2(RE+?vZw9#!~xFSgOg*$t1lNBC5~qH+vl->`APm^Yik&CcmyXbs5hKZc5N z{)Bcj7t_Vo!$t|2tvXQFJo9Z)>Bk=I#%$sh*r2m|!T8e(LfE~|6pjy#svRz?3#0=8 zu*L0p?L47a`tscv1wJ6X0j+Wx5cd4MJli_ZA7S+YYq!NHXeYgCiE`2U(5zL~h=~X% zLd*+kPZa1C@2vLB5*ONgH;4;p%Oo)Oo`=UfRQ_g5ov1{S;ul(`R&lTBNRx?J0Fc{4 zRBm#iX~li{g?FfB0yy znjy#AQeu*reY0B8FBTB0P9~vEUQY-E3#LBzw0o_)9NH#$Jmfe`PIG=wE$?Wva3$^Y z(N8U=+df4+aN2=bb?_$hbJmH&tM<0Tp3=aDQ^%3W6`n0^&SK*^&;ln?_c;?*$Xy#i z!zC|Lv7yO$jC=r-^{tlpcx!hmsNJC&@B{l-$Yc4RKTLw3GnEr7vEMt ztX(vArrhh1#6y-Ri|J||9AwUI!`9WHJUDsM7uO0?jJsA@VN#vgj%{Ls%$~#V#lw;} z_iJe{<*G7CrueDoaA#H~=LP_aHro_8g)EJE@-%3tz+lms$*Sq!&iHC_fTKbH=nA zrEbo`TmcfeRl)t}vr?Qtq|tp6_!?DPeNdJ2a?Ld0jg~7r3bnx9!a6sGthL?oGuj3~ z`UIq($N7w)-w%Sh=7uxfM^o3<^DTgbIS5T0qorII>0bE#O1Tv_H325TVN_r7K9buHgBnx?ye+2OCG+ z_<-?zb=`4ov%yq;3*&MBu+Lp~1Aq42^gtlEs9d_gPrM#+qKSh>XP(87eSHVM{k9x#$N=>JAb{yA^lA7N^X9&eADYs#EkcU zX2TWa{!bQdJeVi{O9Gtxzs}-zfA&8}df)t)x!eom-d7Q6e*sjMFVWJr78jL2i(f@n z{eo@%vHJ6d_}}HmHEp5YiYX@Tf#0=fGVc|~Jyp+e5x>5CmMEz0jAH@7gDZBN$p%qw z?mQ=xL)#cxL~*(I1<{sSaW0I)Z2ZyUv3e zRjT+n&WtAH-p9=~4XRevZ8Pa5^4(bu`)W3}Gi~jn`nI)Sy>EL~>JD~`{X&tDIP$6F z_Ro6klifdQZXM$Lu%uGG!l3W2{F0eD|IB&`C{Fv^;KqU%4@6+wxob?;S&^4~|MygwQeS_)G`c}yC z@_-Sq&TQ10VL;!cb6jp#!VXq8yw2i1M#v`8l!k|TJhm%LZk1)(seGp*;KMJ@mJi~s zVT$|7v8yPtY{+FxB^D3U7#KHYHe{lW5LCNpX{o7-zDKlp7sXslO%DwdZ!>LTias+Y z1EvFhLdmT3ylNYMV_?H_+)B-54LOWX0v;|4M0hY2LwHRkFqjsQ96To%aPZA9#JE+q zoA#SjhP`6uTb|Gl;?o?;vCPN*YA04v&&(whX!%a5_}t$LKUpiUl%@Zmy_0Jq=d0D7 zdgwP-nM!=43nJAC7JzIm3*G^#L*&_jDHL1Y{&b0UbB}*t?5%cAWSNK(@46P#SZ$5@ zr_tIoz`AS*X#uER_J`R@xyYH(1fE?V)A^nUr->^aDJ|ubY6GP4;4_^r)!)F(Px)Jn zEX@lX`)yczEi5gbxC6PP*JyoM6KY{1bjv%9j~SZ=Io~sAQ_OA-iE?dB9r-t`e9}LK zzLta)gqLRvQNvAF7Hr0bnbvNRjgO}RlNsn-j`TZI22%i>Iv(C_G>VOKaOf>7h_-de_uN53A-p;Y{e529vqWZqGhOHG@f=i9; zuADrGR+#{#D4*NjQZY9Ui0)~n{E6JA4GM#RP|!5jo=ClusB{anbpQm)*)So zgx|>`nLVkIyF_OpsEGUj!rXfYHPwaf-l0iRiZtm`5+R`|NN>^<5_;%OLFo`6Q~~j! zBRzx!lnxSlCnR*GH!0E~^xjoKP_UfmJ?G4v_so1V-}&b~bN=14X3y+v?|ZN7T63@8 z>h>h$i+GCC^|M}S)Ts!KDZEe{&u$?saWV<%FR@AHHw@Gf&ig0It@@SJa%vUs%Bg;< zuB^0fh3$&fcoxofd+-i1uj=Xx2~$9f0ggZBR31()FOE{Zx~bFlZm;no#!Tx69_>L< zpO>&0NwUUKMEhC*tFgP8LQ(sQUf)$qCOwmDkycN)Yd>0$`+Xm6Uc4i4L+R7i%>sY<#IQ!mKK-(23=y=2Ewd(>j|xaSE2$JW{8U|w!6Gf%_JrZG z=4LbXEE4_QK=}hCJ#K*!glDT(7tw+6JHhzL&e4ELHeUIa2c)X3vN@HK(IbTi6?QeI z(Tx&)-UR&he=mqPMs%=&;^6PX7P-rfPKNucGmCW|j=Ely2ZpYx_Gh9&3-1RV3@%L> zsmf$yd^b@=j7+{aA{TCkdJc_gc(I=ppj!@2d?rT|MWxL1b22_!RHYW*+O(-Up}SMP zZPFNIy^WE*MmrS2Z+;RQD0ihsYo~3cmcrV^qx@TJGECi{Xr2*&>o+ps`Xh6qyCQA< z6b5O<2bB%WuId;C^4XMx{p(xo`+VO=hm0h)X^a0Zta(Vv%DmQ#jtL@<29VjOE~D>-LH#ULW*>o_1WeqchGzrwKRC*%S?a1>TiKa z$7Z0r~w78n^MHi5#5uz>Q&<8p?LFQb@shr0s6AS zzS|=oVd&zrd?b{5aBjh7&bcp&%fFhW)(iE_+*I981S593(P+F#C7mIt*zx6X_|=n) zZ12**dTaw$&byy3qTLHo1vPnrTw7!}R_&`+^~vCpO76M?dy-D3 zXz0xHV+8S?ZlmC1Ces2eSe-v|Y8`B4m~$N&!9U^ccU*d(ugKeHT4EuZt%K^JjTE;I zC&VOp3&7|5q)7ZKv#wIavnF>LKi*sYCLWz+mE4Y(Y7d<0qeR~s5_sfqDw&fkfe8H9 zpB&5m*6+aD4m_V(F$6or@eA_5`4xOi>dZyuy9hP6Np7F;xP*xL4ME&_rN3yYG~UQf zs1H4-S28)I7F>*zmADp+a*PRvn0PbSV|Ic0Lj2#~HM4r({89!+V749R64X@goW8ESzXs8fL?vM0+t?eX~G}*pNSxIGjU0POQM44#|g>v@3~{&ufsR8n8KPme_9){7hjx> z2tZ(O`qlm|h^n+8ddjvTR%36`yM&}X?=CNEHi6W0_p@uX2}Z+wzmX6g7+uJ1TtY zu=yIy+%}LE4s*hy_J+*{{Q#$63bN3pF!=t;sx=9};;*l~L?~<@%$v+{8enH4pJc-T zd`%6=)qrah<@4O>UgPcQk8k{`FvDwMp^=~Z=LAqRl+|^?KytNHl`S`IZp6ut<$DDS zJx<|R8(nNAag?M!c5}b?3;0*C5Ok#YG(!QZJ|$Q4oxMN=H$H2oMsCkaLSkh7l>}~ zmUh$@W5EG6E_*}vPi1{`jTVIsU*8Yo+*D;9n+_a?tr>;l-VVnXgRL|ss**NMNz2(S zd8;O$`6@fu2LjAj@9lO@=$Q*i4_oj;At!z+Se!E4r0)!^9EIHbEsni0Vith+cE%v8 zwkZ8zfAsgiv@SNFwK3wteBW|-c#^4lo+ST2&8vGhy3B?mDq)y=KD8$_E#ARUyEeo` z-=|jCLcHpWwc_gLRcw?x~H4|>>uxWa5VFauAK19r^b9+1^5Nwy>AulM+-K|;sMS@GPiai z1v8ck#2!gZA$SBRdsybgAA*VFM9Lc=mj|ZGhCV-@wrfMS5mjfBoaEdH-E88eMrq3$ z**AA)S%b+2DRS)pgG)`b46UxKE=q$!1CUZD<(1B&8-%4@ z;yAfOb^!O_wrd1d;@n}SSUo@& zSu_fx7)2H3TTp>jktmHf{K+op>uQ~(DWCi>MlsxgjR>thCD!*Dh+Lgtc#_q(5OqUm zH+h`VXX&V#7~1SsEvLE``#l|5fw&mXf8G_NyD=UtPQYmW(-52R6b=W#PnC0}uhMUL zRv%6+NEVKSy~$+G!EDl(+eLFNxY8Nlm4m?Hv;$bOFGA{}GlA@9?{ixPj(;#hY$iAK zF!8s(neaajBk-x4`+bsM9LMrx!dCmkdK zD9!Qif7*X%N&b|fEc8yvL}s&PMg9EALvmKcSmvVL^TmY2G0VELh4X0Tn>_Nb)=xG0 ztk2{0Jm8=l&Kd*vTN&F*WM5p+Bp8*xQkUr3>&fP7YU(|sxrg3a%gcyKcP^0UfNfh` z{dyaFw;5}EdRVi}X%gW8rX`26fh8;{V@v_CH(f60ow&Dw9R`@OmDe4IiPDBnGqVy3 zn4UT-@OM@Q7{j$T@YR+$Y>Vs}>iG<*FXyU|r@z7dp_G$afUC(j_!kMXSFFXmB9_CZ z>LT*M;OW@3e3Q=kz(ilIcTR+75sKzrg)WOrHE>p5Ck8=HQNPr}uIqXBX^l4;ub5J~ zY=oWls|X83V!YzGS{wZ?Tn<~jQHUVkk(HUcDVzdaOZt* zK(8j|S!UmNMU;(wade&sSXrYRIvjy%TR6+}E)T4p(Dk()ox0f!?{1rNM=gioWXC6q zt3`r=Lc18`sT$xe*GJMxP3UJV?ZqO32JTq)p0ICh4o9(?VZL#0p;R;}e|FzpJG>Ha zxHw(BwjM%Ec?GQ&;q+u0PAi`|+>)QPG@?WBZj?sS7?6{FN#fH< zSW?@tfUCgA2>g%9{ZW)f^uD8K?>4=W?qt0`^Zbp$>-I@WboID0Ml6F#4vYYmf)Xn z-Rrn7KbK06xkPVFtwl2xX}qGCUFoNPY@4mC;Mp6)hEu*isZ8M3cmj*R0&sn2)~sy- zNoc%Qv<`~$KU$sYBsamL8{9c%9)=b8BoiOJ?4 zVMV2Pm>!BoXsCJPqw(yl?D^UGiVNP}RYiVd$GU8uQyo^BkTR22rJ26~iU(8j@jY22 z&GmKylaCF5>4X|X%;%aA(lsBV_qeM6h?MT6o=m8v@YHki(1hCVu+hgw42s@D_P7sG zwQq_HhOf%BwUUabrC|#xEkTSgdIH6xE5I!Gu6;bVIT6#CH{SdNEL(H1NErZoJCc{$ ztW9uXVX-^@nSw^ikl9qeg`0RoA!iHkxagLVW|?8Q+2Btd9mw>k?Oq_Z-m|i}3Bp4# z`W3Wj0aRQJhnuFKN75*2hj@|th6acIX48D&1*U@99s{y1n7Z~cVHR;6)} zYy_vLfP`^=7glq$pB;JoSCn+C74E4=erewiV+($8_wM+QXve=z+1FLV6*Y?7Pi`t1VT z5O~iK5Ev#;OQtgO!C!@CY>rG`K-cM3^PQ$^ zQ#_va`@9NG{R=?Q2i;2sU2P&5?i#xb*nZ&_Z!_OnYz!7jbZyR?0yFg8Dn=TK`uG~d zOb+CQhGA%j_j;?7EG<<$xjxmO&8CKjkcUQBJ%Xb<&eZId)CrkG07}#owXZO^meYh{ z3Zbp4BG=}IKYBV_JEQkrkFHffuQbs#Uq}92wsDuUpBhcJJ5oJpMVf;auA1+^`M4F7`KY~~R zd8|`OmuAH8{rx3|_&&xCp4!N?)1=mt90OLeuXqucC1hG!6fW-n91HATJ%zC}(_fe> zAX$r$ynYYd-t%}{&x*%dHe&)K*7G)@&!p&1b+!ip)LI^c$cBTgn@}V_8}Kea&sy5A zAOD8LkvRX=_odvCTD;={fjr578r^-dh5@{vv(AP6e0S8&3&=X{K>AO z!#{f|o`|~{e-^6(^1T{^w{>(vjDkPLR24^8Hl01;K4C(k*6D6YtS-sO9ppe9l>{C* z)`*UAoCq`=u)^_$?mD_TrdS|`4WLfB;_ z<^|=8kMhHCwP%OKyv6!uG@(jK;<(q~%WFA@t{y@L>jz^)mI!bv@@#yd#j?)LZ%*Vv zxuQkKrHYvRcVc--#)jvHG$)4L+Q5`o=jPC{%Ls{XG4*}5KFCT=^sF(h!{HhirKt4Is&t&c)RRDR^98aGUR6|O;^M|ttT~)23-O( z?gbE7{gQfl$nrAR)9tp0n~T+S)2vLeXX2adgc|zC@ZHu8ph|?^D9p)R(*&F>)%=V?m+V;j9?7jRP!0+?K*^C1m{Q&2k7{F zwa0Nwlo#MLnaSYlr(|QacgLgt0!X&C)X0;jk`)@xO6LP(4C%L};!s}*8k%8+Sd*1K5|r|tBkPpvWRR)AkC z;(=Whd^OrD28BUkeF@LM+}ZjNZpl!pIQ zky_#iPm68=)m7ZPn;C5!v(z2IN1XX z>n2Q>^C_*yw1GyBvB?wqPEyU%?Lgoiq29bv`%JEu3_7MIX)$R!A9;|#V=yiCUx1ja z+_T4sC0)9fy0Du2LhL3i0+sl$B9!4ghIfoK!UwlnVN7At8OxR zh`cbx@ej(sfbB9}@l~Rz)rXJ(wB?f(dmTK)?H~RH&t|r>uwb1>a;oZle*s*()z$Xd z`o{#8Am7uh($z5;#@LN?al(8W+=3@mcF;(gPb0C=lYSWPT!Mw*e54Bz80O5Mk8*s7-LI^d#1b#Jm z<_)q0FdIgf#gF>#jD?)=a_kCvY6o_1;1&?gajcP>dW#IZC|{#ZhJGmD21`^W-|)MT znVQjN^Nsdg!MVU^a~*v8QHd!pn!ZN36)Y%+K^z)b)s6U2FT+uc)Lxa=OU4&xXr#+M zp+?RZksW#j!bFqr!0i~t`7QLo1fOkTT;=6m3YbN%ol{c6A*77&{w1Rv>VDvq3TcE zE3V$?IQcWTG#e=Oj8ty{@k?oMc*kI%D}h(ehg%E2aD$FBVKzCqDi%yn7?*`Y<`HG^ zRo^c@9fT^oq{#PdnTKm&W^Agj)y9|fO^Lq%)rjAXaw_cKNNGfNQl9Y4umtEGSyO>n zp*zCzCg2C$RAmL3wrO*_rqXeBtkBs|iR0EoL0x55dD(A1vNc*r1#yKnX6?K3gX7BP zr0$aaWYw93={G5`rlor~-+Xvo7|rha3}(a7z)Iv*9=M@lC;=J#RxKXidgSb_$W2mm zNw;|DeO#NwF1fr>FM4@u6bD20H9^l6E->V*^5riXia*!9T#&P=Fu1a8TEb3L-LKif7JUpTOVF>wj>XM(kVYZ8ti|lX-Z~^WzVsj!s zz@e^cZb04kabVKG)Kupw-u3f;!I7pFHP`X%K_=OWvJa)+J|+2yE6-b-YRzw}rlSnh zK6bZnPJYNj*!?eXngvnUOKB#SgrKudng0i@GbFS)Kb~6rLiIt_@8Lgg5(R1ai`vrI zMV#u1eB|fx(S8-k_&3!<1;gLFVEpHnnv%mL%4n z8+ zFRWY{-dEV(eFXi^_ZTiD(I1%6wA^>sr-fS)& z0X6v-5aQKh8U~FayEb<)sr0lm^jBuWTrPx&X#5m$nat$*mc#Rtnu2xtL)&FkeQQwY zKfx-kx>;HN?ce<#jQb92kLeYQH{kL6aAvIJKs;pZ1`RdacX7m)xsY}LMeN&*-v0Da z=*F1@Xcmh}%Ml05t1>)L=aUgA{$LQ~Vk~!K-??i(z3*X$xlt8&+7WFWm00<7BWZ27 z>5jsG;HDo0m#YEE%Ks$Tp3v5iOuepk!AdC<#A~{hh{O0Sw9H@7x4GgP8Q(4UTe&2sIIyO<^~dtHbF~~zu`M8W*BK(PTS|7d=*@u zz!&N_ujD3KHr8y$5QJ#{Q}QF438z??VoAwg$WK{Eym8)QsO3tu5pi!A+it}uZjiR# z+;~wXyBP!d8tO2^#J0)r((ivOmut7ryLyw)akPWc$M$K#7mM;VC(erLPn!C3(tiO? zRJ~2y&32-k*3fQK0Hh!Ew&lR_(5_9>&HrL4YiE`4&YnB@_HIV=>03n1RuGrQbR0Q` zWk?9!PqqPPSmxTb?9e=Ty&iAdN|U})|75D7Me{bx(>G^)s2K3%PxOYZu7V-i!fE;- zI!wrXs!hCTY{ ziLiVGb%Wi5Xnly9B>Dc7J4OEMs^zW0)_(!9RBqx)IcVuy#{>E{&1Ejewofjy_Kzf# zGlI)``==ii4gp0R!}z1Bzdm@NntZP{`Ge;n@zawsv6D=`d+SwYjV=p?30s^J(yTGy zm#ETEZ;)COCMxN-;`AbSV@S=M$Nc<>u$Z8&mu_p*+&vZ=4a?-?Vb>TC&q#Pb%x{o9 zeH&zDOs%o2@i;M{@*VF(J2yijM>9nw0tAM4`=L?h;fBp@j0Bll;=YHgXmWs_w{ya? z5Or;t``dg02F+Dv>DwO01I;cJ6co^>=}U%7Dy9ph*f}IOc=nphDGG&-HClcds3*v! zra}HAlFoM{1M2yc?@6PV{^$o5M9V#klOA@J*B7-#akOSf@)OQ50gzL-$*8Sf3|Jm+ z;7e=759G^ASTZg<*%(|ToJgH|K37Hz=A>pdOMK@0l-}uyC ze9zeI%y#ZS{J~YBMdQ=as&jGA$)|hb?OJ%LZxfIKeAh7Dz^@{E?TA_|-K(UezDbU! zp{YN`+_5`v>Xu?1s^ljnnO5+yba3--H{*h`ZCmo06upLJqLKcsMMKaly1KC%b#*mrWI>#t$UVOR0tCT0KxMIw^;AM4!g^9a$ z$-mxK`^5_<>)oa&(Qh0EKj$0Y9_&RID-JN@BBRn%->dCLNr?T>Gl&AcGj^2Cv<$<> z5Dr+SuprGYN+xwahB~gS@6YaiH;$;+GSkxB*23U%ROS3G6c8Ac-|?G4SdZ;jxl5z% zBPIR*m1EO@sq;U1zX)${kK;cDm*4bzCnApsD;xp?uA4FTr(WM9o%iC1>$;@-LvG@* zlZAV?Q;#bWGBV7L{!C(}&DlPp3bzH+n2-f+dvkJ&UUvO*wucB}XLUwj4t>!Z_e?Iu z?BmglP2JEY5|3$dqz=!k*1})r-C}{i(b6;Z;>&P?P9kc_=j_}6xHTS@7!6`f%sHT zCV`aWA(;H;%gULyf4ol;Eo6(!+1Ssjc5srchw*O?5%?t3A&n?v;xIy?pN2}+hryD0 z!&3eED_T9>co4p|=ct*TRAw}6ie;pOQZi{r%49=_Jr3!K-yuhpTmxCj0{-V|D%D$5 zMS^!P0?n@?zG^Tx)T$~6f6GO9(~`2Xc8H$!A6)QpqGHv&L@Ya3E_^dqURyv6SC^zn zWQ(T4ly=8`P+OR`Ci1O3z6w08t(fwyLe@%=m<{0O4_1O-O_x9Y;v>8yoz$^n`h5}ea)*4 zLccS_&(IZqW-d|Sg(G6`uDJXi5Psw z6I1iZgFsVQ9Td1$O0vPm+9V5k_PHVIMm8R%JGYX44k|!A z<<|1~Xf_P|8GhTF&b!rlwZP}~=B!Od2P6O+B&ZI&J8YZ3nm^wMa@W&Mp);tjL-n{O zPB-`;g|a(Mri8w|Iu=?OiV)e80M_l>AQc8X`at=aZXit-L&skt!aD4W?Z!VymR~w$ zS>=#);ra27vG0a7m}~gi&^epiG#ok_a9;8EI@#5$?T6frg%NEgFF=XBt#2U6b+C=*4hwMs@&#qdt$!p%_OQ zqg;qeTf6o1RO8G0|BBO0!wQjzFr#{2H+Ri93l|U=+6S)jIg)WA;Osv+v}!hzx$*ZV z_Dq(|kI`debtkIV5&us9$v7e5eTV>m=ny}n@Z;&c9|vvM=6?ZR)1&Pr4%?JT?Yu<~&)8g9(Gz9HTgQ~C^^HfXLxW+}``2IKtWcX8fu zfG{6eRcgB453{RD!3u~=@>rBRWK1dp`PRnKxVsd?DJ6)}g|bo8#%b$BwSpl^|B>p!-^{SF&3B=5-|=+m@9D=!slUM;5%yrx+Y) zvmQO>EnC`SA(2?i{s&{P(6L&aXj*_sR~hso&vMa%1SrnxpOBgbGufj zAQXEHQgj&;`g}CQ-G~MO*o^kWsU^~N3+U`3!5mnX;u2RZZTSS zF3e0`hMedGp67MK{7&bWcQlK1+F1_hp z2<0ympcR3Clpn~7GxI*FMckoNJbVu~`Vzu*neD4M2Qe8=qd&#hHZw0$2UAepglyCb z^+%MxXp{}Z$TJ-U;#db~2I;$;t}b%4OaTC0H?RNzaDye)XLhNA4s5jBgVnYE~S|8n3&7ISl|hxFj%1RsDczPe?a>IM8pEJ5&nEnk;d&p)OTJOv8tJId44!1=hHapx_b5>t(M=8}I^7!b z7;%UIm=DEZF8g}YLC1vKI=Lv$GMI|(m_b5{#_0v^*OD$}!wv=c{zkLo2d!*nal%Y&9l_-#6>$<;CZl+<)>p1at>*7!6{z*-NA$nimM;y$ybZ%DX zB45`G7;&(>2KW%A)-OR1+38PQ1RgiXa$dB?9`Yr8_nl>ZS?#4*cg3K>PyqT@wO;@$ zv5VNL#$3U$jJe`$30*h0%Plpx0bUIqFbq?SE{?oG_Vs}bp^sOTZ)BmY)??vrpq|%l zl+t~L@#c*ODxwz1F&LkrjLVAuyVYE^l_SLKBB@Hc-yKL}8(BMlkg4)B$whxqi_X6u z))1$2`AzM(y7!ct!}PjCZE50?Vs!Aa=Jx<%6DiO~%Y{2lP%q={Jx#~v0+O3;#@B_L zAOY?C2$cN{BDu-LemnW;N?C-=%C4`Lt3F}lItJng(V;vQQGeu#Q@Ese_D#W#UHTSv zg#C2Qx)d2y8KPP5+J1Su5sFyX9$d@0O98t*BfbK$hoVMpylhwJ&DBk<-O`hs9oj$; zWWSXaa;8iwoH<266^DH>`HrHK7;yZUSBdSjNDV?%tYpj%7y66aU8u}O#6j2Xqn$*d z+fHF0^`Ln~s#DX&C?;64D)3mV9|UFIk`rX{0_}EdXjaluf*rsxjno_<<9o~g@kMnh zxNH+2sBm^GHEOYEC@3{R^!zIF+I5R@Y%OP(!gM9qRz~x?^wG7Pr@-6=VaDB9&_*`^ zU#*A7ME;w}&_w_Z9SD%@%QU4|nK!2ryx;$&?l7~w?TPoAn% z!A{e6)#eQ5Np6wntj7nK-q+kdPwh24Ww)HWqdd#yyAT2}GU|_8KFYa{ORTImv0MVH zle45J2#4N>ijcb+rZ>nV&1tBI&VF6#oOD(j*wRn23VWYe*Eb0-X~OrmWp1x@FKWBN z0-TshMlYQZtf_`=(=rbE(<X@G7pe?-j;LAYUf$XRG>m@|%=%hf`YnA>*f`tJ=rQVIQNH%YR0vogP!UyS zVI@gHHk3H^CJBw^U?`Z<5$JAMX3CoF`xj99RRmIG)@wI?srRz_28mAQA(?>C$4f>4 zS%KpasqMA?Lwtj4#Y$zc2XfFr3!x|OVP%c65sC*nmZ6o=hV6&s7b#PAj*zC~gvV;( zyMa6=WJS{fTY38LQs6`duoGgSx(q1jJiO1?rVA6PrF(x-3Tpd0M@ z)NjXgFfjnQ4&0GoXd)-Ovn=_(zs#~CU*eUP=o;q`+waId#IBR*EoE#*oly!1Vr?>r z@~3}taL8S%|1eCXHLY3gWpW3tAfpEoHwX_rSQ*y`KA-scRJ|4tkFK%aU4 zaEtca6qie&6x*>_X(s#9;P(Q*r_8?8ps>c;d@^{v^K*#3;4?hL2=#W5fqKNQXwUrN zIB{?L%jW*&%Sou6-KzI7Cn*7_LWp(0FnhY4@$Uo!3mBqrCvvDUFn|SWVeugO(>o(m zZ8Q2^0b$O~X_!pOv8+5Whqv$E1X4J=7YoSwhp4*+roK&c`LBU z6FO6TQdv~xGlQVV9ho}(-iQTA21}!Rnk(+X;$kuz?m?!ClZUbVY0)ctp5VfpxA z;`i?xoi|9O@wcFQ^}KJz3p=k&Suy9B|!Br6l7OXf0RUedUMDg_N$`i|MSw~Vyp%AjflSaa%2yM+<8K@hhfE4Jfu$Dx} zNHOz>@Z0AbEIlpwQvLy8{?Lw&=URL~u=rC$$-CR7n?%|nL0#iqYdgcy%{~}EMuh5C z3;^jmS)f-p&)tyj^wHG4qvCYp#dxmmQLQIdP`AQYB%rDA_S}IXIlfG!iVXe0`s%-; zlM}}B7x10>HVi?OM{rYxZ;($7iKj3mGst#)p|a z4Q)6fZD-n={awT62(kG4R!5qh09eEBxtbWi@?u;J+0iba2KrS#Sn>O8$LD_>8q2eC zIkVDV*f}4~>q#%_2sV8OHC59&EVYcG!RB=?4G<%ZJ;Oe)qp zUVwT$ZHYeTF2~lRd1ufsCooeI_eaCUt=dGs5v{rn_3n{cU= zst{~*>>ko|MPv-?brwC)$n~BqJWJI1{%Spy(sB3J@AxJc83o4KDo8-2=So1iq4a^% z4b)%&k*SV=C25%KfxqPw{OVieUN4iGs0Bm)s`GXh`-hC<~ESSChI6akncM|%Sp+rWqYg`)^rTn zn6-N7BEjQWEl^qms#3;^qS1fsM)rk&)STYcZZiomWBcyw>DXnDKgQI0WauVXAXgT- zwxbG^6l!kT7Lv3P5V7tCsPm{( zEMsH)SFS7M^avSCOF`+&ZRroa7P{-D*m>(~GbQ8#Za($J$(FKCcBvMZQ|_is_){)t z6L!o_xLRb|H@xK7w;RJQsqtWa0W4396DI;MJgMELdTP*Vb=1-1;`+UKapj0OM?1jt zr8y54dytpp!%AJ)SN`;ixldIpm*q%XtKoEGhZj{xcw>_HHH!)^?4r%j3DhY%4*Uj# zvqY@{$xdcUw2eHMR*2c=oh3MC$R@b=m4G_|2>X4)qgyS-X(6jnCX0*N28vGlklj>K zohT^(kQT-)jkWAtT)eN7^DBkqVQGz8w6#W0!ooo!w3HE>A7`=S284kAb^YJT8o70P zZ_gCsy#=U#Y=bg&-7M9S%4%CC=(JvRK9~8&tAeR#`0^4jdAvye*IS|6sv45A)WZBJ(D?uslk5osU4c0r`vPT z)JoUBjgR>1_F^4u%acGiY>ia;B#*gs=cA}HS+{(+WPX`aMR(0B{WeYW(U{&JQY8$( zrr1h2UPPL&TiaN-_y*KrqJILnl3aA{(x(@il=$AwOpkXEmHzRdwoUWd{X+C)C#Y}K z6&E_FmFr%%3{u_h<)z3lSS&%iVedVxt-(I_;qlc?uyGfwj>L&nih_vjv{uGv`TyiP zERtY}o^9e+Z%;MPD4uJcmV5xu;OaD3Mz_n=!CO^89tLfSp&8nhCbi^_Y?6r(oNyp6 zWHPKFG3gZV4dSy(vY`uzuI?>phB3zQaZo>%`vAZ62vc1q)w&~wapqI^JdAh78?0>u z28T_&#I$uGRAjD}oJf#u*buei&8(|nyj{r5zFF-jvnuUE*hR~DrxHV+f%Lrfpc|b$ zP_EaJ5ihyVP2qlThqtRHc&M(&uBlDtlDP?=Lf^V!+K_1ndqr(aXL((%#)td#{73gY z;#)l$f={_;Nu#~FRUMiHgK?|7sq{zYyMelmeA~Z%4T$p&fI03K3^$RI%-{yixkjJP zoR$RUhhO2`YDvfsA_Z_5izyk^XvAUDE23#B=4i#$m2{x9&-=2y`y0!G5)T^+OA~YoZEQr zCU0zq5Uuj7sB|okK~cRvg8lbu%-i?X1xsEkR3vSu%%w!v9$G7#(%}@gfwXgKI`s{i zM=aH8tEB9dP_r3X<~=M;JH#t`KCE0TeN9ehx446m>~_KG26_65 z=`kYYCMRPCQU=8r+dUVd(8SU-Q`-Qna=v~2#oJ09;dsq$nk_UyVM8+gOFwL(lThxt z^pGnfZ??NNz}B>==(p7Sj^ptRBcQtF*en^y`q$@aY=`vn|Up z^I@}3lh(I0nNC@GVB;Vsbt~l*=+Io*HMeKO8=?7a)iUPXOx}fuTdI4({ifZsxaI~N zdT~16SbjW-iKe)1w(K^sG1T4B-F*3Rv3s!2<3+uC@vZkGl8Fumb=YRi9a{CT?|T3T z-sNH1Pd~kr;wZGkM3}y7Iuf$8|J!9!~K@vFikHxI~F;u>TmxnCe++Nzmbhq2tG^tRV8s+IwsJ^yI3OW0( zgT#%W&-swmn*>I5K`ZxzY!4{$2J!S(0 zmh*ECTos)v`f&$TP*GB2@7Y@2KCbPRg&(=(IJqGa>yuE4W_4dnk?skVWL9|etR7t{GFkzkf7OWy zmBq5oM<^Dlh-Gw?f3dyCjK|LgZy_0~d?`hChvYdVLi`#Lmvr7$5Z0sfq2&8-GftVF zrNFKH3E1d6EWHem6~H`D@VAQV-|%1+h2%E2XX<3z&`fr%P>=H-H->@We)EhKanWX2 zmU0+)kUuB1i45QR_LykK?RC?4tJK%Xc&xTM#26+hz4!JgZafkN51*IkYYLn~F{nui z9woQ1Z(qCCmkfkxrYN3?TMlZOHLnSHNcQCBxo<%&ZlV2he$J9?p2l>%P0kX{HlyRG zTc_^>yIuIC%zL6?sipnU@v~i172Iq>SWjmWVt%jk*i!c$GpF-1!|2Tib`|=0EOIgj)1ji(LE#oY(NpEMKIi|BQ=O$=?lW9AA>$5)NGX zH=u{ij952Mu_)}7zd8FdKZqh`X(XW7?W|icXbsaUOr#n=kH?d{dIT+%?v=GvnDO&z z;*QjQ#wmKF7U%Yo5ZNhmlcA~{Oa{!e9HdlNnc@6&^6o3|;ztwpC1Y2zdr!`>pN+1|QGeUQAu-H^Q=0`qoBBpb!LIhR+DAj^|fhqGX&tE@k|0v`2K zo*ECXk#|MhDYa2gI25^2zprl<8{PCN=U1jV7Z6WTQ?09`4lDqs0Jr5;0~#ruj(>Pr zC}vavJFLY01lnXL^-8$|Jj=0sUd_1MB)dA>oZ`IC||Op%QM|HqwT1tMT%A(%_4@y~*gOl){m*!c|J=AU{rNw|p;`UDM%jz? zI=yQParlpG--c9`l z`~@g!v>Ml6-ZP=w|GOA-w_*%RT5#o=Esw_#SX?Yczd1?OWFMv07 z-d(EulsD;}l(1Gd$hV+^;`h)kOpRhZ#5>i6L*XnUeN%P)4L#RwU_2Xbyf$ke5m_Pe z?8c>MPl8LjsN*)w75ghY(XcAVWdOy1FI8V`EI57%FL#k2o3;@x{{0J87L%v)!N>#s z@%X)flNu&cUC0ve`s7#4=RwkiKf_17nO$)vNH0kY&a|1Lu;jNihl4zY!hF)x)3$a4 zXE*3^*s$bi58-VK`NMi1)BZnD1AIwlIA<3Xol)1fU7_(@^}UIB72>`3Uf?EpH$IM3 zlWIxs$*kR2$I1z%dXGlo0F4J-{Q=(w_H9wWVm{Wxw`^p5Ph5m^X9W2+#r@VS#oM>hcl4ZRD(P_c=u%LC9) z7<0A%eMC-1_~6@fqP-P(?&!rr+x2fUQA{^HBNt4M1PRbwJ%BOm04b{2^^V(k^ZtB( zXJ&sadYY5b{AUG|ce-kFU}Whk=F}(hgWo>w?3IVblW6PrC%YV&tyrulRva(WL$VeJ ziEIxfI^}^?{}qk)rscnhb2gwpx#{V;-Lrv$gX5StVS|n=F@?g^T?0AE7XN-+7W~H+LQ0(e zQ`1xRC4JU<=Q&N1Uw=jXx)WKdX0H9O?S(75kFA`B(aX*UF5&7>bR~G`=E;!Q)?a|C zUw)}#`M+|@Zkfn6f{u39EQ=DJ17&|1D^Q>v#XbD}j(vGB8{?6ZIkx~Zk+8t?_!EP` zhThJNf^scG9Rmk>yX5HD=J1%Z901vPrI2-qv|x|bKYRoPW>DO!?l>oUIJ4j5m94*k z$PTmB1{xk6)q87mETA^X$tob!Fvx|j`*Doak}b6!VQNu=GR8>&g{9~drlTZBJ)xmC zT9g)YkH{rzGUS2u&7z&%oRlOwR9CQpcE~0?&PkuSu&b|_$`SAc@Nr=N4e9fYf|Ww9^dN}cU4`A`E!xP z&Y@lY{wy@{d+6A!^oUxfVtDtDhYOWQHa{S*vN@i8K!w7AL7^k3bCsE4tJM6yUvK=k z_O3k|3U!N*lviF24N0Vkqv9L~A(@h9JUT|hDUL`XV;GD`oiI0{9L9L7Oa@~-Ga;`$ zqK;>E7@53gnB)|OF%z1>n3;RK>z9|v-_Vo_J_ z{Eo!VL#`JrYw2!Hi9n@L3)!nw{066XdvA~yR;HT5=qXBUiu}Q&JGI=Xk0o1GuG4dx z^g!Zd{x^nj+_w0*Xo<3W{l6&mqOhGiqaLf@da++|qBLM!J&79L8+5e!WoPA9ZcGya4LypP)iygJ$XCL@3w%(bweYma5QnQ#;*jX6l z@hr?aEZiE|ac|iGXuHsg$M^b(0IO!sgN16wxNsq}M+BIz;VWosy%oH|i2yymT#b@h zN^(Ti?8@!_Zp_s7I;I?mfbj9x^})#_>jU&@!K9N@GWXm|2hr zkW~7Cg*@zH&kY1;9l(4CWkp>6LyO#1arQ_T`uoe{!#Z4boZORbF6mBs!oUM{Q-(47 z6$;)ywZ;K9#jHyiU(8&y?O9fh9f5w*oDlrZyb{0OoS({(&0}jvt5t4*Tv6e?vQ-!u z{UN|Y3oxKvMm46oyOV$x9j+3?FQ>PH50DS$Bf=We@iQ4WHGyHK@a+nGbujyz-8sX@;IdlNaS-S-5KQo{hfsM2I!DvL8{;BTiCN4zAEK@<5WO@h0%*jK zb1@36ikAGIhx}-B|I3e-SUlzJJr+B<(RhWOrSlg?-s`s?WgZrzYMJ7fhK&VTiI=`> zkS$^tx>w1NM68C{F(L#j@s+X}3lnT&yf+oLRY8N`GgFO*ew~F6lRWp>JB8TC?#PVa zLh{qIrff=bjK-$~bldN#;;5Yhv!z=2HUt`SYe^llf;i$>oAz`9zTnSyed4E_&CLsy z?cjVn9<#Ot6KdSw*g}QzpOA$ErQC6wO-y~k>k&-A5FaJQ-?{IOgnd|F+RN$wlxgSt zXwOU9N>+*hu!WD$s@4XNeBU0Y~h;Pbv~m=?tO+^5lI^$@fO+vPznPekGr-1tvN{q zxMIc_TM^Qr9bR@KK&u9OVI6}iN_`ZQbV&bAz)B+du6M|;+%|T(-jGM=sG?oY7>ZgF zulrh1q{WH&m156guU~6VdL}r2H+9%D#G^>_I?Tx0l5EnD7qj|y#T=B8pe5nZ_lAhG zklq|8r2rO-mf~er8tDm|tYNMto${w^7M?J4%&^TUPG59!*{oe~y`o(_CZf1y%$*uW z9^&^qw8XP@98KD2)7Y?+ZmbtK95p2CS9 zxLdK)6{{(IT)&*8H0#<@^t|+!dGfB<9F{fLVY1pg$|<<0JbiXXx%`%&z*Q(h@TA=wkQyP<9aAO(lW^j>2j z2kPf-Hq(BLm=FOFT$$jmMb0#xRiK|^g2o5zu##E)+8k&clHp_zd67vk9y?;KZI6fh zZk8N_HmP@B=hiw1FIB45cJO)V*eDf&QFhQU_A1w1J9g2y{|$yjdEu@I!>ZAul-ayC z?-7+D+WC>T$>%diS}`*O;ugmbMDLg!X+}%(auZ=L;@SbF_9(R(H2CG*Un~FjE8l}8 z)Al-YCpr%c*s%J}6)q!^fT>*@2nDZA&-TIF5F-Tt>%7G`8;knuURuv3*%MuBbl6HW zyiy=e)@AA{Cv(V)Qhf3;Ji)qFGQ(F@W$aw5Oh-DGb4-XP+D(M}pF6Xj?BM}wP@H0& zxb;l^eEWq|vW%@Q+{DG9L$YtV3OCVME&{|e=zC)aAXq!?mQYs_K(@UJBFK-AY%HHm z8=9k!qRG)p)sXkU)tf(9Zzt_{5dj8R)BiZ-`3)byoIHMf=-8})_A_Di2f@=r3o8hU z_%8qM;4hQ^VUvFnB6UcXK8hkoOMfIpm&HdyIGy@P2;cv(OVD^ErmP_{qcR{wYr!M9 c>L!hAF!wH@m~>nRkP;V-vob|cFru-)1F8fcnE(I) literal 0 HcwPel00001 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 HcwPel00001 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 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 literal 0 HcwPel00001 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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 literal 0 HcwPel00001 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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 MP$)o1=VlMF0Q* literal 0 HcwPel00001 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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 literal 0 HcwPel00001 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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 NwQTL*5$c~G{|8;Na_Im7 literal 0 HcwPel00001 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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 W3(@PLVtdYr``1?Op217cXZ{P-GXpyS literal 0 HcwPel00001 diff --git a/WINGs_tutorial/WINGstep3_files/ScreenSize.jpeg b/WINGs_tutorial/WINGstep3_files/ScreenSize.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..456f8a76e1ac4122be49a8383aae0c19c786fc2b GIT binary patch literal 48384 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 literal 0 HcwPel00001 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

    +
    +

    +

    +
    +
    + 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; +} -- 2.11.4.GIT
      +
    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 +