~ubuntu-branches/debian/experimental/xfce4-panel/experimental

« back to all changes in this revision

Viewing changes to plugins/clock/clock-analog.c

  • Committer: Bazaar Package Importer
  • Author(s): Yves-Alexis Perez, Lionel Le Folgoc, Yves-Alexis Perez
  • Date: 2011-02-06 18:10:07 UTC
  • mfrom: (1.3.13 upstream) (5.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20110206181007-vpw5z3xnm3hdvybx
Tags: 4.8.1-1
[ Lionel Le Folgoc ]
* New upstream bugfix release.
* debian/control:
  - refreshed (b-)deps for this new major release
  - add myself to Uploaders
  - bump Standards-Version to 3.9.1.
* debian/NEWS: dropped, unneeded.
* debian/xfce4-panel.shlibs: refreshed, bump to (>= 4.7.2).
* debian/xfce4-panel.lintian-overrides: refreshed, new lib name.
* debian/xfce4-panel.preinst: added, handles removal of old conffiles.
* debian/xfce4-panel.postinst: explicitly set -e.
* debian/*.install: refreshed.
* debian/rules:
  - call dpkg-buildflags
  - dropped rc files mangling as they don't exist anymore
  - updated removal of *.{l,}a files.
  - drop overrides for dh_auto_{configure,clean}, obsolete.
* debian/xfce4-panel.{preinst,postinst,prerm}: use dpkg-maintscript-helper
  to remove pre-xfconf config files.
* Bugs fixed by 4.7.x/4.8.x series:
  - rgba support                                                  lp: #586012
  - disappearing menus                                             lp: #53897
  - xrandr support                               lp: #176174, Closes: #432914
  - Fails to reap children, creating zombies                      lp: #420187
  - DND of desktop-files on the panel to create new launchers Closes: #480380
* Bumped shlibs to >= 4.7.7, abi break for external plugins.

[ Yves-Alexis Perez ]
* New upstream development release
* debian/xfce4-panel.install:
  - install wrapper and migrate tools in xfce4-panel package
  - update plugins paths
* debian/rules:
  - update path when removing .a/.la files for plugins.
  - add hardening flags to {C,LD}FLAGS
* debian/control:
  - add build-dep on hardening-includes
  - update build-dep on garcon to 0.1.4.
* debian/copyright updated for new release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id$ */
2
1
/*
3
 
 * Copyright (c) 2007 Nick Schermer <nick@xfce.org>
 
2
 * Copyright (C) 2007-2010 Nick Schermer <nick@xfce.org>
4
3
 *
5
 
 * This program is free software; you can redistribute it and/or modify it
 
4
 * This library is free software; you can redistribute it and/or modify it
6
5
 * under the terms of the GNU General Public License as published by the Free
7
6
 * Software Foundation; either version 2 of the License, or (at your option)
8
7
 * any later version.
9
8
 *
10
 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 
9
 * This library is distributed in the hope that it will be useful, but WITHOUT
11
10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13
12
 * more details.
14
13
 *
15
 
 * You should have received a copy of the GNU General Public License along with
16
 
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
17
 
 * Place, Suite 330, Boston, MA  02111-1307  USA
 
14
 * You should have received a copy of the GNU Library General Public License
 
15
 * along with this library; if not, write to the Free Software Foundation,
 
16
 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
18
17
 */
19
18
 
20
19
#ifdef HAVE_CONFIG_H
34
33
#include "clock.h"
35
34
#include "clock-analog.h"
36
35
 
37
 
#ifndef M_PI
38
 
#define M_PI 3.14159265358979323846
39
 
#endif
40
 
 
41
36
#define CLOCK_SCALE 0.1
42
 
#define TICKS_TO_RADIANS(x)   (M_PI - (M_PI / 30.0) * (x))
43
 
#define HOURS_TO_RADIANS(x,y) (M_PI - (M_PI / 6.0) * (((x) > 12 ? (x) - 12 : (x)) + (y) / 60.0))
44
 
 
45
 
 
46
 
 
47
 
/* prototypes */
48
 
static void      xfce_clock_analog_finalize      (GObject              *object);
 
37
#define TICKS_TO_RADIANS(x)   (G_PI - (G_PI / 30.0) * (x))
 
38
#define HOURS_TO_RADIANS(x,y) (G_PI - (G_PI / 6.0) * (((x) > 12 ? (x) - 12 : (x)) + (y) / 60.0))
 
39
 
 
40
 
 
41
 
49
42
static void      xfce_clock_analog_set_property  (GObject              *object,
50
43
                                                  guint                 prop_id,
51
44
                                                  const GValue         *value,
54
47
                                                  guint                 prop_id,
55
48
                                                  GValue               *value,
56
49
                                                  GParamSpec           *pspec);
57
 
static void      xfce_clock_analog_size_request  (GtkWidget            *widget,
58
 
                                                  GtkRequisition       *requisition);
 
50
static void      xfce_clock_analog_finalize      (GObject              *object);
59
51
static gboolean  xfce_clock_analog_expose_event  (GtkWidget            *widget,
60
52
                                                  GdkEventExpose       *event);
61
53
static void      xfce_clock_analog_draw_ticks    (cairo_t              *cr,
69
61
                                                  gdouble               angle,
70
62
                                                  gdouble               scale,
71
63
                                                  gboolean              line);
 
64
static gboolean  xfce_clock_analog_update        (gpointer              user_data);
72
65
 
73
66
 
74
67
 
75
68
enum
76
69
{
77
 
    PROP_0,
78
 
    PROP_SHOW_SECONDS
 
70
  PROP_0,
 
71
  PROP_SHOW_SECONDS,
 
72
  PROP_SIZE_RATIO,
 
73
  PROP_ORIENTATION
79
74
};
80
75
 
81
76
struct _XfceClockAnalogClass
82
77
{
83
 
    GtkImageClass __parent__;
 
78
  GtkImageClass __parent__;
84
79
};
85
80
 
86
81
struct _XfceClockAnalog
87
82
{
88
 
    GtkImage  __parent__;
89
 
 
90
 
    /* draw seconds */
91
 
    guint     show_seconds : 1;
 
83
  GtkImage __parent__;
 
84
 
 
85
  ClockPluginTimeout *timeout;
 
86
 
 
87
  guint               show_seconds : 1;
92
88
};
93
89
 
94
90
 
95
91
 
96
 
G_DEFINE_TYPE (XfceClockAnalog, xfce_clock_analog, GTK_TYPE_IMAGE);
 
92
XFCE_PANEL_DEFINE_TYPE (XfceClockAnalog, xfce_clock_analog, GTK_TYPE_IMAGE)
97
93
 
98
94
 
99
95
 
100
96
static void
101
97
xfce_clock_analog_class_init (XfceClockAnalogClass *klass)
102
98
{
103
 
    GObjectClass   *gobject_class;
104
 
    GtkWidgetClass *gtkwidget_class;
105
 
 
106
 
    gobject_class = G_OBJECT_CLASS (klass);
107
 
    gobject_class->finalize = xfce_clock_analog_finalize;
108
 
    gobject_class->set_property = xfce_clock_analog_set_property;
109
 
    gobject_class->get_property = xfce_clock_analog_get_property;
110
 
 
111
 
    gtkwidget_class = GTK_WIDGET_CLASS (klass);
112
 
    gtkwidget_class->size_request = xfce_clock_analog_size_request;
113
 
    gtkwidget_class->expose_event = xfce_clock_analog_expose_event;
114
 
 
115
 
    /**
116
 
     * Whether we display seconds
117
 
     **/
118
 
    g_object_class_install_property (gobject_class,
119
 
                                     PROP_SHOW_SECONDS,
120
 
                                     g_param_spec_boolean ("show-seconds", "show-seconds", "show-seconds",
121
 
                                                           FALSE, PANEL_PARAM_READWRITE));
 
99
  GObjectClass   *gobject_class;
 
100
  GtkWidgetClass *gtkwidget_class;
 
101
 
 
102
  gobject_class = G_OBJECT_CLASS (klass);
 
103
  gobject_class->set_property = xfce_clock_analog_set_property;
 
104
  gobject_class->get_property = xfce_clock_analog_get_property;
 
105
  gobject_class->finalize = xfce_clock_analog_finalize;
 
106
 
 
107
  gtkwidget_class = GTK_WIDGET_CLASS (klass);
 
108
  gtkwidget_class->expose_event = xfce_clock_analog_expose_event;
 
109
 
 
110
  g_object_class_install_property (gobject_class,
 
111
                                   PROP_SIZE_RATIO,
 
112
                                   g_param_spec_double ("size-ratio", NULL, NULL,
 
113
                                                        -1, G_MAXDOUBLE, 1.0,
 
114
                                                        G_PARAM_READABLE
 
115
                                                        | G_PARAM_STATIC_STRINGS));
 
116
 
 
117
  g_object_class_install_property (gobject_class,
 
118
                                   PROP_ORIENTATION,
 
119
                                   g_param_spec_enum ("orientation", NULL, NULL,
 
120
                                                      GTK_TYPE_ORIENTATION,
 
121
                                                      GTK_ORIENTATION_HORIZONTAL,
 
122
                                                      G_PARAM_WRITABLE
 
123
                                                      | G_PARAM_STATIC_STRINGS));
 
124
 
 
125
  g_object_class_install_property (gobject_class,
 
126
                                   PROP_SHOW_SECONDS,
 
127
                                   g_param_spec_boolean ("show-seconds", NULL, NULL,
 
128
                                                         FALSE,
 
129
                                                         G_PARAM_READWRITE
 
130
                                                         | G_PARAM_STATIC_STRINGS));
122
131
}
123
132
 
124
133
 
126
135
static void
127
136
xfce_clock_analog_init (XfceClockAnalog *analog)
128
137
{
129
 
    /* init */
130
 
    analog->show_seconds = FALSE;
131
 
}
132
 
 
133
 
 
134
 
 
135
 
static void
136
 
xfce_clock_analog_finalize (GObject *object)
137
 
{
138
 
    (*G_OBJECT_CLASS (xfce_clock_analog_parent_class)->finalize) (object);
 
138
  analog->show_seconds = FALSE;
 
139
  analog->timeout = clock_plugin_timeout_new (CLOCK_INTERVAL_MINUTE,
 
140
                                              xfce_clock_analog_update,
 
141
                                              analog);
139
142
}
140
143
 
141
144
 
146
149
                                const GValue *value,
147
150
                                GParamSpec   *pspec)
