This file is indexed.

/usr/share/ada/adainclude/gtkada/gtkada-style.ads is in libgtkada16.1.0-dev 17.0.2017-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
------------------------------------------------------------------------------
--                  GtkAda - Ada95 binding for Gtk+/Gnome                   --
--                                                                          --
--                     Copyright (C) 2011-2017, AdaCore                     --
--                                                                          --
-- This library is free software;  you can redistribute it and/or modify it --
-- under terms of the  GNU General Public License  as published by the Free --
-- Software  Foundation;  either version 3,  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 MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE.                            --
--                                                                          --
--                                                                          --
--                                                                          --
--                                                                          --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
------------------------------------------------------------------------------

--  <description>
--  Utility functions that mimic Gtk.Style drawing methods, but using Cairo
--  instead of Gdk. This allow smooth transition to Gtk3 that will get rid
--  of those Gdk drawing methods and only use Cairo.
--  </description>
--  <group>Configuration and Themes</group>

with Ada.Finalization;
with Glib;
with Cairo;
with Pango.Layout;
with Gdk.Color;
with Gdk.Device;
with Gdk.Pixbuf;
with Gdk.RGBA;
with Gdk.Types;
with Gtk.Enums;
with Gtk.Style_Provider;
with Gtk.Widget;
with Pango.Enums;
with Pango.Font;

