-----------------------------------------------------------------------
-- GtkAda - Ada95 binding for Gtk+/Gnome --
-- --
-- Copyright (C) 1998-2000 E. Briot, J. Brobecker and A. Charlet --
-- Copyright (C) 2000-2003 ACT-Europe --
-- --
-- This library is free software; you can redistribute it and/or --
-- modify it under the terms of the GNU General Public --
-- License as published by the Free Software Foundation; either --
-- version 2 of the License, or (at your option) any later version. --
-- --
-- This library is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
-- General Public License for more details. --
-- --
-- You should have received a copy of the GNU General Public --
-- License along with this library; if not, write to the --
-- Free Software Foundation, Inc., 59 Temple Place - Suite 330, --
-- Boston, MA 02111-1307, USA. --
-- --
-- As a special exception, if other files instantiate generics from --
-- this unit, or you link this unit with other files to produce an --
-- executable, this unit does not by itself cause the resulting --
-- executable to be covered by the GNU General Public License. This --
-- exception does not however invalidate any other reasons why the --
-- executable file might be covered by the GNU Public License. --
-----------------------------------------------------------------------
--
--
-- This package contains top-level subprograms that are used to initialize
-- GtkAda and interact with the main event loop.
--
-- It also provides a set of packages to set up idle functions, timeout
-- functions, and functions to be called before and after entering the
-- main loop.
--
--
-- 1.3.11
with Gdk.Event;
with Gtk.Widget;
with Gtk.Object;
with System;
package Gtk.Main is
pragma Elaborate_Body;
--------------------------------------
-- Initialization and exit routines --
--------------------------------------
procedure Init;
-- Initialize GtkAda's internal structures.
-- This subprogram should be called before any other one in GtkAda.
-- If GtkAda could not be initialized (no access to the display, etc.), the
-- application exits with an error
function Init_Check return Boolean;
-- Initialize GtkAda's internal structures.
-- Return False if there was an error (no access to the display, etc.)
--
procedure Gtk_Exit (Error_Code : Gint);
-- Terminate GtkAda.
-- Deprecated, use Main_Quit instead.
-- pragma Deprecated (Gtk_Exit);
--
function Set_Locale return String;
-- Read and parse the local settings, such as time format, ...
-- Return the name of the local settings, which can also be set with
-- the environment variable LOCALE
procedure Set_Locale;
-- Read and parse the local settings, such as time format, ...
-----------------------------
-- Init and Quit functions --
-----------------------------
type Init_Function is access procedure (Data : System.Address);
-- Function called just before starting the main loop.
-- This can be registered with Init_Add below.
procedure Init_Add (Func : Init_Function; Data : System.Address);
-- Register a function to be called just before starting a main loop.
-- This function is called only once, even if a new main loop is started
-- recursively.
type Quit_Handler_Id is new Guint;
-- registration ID for functions that will be called before the
-- main loop exits.
type Quit_Function is access function return Boolean;
-- Type of function that can be called when the main loop exits.
-- It should return False if it should not be called again when another
-- main loop exits.
function Quit_Add
(Main_Level : Guint; Func : Quit_Function) return Quit_Handler_Id;
-- Register a new function to be called when the current main loop exits.
-- The function will be called once when the current main loop exists.
-- If it returns False, it will then be deleted from the list of
-- quit functions, and won't be called again next time a main loop is
-- exited.
-- The function will only be called when exiting a main loop at level
-- Main_Level. If Main_Level is 0, the function will be called for the
-- current main_loop.
--
generic
type Data_Type (<>) is private;
package Quit is
type Quit_Function is access function (Data : Data_Type) return Boolean;
function Quit_Add
(Main_Level : Guint;
Func : Quit_Function;
Data : Data_Type) return Quit_Handler_Id;
end Quit;
-- !!Warning!!: This package needs to be instantiated at library level
-- since it calls some internal functions as callback.
--
function Quit_Add_Destroy
(Main_Level : Guint;
Object : access Gtk.Object.Gtk_Object_Record'Class)
return Quit_Handler_Id;
-- Ensure that Object is destroyed when exiting the main loop at Main_Level
-- (or the current main loop level is 0).
procedure Quit_Remove (Id : Quit_Handler_Id);
-- Remove a Quit Handler, that has been previously set by Quit_Add.
-------------------
-- The main loop --
-------------------
function Events_Pending return Boolean;
-- Return True if there are some events waiting in the event queue.
procedure Main;
-- Start the main loop, and returns only when the main loop is exited.
-- This subprogram can be called recursively, to start new internal
-- loops. Each of these loops is exited through a call to Main_Quit.
-- This is the recommended method to use when you want to popup a dialog
-- and wait for the user answer before going any further.
-- Note that this procedure can only be called within a single task.
function Main_Level return Guint;
-- Return the level of the current main loop.
-- Since there can be nested loops, this returns the depth of the
-- current one, starting from 1 (0 if there is none).
procedure Main_Quit;
-- Quit the current main loop.
-- If this was the last active main loop, no more events will be processed
-- by GtkAda.
function Main_Iteration (Blocking : Boolean := True) return Boolean;
-- Do one iteration of the main loop.
-- Blocking indicates whether GtkAda should wait for an event to be
-- available, or simply exit if there is none.
-- Returns True if no main loop is running
-- When doing some heavy calculations in an application, it is recommended
-- that you check from time to time if there are any events pending and
-- process them, so that your application still reacts to events.
-- To do that, you would add a loop like:
--
-- while Gtk.Main.Events_Pending loop
-- Dead := Gtk.Main.Main_Iteration;
-- end loop;
procedure Do_Event (Event : Gdk.Event.Gdk_Event);
-- Process Event as if it was in the event queue.
-- This function should almost never be used in your own application, this
-- is the core function for event processing in GtkAda.
-- The user should not free Event, this is already done by GtkAda.
function Get_Event_Widget
(Event : Gdk.Event.Gdk_Event) return Gtk.Widget.Gtk_Widget;
-- Return the widget to which Event applies.
function Get_Current_Event return Gdk.Event.Gdk_Event;
-- Return a copy of the event being processed by gtk+. The returned
-- value must be freed by the caller.
-- If there is no current event, null is returned.
--------------------
-- Grab functions --
--------------------
procedure Grab_Add (Widget : access Gtk.Widget.Gtk_Widget_Record'Class);
-- Add a new widget to the grab list.
-- The widget at the front of this list gets all the events even if it does
-- not have the focus. This feature should be used with care.
-- If you want a whole window to get the events, it is better to use
-- Gtk.Window.Set_Modal instead which does the grabbing and ungrabbing for
-- you.
-- The grab is only done for the application. Events outside the
-- application are still sent to their respective windows.
procedure Grab_Remove (Widget : access Gtk.Widget.Gtk_Widget_Record'Class);
-- Remove a widget from the grab list.
function Grab_Get_Current return Gtk.Widget.Gtk_Widget;
-- Return the widget that currently has the focus.
----------
-- Idle --
----------
-- GtkAda gives the possibility to register Idle functions.
-- These are called every time there is no more event to process in the
-- queue, and are used for instance internally to redraw widgets (so that
-- the application keeps reacting to user input even if there is a heavy
-- redrawing to do).
-- The Idle function returns a boolean, which should be True if the idle
-- remains active and should be called again, or False if the idle should
-- be unregistered.
-- The priority of these idle callbacks can also be modified, so that
-- the scheduling calls one callback before another.
--
-- Two versions are given, either with a user data or with none.
type Idle_Handler_Id is new Guint;
-- Id for Idle handlers.
type Idle_Priority is new Guint;
-- Priorities that can be set for idle handlers.
-- The higher the priority, the less urgent the task. Handlers whose
-- priority is lower will be called before others.
Priority_High_Idle : constant Idle_Priority := 100;
Priority_Default_Idle : constant Idle_Priority := 200;
Priority_Low_Idle : constant Idle_Priority := 300;
type Idle_Callback is access function return Boolean;
-- Function that can be called automatically whenever GtkAda is not
-- processing events.
-- It should return True if the function should be called again as soon
-- as possible, False if it should be unregistered.
function Idle_Add (Cb : in Idle_Callback;
Priority : in Idle_Priority := Priority_Default_Idle)
return Idle_Handler_Id;
-- Register an idle callback with no user data.
--
generic
type Data_Type (<>) is private;
package Idle is
type Callback is access function (D : in Data_Type) return Boolean;
type Destroy_Callback is access procedure (D : in out Data_Type);
function Add
(Cb : in Callback;
D : in Data_Type;
Priority : in Idle_Priority := Priority_Default_Idle;
Destroy : in Destroy_Callback := null)
return Idle_Handler_Id;
end Idle;
-- !!Warning!! The instances of this package must be declared at library
-- level, as they are some accesses to internal functions that happen
-- when the callback is called.
-- Destroy will be called automatically just prior to the destruction of D.
-- In particular, it is also called if the idle is destroyed through a call
-- to Idle_Remove.
--
procedure Idle_Remove (Id : in Idle_Handler_Id);
-- Remove an idle callback, when its Id is known.
-------------
-- Timeout --
-------------
-- A timeout is a function that is called after a specified amount
-- of time. You can of course use Ada tasks for the same role, however
-- this might provide an easier way of doing things.
--
-- In case your timeout function takes longer to execute than the specific
-- delay (for instance it takes 200ms for an internal of 100ms), then
-- no invocation is queued, and they are simply discarded. There is no
-- queue of expired timers. On the other hand, standard events are still
-- processed, but slowly (since they have the same priority as timeouts).
--
-- The redrawing and resizing of widgets, which are being done as idles
-- with lower priority will not take place.
type Timeout_Handler_Id is new Guint;
-- Id for Timeout handlers.
type Timeout_Callback is access function return Boolean;
-- Function that can be called automatically at precise time intervals.
-- It should return True if the function should be called again as soon
-- as possible, False if it should be unregistered.
function Timeout_Add
(Interval : in Guint32;
Func : Timeout_Callback) return Timeout_Handler_Id;
-- Add a new timeout. Func will be called after Interval milliseconds.
-- The function will be called as long as it returns True.
--
generic
type Data_Type (<>) is private;
package Timeout is
type Callback is access function (D : in Data_Type) return Boolean;
type Destroy_Callback is access procedure (D : in out Data_Type);
function Add
(Interval : Guint32;
Func : Callback;
D : Data_Type;
Destroy : in Destroy_Callback := null) return Timeout_Handler_Id;
-- Adds a new timeout. Func will be called after Interval milliseconds.
end Timeout;
-- !!Warning!! The instances of this package must be declared at library
-- level, as they are some accesses to internal functions that happen
-- when the callback is called.
--
procedure Timeout_Remove (Id : Timeout_Handler_Id);
-- Unregister a timeout function.
-----------
-- Input --
-----------
-- The following functions are used to react when new data is available on
-- a file descriptor (file, socket, pipe, ...)
-- You can use the lower level Gdk.Input package instead.
-- gtk_input_add_full
-- gtk_input_remove
-- key_snooper_install
-- key_snooper_remove
-- gtk_get_current_event
-- gtk_get_current_event_time
-- gtk_get_current_event_state
private
pragma Import (C, Gtk_Exit, "gtk_exit");
pragma Import (C, Main_Level, "gtk_main_level");
pragma Import (C, Main_Quit, "gtk_main_quit");
pragma Import (C, Main, "gtk_main");
pragma Import (C, Idle_Remove, "gtk_idle_remove");
pragma Import (C, Timeout_Remove, "gtk_timeout_remove");
pragma Import (C, Init_Add, "gtk_init_add");
pragma Import (C, Quit_Remove, "gtk_main_quit_remove");
pragma Import (C, Get_Current_Event, "gtk_get_current_event");
end Gtk.Main;