|
Packit |
ae235b |
|
|
Packit |
ae235b |
<html>
|
|
Packit |
ae235b |
<head>
|
|
Packit |
ae235b |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
Packit |
ae235b |
<title>Interface definition prerequisites: GObject Reference Manual</title>
|
|
Packit |
ae235b |
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
|
|
Packit |
ae235b |
<link rel="home" href="index.html" title="GObject Reference Manual">
|
|
Packit |
ae235b |
<link rel="up" href="howto-interface.html" title="How to define and implement interfaces">
|
|
Packit |
ae235b |
<link rel="prev" href="howto-interface-implement.html" title="Implementing interfaces">
|
|
Packit |
ae235b |
<link rel="next" href="howto-interface-properties.html" title="Interface properties">
|
|
Packit |
ae235b |
<meta name="generator" content="GTK-Doc V1.27 (XML mode)">
|
|
Packit |
ae235b |
<link rel="stylesheet" href="style.css" type="text/css">
|
|
Packit |
ae235b |
</head>
|
|
Packit |
ae235b |
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
![Home](home.png)
|
|
Packit |
ae235b |
![Up](up.png)
|
|
Packit |
ae235b |
![Prev](left.png)
|
|
Packit |
ae235b |
![Next](right.png)
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
Interface definition prerequisites
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
To specify that an interface requires the presence of other interfaces
|
|
Packit |
ae235b |
when implemented, GObject introduces the concept of
|
|
Packit |
ae235b |
prerequisites: it is possible to associate
|
|
Packit |
ae235b |
a list of prerequisite types to an interface. For example, if
|
|
Packit |
ae235b |
object A wishes to implement interface I1, and if interface I1 has a
|
|
Packit |
ae235b |
prerequisite on interface I2, A has to implement both I1 and I2.
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
The mechanism described above is, in practice, very similar to
|
|
Packit |
ae235b |
Java's interface I1 extends interface I2. The example below shows
|
|
Packit |
ae235b |
the GObject equivalent:
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
1
|
|
Packit |
ae235b |
2
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
G_DEFINE_INTERFACE (ViewerEditableLossy, viewer_editable_lossy, VIEWER_TYPE_EDITABLE)
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
In the G_DEFINE_INTERFACE
|
|
Packit |
ae235b |
call above, the third parameter defines the prerequisite type. This
|
|
Packit |
ae235b |
is the GType of either an interface or a class. In this case
|
|
Packit |
ae235b |
the ViewerEditable interface is a prerequisite of
|
|
Packit |
ae235b |
ViewerEditableLossy. The code
|
|
Packit |
ae235b |
below shows how an implementation can implement both interfaces and
|
|
Packit |
ae235b |
register their implementations:
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
1
|
|
Packit |
ae235b |
2
|
|
Packit |
ae235b |
3
|
|
Packit |
ae235b |
4
|
|
Packit |
ae235b |
5
|
|
Packit |
ae235b |
6
|
|
Packit |
ae235b |
7
|
|
Packit |
ae235b |
8
|
|
Packit |
ae235b |
9
|
|
Packit |
ae235b |
10
|
|
Packit |
ae235b |
11
|
|
Packit |
ae235b |
12
|
|
Packit |
ae235b |
13
|
|
Packit |
ae235b |
14
|
|
Packit |
ae235b |
15
|
|
Packit |
ae235b |
16
|
|
Packit |
ae235b |
17
|
|
Packit |
ae235b |
18
|
|
Packit |
ae235b |
19
|
|
Packit |
ae235b |
20
|
|
Packit |
ae235b |
21
|
|
Packit |
ae235b |
22
|
|
Packit |
ae235b |
23
|
|
Packit |
ae235b |
24
|
|
Packit |
ae235b |
25
|
|
Packit |
ae235b |
26
|
|
Packit |
ae235b |
27
|
|
Packit |
ae235b |
28
|
|
Packit |
ae235b |
29
|
|
Packit |
ae235b |
30
|
|
Packit |
ae235b |
31
|
|
Packit |
ae235b |
32
|
|
Packit |
ae235b |
33
|
|
Packit |
ae235b |
34
|
|
Packit |
ae235b |
35
|
|
Packit |
ae235b |
36
|
|
Packit |
ae235b |
37
|
|
Packit |
ae235b |
38
|
|
Packit |
ae235b |
39
|
|
Packit |
ae235b |
40
|
|
Packit |
ae235b |
41
|
|
Packit |
ae235b |
42
|
|
Packit |
ae235b |
43
|
|
Packit |
ae235b |
44
|
|
Packit |
ae235b |
45
|
|
Packit |
ae235b |
46
|
|
Packit |
ae235b |
47
|
|
Packit |
ae235b |
48
|
|
Packit |
ae235b |
49
|
|
Packit |
ae235b |
50
|
|
Packit |
ae235b |
51
|
|
Packit |
ae235b |
52
|
|
Packit |
ae235b |
53
|
|
Packit |
ae235b |
54
|
|
Packit |
ae235b |
55
|
|
Packit |
ae235b |
56
|
|
Packit |
ae235b |
57
|
|
Packit |
ae235b |
58
|
|
Packit |
ae235b |
59
|
|
Packit |
ae235b |
60
|
|
Packit |
ae235b |
61
|
|
Packit |
ae235b |
62
|
|
Packit |
ae235b |
63
|
|
Packit |
ae235b |
64
|
|
Packit |
ae235b |
65
|
|
Packit |
ae235b |
66
|
|
Packit |
ae235b |
67
|
|
Packit |
ae235b |
68
|
|
Packit |
ae235b |
69
|
|
Packit |
ae235b |
70
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_editable_lossy_compress (ViewerEditableLossy *editable)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
ViewerFile *self = VIEWER_FILE (editable);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_print ("File implementation of lossy editable interface compress method: %s.\n",
|
|
Packit |
ae235b |
self->filename);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_editable_lossy_interface_init (ViewerEditableLossyInterface *iface)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
iface->compress = viewer_file_editable_lossy_compress;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_editable_save (ViewerEditable *editable,
|
|
Packit |
ae235b |
GError **error)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
ViewerFile *self = VIEWER_FILE (editable);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_print ("File implementation of editable interface save method: %s.\n",
|
|
Packit |
ae235b |
self->filename);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_editable_undo (ViewerEditable *editable,
|
|
Packit |
ae235b |
guint n_steps)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
ViewerFile *self = VIEWER_FILE (editable);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_print ("File implementation of editable interface undo method: %s.\n",
|
|
Packit |
ae235b |
self->filename);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_editable_redo (ViewerEditable *editable,
|
|
Packit |
ae235b |
guint n_steps)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
ViewerFile *self = VIEWER_FILE (editable);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_print ("File implementation of editable interface redo method: %s.\n",
|
|
Packit |
ae235b |
self->filename);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_editable_interface_init (ViewerEditableInterface *iface)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
iface->save = viewer_file_editable_save;
|
|
Packit |
ae235b |
iface->undo = viewer_file_editable_undo;
|
|
Packit |
ae235b |
iface->redo = viewer_file_editable_redo;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_class_init (ViewerFileClass *klass)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
viewer_file_init (ViewerFile *self)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT,
|
|
Packit |
ae235b |
G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE,
|
|
Packit |
ae235b |
viewer_file_editable_interface_init)
|
|
Packit |
ae235b |
G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE_LOSSY,
|
|
Packit |
ae235b |
viewer_file_editable_lossy_interface_init))
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
It is very important to notice that the order in which interface
|
|
Packit |
ae235b |
implementations are added to the main object is not random:
|
|
Packit |
ae235b |
g_type_add_interface_static ,
|
|
Packit |
ae235b |
which is called by
|
|
Packit |
ae235b |
G_IMPLEMENT_INTERFACE ,
|
|
Packit |
ae235b |
must be invoked first on the interfaces which have no prerequisites and then on
|
|
Packit |
ae235b |
the others.
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
Generated by GTK-Doc V1.27
|
|
Packit |
ae235b |
</body>
|
|
Packit |
ae235b |
</html>
|