1 /* GIMP - The GNU Image Manipulation Program
2 * Copyright (C) 1995 Spencer Kimball and Peter Mattis
3 *
4 * gimpuncancelablewaitable.c
5 * Copyright (C) 2018 Ell
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21 #include "config.h"
22
23 #include <gdk-pixbuf/gdk-pixbuf.h>
24 #include <gegl.h>
25
26 #include "core-types.h"
27
28 #include "gimpuncancelablewaitable.h"
29 #include "gimpwaitable.h"
30
31
32 /* local function prototypes */
33
34 static void gimp_uncancelable_waitable_waitable_iface_init (GimpWaitableInterface *iface);
35
36 static void gimp_uncancelable_waitable_finalize (GObject *object);
37
38 static void gimp_uncancelable_waitable_wait (GimpWaitable *waitable);
39 static gboolean gimp_uncancelable_waitable_try_wait (GimpWaitable *waitable);
40 static gboolean gimp_uncancelable_waitable_wait_until (GimpWaitable *waitable,
41 gint64 end_time);
42
43
G_DEFINE_TYPE_WITH_CODE(GimpUncancelableWaitable,gimp_uncancelable_waitable,G_TYPE_OBJECT,G_IMPLEMENT_INTERFACE (GIMP_TYPE_WAITABLE,gimp_uncancelable_waitable_waitable_iface_init))44 G_DEFINE_TYPE_WITH_CODE (GimpUncancelableWaitable, gimp_uncancelable_waitable, G_TYPE_OBJECT,
45 G_IMPLEMENT_INTERFACE (GIMP_TYPE_WAITABLE,
46 gimp_uncancelable_waitable_waitable_iface_init))
47
48 #define parent_class gimp_uncancelable_waitable_parent_class
49
50
51 /* private functions */
52
53
54 static void
55 gimp_uncancelable_waitable_class_init (GimpUncancelableWaitableClass *klass)
56 {
57 GObjectClass *object_class = G_OBJECT_CLASS (klass);
58
59 object_class->finalize = gimp_uncancelable_waitable_finalize;
60 }
61
62 static void
gimp_uncancelable_waitable_waitable_iface_init(GimpWaitableInterface * iface)63 gimp_uncancelable_waitable_waitable_iface_init (GimpWaitableInterface *iface)
64 {
65 iface->wait = gimp_uncancelable_waitable_wait;
66 iface->try_wait = gimp_uncancelable_waitable_try_wait;
67 iface->wait_until = gimp_uncancelable_waitable_wait_until;
68 }
69
70 static void
gimp_uncancelable_waitable_init(GimpUncancelableWaitable * uncancelable_waitable)71 gimp_uncancelable_waitable_init (GimpUncancelableWaitable *uncancelable_waitable)
72 {
73 }
74
75 static void
gimp_uncancelable_waitable_finalize(GObject * object)76 gimp_uncancelable_waitable_finalize (GObject *object)
77 {
78 GimpUncancelableWaitable *uncancelable_waitable =
79 GIMP_UNCANCELABLE_WAITABLE (object);
80
81 g_clear_object (&uncancelable_waitable->waitable);
82
83 G_OBJECT_CLASS (parent_class)->finalize (object);
84 }
85
86 static void
gimp_uncancelable_waitable_wait(GimpWaitable * waitable)87 gimp_uncancelable_waitable_wait (GimpWaitable *waitable)
88 {
89 GimpUncancelableWaitable *uncancelable_waitable =
90 GIMP_UNCANCELABLE_WAITABLE (waitable);
91
92 if (uncancelable_waitable->waitable)
93 gimp_waitable_wait (uncancelable_waitable->waitable);
94 }
95
96 static gboolean
gimp_uncancelable_waitable_try_wait(GimpWaitable * waitable)97 gimp_uncancelable_waitable_try_wait (GimpWaitable *waitable)
98 {
99 GimpUncancelableWaitable *uncancelable_waitable =
100 GIMP_UNCANCELABLE_WAITABLE (waitable);
101
102 if (uncancelable_waitable->waitable)
103 return gimp_waitable_try_wait (uncancelable_waitable->waitable);
104 else
105 return TRUE;
106 }
107
108 static gboolean
gimp_uncancelable_waitable_wait_until(GimpWaitable * waitable,gint64 end_time)109 gimp_uncancelable_waitable_wait_until (GimpWaitable *waitable,
110 gint64 end_time)
111 {
112 GimpUncancelableWaitable *uncancelable_waitable =
113 GIMP_UNCANCELABLE_WAITABLE (waitable);
114
115 if (uncancelable_waitable->waitable)
116 return gimp_waitable_wait_until (uncancelable_waitable->waitable, end_time);
117 else
118 return TRUE;
119 }
120
121
122 /* public functions */
123
124
125 GimpWaitable *
gimp_uncancelable_waitable_new(GimpWaitable * waitable)126 gimp_uncancelable_waitable_new (GimpWaitable *waitable)
127 {
128 GimpUncancelableWaitable *uncancelable_waitable;
129
130 g_return_val_if_fail (GIMP_IS_WAITABLE (waitable), NULL);
131
132 uncancelable_waitable = g_object_new (GIMP_TYPE_UNCANCELABLE_WAITABLE, NULL);
133
134 uncancelable_waitable->waitable = g_object_ref (waitable);
135
136 return GIMP_WAITABLE (uncancelable_waitable);
137 }
138