Drawing in GTK+

Total Page:16

File Type:pdf, Size:1020Kb

Drawing in GTK+ CSci493.70 Graphical User Interface Programming Prof. Stewart Weiss Drawing in GTK+ Drawing in GTK+ Background In order to understand how to draw in GTK, you rst have to understand something about how GTK draws widgets, because how GTK draws widgets has an important role in how you design your drawing application. An understanding of how GTK draws widgets is also required if you ever plan to build your own custom widgets. Windows and Clipping Most windowing systems are designed around the idea that an application's visual display lies within a rectangular region on the screen called its window. The windowing system, e.g. Gnome or KDE or Explorer, does not automatically save the graphical content of an application's windows; instead it asks the application itself to repaint 1 its windows whenever it is needed. For example, if a window that is stacked below other windows gets raised to the top, then a client program has to repaint the area that was previously obscured. When the windowing system asks a client program to redraw part of a window, it sends an exposure event to the program that contains that window. An exposure event is simply an event sent from the underlying windowing system to a widget to notify it that it must redraw itself. In this context, a "window" means "a rectangular region with automatic clipping", not a top-level application window. Clipping is the act of removing portions of a window that do not need to be redrawn, or looked at the other way, it is determining which are the only regions of a window that must be redrawn. In Figure 1, window A is below window B, which is below window C. If the user does something that brings A forward on the screen, then the only region of window A that must be redrawn is the portion of A in the set A \ (B [ C), which is shaded in the gure. Figure 1: Window clipping. Most windowing systems support nested windows, which are called child windows. A top-level window may contain many child windows, which may contain child windows in turn, and so on. For example, a top-level window will typically contain a window for the menu bar, one for the document area, one for each scrollbar, 1We will use the terms draw and paint interchangeably. Technically, the operation we are describing is painting, because it is the application of colors and brush strokes to a canvas. Drawing is just a special kind of painting. All GUI APIs refer to the process of visually rendering their windows as painting, or repainting, even if they describe the process occasionally as drawing. We will keep with this tradition of equating the two terms. 1 CSci493.70 Graphical User Interface Programming Prof. Stewart Weiss Drawing in GTK+ and one for the status bar. In addition, controls that receive user input, such as clickable buttons, typically have their own subwindows. It is possible for GTK+ to run on a windowing system with no notion of nested windows. This is not a problem, because GDK presents the illusion of being under such a system, and therefore, in GTK+, nested windows are always available. The Drawing Cycle Generally, the drawing cycle begins when GTK+ receives an exposure event from the underlying windowing system, such as when the user drags a window over another one. In this case the windowing system will tell the underlying window that it needs to repaint itself. The drawing cycle can also be initiated when a widget itself decides that it needs to update its display. For example, when the user types a character in a GtkEntry widget, the entry asks GTK+ to queue a redraw operation for itself. In other words, a widget can call a function that requests that the windowing system itself send it an event to redraw itself! This simplies the program, as you will soon see. A GdkWindow represents a window from the underlying windowing system on which GTK+ is running. On X11 it corresponds to a (X) Window; on Win32, it corresponds to a HANDLE. It is the windowing system that generates events for these windows. These events are passed to the GDK interface, which translates these native events into GdkEvent structures and sends them on to the GTK layer. In turn, the GTK widget layer nds the widget that corresponds to a particular GdkWindow and emits the corresponding event signals on that widget. Widgets With and Without GdkWindows If every single widget had its own GdkWindow, the drawing cycle would be trivial: the underlying windowing system would notify GDK about a window that needed redrawing, GDK would pass that exposure event for the specic GdkWindow to the GTK layer, and the GTK layer would emit the expose-event signal for that widget. The widget's expose event handler would then repaint the widget. Nothing else would have to be done; the windowing system would generate exposure events for each window that needed it, and then each corresponding widget would draw itself in turn. However, in practice, there are reasons for which it is more convenient and ecient to allow widgets not to have a GdkWindow of their own, but to instead share the one from their parent widget. Every widget has a GTK_NO_WINDOW ag that indicates whether or not the widget has its own window. If a widget does not have its own window, it must inform GTK that it does not, when it is created, by setting this ag to true. (In GTK+-2.18 and later, the widget should call gtk_widget_set_has_window(), passing a false value in its second argument.) This is not something you would have to do as a programmer. It is the job of the widget's implementer to do this in the widget's constructor (its init method.) You, as a programmer, can test whether a particular widget has a GdkWindow of its own by inspecting the value of the GTK_NO_WINDOW ag or by calling the gtk_widget_get_has_window() method in GTK+-2.18 or later, which will return true if it has its own window2. Widgets that do not have their own GDK windows are called no-window widgets or GTK_NO_WINDOW widgets. Why would you want a widget to be window-less? There are two primary reasons. • Some widgets may want the parent's background to show through, even when they draw on parts of it. Such is the case, for instance, when a label is placed on a button with a themed texture. If each widget had its own window, and therefore its own background, labels would look bad because there would be a visible break with respect to their surroundings. • Reducing the total number of GDK windows reduces the volume of trac between GDK and GTK, so if a widget can be implemented without a window, it improves performance. 2You cannot just test whether the window member variable of the GdkWindow structure is NULL, because it may be sharing its parent's GdkWindow. 2 CSci493.70 Graphical User Interface Programming Prof. Stewart Weiss Drawing in GTK+ Hierarchical Drawing With this understanding, we can direct our attention to describing the sequence of steps that take place when GTK receives the exposure event. The very rst step is that GTK nds the widget that corresponds to the window that received the event. This widget cannot be a no-window widget, otherwise the widget wouldn't own the window that received the event. This widget begins by painting its background. Then, if it is a container widget, it tells each of its no-window children to paint themselves. This process is applied recursively for all the no-window descendants of the original widget. This process does not get propagated to widgets that have windows of their own (those for which GTK_NO_WINDOW is true). This is because if any of those widgets require redrawing, the windowing system will have already sent exposure events to their corresponding GDK windows. Thus, there is no need to propagate the exposure to them on the GTK+ side. An Example (from the GTK+ API Documentation) The following example is from the online Gnome/GTK+ documentation, The GTK+ Drawing Model, at http://library.gnome.org/devel/gtk/unstable/chap-drawing-model.html. It demonstrates how a top-level window would repaint itself when it has only no-window widget children. Figure 2: Hierarchical redrawing of a window 1. The outermost, thick rectangle is a top-level GtkWindow, which is not a GTK_NO_WINDOW widget therefore, it does receive its exposure event as it comes from GDK. First the GtkWindow would paint its own background. Then, it would ask its only child to paint itself, which is the dotted-rectangle numbered 2. 2. The dotted rectangle represents a GtkVBox, which has been made the sole child of the GtkWindow. GtkBoxes, which are no-window widgets, are just layout containers that do not paint anything by themselves, so this GtkVBox would draw nothing, but rather ask its children to draw themselves. The children are numbered 3 and 6. 3. The thin rectangle is a GtkFrame, also a no-window widget, which has two children: a label for the frame, numbered 4, and another label inside, numbered 5. First the frame would draw its own beveled box, then ask the frame label and its internal child to draw themselves. 4. The frame label has no children, so it just draws its text: "Frame Label". 5. The internal label has no children, so it just draws its text: "This is some text inside the frame!". 6. The dotted rectangle represents a GtkHBox.
Recommended publications
  • Full Circle Magazine #33 Contents ^ Full Circle Ubuntu Women P.28
    full circle ISSUE #33 - January 2010 CCRREEAATTEE AA MMEEDDIIAA CCEENNTTEERR WWIITTHH UUBBUUNNTTUU,, AANN AACCEERR RREEVVOO && BBOOXXEEEE full circle magazine #33 contents ^ full circle Ubuntu Women p.28 Program In Python - Pt7 p.08 Ubuntu Games p.31 My Story p.19 MOTU Interview p.24 Read how Ubuntu is used in public education, and why one man made the switch to Linux. Ubuntu, Revo & Boxee p.13 Command & Conquer p.05 The Perfect Server - Pt3 p.15 Review - Exaile p.23 Letters p.26 Top 5 - Sync. Clients p.35 The articles contained in this magazine are released under the Creative Commons Attribution-Share Alike 3.0 Unported license. This means you can adapt, copy, distribute and transmit the articles but only under the following conditions: You must attribute the work to the original author in some way (at least a name, email or URL) and to this magazine by name ('full circle magazine') and the URL www.fullcirclemagazine.org (but not attribute the article(s) in any way that suggests that they endorse you or your use of the work). If you alter, transform, or build upon this work, you must distribute the resulting work under the same, similar or a compatible license. full circle magazine #33 contents ^ EDITORIAL This magazine was created using : Welcome to another issue of Full Circle magazine. ast month, Andrew gave us his Top 5 Media Center applications. This month I've written a How-To on using Ubuntu on an Acer Aspire Revo to create the foundation for Boxee. For under £150 I've created a fantastic media center L which not only looks great, it's fully customizable! That's my media center story, but don't forget to read the My Story articles which this month focus on Ubuntu, Linux and open-source in public education, as well as how one man went from using old (modern at the time) computers, to using Ubuntu.
    [Show full text]
  • Home Audio System Getting Started Operating Instructions USB Device
    Home Audio System Getting Started Operating Instructions USB Device BLUETOOTH connection Sound Adjustment Other Operations Additional Information GTK-XB60/XB90 GTK-XB60/XB90.4-697-227-22(1) For customers in Europe WARNING Disposal of waste batteries and To reduce the risk of fire, do not cover the electrical and electronic equipment ventilation opening of the appliance with (applicable in the European Union newspapers, tablecloths, curtains, etc. and other European countries with Do not expose the appliance to naked separate collection systems) flame sources (for example, lighted This symbol on the product, candles). the battery or on the To reduce the risk of fire or electric shock, packaging indicates that the do not expose this appliance to dripping product and the battery shall or splashing, and do not place objects not be treated as household filled with liquids, such as vases, on the waste. On certain batteries appliance. this symbol might be used in As the main plug is used to disconnect combination with a chemical symbol. The the unit from the mains, connect the unit chemical symbols for mercury (Hg) or to an easily accessible AC outlet. Should lead (Pb) are added if the battery you notice an abnormality in the unit, contains more than 0.0005% mercury or disconnect the main plug from the AC 0.004% lead. By ensuring these products outlet immediately. and batteries are disposed of correctly, you will help prevent potentially negative Do not install the appliance in a confined consequences for the environment and space, such as a bookcase or built-in human health which could otherwise be cabinet.
    [Show full text]
  • Monolithic Transformation
    Compliments of Monolithic Transformation Using DevOps, Agile, and Cloud Platforms to Execute a Digital Transformation Strategy Michael Coté Monolithic Transformation Using DevOps, Agile, and Cloud Platforms to Execute a Digital Transformation Strategy Michael Coté Beijing Boston Farnham Sebastopol Tokyo Monolithic Transformation by Michael Coté Copyright © 2019 Michael Coté. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://oreilly.com). For more infor‐ mation, contact our corporate/institutional sales department: 800-998-9938 or cor‐ [email protected]. Editors: Alicia Young and Melissa Duf‐ Proofreader: Nan Barber field Interior Designer: David Futato Production Editor: Nan Barber Cover Designer: Karen Montgomery Copyeditor: Octal Publishing, LLC Illustrator: Rebecca Demarest March 2019: First Edition Revision History for the First Edition 2019-02-15: First Release Figures 1-2 and 1-3 are copyright © 2019 Pivotal Software, Inc. This work is part of a collaboration between O’Reilly and Pivotal. See our statement of editorial independence. The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. Monolithic Trans‐ formation, the cover image, and related trade dress are trademarks of O’Reilly Media, Inc. The views expressed in this work are those of the author, and do not represent the publisher’s views. While the publisher and the author have used good faith efforts to ensure that the information and instructions contained in this work are accurate, the publisher and the author disclaim all responsibility for errors or omissions, includ‐ ing without limitation responsibility for damages resulting from the use of or reli‐ ance on this work.
    [Show full text]
  • Current Status of Win32 Gdk Implementation
    Current status of Win32 Gdk implementation Bertrand Bellenot - [email protected] Features (recall) ! Same environment on every system : ! Same look and feel on every platform. ! Simplify the code maintenance : ! No need to care about a « windows specific code ». ! Simplify functionality extension : ! No need to implement the code twice, once for windows and once for other OS. ! Only use TVirtualX. Actual Status (recall) ! The actual code uses a modified version of gdk and glib, the GIMP low-level libraries ported on win32. In practice, this means that we only need to link with gdk.lib, glib.lib and iconv.dll as additional libraries (hopefully less in the future). These libraries are under LGPL, so there are no licensing issues in using and distributing them. ! As original version of gdk was not doing everything needed by root (as font orientation!), I did have to slightly modify the original code. Points fixed since last year ! Some characters were not displayed. " ! Some problems with icon’s transparency. " ! The event handling was not perfect. " ! OpenGL was not working. " Events handling architecture (actual) TSystem CINT TGClient TVirtualX Gdk Threads issue ! From gdk developper FAQ : ! Without some major restructuring in GDK-Win32, I don't think there is any chance that GTK+ would work, in general, in a multi-threaded app, with different threads accessing windows created by other threads. ! One problem is that each thread in Windows have its own message queue. GDK-Win32 currently uses just one "message pump" in the main thread. It will never see messages for windows created by other threads. Threads issue ! As gdk is not thread safe, I had to create a separate thread from within the gdk calls are made.
    [Show full text]
  • The GNOME Desktop Environment
    The GNOME desktop environment Miguel de Icaza ([email protected]) Instituto de Ciencias Nucleares, UNAM Elliot Lee ([email protected]) Federico Mena ([email protected]) Instituto de Ciencias Nucleares, UNAM Tom Tromey ([email protected]) April 27, 1998 Abstract We present an overview of the free GNU Network Object Model Environment (GNOME). GNOME is a suite of X11 GUI applications that provides joy to users and hackers alike. It has been designed for extensibility and automation by using CORBA and scripting languages throughout the code. GNOME is licensed under the terms of the GNU GPL and the GNU LGPL and has been developed on the Internet by a loosely-coupled team of programmers. 1 Motivation Free operating systems1 are excellent at providing server-class services, and so are often the ideal choice for a server machine. However, the lack of a consistent user interface and of consumer-targeted applications has prevented free operating systems from reaching the vast majority of users — the desktop users. As such, the benefits of free software have only been enjoyed by the technically savvy computer user community. Most users are still locked into proprietary solutions for their desktop environments. By using GNOME, free operating systems will have a complete, user-friendly desktop which will provide users with powerful and easy-to-use graphical applications. Many people have suggested that the cause for the lack of free user-oriented appli- cations is that these do not provide enough excitement to hackers, as opposed to system- level programming. Since most of the GNOME code had to be written by hackers, we kept them happy: the magic recipe here is to design GNOME around an adrenaline response by trying to use exciting models and ideas in the applications.
    [Show full text]
  • GTK Lesson 3: Containers
    CSci493.70 Graphical User Interface Programming Prof. Stewart Weiss Lesson 3: Containers Lesson 3: Containers 1 Container Widgets and Packing When you design an application with a graphical user interface, you put various widgets inside of one another and implicitly dene a hierarchy of what's inside of what. This is a containment hierarchy. Some of the widgets you use have specic purposes, such as buttons, text entry boxes, and menus. If you design your GUI on paper, you draw these widgets where you want them and making them the sizes that you want them to be. However, getting them to be in those specic positions with their specic sizes using a library like GTK+ requires that you use widgets whose primary purpose is for laying out other widgets. These widgets are called container widgets. In Lesson 2, we introduced the GtkContainer class, which is the ancestral class of all container widgets and which we now cover in more detail. Recall that containers can be partitioned into two categories: (1) those that can hold only a single child widget, and (2) those that can hold more than one. Containers that can contain only a single widget are called decorator containers, because their principal purpose is to add functionality and decorative eects to the child widget. Containers that can hold several children are called layout containers, because they are used primarily for laying out the child widgets within their (GDK) windows. Layout containers assign sizes and positions to their children. 1.1 The GtkContainer Class Before we look at their concrete subclasses, we will examine what functionality and properties GtkContainers possess.
    [Show full text]
  • The Glib/GTK+ Development Platform
    The GLib/GTK+ Development Platform A Getting Started Guide Version 0.8 Sébastien Wilmet March 29, 2019 Contents 1 Introduction 3 1.1 License . 3 1.2 Financial Support . 3 1.3 Todo List for this Book and a Quick 2019 Update . 4 1.4 What is GLib and GTK+? . 4 1.5 The GNOME Desktop . 5 1.6 Prerequisites . 6 1.7 Why and When Using the C Language? . 7 1.7.1 Separate the Backend from the Frontend . 7 1.7.2 Other Aspects to Keep in Mind . 8 1.8 Learning Path . 9 1.9 The Development Environment . 10 1.10 Acknowledgments . 10 I GLib, the Core Library 11 2 GLib, the Core Library 12 2.1 Basics . 13 2.1.1 Type Definitions . 13 2.1.2 Frequently Used Macros . 13 2.1.3 Debugging Macros . 14 2.1.4 Memory . 16 2.1.5 String Handling . 18 2.2 Data Structures . 20 2.2.1 Lists . 20 2.2.2 Trees . 24 2.2.3 Hash Tables . 29 2.3 The Main Event Loop . 31 2.4 Other Features . 33 II Object-Oriented Programming in C 35 3 Semi-Object-Oriented Programming in C 37 3.1 Header Example . 37 3.1.1 Project Namespace . 37 3.1.2 Class Namespace . 39 3.1.3 Lowercase, Uppercase or CamelCase? . 39 3.1.4 Include Guard . 39 3.1.5 C++ Support . 39 1 3.1.6 #include . 39 3.1.7 Type Definition . 40 3.1.8 Object Constructor . 40 3.1.9 Object Destructor .
    [Show full text]
  • Ghibli Digital Catalogue En.Pdf
    An enduring legacy | 6 Endless possibilities | 8 A distinctive invitation | 20 High-powered Luxury | 26 History of character Discover the Ghibli Experience something truly Maserati Connect and Collection unique in a world of Safety ADAS standardized choices Fuoriserie | 42 Technical specifications | 48 A world of possibilities | 52 Your Maserati tailor-made Specifications overview of all to your unique personality Ghibli versions You’re Not Like Everyone Else 2 3 Bold and Elegant The Maserati Ghibli offers something very different in a world of business- like conformity. As you would expect of a luxury sports sedan, there’s soothing comfort and effortlessly intuitive technology. The attention to detail, style and quality, reveal the very essence of the Maserati. Whatever your choice, whatever your ambition, the Maserati Ghibli always has a uniquely inspirational answer. 4 5 The first Maserati Ghibli was designed by Giorgetto Ghibli SS | 1966 Giugiaro and unveiled at the Turin Motor Show of 1966. Giugiaro, then in his 20s, was considered a design prodigy. And rightly so. His creation, with its 2+2, fastback format, pop-up headlights and audacious shark-nosed profile was an instant hit and became an automotive design icon. The latest Ghibli model carries on the spirit that shaped its first incarnation in 1966. That means exclusive luxury, glorious style, progressive technology and of course, empowering performance. An Enduring Legacy 6 7 V8 Engine - Ghibli Trofeo V6 Engine - Ghibli SQ 4, Ghibli S L4 Engine - Ghibli Hybrid A core offering of all Maserati vehicles is the ability to cover long distances at dynamic yet refined high speed.
    [Show full text]
  • Abstract Window Toolkit Overview
    In this chapter: • Components • Peers 1 • Layouts • Containers • And the Rest • Summary Abstract Window Toolkit Overview For years, programmers have had to go through the hassles of porting software from BSD-based UNIX to System V Release 4–based UNIX, from OpenWindows to Motif, from PC to UNIX to Macintosh (or some combination thereof), and between various other alternatives, too numerous to mention. Getting an applica- tion to work was only part of the problem; you also had to port it to all the plat- forms you supported, which often took more time than the development effort itself. In the UNIX world, standards like POSIX and X made it easier to move appli- cations between different UNIX platforms. But they only solved part of the prob- lem and didn’t provide any help with the PC world. Portability became even more important as the Internet grew. The goal was clear: wouldn’t it be great if you could just move applications between different operating environments without worr yingabout the software breaking because of a different operating system, win- dowing environment, or internal data representation? In the spring of 1995, Sun Microsystems announced Java, which claimed to solve this dilemma. What started out as a dancing penguin (or Star Trek communicator) named Duke on remote controls for interactive television has become a new paradigm for programming on the Internet. With Java, you can create a program on one platform and deliver the compilation output (byte-codes/class files) to ever yother supported environment without recompiling or worrying about the local windowing environment, word size, or byte order.
    [Show full text]
  • Development Environment for the Raspberry Pi Using a Cross Compiling Toolchain and Eclipse | Hertaville 07.10.13 13:37
    Development Environment for the Raspberry Pi using a Cross Compiling Toolchain and Eclipse | Hertaville 07.10.13 13:37 Hertaville Welcome to Hertaville! Development Environment for the Raspberry Pi using a Cross Compiling Toolchain and Eclipse Posted on September 28, 2012 by halherta UPDATED July 15th 2013 In this blog entry the setup of a cross-compiling development environment for the Raspberry Pi will be demonstrated. This will include the Official Raspbian (armhf) cross compiling toolchain (available from github) Eclipse for C/C++ Developers (Linux) We will finally write a simple Hello World program on our development PC, compile it using the cross compiler and then deploy it onto our Raspberry Pi board to run it. I’m going to assume that you have already installed a Raspbian Wheezy image on your RPi board and that you have Linux installed on your desktop PC. For this tutorial I am using the Crunchbang 11 Linux OS (64-bit) on my PC. The instructions provided should work on most Debian/Ubuntu based Linux distributions running directly on a PC or as a a guest operating system via VMWare/ VirtualBox . A remote debugging tutorial; which I consider to be the continuation of this tutorial, can be found here. Finally, Derek Molloy has a great video tutorial on setting up a similar environment for the Beaglebone. Watching this video was incredibly informative and helped me set up this tutorial. So what is a cross compiling toolchain and why use one ? A native compiler such as the default gcc tool on the PC is a compiler that runs on an Intel machine, as well as creates binaries intended to be run on an Intel machine.
    [Show full text]
  • Embedded Linux Training
    Free Electrons Embedded Linux training Gregory Clement Thomas Petazzoni Michael Opdenacker Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com Rights to copy © Copyright 2004-2011, Free Electrons [email protected] Electronic version of this document available on http://free-electrons.com/doc/training/embedded-linux Updates will be available on http://free-electrons.com/doc/training/embedded-linux/ Attribution ± ShareAlike 3.0 Corrections, suggestions, You are free contributions and translations are welcome! to copy, distribute, display, and perform the work to make derivative works Latest update: Feb 14, 2011 to make commercial use of the work Under the following conditions Attribution. You must give the original author credit. Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one. For any reuse or distribution, you must make clear to others the license terms of this work. Any of these conditions can be waived if you get permission from the copyright holder. Your fair use and other rights are in no way affected by the above. License text: http://creativecommons.org/licenses/by-sa/3.0/legalcode Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com Linux kernel Linux device drivers Free Electrons Board support code Our services Mainstreaming kernel code Kernel debugging Custom Development System integration
    [Show full text]
  • Gtk Marries Ada: the GUI Technology Revolution
    GtkGtk MarriesMarries AdaAda:: TheThe GUIGUI TechnologyTechnology RevolutionRevolution [email protected] OverviewOverview History of GtkAda GtkAda Features Why Gtk Rather Than Other Toolkits? Why GtkAda rather than Gtk+? GtkAdaGtkAda -- HistoryHistory á The GIMP – GNU Photoshop clone á The Gtk+ library – Becomes independent á GtkGlade: a Gtk+ GUI builder á Gnome: a desktop manager á GVD: the GNU Visual Debugger GtkAdaGtkAda FeaturesFeatures ááHigh-level binding to the Gtk+ library – object-oriented – type safety – small and efficient ááHighly portable – Unixes: Linux, Solaris, … – Windows NT ááNative GtkAdaGtkAda FeaturesFeatures (2)(2) ááEvent handling ááDrawing services – Lines, rectangles, … – OpenGL (3D graphics) ááStyle support ááLarge set of widgets GtkAdaGtkAda -- WidgetWidget setset á Two types of widgets – containers and visual objects á About 100 widgets are provided á High-level widgets – notebook, text widget, tree, spin button, table, toolbar, ... GtkAdaGtkAda -- ScreenshotsScreenshots á Ctree GtkAdaGtkAda -- ScreenshotsScreenshots (2)(2) á OpenGL WhyWhy Gtk+?Gtk+? á Portable á Native á Extensible á Open Source á Actively developped á Thread-safe WhyWhy Gtk+?Gtk+? (2)(2) á High level widgets á Easy to use scrolling capabilities á Wide range of users á Very powerful layout capabilities – Complete set of containers á Powerful and easy to use GUI builder á Easy to bind TheThe GUIGUI BuilderBuilder ááMulti-language GUI builder – Language-independent save file (XML). – Code-generation specific to each language. – Dynamic loading
    [Show full text]