File: | typing-break/drw-break-window.c |
Warning: | line 504, column 3 This statement is never executed |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ |
2 | /* |
3 | * Copyright (C) 2002 CodeFactory AB |
4 | * Copyright (C) 2002-2003 Richard Hult <richard@imendio.com> |
5 | |
6 | * |
7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License as |
9 | * published by the Free Software Foundation; either version 2 of the |
10 | * License, or (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 GNU |
15 | * General Public License for more details. |
16 | * |
17 | * You should have received a copy of the GNU General Public |
18 | * License along with this program; if not, write to the |
19 | * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
20 | * Boston, MA 02110-1301, USA. |
21 | */ |
22 | |
23 | #include <config.h> |
24 | #include <string.h> |
25 | #include <math.h> |
26 | #include <glib/gi18n.h> |
27 | #include <ctk/ctk.h> |
28 | #include <cdk/cdkx.h> |
29 | #include <cdk/cdkkeysyms.h> |
30 | #include <gio/gio.h> |
31 | |
32 | #ifdef HAVE_KANBERRA_CTK1 |
33 | #include <kanberra-ctk.h> |
34 | #endif |
35 | |
36 | #include "drwright.h" |
37 | #include "drw-utils.h" |
38 | #include "drw-break-window.h" |
39 | #include "drw-timer.h" |
40 | |
41 | struct _DrwBreakWindowPrivate { |
42 | CtkWidget *clock_label; |
43 | CtkWidget *break_label; |
44 | CtkWidget *image; |
45 | |
46 | CtkWidget *postpone_entry; |
47 | CtkWidget *postpone_button; |
48 | |
49 | DrwTimer *timer; |
50 | |
51 | gint break_time; |
52 | gchar *break_text; |
53 | guint clock_timeout_id; |
54 | guint postpone_timeout_id; |
55 | guint postpone_sensitize_id; |
56 | }; |
57 | |
58 | #define POSTPONE_CANCEL30 30 |
59 | |
60 | /* Signals */ |
61 | enum { |
62 | DONE, |
63 | POSTPONE, |
64 | LAST_SIGNAL |
65 | }; |
66 | |
67 | static void drw_break_window_finalize (GObject *object); |
68 | static void drw_break_window_dispose (GObject *object); |
69 | static gboolean postpone_sensitize_cb (DrwBreakWindow *window); |
70 | static gboolean clock_timeout_cb (DrwBreakWindow *window); |
71 | static void postpone_clicked_cb (CtkWidget *button, |
72 | CtkWidget *window); |
73 | static gboolean label_draw_event_cb (CtkLabel *label, |
74 | cairo_t *cr, |
75 | gpointer user_data); |
76 | static void label_size_allocate_cb (CtkLabel *label, |
77 | CdkRectangle *allocation, |
78 | gpointer user_data); |
79 | |
80 | G_DEFINE_TYPE_WITH_PRIVATE (DrwBreakWindow, drw_break_window, CTK_TYPE_WINDOW)static void drw_break_window_init (DrwBreakWindow *self); static void drw_break_window_class_init (DrwBreakWindowClass *klass ); static GType drw_break_window_get_type_once (void); static gpointer drw_break_window_parent_class = ((void*)0); static gint DrwBreakWindow_private_offset; static void drw_break_window_class_intern_init (gpointer klass) { drw_break_window_parent_class = g_type_class_peek_parent (klass); if (DrwBreakWindow_private_offset != 0) g_type_class_adjust_private_offset (klass, &DrwBreakWindow_private_offset); drw_break_window_class_init ((DrwBreakWindowClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer drw_break_window_get_instance_private (DrwBreakWindow *self) { return (((gpointer) ((guint8*) (self ) + (glong) (DrwBreakWindow_private_offset)))); } GType drw_break_window_get_type (void) { static GType static_g_define_type_id = 0; if ((__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id) == sizeof (gpointer), "Expression evaluates to false"); (void) ( 0 ? (gpointer) * (&static_g_define_type_id) : ((void*)0)) ; (!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id ) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (*(&static_g_define_type_id)) gapg_temp_newval; __typeof__ ((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id ); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5) ; gapg_temp_newval; })) && g_once_init_enter_pointer ( &static_g_define_type_id)); })) ) { GType g_define_type_id = drw_break_window_get_type_once (); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id) == sizeof (gpointer) , "Expression evaluates to false"); 0 ? (void) (*(&static_g_define_type_id ) = (g_define_type_id)) : (void) 0; g_once_init_leave_pointer ((&static_g_define_type_id), (gpointer) (guintptr) (g_define_type_id )); })) ; } return static_g_define_type_id; } __attribute__ ( (__noinline__)) static GType drw_break_window_get_type_once ( void) { GType g_define_type_id = g_type_register_static_simple ((ctk_window_get_type ()), g_intern_static_string ("DrwBreakWindow" ), sizeof (DrwBreakWindowClass), (GClassInitFunc)(void (*)(void )) drw_break_window_class_intern_init, sizeof (DrwBreakWindow ), (GInstanceInitFunc)(void (*)(void)) drw_break_window_init, (GTypeFlags) 0); { {{ DrwBreakWindow_private_offset = g_type_add_instance_private (g_define_type_id, sizeof (DrwBreakWindowPrivate)); };} } return g_define_type_id; } |
81 | |
82 | static guint signals[LAST_SIGNAL] = { 0 }; |
83 | |
84 | static void |
85 | drw_break_window_class_init (DrwBreakWindowClass *klass) |
86 | { |
87 | GObjectClass *object_class = G_OBJECT_CLASS (klass)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((klass)), (((GType) ((20) << (2)))))))); |
88 | |
89 | object_class->finalize = drw_break_window_finalize; |
90 | object_class->dispose = drw_break_window_dispose; |
91 | |
92 | signals[POSTPONE] = |
93 | g_signal_new ("postpone", |
94 | G_TYPE_FROM_CLASS (klass)(((GTypeClass*) (klass))->g_type), |
95 | G_SIGNAL_RUN_LAST, |
96 | 0, |
97 | NULL((void*)0), NULL((void*)0), |
98 | g_cclosure_marshal_VOID__VOID, |
99 | G_TYPE_NONE((GType) ((1) << (2))), 0); |
100 | |
101 | signals[DONE] = |
102 | g_signal_new ("done", |
103 | G_TYPE_FROM_CLASS (klass)(((GTypeClass*) (klass))->g_type), |
104 | G_SIGNAL_RUN_LAST, |
105 | 0, |
106 | NULL((void*)0), NULL((void*)0), |
107 | g_cclosure_marshal_VOID__VOID, |
108 | G_TYPE_NONE((GType) ((1) << (2))), 0); |
109 | } |
110 | |
111 | static void |
112 | drw_break_window_init (DrwBreakWindow *window) |
113 | { |
114 | DrwBreakWindowPrivate *priv; |
115 | CtkWidget *vbox; |
116 | CtkWidget *hbox; |
117 | gchar *str; |
118 | CtkWidget *outer_vbox; |
119 | CtkWidget *button_box; |
120 | gboolean allow_postpone; |
121 | |
122 | gint root_monitor = 0; |
123 | CdkScreen *screen = NULL((void*)0); |
124 | CdkDisplay *display; |
125 | CdkRectangle monitor; |
126 | gint right_padding; |
127 | gint bottom_padding; |
128 | gint scale; |
129 | GSettings *settings; |
130 | |
131 | priv = drw_break_window_get_instance_private (window); |
132 | window->priv = priv; |
133 | |
134 | settings = g_settings_new (TYPING_BREAK_SCHEMA"org.cafe.typing-break"); |
135 | |
136 | priv->break_time = 60 * g_settings_get_int (settings, "break-time"); |
137 | |
138 | allow_postpone = g_settings_get_boolean (settings, "allow-postpone"); |
139 | g_object_unref (settings); |
140 | |
141 | ctk_window_set_keep_above (CTK_WINDOW (window)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_window_get_type ())))))), TRUE(!(0))); |
142 | ctk_window_fullscreen (CTK_WINDOW (window)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_window_get_type ()))))))); |
143 | ctk_window_set_modal (CTK_WINDOW (window)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_window_get_type ())))))), TRUE(!(0))); |
144 | |
145 | screen = cdk_screen_get_default (); |
146 | display = cdk_screen_get_display (screen); |
147 | scale = ctk_widget_get_scale_factor (CTK_WIDGET (window)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_widget_get_type ()))))))); |
148 | |
149 | cdk_monitor_get_geometry (cdk_display_get_monitor (display, root_monitor), &monitor); |
150 | |
151 | ctk_window_set_default_size (CTK_WINDOW (window)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_window_get_type ())))))), |
152 | WidthOfScreen (cdk_x11_screen_get_xscreen (screen))((cdk_x11_screen_get_xscreen (screen))->width) / scale, |
153 | HeightOfScreen (cdk_x11_screen_get_xscreen (screen))((cdk_x11_screen_get_xscreen (screen))->height) / scale); |
154 | |
155 | ctk_window_set_decorated (CTK_WINDOW (window)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_window_get_type ())))))), FALSE(0)); |
156 | ctk_widget_set_app_paintable (CTK_WIDGET (window)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_widget_get_type ())))))), TRUE(!(0))); |
157 | drw_setup_background (CTK_WIDGET (window)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_widget_get_type ()))))))); |
158 | |
159 | right_padding = WidthOfScreen (cdk_x11_screen_get_xscreen (screen))((cdk_x11_screen_get_xscreen (screen))->width) / scale - monitor.width - monitor.x; |
160 | bottom_padding = HeightOfScreen (cdk_x11_screen_get_xscreen (screen))((cdk_x11_screen_get_xscreen (screen))->height) / scale - monitor.height - monitor.y; |
161 | |
162 | outer_vbox = ctk_box_new (CTK_ORIENTATION_VERTICAL, 0); |
163 | ctk_widget_set_hexpand (outer_vbox, TRUE(!(0))); |
164 | ctk_widget_set_vexpand (outer_vbox, TRUE(!(0))); |
165 | ctk_widget_set_margin_top (outer_vbox, monitor.y); |
166 | ctk_widget_set_margin_bottom (outer_vbox, bottom_padding); |
167 | ctk_widget_set_margin_start (outer_vbox, monitor.x); |
168 | ctk_widget_set_margin_end (outer_vbox, right_padding); |
169 | ctk_widget_show (outer_vbox); |
170 | |
171 | ctk_container_add (CTK_CONTAINER (window)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_container_get_type ())))))), outer_vbox); |
172 | |
173 | if (allow_postpone) { |
174 | button_box = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 0); |
175 | ctk_widget_show (button_box); |
176 | |
177 | ctk_container_set_border_width (CTK_CONTAINER (button_box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((button_box)), ((ctk_container_get_type ())))))), 12); |
178 | |
179 | priv->postpone_button = ctk_button_new_with_mnemonic (_("_Postpone Break")gettext ("_Postpone Break")); |
180 | ctk_widget_show (priv->postpone_button); |
181 | |
182 | ctk_widget_set_sensitive (priv->postpone_button, FALSE(0)); |
183 | |
184 | if (priv->postpone_sensitize_id) { |
185 | g_source_remove (priv->postpone_sensitize_id); |
186 | } |
187 | |
188 | priv->postpone_sensitize_id = g_timeout_add_seconds (5, |
189 | (GSourceFunc) postpone_sensitize_cb, |
190 | window); |
191 | |
192 | g_signal_connect (priv->postpone_button,g_signal_connect_data ((priv->postpone_button), ("clicked" ), (((GCallback) (postpone_clicked_cb))), (window), ((void*)0 ), (GConnectFlags) 0) |
193 | "clicked",g_signal_connect_data ((priv->postpone_button), ("clicked" ), (((GCallback) (postpone_clicked_cb))), (window), ((void*)0 ), (GConnectFlags) 0) |
194 | G_CALLBACK (postpone_clicked_cb),g_signal_connect_data ((priv->postpone_button), ("clicked" ), (((GCallback) (postpone_clicked_cb))), (window), ((void*)0 ), (GConnectFlags) 0) |
195 | window)g_signal_connect_data ((priv->postpone_button), ("clicked" ), (((GCallback) (postpone_clicked_cb))), (window), ((void*)0 ), (GConnectFlags) 0); |
196 | |
197 | ctk_box_pack_end (CTK_BOX (button_box)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((button_box)), ((ctk_box_get_type ())))))), priv->postpone_button, FALSE(0), TRUE(!(0)), 0); |
198 | |
199 | priv->postpone_entry = ctk_entry_new (); |
200 | ctk_entry_set_has_frame (CTK_ENTRY (priv->postpone_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((priv->postpone_entry)), ((ctk_entry_get_type ())))))), FALSE(0)); |
201 | |
202 | ctk_box_pack_end (CTK_BOX (button_box)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((button_box)), ((ctk_box_get_type ())))))), priv->postpone_entry, FALSE(0), TRUE(!(0)), 4); |
203 | |
204 | ctk_box_pack_end (CTK_BOX (outer_vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((outer_vbox)), ((ctk_box_get_type ())))))), button_box, FALSE(0), TRUE(!(0)), 0); |
205 | } |
206 | |
207 | vbox = ctk_box_new (CTK_ORIENTATION_VERTICAL, 0); |
208 | ctk_widget_set_halign (vbox, CTK_ALIGN_CENTER); |
209 | ctk_widget_set_valign (vbox, CTK_ALIGN_CENTER); |
210 | ctk_widget_show (vbox); |
211 | |
212 | ctk_box_pack_start (CTK_BOX (outer_vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((outer_vbox)), ((ctk_box_get_type ())))))), vbox, TRUE(!(0)), TRUE(!(0)), 0); |
213 | |
214 | hbox = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 0); |
215 | ctk_widget_show (hbox); |
216 | ctk_box_pack_start (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((vbox)), ((ctk_box_get_type ())))))), hbox, TRUE(!(0)), FALSE(0), 0); |
217 | |
218 | priv->image = ctk_image_new_from_icon_name ("process-stop", CTK_ICON_SIZE_DIALOG); |
219 | ctk_widget_set_halign (priv->image, CTK_ALIGN_END); |
220 | ctk_widget_set_valign (priv->image, CTK_ALIGN_CENTER); |
221 | ctk_widget_show (priv->image); |
222 | ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((hbox)), ((ctk_box_get_type ())))))), priv->image, TRUE(!(0)), TRUE(!(0)), 8); |
223 | |
224 | priv->break_label = ctk_label_new (NULL((void*)0)); |
225 | ctk_widget_show (priv->break_label); |
226 | |
227 | g_signal_connect (priv->break_label,g_signal_connect_data ((priv->break_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
228 | "draw",g_signal_connect_data ((priv->break_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
229 | G_CALLBACK (label_draw_event_cb),g_signal_connect_data ((priv->break_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
230 | NULL)g_signal_connect_data ((priv->break_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0); |
231 | |
232 | g_signal_connect_after (priv->break_label,g_signal_connect_data ((priv->break_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER) |
233 | "size-allocate",g_signal_connect_data ((priv->break_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER) |
234 | G_CALLBACK (label_size_allocate_cb),g_signal_connect_data ((priv->break_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER) |
235 | NULL)g_signal_connect_data ((priv->break_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER); |
236 | |
237 | str = g_strdup_printf ("<span size=\"xx-large\" foreground=\"white\"><b>%s</b></span>", |
238 | _("Take a break!")gettext ("Take a break!")); |
239 | ctk_label_set_markup (CTK_LABEL (priv->break_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((priv->break_label)), ((ctk_label_get_type ())))))), str); |
240 | g_free (str); |
241 | |
242 | ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((hbox)), ((ctk_box_get_type ())))))), priv->break_label, FALSE(0), FALSE(0), 12); |
243 | |
244 | |
245 | priv->clock_label = ctk_label_new (NULL((void*)0)); |
246 | ctk_widget_show (priv->clock_label); |
247 | ctk_box_pack_start (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((vbox)), ((ctk_box_get_type ())))))), priv->clock_label, TRUE(!(0)), TRUE(!(0)), 8); |
248 | |
249 | g_signal_connect (priv->clock_label,g_signal_connect_data ((priv->clock_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
250 | "draw",g_signal_connect_data ((priv->clock_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
251 | G_CALLBACK (label_draw_event_cb),g_signal_connect_data ((priv->clock_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
252 | NULL)g_signal_connect_data ((priv->clock_label), ("draw"), (((GCallback ) (label_draw_event_cb))), (((void*)0)), ((void*)0), (GConnectFlags ) 0); |
253 | |
254 | g_signal_connect_after (priv->clock_label,g_signal_connect_data ((priv->clock_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER) |
255 | "size-allocate",g_signal_connect_data ((priv->clock_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER) |
256 | G_CALLBACK (label_size_allocate_cb),g_signal_connect_data ((priv->clock_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER) |
257 | NULL)g_signal_connect_data ((priv->clock_label), ("size-allocate" ), (((GCallback) (label_size_allocate_cb))), (((void*)0)), (( void*)0), G_CONNECT_AFTER); |
258 | |
259 | ctk_window_stick (CTK_WINDOW (window)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((ctk_window_get_type ()))))))); |
260 | |
261 | priv->timer = drw_timer_new (); |
262 | |
263 | /* Make sure we have a valid time label from the start. */ |
264 | clock_timeout_cb (window); |
265 | |
266 | priv->clock_timeout_id = g_timeout_add (1000, |
267 | (GSourceFunc) clock_timeout_cb, |
268 | window); |
269 | #ifdef HAVE_KANBERRA_CTK1 |
270 | ka_context_play (ka_ctk_context_get (), 0, KA_PROP_EVENT_ID"event.id", "desktop-screen-lock", NULL((void*)0)); |
271 | #endif |
272 | } |
273 | |
274 | static void |
275 | drw_break_window_finalize (GObject *object) |
276 | { |
277 | DrwBreakWindow *window = DRW_BREAK_WINDOW (object)((((DrwBreakWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((drw_break_window_get_type ())))))); |
278 | DrwBreakWindowPrivate *priv; |
279 | |
280 | priv = window->priv; |
281 | |
282 | if (priv->clock_timeout_id != 0) { |
283 | g_source_remove (priv->clock_timeout_id); |
284 | } |
285 | |
286 | if (priv->postpone_timeout_id != 0) { |
287 | g_source_remove (priv->postpone_timeout_id); |
288 | } |
289 | |
290 | if (priv->postpone_sensitize_id != 0) { |
291 | g_source_remove (priv->postpone_sensitize_id); |
292 | } |
293 | |
294 | window->priv = NULL((void*)0); |
295 | |
296 | if (G_OBJECT_CLASS (drw_break_window_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((drw_break_window_parent_class)), (((GType) ((20) << (2))))))))->finalize) { |
297 | (* G_OBJECT_CLASS (drw_break_window_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((drw_break_window_parent_class)), (((GType) ((20) << (2))))))))->finalize) (object); |
298 | } |
299 | } |
300 | |
301 | static void |
302 | drw_break_window_dispose (GObject *object) |
303 | { |
304 | DrwBreakWindow *window = DRW_BREAK_WINDOW (object)((((DrwBreakWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((drw_break_window_get_type ())))))); |
305 | DrwBreakWindowPrivate *priv; |
306 | |
307 | priv = window->priv; |
308 | |
309 | if (priv->timer) { |
310 | drw_timer_destroy (priv->timer); |
311 | priv->timer = NULL((void*)0); |
312 | } |
313 | |
314 | if (priv->clock_timeout_id != 0) { |
315 | g_source_remove (priv->clock_timeout_id); |
316 | priv->clock_timeout_id = 0; |
317 | } |
318 | |
319 | if (priv->postpone_timeout_id != 0) { |
320 | g_source_remove (priv->postpone_timeout_id); |
321 | priv->postpone_timeout_id = 0; |
322 | } |
323 | |
324 | if (priv->postpone_sensitize_id != 0) { |
325 | g_source_remove (priv->postpone_sensitize_id); |
326 | } |
327 | |
328 | if (G_OBJECT_CLASS (drw_break_window_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((drw_break_window_parent_class)), (((GType) ((20) << (2))))))))->dispose) { |
329 | (* G_OBJECT_CLASS (drw_break_window_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((drw_break_window_parent_class)), (((GType) ((20) << (2))))))))->dispose) (object); |
330 | } |
331 | } |
332 | |
333 | CtkWidget * |
334 | drw_break_window_new (void) |
335 | { |
336 | GObject *object; |
337 | |
338 | object = g_object_new (DRW_TYPE_BREAK_WINDOW(drw_break_window_get_type ()), |
339 | "type", CTK_WINDOW_POPUP, |
340 | "skip-taskbar-hint", TRUE(!(0)), |
341 | "skip-pager-hint", TRUE(!(0)), |
342 | "focus-on-map", TRUE(!(0)), |
343 | NULL((void*)0)); |
344 | |
345 | return CTK_WIDGET (object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((ctk_widget_get_type ())))))); |
346 | } |
347 | |
348 | static gboolean |
349 | postpone_sensitize_cb (DrwBreakWindow *window) |
350 | { |
351 | DrwBreakWindowPrivate *priv; |
352 | |
353 | priv = window->priv; |
354 | |
355 | ctk_widget_set_sensitive (priv->postpone_button, TRUE(!(0))); |
356 | |
357 | priv->postpone_sensitize_id = 0; |
358 | return FALSE(0); |
359 | } |
360 | |
361 | static gboolean |
362 | clock_timeout_cb (DrwBreakWindow *window) |
363 | { |
364 | DrwBreakWindowPrivate *priv; |
365 | gchar *txt; |
366 | gint minutes; |
367 | gint seconds; |
368 | |
369 | g_return_val_if_fail (DRW_IS_BREAK_WINDOW (window), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((window)); GType __t = ((drw_break_window_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char* ) (__func__)), "DRW_IS_BREAK_WINDOW (window)"); return ((0)); } } while (0); |
370 | |
371 | priv = window->priv; |
372 | |
373 | seconds = 1 + priv->break_time - drw_timer_elapsed (priv->timer); |
374 | seconds = MAX (0, seconds)(((0)>(seconds))?(0):(seconds)); |
375 | |
376 | if (seconds == 0) { |
377 | /* Zero this out so the finalizer doesn't try to remove the |
378 | * source, which would be done in the timeout callback == |
379 | * no-no. |
380 | */ |
381 | priv->clock_timeout_id = 0; |
382 | |
383 | #ifdef HAVE_KANBERRA_CTK1 |
384 | ka_context_play (ka_ctk_context_get (), 0, KA_PROP_EVENT_ID"event.id", "alarm-clock-elapsed", NULL((void*)0)); |
385 | #endif |
386 | g_signal_emit (window, signals[DONE], 0, NULL((void*)0)); |
387 | |
388 | return FALSE(0); |
389 | } |
390 | |
391 | minutes = seconds / 60; |
392 | seconds -= minutes * 60; |
393 | |
394 | txt = g_strdup_printf ("<span size=\"25000\" foreground=\"white\"><b>%d:%02d</b></span>", |
395 | minutes, |
396 | seconds); |
397 | ctk_label_set_markup (CTK_LABEL (priv->clock_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((priv->clock_label)), ((ctk_label_get_type ())))))), txt); |
398 | g_free (txt); |
399 | |
400 | return TRUE(!(0)); |
401 | } |
402 | |
403 | static void |
404 | postpone_entry_activate_cb (CtkWidget *entry, |
405 | DrwBreakWindow *window) |
406 | { |
407 | const gchar *str; |
408 | gchar *phrase; |
409 | GSettings *settings = g_settings_new (TYPING_BREAK_SCHEMA"org.cafe.typing-break"); |
410 | |
411 | str = ctk_entry_get_text (CTK_ENTRY (entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((entry)), ((ctk_entry_get_type ()))))))); |
412 | |
413 | phrase = g_settings_get_string (settings, "unlock-phrase"); |
414 | g_object_unref (settings); |
415 | |
416 | if (!strcmp (str, phrase)) { |
417 | g_signal_emit (window, signals[POSTPONE], 0, NULL((void*)0)); |
418 | g_free (phrase); |
419 | return; |
420 | } |
421 | |
422 | g_free (phrase); |
423 | ctk_entry_set_text (CTK_ENTRY (entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((entry)), ((ctk_entry_get_type ())))))), ""); |
424 | } |
425 | |
426 | static gboolean |
427 | grab_on_window (CdkWindow *window, |
428 | guint32 activate_time) |
429 | { |
430 | CdkDisplay *display; |
431 | CdkSeat *seat; |
432 | |
433 | display = cdk_window_get_display (window); |
434 | seat = cdk_display_get_default_seat (display); |
435 | |
436 | return (cdk_seat_grab (seat, |
437 | window, |
438 | CDK_SEAT_CAPABILITY_ALL, |
439 | TRUE(!(0)), |
440 | NULL((void*)0), |
441 | NULL((void*)0), |
442 | NULL((void*)0), |
443 | NULL((void*)0)) == CDK_GRAB_SUCCESS); |
444 | } |
445 | |
446 | static gboolean |
447 | postpone_cancel_cb (DrwBreakWindow *window) |
448 | { |
449 | DrwBreakWindowPrivate *priv; |
450 | |
451 | priv = window->priv; |
452 | |
453 | ctk_entry_set_text (CTK_ENTRY (priv->postpone_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((priv->postpone_entry)), ((ctk_entry_get_type ())))))), ""); |
454 | ctk_widget_hide (priv->postpone_entry); |
455 | |
456 | priv->postpone_timeout_id = 0; |
457 | |
458 | return FALSE(0); |
459 | } |
460 | |
461 | static gboolean |
462 | postpone_entry_key_press_event_cb (CtkEntry *entry, |
463 | CdkEventKey *event, |
464 | DrwBreakWindow *window) |
465 | { |
466 | DrwBreakWindowPrivate *priv; |
467 | |
468 | priv = window->priv; |
469 | |
470 | if (event->keyval == CDK_KEY_Escape0xff1b) { |
471 | if (priv->postpone_timeout_id) { |
472 | g_source_remove (priv->postpone_timeout_id); |
473 | } |
474 | |
475 | postpone_cancel_cb (window); |
476 | |
477 | return TRUE(!(0)); |
478 | } |
479 | |
480 | g_source_remove (priv->postpone_timeout_id); |
481 | |
482 | priv->postpone_timeout_id = g_timeout_add_seconds (POSTPONE_CANCEL30, (GSourceFunc) postpone_cancel_cb, window); |
483 | |
484 | return FALSE(0); |
485 | } |
486 | |
487 | static void |
488 | postpone_clicked_cb (CtkWidget *button, |
489 | CtkWidget *window) |
490 | { |
491 | DrwBreakWindow *bw = DRW_BREAK_WINDOW (window)((((DrwBreakWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), ((drw_break_window_get_type ())))))); |
492 | DrwBreakWindowPrivate *priv = bw->priv; |
493 | gchar *phrase; |
494 | |
495 | /* Disable the phrase for now. */ |
496 | phrase = NULL((void*)0); /*g_settings_get_string (settings, "unlock-phrase");*/ |
497 | |
498 | if (!phrase || !phrase[0]) { |
499 | g_signal_emit (window, signals[POSTPONE], 0, NULL((void*)0)); |
500 | return; |
501 | } |
502 | |
503 | if (ctk_widget_get_visible (priv->postpone_entry)) { |
504 | ctk_widget_activate (priv->postpone_entry); |
This statement is never executed | |
505 | return; |
506 | } |
507 | |
508 | ctk_widget_show (priv->postpone_entry); |
509 | |
510 | priv->postpone_timeout_id = g_timeout_add_seconds (POSTPONE_CANCEL30, (GSourceFunc) postpone_cancel_cb, bw); |
511 | |
512 | grab_on_window (ctk_widget_get_window (priv->postpone_entry), ctk_get_current_event_time ()); |
513 | |
514 | ctk_widget_grab_focus (priv->postpone_entry); |
515 | |
516 | g_signal_connect (priv->postpone_entry,g_signal_connect_data ((priv->postpone_entry), ("activate" ), (((GCallback) (postpone_entry_activate_cb))), (bw), ((void *)0), (GConnectFlags) 0) |
517 | "activate",g_signal_connect_data ((priv->postpone_entry), ("activate" ), (((GCallback) (postpone_entry_activate_cb))), (bw), ((void *)0), (GConnectFlags) 0) |
518 | G_CALLBACK (postpone_entry_activate_cb),g_signal_connect_data ((priv->postpone_entry), ("activate" ), (((GCallback) (postpone_entry_activate_cb))), (bw), ((void *)0), (GConnectFlags) 0) |
519 | bw)g_signal_connect_data ((priv->postpone_entry), ("activate" ), (((GCallback) (postpone_entry_activate_cb))), (bw), ((void *)0), (GConnectFlags) 0); |
520 | |
521 | g_signal_connect (priv->postpone_entry,g_signal_connect_data ((priv->postpone_entry), ("key_press_event" ), (((GCallback) (postpone_entry_key_press_event_cb))), (bw), ((void*)0), (GConnectFlags) 0) |
522 | "key_press_event",g_signal_connect_data ((priv->postpone_entry), ("key_press_event" ), (((GCallback) (postpone_entry_key_press_event_cb))), (bw), ((void*)0), (GConnectFlags) 0) |
523 | G_CALLBACK (postpone_entry_key_press_event_cb),g_signal_connect_data ((priv->postpone_entry), ("key_press_event" ), (((GCallback) (postpone_entry_key_press_event_cb))), (bw), ((void*)0), (GConnectFlags) 0) |
524 | bw)g_signal_connect_data ((priv->postpone_entry), ("key_press_event" ), (((GCallback) (postpone_entry_key_press_event_cb))), (bw), ((void*)0), (GConnectFlags) 0); |
525 | } |
526 | |
527 | static void |
528 | get_layout_location (CtkLabel *label, |
529 | gint *xp, |
530 | gint *yp) |
531 | { |
532 | CtkWidget *widget; |
533 | CtkAllocation widget_allocation; |
534 | CtkRequisition widget_requisition; |
535 | gfloat xalign, yalign; |
536 | gint x, y; |
537 | gint xpad, ypad; |
538 | gint margin_start, margin_end, margin_top, margin_bottom; |
539 | gint scale; |
540 | |
541 | widget = CTK_WIDGET (label)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((label)), ((ctk_widget_get_type ())))))); |
542 | |
543 | scale = ctk_widget_get_scale_factor (widget); |
544 | xalign = ctk_label_get_xalign (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((label)), ((ctk_label_get_type ()))))))); |
545 | yalign = ctk_label_get_yalign (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((label)), ((ctk_label_get_type ()))))))); |
546 | margin_start = ctk_widget_get_margin_start (widget); |
547 | margin_end = ctk_widget_get_margin_end (widget); |
548 | margin_top = ctk_widget_get_margin_top (widget); |
549 | margin_bottom = ctk_widget_get_margin_bottom (widget); |
550 | |
551 | xpad = margin_start + margin_end; |
552 | ypad = margin_top + margin_bottom; |
553 | |
554 | ctk_widget_get_allocation (widget, &widget_allocation); |
555 | ctk_widget_get_preferred_size (widget, &widget_requisition, NULL((void*)0)); |
556 | widget_allocation.x /= scale; |
557 | widget_allocation.y /= scale; |
558 | widget_requisition.width /= scale; |
559 | widget_requisition.height /= scale; |
560 | |
561 | if (ctk_widget_get_direction (widget) != CTK_TEXT_DIR_LTR) |
562 | xalign = 1.0 - xalign; |
563 | |
564 | x = floor (widget_allocation.x + (int)xpad |
565 | + ((widget_allocation.width - widget_requisition.width - 1) * xalign) |
566 | + 0.5); |
567 | |
568 | y = floor (widget_allocation.y + (int)ypad |
569 | + ((widget_allocation.height - widget_requisition.height - 1) * yalign) |
570 | + 0.5); |
571 | |
572 | if (xp) { |
573 | *xp = x; |
574 | } |
575 | |
576 | if (yp) { |
577 | *yp = y; |
578 | } |
579 | } |
580 | |
581 | static gboolean |
582 | label_draw_event_cb (CtkLabel *label, |
583 | cairo_t *cr, |
584 | gpointer user_data) |
585 | { |
586 | gint x, y; |
587 | CtkWidget *widget; |
588 | |
589 | get_layout_location (label, &x, &y); |
590 | |
591 | widget = CTK_WIDGET (label)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((label)), ((ctk_widget_get_type ())))))); |
592 | |
593 | pango_cairo_show_layout (cr, ctk_label_get_layout (label)); |
594 | |
595 | ctk_paint_layout (ctk_widget_get_style (widget), |
596 | cr, |
597 | ctk_widget_get_state (widget), |
598 | FALSE(0), |
599 | widget, |
600 | "label", |
601 | x, y, |
602 | ctk_label_get_layout (label)); |
603 | |
604 | return TRUE(!(0)); |
605 | } |
606 | |
607 | static void |
608 | label_size_allocate_cb (CtkLabel *label, |
609 | CdkRectangle *allocation, |
610 | gpointer user_data) |
611 | { |
612 | allocation->width += 1; |
613 | allocation->height += 1; |
614 | } |