148
151
{
149
 
    XfceClockAnalog *analog = XFCE_CLOCK_ANALOG (object);
 
152
  XfceClockAnalog *analog = XFCE_CLOCK_ANALOG (object);
150
153
 
151
 
    switch (prop_id)
 
154
  switch (prop_id)
152
155
    {
153
 
        case PROP_SHOW_SECONDS:
154
 
            analog->show_seconds = g_value_get_boolean (value);
155
 
            break;
156
 
 
157
 
        default:
158
 
            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
159
 
            break;
 
156
    case PROP_ORIENTATION:
 
157
      break;
 
158
 
 
159
    case PROP_SHOW_SECONDS:
 
160
      analog->show_seconds = g_value_get_boolean (value);
 
161
      break;
 
162
 
 
163
    default:
 
164
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
165
      break;
160
166
    }
 
167
 
 
168
  /* reschedule the timeout and redraw */
 
169
  clock_plugin_timeout_set_interval (analog->timeout,
 
170
      analog->show_seconds ? CLOCK_INTERVAL_SECOND : CLOCK_INTERVAL_MINUTE);
 
171
  xfce_clock_analog_update (analog);
161
172
}
162
173
 
163
174
 
168
179
                                GValue     *value,
169
180
                                GParamSpec *pspec)