package Gtkada.Style is

   --------------------
   -- Color handling --
   --------------------

   subtype Cairo_Color_Val is Glib.Gdouble range 0.0 .. 1.0;
   --  In cairo, the color components are expressed as percents.

   subtype Cairo_Color is Gdk.RGBA.Gdk_RGBA;

   type HSV_Color is record
      H, S, V, A : Glib.Gdouble;
   end record;
   --  Used when manipulating Cairo color. The HSV color space is useful when
   --  wanting to shade a color (change it's value), (de)saturate it, or modify
   --  its hue.

   type HSLA_Color is record
      Hue        : Glib.Gdouble;
      Saturation : Glib.Gdouble;
      Lightness  : Glib.Gdouble;
      Alpha      : Glib.Gdouble;
   end record;
   --  The Hue is the colour's position on the colour wheel, expressed in
   --  degrees from 0° to 359°, representing the 360° of the wheel; 0°
   --  being red, 180° being red's opposite colour cyan, and so on.
   --  The mapping is:    0.0 => 0°
   --                     1.0 => 360°
   --
   --  Saturation is the intensity of the colour, how dull or bright it is.
   --  The lower the saturation, the duller (greyer) the colour looks. This is
   --  expressed as a percentage, 100% being full saturation, the brightest,
   --  and 0% being no saturation, grey.
   --
   --  Lightness is how light the colour is. Slightly different to saturation.
   --  The more white in the colour the higher its Lightness value, the more
   --  black, the lower its Lightness. So 100% Lightness turns the colour
   --  white, 0% Lightness turns the colour black, and the "pure" colour
   --  would be 50% Lightness.

   function To_HSLA (Color : Gdk.RGBA.Gdk_RGBA) return HSLA_Color;
   function To_RGBA (Color : HSLA_Color) return Gdk.RGBA.Gdk_RGBA;
   function To_HSV (Color   : Cairo_Color) return HSV_Color;
   function To_Cairo (Color : Cairo_Color) return Gdk.RGBA.Gdk_RGBA;
   function To_Cairo (HSV : HSV_Color) return Cairo_Color;
   function To_Cairo (Color : Gdk.Color.Gdk_Color) return Cairo_Color;
   --  Translations between one color definition to another

   procedure Set_Source_Color
      (Cr : Cairo.Cairo_Context; Color : Cairo_Color);
   function Create_Rgba_Pattern
      (Color : Cairo_Color) return Cairo.Cairo_Pattern;

   function To_Hex (Color : Gdk.RGBA.Gdk_RGBA) return String;
   --  Return a hexadecimal approximate representation of the color, of the
   --  form "#rrggbb". This loses the alpha chanel.
   --  The output is suitable for use in a markup (see Gtk.Label.Set_Markup
   --  for instance)

   function Complementary
     (Color : Gdk.RGBA.Gdk_RGBA) return Gdk.RGBA.Gdk_RGBA;
   --  Return the complementary color

   ----------------------------------
   -- Changing lightness of colors --
   ----------------------------------

   subtype Percent is Glib.Gdouble range 0.0 .. 1.0;

   function Shade
     (Color : Gdk.Color.Gdk_Color;
      Value : Percent) return Cairo_Color;
   function Shade
     (Color : Cairo_Color;
      Value : Percent) return Cairo_Color;
   --  Modifies the lightning of the color by the specified value.
   --
   --  Value is a modifier: 0.0 means the color is unchanged, 0.1 means the
   --  color is modified by 10%, and so on.

   function Lighten
     (Color  : Gdk.RGBA.Gdk_RGBA;
      Amount : Percent) return Gdk.RGBA.Gdk_RGBA;
   --  Return a lighter version of the color
   --
   --  Amount is a modifier: 0.0 means the color is unchanged, 0.1 means the
   --  color is modified by 10%, and so on.

   function Shade_Or_Lighten
     (Color  : Gdk.RGBA.Gdk_RGBA;
      Amount : Percent := 0.4) return Gdk.RGBA.Gdk_RGBA;
   --  Return a lighter or darker version of Color, depending on whether color
   --  is rather dark or rather light.
   --
   --  Amount is a modifier: 0.0 means the color is unchanged, 0.1 means the
   --  color is modified by 10%, and so on.

   -------------------------
   -- Drawing subprograms --
   -------------------------
   --  The following subprograms are better replaced by the use of the
   --  Drawing_Style type below, which provides more configurability.

   procedure Rounded_Rectangle
     (Cr         : Cairo.Cairo_Context;
      X, Y, W, H : Glib.Gdouble;
      Radius     : Glib.Gdouble);
   --  Draws a rounded rectangle at coordinate X, Y with W and H size.
   --  If Radius > 0, then the corner will be rounded.

   procedure Draw_Shadow
     (Cr                  : Cairo.Cairo_Context;
      Widget              : not null access Gtk.Widget.Gtk_Widget_Record'Class;
      Shadow_Type         : Gtk.Enums.Gtk_Shadow_Type;
      X, Y, Width, Height : Glib.Gint;
      Corner_Radius       : Glib.Gdouble := 0.0);
   --  Draws a Frame of size Width x Height at position (X, Y) and (X2, Y2)
   --  using the specified color.
   --  Corner_Radius allows you to draw a rounded frame if set to a value > 0.
   --
   --  Additional drawing styles can be specified by using Cairo.Set_Line_XXXX
   --  on the Cairo_Context before calling this procedure.

   procedure Draw_Rectangle
     (Cr                  : Cairo.Cairo_Context;
      Color               : Cairo_Color;
      Filled              : Boolean;
      X, Y, Width, Height : Glib.Gint;
      Corner_Radius       : Glib.Gdouble := 0.0);
   procedure Draw_Rectangle
     (Cr                  : Cairo.Cairo_Context;
      Color               : Gdk.Color.Gdk_Color;
      Filled              : Boolean;
      X, Y, Width, Height : Glib.Gint;
      Corner_Radius       : Glib.Gdouble := 0.0);
   --  Draws a rectangle of size Width x Height at position (X, Y) and (X2, Y2)
   --  using the specified color.
   --  Corner_Radius allows you to draw a rounded rectangle if set to a
   --  value > 0.0
   --
   --  Additional drawing styles can be specified by using Cairo.Set_Line_XXXX
   --  on the Cairo_Context before calling this procedure.

   procedure Draw_Line
     (Cr             : Cairo.Cairo_Context;
      Color          : Cairo_Color;
      X1, Y1, X2, Y2 : Glib.Gint);
   procedure Draw_Line
     (Cr             : Cairo.Cairo_Context;
      Color          : Gdk.Color.Gdk_Color;
      X1, Y1, X2, Y2 : Glib.Gint);
   --  Draws a line between (X1, Y1) and (X2, Y2) using the specified color.
   --
   --  Additional drawing styles can be specified by using Cairo.Set_Line_XXXX
   --  on the Cairo_Context before calling this procedure.

   procedure Draw_Layout
     (Cr     : Cairo.Cairo_Context;
      Color  : Cairo_Color;
      X, Y   : Glib.Gint;
      Layout : Pango.Layout.Pango_Layout);
   procedure Draw_Layout
     (Cr     : Cairo.Cairo_Context;
      Color  : Gdk.Color.Gdk_Color;
      X, Y   : Glib.Gint;
      Layout : Pango.Layout.Pango_Layout);
   --  Draws the Pango layout at position (X, Y) using Color.

   procedure Draw_Pixbuf
     (Cr     : Cairo.Cairo_Context;
      Pixbuf : Gdk.Pixbuf.Gdk_Pixbuf;
      X, Y   : Glib.Gint);
   pragma Obsolescent (Draw_Pixbuf, "Use Draw_Pixbuf_With_Scale instead");
   --  Draws a pixbuf at coordinate X, Y
   --
   --  Note that Gdk_Pixmap or Gdk_Bitmap are not supported, as those
   --  are server-side images, so depend on a surface attached to a screen.
   --  As a result, those would not be drawn on a non-screen surface (such as
   --  an internal Image_Surface).

   procedure Draw_Pixbuf_With_Scale
      (Cr     : Cairo.Cairo_Context;
       Pixbuf : Gdk.Pixbuf.Gdk_Pixbuf;
       X, Y   : Glib.Gdouble;
       Widget : access Gtk.Widget.Gtk_Widget_Record'Class := null);
   procedure Draw_Pixbuf_With_Scale
      (Cr        : Cairo.Cairo_Context;
       Icon_Name : String;
       X, Y      : Glib.Gdouble;
       Size      : Glib.Gint;
       Widget    : access Gtk.Widget.Gtk_Widget_Record'Class := null);
   --  Draw the pixbuf at the specified coordinates.
   --  This takes into account the scale factor on the screen, so that the
   --  image is properly sized on hi-dpi (retina) displays.
   --  The pixbuf must have been created with the proper scale factor as well,
   --  using for instance Gtk.Icon_Theme.Load_Icon_For_Scale. It is often more
   --  convenient to pass the name of the icon, as found in the icon theme,
   --  and let gtk+ create the pixbuf automatically.
   --  The widget is used to compute the appropriate scale factor.

   --------------------
   -- Drawing styles --
   --------------------

   type Drawing_Style is tagged private;
   --  This type provides a set of high-level subprograms to draw on a cairo
   --  context (and thus they can be used when drawing Canvas_Item).
   --
   --  This type is reference-counted: it will be automatically freed when no
   --  longer used in your application. If you store the same instance of
   --  Drawing_Style in two contexts, modifying one will also modify the
   --  other.

   No_Drawing_Style : constant Drawing_Style;

   type Arrow_Head is (None, Open, Solid, Diamond, Circle);
   --  The various styles of arrow heads (filled with Fill style).
   --  When displaying a circle, the Length of the arrow style is the radius of
   --  the circle.

   type Arrow_Style is record
      Head       : Arrow_Head;
      Length     : Glib.Gdouble := 8.0;
      Angle      : Glib.Gdouble := 0.4;
      Stroke     : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Black_RGBA;
      Fill       : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Null_RGBA;
      Line_Width : Glib.Gdouble := 1.0;
   end record;
   No_Arrow_Style : constant Arrow_Style :=
     (None, 0.0, 0.0, Gdk.RGBA.Black_RGBA, Gdk.RGBA.Null_RGBA, 1.0);

   type Symbol_Name is (None, Cross, Strike, Double_Strike);
   type Symbol_Style is record
      Name       : Symbol_Name;
      Stroke     : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Black_RGBA;
      Distance   : Glib.Gdouble := 16.0;
      Line_Width : Glib.Gdouble := 1.0;
   end record;
   No_Symbol : constant Symbol_Style := (None, Gdk.RGBA.Black_RGBA, 16.0, 1.0);
   --  Distance is the distance from the end of the line to the symbol. It
   --  should in general be greater than the length of the arrow (see
   --  Arrow_Style above)

   type Font_Style is record
      Name       : Pango.Font.Pango_Font_Description := null;
      Underline  : Pango.Enums.Underline := Pango.Enums.Pango_Underline_None;
      Strikethrough : Boolean := False;
      Color      : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Black_RGBA;

      Line_Spacing : Glib.Gint := 1;
      --  Space between two lines

      Halign     : Pango.Enums.Alignment := Pango.Enums.Pango_Align_Left;
   end record;
   Default_Font : constant Font_Style := (others => <>);
   --  Some of the attributes like Halign are only taken into account when
   --  using Gtkada.Canvas_View.Text_Item.

   type Shadow_Style is record
      Color    : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Null_RGBA;
      X_Offset : Glib.Gdouble := 2.0;
      Y_Offset : Glib.Gdouble := 2.0;
   end record;
   No_Shadow : constant Shadow_Style := (Gdk.RGBA.Null_RGBA, 5.0, 5.0);

   type Point is record
      X, Y : Glib.Gdouble;
   end record;
   type Point_Array is array (Natural range <>) of Point;
   type Point_Array_Access is access all Point_Array;

   function Gtk_New
      (Stroke           : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Black_RGBA;
       Fill             : Cairo.Cairo_Pattern := Cairo.Null_Pattern;
       Font             : Font_Style := Default_Font;
       Line_Width       : Glib.Gdouble := 1.0;
       Dashes           : Cairo.Dash_Array := Cairo.No_Dashes;
       Arrow_From       : Arrow_Style := No_Arrow_Style;
       Arrow_To         : Arrow_Style := No_Arrow_Style;
       Symbol_From      : Symbol_Style := No_Symbol;
       Symbol_To        : Symbol_Style := No_Symbol;
       Shadow           : Shadow_Style := No_Shadow;
       Sloppy           : Boolean := False)
     return Drawing_Style;
   --  Creates a new instance of drawing style.
   --
   --  Sloppy: if true, a sort of approximate drawing is done for lines and
   --   text, so that it looks like the drawing was done by hand.
   --
   --  Fill: this is generated created through the functions in Cairo.Pattern.
   --   The pattern is adopted by the style, which will unreferenced it when
   --   not needed. As such, if the pattern is shared between multiple
   --   styles you need to Ref it.
   --   When the style is used with a Gtkada.Canvas_View.Container_Item or one
   --   of its children, and pattern is a gradient, it should be defined in
   --   the 0.0 .. 1.0 pattern space, and will be resized automatically based
   --   on the computed size of the item.
   --
   --  The style will free the Font.Name object, so you will need to pass the
   --  result of either Pango.Font.Copy or Pango.Font.From_String.

   procedure Draw_Rect
      (Self          : Drawing_Style;
       Cr            : Cairo.Cairo_Context;
       Topleft       : Point;
       Width, Height : Glib.Gdouble;
       Radius        : Glib.Gdouble := 0.0);
   function Path_Rect
      (Self          : Drawing_Style;
       Cr            : Cairo.Cairo_Context;
       Topleft       : Point;
       Width, Height : Glib.Gdouble;
       Radius        : Glib.Gdouble := 0.0) return Boolean;
   --  Draw a rectangle with the given style. If Radius is not null, this is
   --  a rounded rectangle. Draw_Rect will automatically call Finish path
   --  to display te path, but Path_Rect will only prepare it (it returns False
   --  if no path was prepared)

   procedure Draw_Polyline
      (Self        : Drawing_Style;
       Cr          : Cairo.Cairo_Context;
       Points      : Point_Array;
       Close       : Boolean := False;
       Show_Arrows : Boolean := True;
       Relative    : Boolean := False);
   function Path_Polyline
      (Self        : Drawing_Style;
       Cr          : Cairo.Cairo_Context;
       Points      : Point_Array;
       Close       : Boolean := False;
       Relative    : Boolean := False) return Boolean;
   --  Draw a line joining all the points. If Close is true, the last point is
   --  also linked to the first.
   --  If Self defines arrows or symbols on either ends, they are also
   --  displayed if Show_Arrows is True.
   --  Relative should be set to True if the points are relative: the first
   --  point has item coordinates, and all remaining points are relative to the
   --  previous point.

   procedure Draw_Polycurve
     (Self        : Drawing_Style;
      Cr          : Cairo.Cairo_Context;
      Points      : Point_Array;
      Show_Arrows : Boolean := True;
      Relative    : Boolean := False);
   function Path_Polycurve
     (Self        : Drawing_Style;
      Cr          : Cairo.Cairo_Context;
      Points      : Point_Array;
      Relative    : Boolean := False) return Boolean;
   --  Same as Drawpolyline, but draws bezier curves.
   --  Points is an array of both points and control points, as in:
   --     pt1, ctrl1, ctrl2, pt2, ctrl3, ctrl4, pt3, ...

   procedure Draw_Ellipse
     (Self          : Drawing_Style;
      Cr            : Cairo.Cairo_Context;
      Topleft       : Point;
      Width, Height : Glib.Gdouble);
   function Path_Ellipse
     (Self          : Drawing_Style;
      Cr            : Cairo.Cairo_Context;
      Topleft       : Point;
      Width, Height : Glib.Gdouble) return Boolean;
   --  Draw an ellipse inscribed in the specified rectangle

   procedure Draw_Text
     (Self       : Drawing_Style;
      Cr         : Cairo.Cairo_Context;
      Layout     : not null access Pango.Layout.Pango_Layout_Record'Class;
      Topleft    : Point;
      Text       : String;
      Max_Width  : Glib.Gdouble := Glib.Gdouble'First;
      Max_Height : Glib.Gdouble := Glib.Gdouble'First);
   --  Draw text at specific coordinates.
   --  Topleft is the position of the top-left corner for the text, or the
   --  middle line if the text's vertical_align is set to middle.
   --  Max_Width is optional, but is used to resolve alignment.

   procedure Draw_Arrows_And_Symbols
     (Self     : Drawing_Style;
      Cr       : Cairo.Cairo_Context;
      Points   : Point_Array;
      Relative : Boolean := False);
   --  Draw arrow heads and symbols to both ends of the line, based on Self.
   --  This is similar to Polyline, but does not draw the line itself.
   --  Relative should be True if each point are defined relative to the
   --  previous point.

   procedure Finish_Path
      (Self       : Drawing_Style;
       Cr         : Cairo.Cairo_Context;
       Clear_Path : Boolean := True);
   --  This is for use when you are creating your own paths via standard cairo
   --  calls. This will call Stroke and Fill with the appropriate parameters
   --  found in Self.

   procedure Measure_Text
     (Self     : Drawing_Style;
      Layout   : not null access Pango.Layout.Pango_Layout_Record'Class;
      Text     : String;
      Width    : out Glib.Gdouble;
      Height   : out Glib.Gdouble);
   --  Measure the size the text would take on the screen

   function Get_Arrow_From (Self : Drawing_Style) return Arrow_Style;
   function Get_Arrow_To (Self : Drawing_Style) return Arrow_Style;
   function Get_Stroke (Self : Drawing_Style) return Gdk.RGBA.Gdk_RGBA;
   function Get_Line_Width (Self : Drawing_Style) return Glib.Gdouble;
   function Get_Font (Self : Drawing_Style) return Font_Style;
   function Get_Fill (Self : Drawing_Style) return Cairo.Cairo_Pattern;
   function Get_Shadow (Self : Drawing_Style) return Shadow_Style;
   --  Access the various properties of the style

   procedure Set_Fill
     (Self   : Drawing_Style;
      Fill   : Cairo.Cairo_Pattern := Cairo.Null_Pattern);
   procedure Set_Stroke
     (Self   : Drawing_Style;
      Stroke : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Black_RGBA);
   --  Overriding specific attributes of the style

   ---------
   -- CSS --
   ---------

   procedure Load_Css_File
     (Path     : String;
      Error    : access procedure (Str : String) := null;
      Priority : Gtk.Style_Provider.Priority);
   procedure Load_Css_String
     (Data     : String;
      Error    : access procedure (Str : String) := null;
      Priority : Gtk.Style_Provider.Priority);
   --  Load CSS file and register it as a default CSS provider for the whole
   --  application.
   --  In case of error, the procedure Error is called if defined.

   ------------------------
   -- Cairo manipulation --
   ------------------------

   function Snapshot
     (Widget : not null access Gtk.Widget.Gtk_Widget_Record'Class)
      return Cairo.Cairo_Surface;
   --  Create a snapshot of the widget.
   --  This allocates a new surface and draws the widget on it. The surface
   --  needs to be destroyed when you are done with it using Surface_Destroy.
   --  The snapshot can be drawn on another surface using
   --      Set_Source_Surface (Cr, the_snapshot, 0.0, 0.0);
   --      Set_Operator (Cr, Cairo_Operator_Source);
   --      Rectangle (Cr, ....);
   --      Cairo.Fill (Cr);
   --  The 0.0 values might need to be adjusted if your widget does not have
   --  its own window. In this case, you should use:
   --      Get_Allocation (Widget, Alloc);
   --      --  and replace 0.0 with Gdouble (Alloc.X)

   procedure Draw_Overlay
     (Widget  : not null access Gtk.Widget.Gtk_Widget_Record'Class;
      Overlay : in out Cairo.Cairo_Surface;
      Do_Draw : not null access procedure
        (Context : Cairo.Cairo_Context;
         Draw    : Boolean));
   --  Create an overlay on top of widget on which you can draw.
   --  This overlay is created if it doesn't exist (so Overlay must be
   --  initialied to Null_Surface initially). It is displayed on top of the
   --  toplevel window that contains Widget, and will be fully visible until
   --  some of the children of that toplevel window get a "draw" event. At that
   --  point, the children will partially override the overlay. This is not a
   --  problem in practice if the overlay is displayed while performing
   --  operations like a drag-and-drop.
   --  Do_Draw is the callback used to do the actual drawing or erasing of the
   --  overlay (depending on whether Draw is True or False). The context passed
   --  in argument has been properly translated and clipped so that (0, 0) are
   --  the coordinates of the top-left corner of widget.
   --
   --  When Draw is False, the procedure should display a filled rectangle. The
   --  context has already been set up so that filling will in fact redraw what
   --  was previously hidden. This is more efficient that having Draw_Overlay
   --  systematically fill the whole area.

   procedure Delete_Overlay
     (Widget  : not null access Gtk.Widget.Gtk_Widget_Record'Class;
      Overlay : in out Cairo.Cairo_Surface);
   --  Delete the overlay created by Draw_Overlay, and force a refresh of the
   --  toplevel window.

   procedure Get_Offset
     (Window : not null access Gtk.Widget.Gtk_Widget_Record'Class;
      Parent : not null access Gtk.Widget.Gtk_Widget_Record'Class;
      X, Y   : out Glib.Gint);
   --  Get the position of Window within parent's window (not that this is not
   --  necessarily the same as the position within Parent if the latter does
   --  not have a window).

   -------------
   -- Devices --
   -------------

   function Get_First_Device
     (Widget : not null access Gtk.Widget.Gtk_Widget_Record'Class;
      Source : Gdk.Types.Gdk_Input_Source) return Gdk.Device.Gdk_Device;
   --  Return the first device that matches the given source.
   --  This can be used to simulate keyboard events (using Source_Keyboard)
   --  or mouse events (Source_Mouse) for instance.
   --  The returned value (if not null) must be Ref-ed before being assigned
   --  to an event for instance.

private

   type Dash_Array_Access is access all Cairo.Dash_Array;

   type Drawing_Style_Data is record
      Refcount         : Natural := 1;
      Stroke           : Gdk.RGBA.Gdk_RGBA := Gdk.RGBA.Black_RGBA;
      Fill             : Cairo.Cairo_Pattern := Cairo.Null_Pattern;
      Font             : Font_Style := Default_Font;
      Line_Width       : Glib.Gdouble := 1.0;
      Dashes           : Dash_Array_Access := null;
      Arrow_From       : Arrow_Style := No_Arrow_Style;
      Arrow_To         : Arrow_Style := No_Arrow_Style;
      Symbol_From      : Symbol_Style := No_Symbol;
      Symbol_To        : Symbol_Style := No_Symbol;
      Sloppy           : Boolean := False;
      Shadow           : Shadow_Style := No_Shadow;
   end record;
   type Drawing_Style_Data_Access is access all Drawing_Style_Data;

   Default_Style : constant Drawing_Style_Data := (others => <>);

   type Drawing_Style is new Ada.Finalization.Controlled with record
      Data : Drawing_Style_Data_Access;
   end record;

   overriding procedure Adjust (Self : in out Drawing_Style);
   overriding procedure Finalize (Self : in out Drawing_Style);

   No_Drawing_Style : constant Drawing_Style :=
     (Ada.Finalization.Controlled with Data => null);

end Gtkada.Style;