aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-binding.h
blob: 2cced75920dcf5276442ab9d962aec2c25b7545b (plain) (blame)
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
/*
 * e-binding.h
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) version 3.
 *
 * This program 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with the program; if not, see <http://www.gnu.org/licenses/>  
 *
 *
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
 *
 */

/* This is a direct rip-off of Xfce's excellent ExoBinding API,
 * which binds two GObject properties together.  ExoBinding was
 * written by Benedikt Meurer <benny@xfce.org>. */

#ifndef E_BINDING_H
#define E_BINDING_H

#include <glib-object.h>

G_BEGIN_DECLS

typedef struct _EBinding EBinding;
typedef struct _EBindingBase EBindingBase;
typedef struct _EBindingLink EBindingLink;
typedef struct _EMutualBinding EMutualBinding;

typedef gboolean    (*EBindingTransform)    (const GValue *src_value,
                         GValue *dst_value,
                         gpointer user_data);

struct _EBindingBase {
    GDestroyNotify destroy;
};

struct _EBindingLink {
    GObject *dst_object;
    GParamSpec *dst_pspec;
    gulong dst_handler; /* only set for mutual bindings */
    gulong handler;
    EBindingTransform transform;
    gpointer user_data;
};

struct _EBinding {
    /*< private >*/
    GObject *src_object;
    EBindingBase base;
    EBindingLink link;
};

struct _EMutualBinding {
    /*< private >*/
    EBindingBase  base;
    EBindingLink  direct;
    EBindingLink  reverse;
};

EBinding *  e_binding_new           (GObject *src_object,
                         const gchar *src_property,
                         GObject *dst_object,
                         const gchar *dst_property);
EBinding *  e_binding_new_full      (GObject *src_object,
                         const gchar *src_property,
                         GObject *dst_object,
                         const gchar *dst_property,
                         EBindingTransform transform,
                         GDestroyNotify destroy_notify,
                         gpointer user_data);
EBinding *  e_binding_new_with_negation (GObject *src_object,
                         const gchar *src_property,
                         GObject *dst_object,
                         const gchar *dst_property);
void        e_binding_unbind        (EBinding *binding);

EMutualBinding *e_mutual_binding_new        (GObject *object1,
                         const gchar *property1,
                         GObject *object2,
                         const gchar *property2);
EMutualBinding *e_mutual_binding_new_full   (GObject *object1,
                         const gchar *property1,
                         GObject *object2,
                         const gchar *property2,
                         EBindingTransform transform,
                         EBindingTransform reverse_transform,
                         GDestroyNotify destroy_notify,
                         gpointer user_data);
EMutualBinding *e_mutual_binding_new_with_negation
                        (GObject *object1,
                         const gchar *property1,
                         GObject *object2,
                         const gchar *property2);
void        e_mutual_binding_unbind     (EMutualBinding *binding);

G_END_DECLS

#endif /* E_BINDING_H */