170
181
{
171
 
    XfceClockAnalog *analog = XFCE_CLOCK_ANALOG (object);
 
182
  XfceClockAnalog *analog = XFCE_CLOCK_ANALOG (object);
172
183
 
173
 
    switch (prop_id)
 
184
  switch (prop_id)
174
185
    {
175
 
        case PROP_SHOW_SECONDS:
176
 
            g_value_set_boolean (value, analog->show_seconds);
177
 
            break;
178
 
 
179
 
        default:
180
 
            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
181
 
            break;
 
186
    case PROP_SHOW_SECONDS:
 
187
      g_value_set_boolean (value, analog->show_seconds);
 
188
      break;
 
189
 
 
190
    case PROP_SIZE_RATIO:
 
191
      g_value_set_double (value, 1.0);
 
192
      break;
 
193
 
 
194
    default:
 
195
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
196
      break;
182
197
    }
183
198
}
184
199
 
185
200
 
186
201
 
187
202
static void
188
 
xfce_clock_analog_size_request  (GtkWidget      *widget,
189
 
                           GtkRequisition *requisition)
 
203
xfce_clock_analog_finalize (GObject *object)
190
204
{
191
 
    gint width, height;
192
 
 
193
 
    /* get the current widget size */
194
 
    gtk_widget_get_size_request (widget, &width, &height);
195
 
 
196
 
    /* square the widget */
197
 
    requisition->width = requisition->height = MAX (width, height);
 
205
  /* stop the timeout */
 
206
  clock_plugin_timeout_free (XFCE_CLOCK_ANALOG (object)->timeout);
 
207
 
 
208
  (*G_OBJECT_CLASS (xfce_clock_analog_parent_class)->finalize) (object);
198
209
}
199
210
 
