473 lines
9.7 KiB
Ada
473 lines
9.7 KiB
Ada
with
|
|
gel.Events,
|
|
ada.unchecked_Deallocation;
|
|
|
|
package body gel.Window
|
|
is
|
|
-----------
|
|
--- Utility
|
|
--
|
|
|
|
procedure free is new ada.unchecked_Deallocation (String, String_view);
|
|
pragma Unreferenced (free);
|
|
|
|
|
|
----------
|
|
--- Forge
|
|
--
|
|
|
|
procedure define (Self : in out Item; Width : in Positive;
|
|
Height : in Positive)
|
|
is
|
|
begin
|
|
Self.last_resize_Time := ada.Calendar.Clock;
|
|
|
|
Self.Width := Width;
|
|
Self.Height := Height;
|
|
|
|
Self.Keyboard := gel.Keyboard.local.Forge.new_Keyboard (of_name => Self.Name & "." & "Keyboard");
|
|
Self.Mouse := gel.Mouse .local.Forge.new_Mouse (of_name => Self.Name & "." & "Mouse");
|
|
end define;
|
|
|
|
|
|
|
|
window_Creator : create_Window_Function;
|
|
|
|
package body Forge
|
|
is
|
|
function new_Window (Name : in String;
|
|
Width : in Positive;
|
|
Height : in Positive) return View
|
|
is
|
|
begin
|
|
if window_Creator = null
|
|
then
|
|
raise Error with "'window_Creator' has not been set.";
|
|
end if;
|
|
|
|
return window_Creator (Name, Width, Height);
|
|
end new_Window;
|
|
|
|
end Forge;
|
|
|
|
|
|
|
|
overriding
|
|
procedure destroy (Self : in out Item)
|
|
is
|
|
use lace.Subject_and_deferred_Observer,
|
|
gel.Keyboard.local,
|
|
gel.Mouse .local;
|
|
|
|
procedure deallocate is new ada.unchecked_Deallocation (openGL.Surface.item'Class, openGL.Surface.View);
|
|
begin
|
|
destroy (lace.Subject_and_deferred_Observer.item (Self)); -- Destroy base class.
|
|
|
|
free (Self.Keyboard);
|
|
free (Self.Mouse);
|
|
|
|
deallocate (Self.Surface);
|
|
end destroy;
|
|
|
|
|
|
|
|
procedure free (Self : in out View)
|
|
is
|
|
procedure deallocate is new ada.unchecked_Deallocation (Item'Class, View);
|
|
begin
|
|
Self.destroy;
|
|
deallocate (Self);
|
|
end free;
|
|
|
|
|
|
|
|
procedure use_create_Window (create_Window : in create_Window_Function)
|
|
is
|
|
begin
|
|
if window_Creator /= null
|
|
then
|
|
raise Error with "'window_Creator' has already been set.";
|
|
end if;
|
|
|
|
window_Creator := create_Window;
|
|
end use_create_Window;
|
|
|
|
|
|
|
|
package body private_Forge
|
|
is
|
|
function to_Window (Name : in String;
|
|
Width : in Positive;
|
|
Height : in Positive) return Item
|
|
is
|
|
begin
|
|
return Self : Item := (lace.Subject_and_deferred_Observer.Forge.to_Subject_and_Observer (Name)
|
|
with others => <>)
|
|
do
|
|
Self.define (Width, Height);
|
|
end return;
|
|
end to_Window;
|
|
end private_Forge;
|
|
|
|
|
|
--------------
|
|
--- Attributes
|
|
--
|
|
|
|
function Surface (Self : in Item) return openGL.Surface.view
|
|
is
|
|
begin
|
|
return Self.Surface;
|
|
end Surface;
|
|
|
|
|
|
|
|
function Keyboard (Self : access Item) return access gel.Keyboard.item'class
|
|
is
|
|
begin
|
|
return Self.Keyboard;
|
|
end Keyboard;
|
|
|
|
|
|
|
|
function Mouse (Self : access Item) return access gel.Mouse.item'class
|
|
is
|
|
begin
|
|
return Self.Mouse;
|
|
end Mouse;
|
|
|
|
|
|
|
|
function is_Open (Self : in Item) return Boolean
|
|
is
|
|
begin
|
|
return Self.is_Open;
|
|
end is_Open;
|
|
|
|
|
|
|
|
function is_Exposed (Self : in Item) return Boolean
|
|
is
|
|
begin
|
|
return Self.is_Exposed;
|
|
end is_Exposed;
|
|
|
|
|
|
|
|
function Width (Self : in Item) return Positive
|
|
is
|
|
begin
|
|
return Self.Width;
|
|
end Width;
|
|
|
|
|
|
|
|
function Height (Self : in Item) return Positive
|
|
is
|
|
begin
|
|
return Self.Height;
|
|
end Height;
|
|
|
|
|
|
|
|
function is_being_Resized (Self : in Item'Class) return Boolean
|
|
is
|
|
use ada.Calendar;
|
|
begin
|
|
return ada.Calendar.Clock - Self.last_resize_Time < 0.1;
|
|
end is_being_Resized;
|
|
|
|
|
|
|
|
procedure Size_is (Self : in out Item; Width, Height : in Positive)
|
|
is
|
|
begin
|
|
Self.last_resize_Time := Ada.Calendar.Clock;
|
|
|
|
Self.Width := Width;
|
|
Self.Height := Height;
|
|
|
|
-- Generate a 'resize' event.
|
|
--
|
|
Self.emit (gel.Events.window_resize_Request' (Width, Height));
|
|
end Size_is;
|
|
|
|
|
|
---------------
|
|
--- Operations
|
|
--
|
|
|
|
procedure flush (Self : in Item)
|
|
is
|
|
begin
|
|
null;
|
|
end flush;
|
|
pragma Unreferenced (flush);
|
|
|
|
|
|
|
|
procedure sync (Self : in Item)
|
|
is
|
|
begin
|
|
null;
|
|
end sync;
|
|
pragma Unreferenced (sync);
|
|
|
|
|
|
----------
|
|
--- Events
|
|
--
|
|
|
|
procedure emit_enter_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_Enter;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_enter_Event;
|
|
|
|
|
|
|
|
procedure emit_leave_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_Leave;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_leave_Event;
|
|
|
|
|
|
|
|
procedure emit_focus_in_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_Leave;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_focus_in_Event;
|
|
|
|
|
|
|
|
procedure emit_focus_out_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_Leave;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_focus_out_Event;
|
|
|
|
|
|
|
|
procedure emit_keymap_notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_keymap_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_keymap_notify_Event;
|
|
|
|
|
|
|
|
procedure emit_Expose_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_Expose;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_Expose_Event;
|
|
|
|
|
|
|
|
procedure emit_graphics_Exposure_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_graphics_Exposure;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_graphics_Exposure_Event;
|
|
|
|
|
|
|
|
procedure emit_no_Exposure_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_no_Exposure;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_no_Exposure_Event;
|
|
|
|
|
|
|
|
procedure emit_visibility_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_visibility_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_visibility_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_create_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_create_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_create_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_destroy_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_destroy_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_destroy_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_unmap_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_unmap_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_unmap_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_map_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_map_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_map_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_map_Request_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_map_Request;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_map_Request_Event;
|
|
|
|
|
|
|
|
procedure emit_reparent_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_reparent_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_reparent_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_configure_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_configure_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_configure_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_configure_Request_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_configure_Request;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_configure_Request_Event;
|
|
|
|
|
|
|
|
procedure emit_gravity_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_gravity_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_gravity_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_resize_Request_Event (Self : in out Item'Class; Width, Height : in Positive)
|
|
is
|
|
the_Event : constant gel.Events.window_resize_Request := (Width, Height);
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_resize_Request_Event;
|
|
|
|
|
|
|
|
procedure emit_circulate_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_circulate_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_circulate_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_circulate_Request_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_circulate_Request;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_circulate_Request_Event;
|
|
|
|
|
|
|
|
procedure emit_property_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_property_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_property_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_selection_Clear_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_selection_Clear;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_selection_Clear_Event;
|
|
|
|
|
|
|
|
procedure emit_selection_Request_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_selection_Request;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_selection_Request_Event;
|
|
|
|
|
|
|
|
procedure emit_selection_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_selection_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_selection_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_colormap_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_colormap_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_colormap_Notify_Event;
|
|
|
|
|
|
|
|
procedure emit_client_Message_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_client_Message;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_client_Message_Event;
|
|
|
|
|
|
|
|
procedure emit_mapping_Notify_Event (Self : in out Item'Class)
|
|
is
|
|
the_Event : gel.Events.window_mapping_Notify;
|
|
begin
|
|
Self.emit (the_Event);
|
|
end emit_mapping_Notify_Event;
|
|
|
|
|
|
end gel.Window;
|