Description
This package implements support for the selection mechanism (ie a way to
get a currently active selection anywhere on your Xserver or on your
Windows machine).
This also acts as the low-level support for drag-and-drop, as described
in Gtk.Dnd.
A lot of subprograms in this package work on Gdk_Atom types, instead of
strings. Converting from one to the other can easily be done through
calls to the subprograms in Gdk.Property (Atom_Intern and Atom_Name).
The reason we use Gdk_Atom is for efficiency, since comparing two integers
is of course faster than comparing two strings.
The selection mechanism is the primary mechanism by which applications
can transfer data to each other on a given system. Even though both
applications must be visible on the same screen, this does not mean that
they can access the same files or ressources, since they might in fact
be running on different machines. You should always keep this in mind
when setting the data to be transfered.
A selection is a essentially a named clipboard, identified by a string
interned as a Gdk_Atom. By claiming ownership of a selection, an
application indicates that it will be responsible for supplying its
contents.
The contents of a selection can be represented in a number of formats,
called targets. Each target is identified by an atom. A list of all
possible targets supported by the selection owner can be retrieved by
requesting the special target TARGETS. When a selection is retrieved, the
data is accompanied by a type (an atom), and a format (an integer,
representing the number of bits per item).
See also http://standards.freedesktop.org/clipboards-spec/ for
more information on the way selection works on X-Window systems.
Types
-
type Gdk_Selection is Gdk.Types.Gdk_Atom;
-
type Gdk_Selection_Type is Gdk.Types.Gdk_Atom;
-
type Gdk_Target is Gdk.Types.Gdk_Atom;
-
-
-
type Target_Entry_Array is array (Natural range <>) of Target_Entry;
-
type Target_Flags is new Integer;
-
Subprograms
Target_List
-
function Target_List_New (Targets : Target_Entry_Array) return Target_List;
-
procedure Target_List_Ref (List : Target_List);
-
procedure Target_List_Unref (List : Target_List);
-
procedure Target_List_Add
(List : Target_List;
Target : Gdk.Types.Gdk_Atom;
Flags : Guint;
Info : Guint);
-
procedure Target_List_Add_Table
(List : Target_List;
Targets : Target_Entry_Array);
-
procedure Target_List_Add_Text_Targets
(List : Target_List;
Info : Guint);
-
procedure Target_List_Add_URI_Targets
(List : Target_List;
Info : Guint);
-
procedure Target_List_Add_Image_Targets
(List : Target_List;
Info : Guint;
Writable : Boolean);
-
procedure Target_List_Remove
(List : Target_List;
Target : Gdk.Types.Gdk_Atom);
-
procedure Target_List_Find
(List : Target_List;
Target : Gdk.Types.Gdk_Atom;
Info : out Guint;
Found : out Boolean);
Selection_Data
-
-
function Get_Selection (Selection : Selection_Data) return Gdk_Selection;
-
function Get_Target (Selection : Selection_Data) return Gdk.Types.Gdk_Atom;
-
function Get_Type (Selection : Selection_Data) return Gdk.Types.Gdk_Atom;
-
function Get_Format (Selection : Selection_Data) return Gint;
-
function Get_Data (Selection : Selection_Data) return System.Address;
-
function Get_Data_As_String (Selection : Selection_Data) return String;
-
function Get_Length (Selection : Selection_Data) return Gint;
Setting and getting contents
-
-
-
function Targets_Include_Image
(Selection : Selection_Data; Writable : Boolean := True) return Boolean;
-
function Set_Text
(Selection : Selection_Data;
Str : UTF8_String) return Boolean;
-
function Get_Text (Selection : Selection_Data) return UTF8_String;
-
function Targets_Include_Text (Selection : Selection_Data) return Boolean;
-
function Set_Uris
(Selection : Selection_Data;
URIs : GNAT.Strings.String_List)
return Boolean;
-
function Get_Uris
(Selection : Selection_Data)
return GNAT.Strings.String_List;
-
function Get_Targets
(Selection : Selection_Data) return Gdk.Types.Gdk_Atom_Array;
-
procedure Selection_Data_Set
(Selection : Selection_Data;
The_Type : Gdk.Types.Gdk_Atom;
Format : Gint;
Data : System.Address;
Length : Gint);
-
procedure Selection_Data_Set
(Selection : Selection_Data;
The_Type : Gdk.Types.Gdk_Atom;
Format : Gint;
Data : String);
-
function Selection_Data_Copy
(Selection : Selection_Data) return Selection_Data;
-
procedure Selection_Data_Free (Selection : Selection_Data);
Manipulating the selection
-
function Owner_Set
(Widget :
Gtk.Widget.Gtk_Widget;
Selection : Gdk_Selection := Selection_Primary;
Time : Guint32 := 0)
return Boolean;
-
procedure Add_Target
(Widget :
access Gtk.Widget.Gtk_Widget_Record'Class;
Selection : Gdk_Selection;
Target : Gdk.Types.Gdk_Atom;
Info : Guint);
-
-
-
function Convert
(Widget :
access Gtk.Widget.Gtk_Widget_Record'Class;
Selection : Gdk_Selection := Selection_Primary;
Target : Gdk.Types.Gdk_Atom;
Time : Guint32 := 0)
return Boolean;
-
Testgtk source code
This code is part of testgtk, a demo application packaged with GtkAda. Testgtk demonstrates the various widgets of GtkAda
-----------------------------------------------------------------------
-- GtkAda - Ada95 binding for the Gimp Toolkit --
-- --
-- Copyright (C) 2000 --
-- Emmanuel Briot, Joel Brobecker and Arnaud Charlet --
-- Copyright (C) 2001-2006 AdaCore --
-- --
-- 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. --
-- --
--
--
--
--
--
--
--
-----------------------------------------------------------------------
with Gtk.Frame;
use Gtk.Frame;
with Gtk.Button;
use Gtk.Button;
with Gtk.Clipboard;
use Gtk.Clipboard;
with Gtk.Text_Iter;
use Gtk.Text_Iter;
with Gtk.Text_View;
use Gtk.Text_View;
with Gtk.Text_Buffer;
use Gtk.Text_Buffer;
with Gtk.Box;
use Gtk.Box;
with Gtk.Handlers;
use Gtk.Handlers;
with Gtk.Label;
use Gtk.Label;
with Gtk.Scrolled_Window;
use Gtk.Scrolled_Window;
package body Create_Selection
is
type My_Button_Record
is new Gtk_Button_Record
with record
Text : Gtk_Text_Buffer;
Text_View : Gtk_Text_View;
Label : Gtk_Label;
end record;
type My_Button
is access all My_Button_Record'Class;
package My_Button_Handler
is new Gtk.Handlers.Callback
(My_Button_Record);
----------
-- Help --
----------
function Help
return String
is
begin
return "This
package demonstrates how to interact
with the clipboard to"
& " retrieve text copied from other applications" & ASCII.LF
& "Try selecting some other text outside
of this demo,
and press"
& " once again the button
at the top.";
end Help;
---------------------
-- On_Button_Click --
---------------------
procedure On_Button_Click (Button :
access My_Button_Record'Class)
is
Text :
constant String := Wait_For_Text (Gtk.Clipboard.Get);
Iter : Gtk_Text_Iter;
begin
-- For the text buffer, we query directly the clipboard
Get_End_Iter (Button.Text, Iter);
Insert (Button.Text, Iter, Text);
end On_Button_Click;
---------
-- Run --
---------
procedure Run (Frame :
access Gtk.Frame.Gtk_Frame_Record'Class)
is
Box : Gtk_Box;
Button : My_Button;
Scrolled : Gtk_Scrolled_Window;
begin
Set_Label (Frame, "Selection");
Gtk_New_Vbox (Box, Homogeneous => False);
Add (Frame, Box);
Button :=
new My_Button_Record;
Initialize (Button, "Paste the selection/clipboard");
Pack_Start (Box, Button, Fill => False, Expand => False);
My_Button_Handler.Connect
(Button, "clicked",
My_Button_Handler.To_Marshaller (On_Button_Click'Access));
-- The text
Gtk_New (Scrolled);
Pack_Start (Box, Scrolled, Fill => True, Expand => True);
Gtk_New (Button.Text);
Gtk_New (Button.Text_View, Button.Text);
Add (Scrolled, Button.Text_View);
Show_All (Frame);
end Run;
end Create_Selection;