200
211
 
203
214
xfce_clock_analog_expose_event (GtkWidget      *widget,
204
215
                                GdkEventExpose *event)
205
216
{
206
 
    XfceClockAnalog *analog = XFCE_CLOCK_ANALOG (widget);
207
 
    gdouble          xc, yc;
208
 
    gdouble          angle, radius;
209
 
    cairo_t         *cr;
210
 
    struct tm        tm;
211
 
 
212
 
    g_return_val_if_fail (XFCE_CLOCK_IS_ANALOG (analog), FALSE);
213
 
 
214
 
    /* get center of the widget and the radius */
215
 
    xc = (widget->allocation.width / 2.0);
216
 
    yc = (widget->allocation.height / 2.0);
217
 
    radius = MIN (xc, yc);
218
 
 
219
 
    /* add the window offset */
220
 
    xc += widget->allocation.x;
221
 
    yc += widget->allocation.y;
222
 
 
223
 
    /* get the cairo context */
224
 
    cr = gdk_cairo_create (widget->window);
225
 
 
226
 
    if (G_LIKELY (cr != NULL))
 
217
  XfceClockAnalog *analog = XFCE_CLOCK_ANALOG (widget);
 
218
  gdouble          xc, yc;
 
219
  gdouble          angle, radius;
 
220
  cairo_t         *cr;
 
221
  struct tm        tm;
 
222
 
 
223
  panel_return_val_if_fail (XFCE_CLOCK_IS_ANALOG (analog), FALSE);
 
224
 
 
225
  /* get center of the widget and the radius */
 
226
  xc = (widget->allocation.width / 2.0);
 
227
  yc = (widget->allocation.height / 2.0);
 
228
  radius = MIN (xc, yc);
 
229
 
 
230
  /* add the window offset */
 
231
  xc += widget->allocation.x;
 
232
  yc += widget->allocation.y;
 
233
 
 
234
  /* get the cairo context */
 
235
  cr = gdk_cairo_create (widget->window);
 
236
 
 
237
  if (G_LIKELY (cr != NULL))
227
238
    {
228
 
        /* clip the drawing area */
229
 
        gdk_cairo_rectangle (cr, &event->area);
230
 
        cairo_clip (cr);
231
 
        
232
 
        /* get the local time */
233
 
        xfce_clock_util_get_localtime (&tm);
234
 
 
235
 
        /* set the line properties */
236
 
        cairo_set_line_width (cr, 1);
237
 
        gdk_cairo_set_source_color (cr, &widget->style->fg[GTK_STATE_NORMAL]);
238
 
 
239
 
        /* draw the ticks */
240
 
        xfce_clock_analog_draw_ticks (cr, xc, yc, radius);
241
 
 
242
 
        if (analog->show_seconds)
 
239
      /* clip the drawing region */
 
240
      gdk_cairo_rectangle (cr, &event->area);
 
241
      cairo_clip (cr);
 
242
 
 
243
      /* get the local time */
 
244
      clock_plugin_get_localtime (&tm);
 
245
 
 
246
      /* set the line properties */
 
247
      cairo_set_line_width (cr, 1);
 
248
      gdk_cairo_set_source_color (cr, &widget->style->fg[GTK_WIDGET_STATE (widget)]);
 
249
 
 
250
      /* draw the ticks */
 
251
      xfce_clock_analog_draw_ticks (cr, xc, yc, radius);
 
252
 
 
253
      if (analog->show_seconds)
243
254
        {
244
 
            /* second pointer */
245
 
            angle = TICKS_TO_RADIANS (tm.tm_sec);
246
 
            xfce_clock_analog_draw_pointer (cr, xc, yc, radius, angle, 0.7, TRUE);
 
255
          /* second pointer */
 
256
          angle = TICKS_TO_RADIANS (tm.tm_sec);
 
257
          xfce_clock_analog_draw_pointer (cr, xc, yc, radius, angle, 0.7, TRUE);
247
258
        }
248
259
 
249
 
        /* minute pointer */
250
 
        angle = TICKS_TO_RADIANS (tm.tm_min);
251
 
        xfce_clock_analog_draw_pointer (cr, xc, yc, radius, angle, 0.8, FALSE);
252
 
 
253
 
        /* hour pointer */
254
 
        angle = HOURS_TO_RADIANS (tm.tm_hour, tm.tm_min);
255
 
        xfce_clock_analog_draw_pointer (cr, xc, yc, radius, angle, 0.5, FALSE);
256
 
 
257
 
        /* cleanup */
258
 
        cairo_destroy (cr);
 
260
      /* minute pointer */
 
261
      angle = TICKS_TO_RADIANS (tm.tm_min);
 
262
      xfce_clock_analog_draw_pointer (cr, xc, yc, radius, angle, 0.8, FALSE);
 
263
 
 
264
      /* hour pointer */
 
265
      angle = HOURS_TO_RADIANS (tm.tm_hour, tm.tm_min);
 
266
      xfce_clock_analog_draw_pointer (cr, xc, yc, radius, angle, 0.5, FALSE);
 
267
 
 
268
      /* cleanup */
 
269
      cairo_destroy (cr);
259
270
    }
260
271
 
261
 
    return FALSE;
 
272
  return FALSE;
262
273
}
263
274
 
264
275
 
269
280
                              gdouble  yc,
270
281
                              gdouble  radius)
271
282
{
272
 
    gint    i;
273
 
    gdouble x, y, angle;
 
283
  gint    i;
 
284
  gdouble x, y, angle;
274
285
 
275
 
    for (i = 0; i < 12; i++)
 
286
  for (i = 0; i < 12; i++)
276
287
    {
277
 
        /* calculate */
278
 
        angle = HOURS_TO_RADIANS (i, 0);
279
 
        x = xc + sin (angle) * (radius * (1.0 - CLOCK_SCALE));
280
 
        y = yc + cos (angle) * (radius * (1.0 - CLOCK_SCALE));
 
288
      /* calculate */
 
289
      angle = HOURS_TO_RADIANS (i, 0);
 
290
      x = xc + sin (angle) * (radius * (1.0 - CLOCK_SCALE));
 
291
      y = yc + cos (angle) * (radius * (1.0 - CLOCK_SCALE));
281
292
 
282
 
        /* draw arc */
283
 
        cairo_move_to (cr, x, y);
284
 
        cairo_arc (cr, x, y, radius * CLOCK_SCALE, 0, 2 * M_PI);
285
 
        cairo_close_path (cr);
 
293
      /* draw arc */
 
294
      cairo_move_to (cr, x, y);
 
295
      cairo_arc (cr, x, y, radius * CLOCK_SCALE, 0, 2 * G_PI);
 
296
      cairo_close_path (cr);
286
297
    }
287
298
 
288
 
    /* fill the arcs */
289
 
    cairo_fill (cr);
 
299
  /* fill the arcs */
 
300
  cairo_fill (cr);
290
301
}
291
302
 
292
303
 
300
311
                                gdouble  scale,
301
312
                                gboolean line)
302
313
{
303
 
    gdouble xs, ys;
304
 
    gdouble xt, yt;
305
 
 
306
 
    /* calculate tip position */
307
 
    xt = xc + sin (angle) * radius * scale;
308
 
    yt = yc + cos (angle) * radius * scale;
309
 
 
310
 
    if (line)
311
 
    {
312
 
        /* draw the line */
313
 
        cairo_move_to (cr, xc, yc);
314
 
        cairo_line_to (cr, xt, yt);
315
 
 
316
 
        /* draw the line */
317
 
        cairo_stroke (cr);
318
 
    }
319
 
    else
320
 
    {
321
 
        /* calculate start position */
322
 
        xs = xc + sin (angle - 0.5 * M_PI) * radius * CLOCK_SCALE;
323
 
        ys = yc + cos (angle - 0.5 * M_PI) * radius * CLOCK_SCALE;
324
 
 
325
 
        /* draw the pointer */
326
 
        cairo_move_to (cr, xs, ys);
327
 
        cairo_arc (cr, xc, yc, radius * CLOCK_SCALE, -angle + M_PI, -angle);
328
 
        cairo_line_to (cr, xt, yt);
329
 
        cairo_close_path (cr);
330
 
 
331
 
        /* fill the pointer */
332
 
        cairo_fill (cr);
333
 
    }
 
314
  gdouble xs, ys;
 
315
  gdouble xt, yt;
 
316
 
 
317
  /* calculate tip position */
 
318
  xt = xc + sin (angle) * radius * scale;
 
319
  yt = yc + cos (angle) * radius * scale;
 
320
 
 
321
  if (line)
 
322
    {
 
323
      /* draw the line */
 
324
      cairo_move_to (cr, xc, yc);
 
325
      cairo_line_to (cr, xt, yt);
 
326
 
 
327
      /* draw the line */
 
328
      cairo_stroke (cr);
 
329
    }
 
330
  else
 
331
    {
 
332
      /* calculate start position */
 
333
      xs = xc + sin (angle - 0.5 * G_PI) * radius * CLOCK_SCALE;
 
334
      ys = yc + cos (angle - 0.5 * G_PI) * radius * CLOCK_SCALE;
 
335
 
 
336
      /* draw the pointer */
 
337
      cairo_move_to (cr, xs, ys);
 
338
      cairo_arc (cr, xc, yc, radius * CLOCK_SCALE, -angle + G_PI, -angle);
 
339
      cairo_line_to (cr, xt, yt);
 
340
      cairo_close_path (cr);
 
341
 
 
342
      /* fill the pointer */
 
343
      cairo_fill (cr);
 
344
    }
 
345
}
 
346
 
 
347
 
 
348
 
 
349
static gboolean
 
350
xfce_clock_analog_update (gpointer user_data)
 
351
{
 
352
  GtkWidget *widget = GTK_WIDGET (user_data);
 
353
 
 
354
  panel_return_val_if_fail (XFCE_CLOCK_IS_ANALOG (user_data), FALSE);
 
355
 
 
356
  /* update if the widget if visible */
 
357
  if (G_LIKELY (GTK_WIDGET_VISIBLE (widget)))
 
358
    gtk_widget_queue_draw (widget);
 
359
 
 
360
  return TRUE;
334
361
}
335
362
 
336
363
 
338
365
GtkWidget *
339
366
xfce_clock_analog_new (void)
340
367
{
341
 
    return g_object_new (XFCE_CLOCK_TYPE_ANALOG, NULL);
342
 
}
343
 
 
344
 
 
345
 
 
346
 
gboolean
347
 
xfce_clock_analog_update (gpointer user_data)
348
 
{
349
 
    GtkWidget *widget = GTK_WIDGET (user_data);
350
 
 
351
 
    /* update if the widget if visible */
352
 
    if (G_LIKELY (GTK_WIDGET_VISIBLE (widget)))
353
 
        gtk_widget_queue_draw (widget);
354
 
 
355
 
    return TRUE;
 
368
  return g_object_new (XFCE_CLOCK_TYPE_ANALOG, NULL);
356
369
}