1 /* vi:set et ai sw=2 sts=2 ts=2: */
2 /*-
3  * Copyright (c) 2006 Benedikt Meurer <benny@xfce.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 
25 #include <exo/exo.h>
26 
27 #include <thunar-sbr/thunar-sbr-remove-renamer.h>
28 
29 
30 
31 /* Property identifiers */
32 enum
33 {
34   PROP_0,
35   PROP_END_OFFSET,
36   PROP_END_OFFSET_MODE,
37   PROP_START_OFFSET,
38   PROP_START_OFFSET_MODE,
39 };
40 
41 
42 
43 static void   thunar_sbr_remove_renamer_get_property  (GObject                      *object,
44                                                        guint                         prop_id,
45                                                        GValue                       *value,
46                                                        GParamSpec                   *pspec);
47 static void   thunar_sbr_remove_renamer_set_property  (GObject                      *object,
48                                                        guint                         prop_id,
49                                                        const GValue                 *value,
50                                                        GParamSpec                   *pspec);
51 static void   thunar_sbr_remove_renamer_realize       (GtkWidget                    *widget);
52 static gchar *thunar_sbr_remove_renamer_process       (ThunarxRenamer               *renamer,
53                                                        ThunarxFileInfo              *file,
54                                                        const gchar                  *text,
55                                                        guint                         idx);
56 static void   thunar_sbr_remove_renamer_update        (ThunarSbrRemoveRenamer       *remove_renamer);
57 
58 
59 
60 struct _ThunarSbrRemoveRenamerClass
61 {
62   ThunarxRenamerClass __parent__;
63 };
64 
65 struct _ThunarSbrRemoveRenamer
66 {
67   ThunarxRenamer      __parent__;
68   GtkWidget          *end_spinner;
69   GtkWidget          *start_spinner;
70   guint               end_offset;
71   ThunarSbrOffsetMode end_offset_mode;
72   guint               start_offset;
73   ThunarSbrOffsetMode start_offset_mode;
74 };
75 
76 
77 
78 THUNARX_DEFINE_TYPE (ThunarSbrRemoveRenamer, thunar_sbr_remove_renamer, THUNARX_TYPE_RENAMER);
79 
80 
81 
82 static void
thunar_sbr_remove_renamer_class_init(ThunarSbrRemoveRenamerClass * klass)83 thunar_sbr_remove_renamer_class_init (ThunarSbrRemoveRenamerClass *klass)
84 {
85   ThunarxRenamerClass *thunarxrenamer_class;
86   GtkWidgetClass      *gtkwidget_class;
87   GObjectClass        *gobject_class;
88 
89   gobject_class = G_OBJECT_CLASS (klass);
90   gobject_class->get_property = thunar_sbr_remove_renamer_get_property;
91   gobject_class->set_property = thunar_sbr_remove_renamer_set_property;
92 
93   gtkwidget_class = GTK_WIDGET_CLASS (klass);
94   gtkwidget_class->realize = thunar_sbr_remove_renamer_realize;
95 
96   thunarxrenamer_class = THUNARX_RENAMER_CLASS (klass);
97   thunarxrenamer_class->process = thunar_sbr_remove_renamer_process;
98 
99   /**
100    * ThunarSbrRemoveRenamer:end-offset:
101    *
102    * The end offset for the character removal.
103    **/
104   g_object_class_install_property (gobject_class,
105                                    PROP_END_OFFSET,
106                                    g_param_spec_uint ("end-offset",
107                                                       "end-offset",
108                                                       "end-offset",
109                                                       0, G_MAXUINT, 1,
110                                                       G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
111 
112   /**
113    * ThunarSbrRemoveRenamer:end-offset-mode:
114    *
115    * The end offset mode for the character removal.
116    **/
117   g_object_class_install_property (gobject_class,
118                                    PROP_END_OFFSET_MODE,
119                                    g_param_spec_enum ("end-offset-mode",
120                                                       "end-offset-mode",
121                                                       "end-offset-mode",
122                                                       THUNAR_SBR_TYPE_OFFSET_MODE,
123                                                       THUNAR_SBR_OFFSET_MODE_LEFT,
124                                                       G_PARAM_READWRITE));
125 
126   /**
127    * ThunarSbrRemoveRenamer:start-offset:
128    *
129    * The start offset for the character removal.
130    **/
131   g_object_class_install_property (gobject_class,
132                                    PROP_START_OFFSET,
133                                    g_param_spec_uint ("start-offset",
134                                                       "start-offset",
135                                                       "start-offset",
136                                                       0, G_MAXUINT, 0,
137                                                       G_PARAM_READWRITE));
138 
139   /**
140    * ThunarSbrRemoveRenamer:start-offset-mode:
141    *
142    * The start offset mode for the character removal.
143    **/
144   g_object_class_install_property (gobject_class,
145                                    PROP_START_OFFSET_MODE,
146                                    g_param_spec_enum ("start-offset-mode",
147                                                       "start-offset-mode",
148                                                       "start-offset-mode",
149                                                       THUNAR_SBR_TYPE_OFFSET_MODE,
150                                                       THUNAR_SBR_OFFSET_MODE_LEFT,
151                                                       G_PARAM_READWRITE));
152 }
153 
154 
155 
156 static void
thunar_sbr_remove_renamer_init(ThunarSbrRemoveRenamer * remove_renamer)157 thunar_sbr_remove_renamer_init (ThunarSbrRemoveRenamer *remove_renamer)
158 {
159   AtkRelationSet *relations;
160   GtkAdjustment  *adjustment;
161   AtkRelation    *relation;
162   GEnumClass     *klass;
163   AtkObject      *object;
164   GtkWidget      *combo;
165   GtkWidget      *label;
166   GtkWidget      *grid;
167   guint           n;
168 
169   grid = gtk_grid_new ();
170   gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
171   gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
172   gtk_box_pack_start (GTK_BOX (remove_renamer), grid, TRUE, TRUE, 0);
173   gtk_widget_show (grid);
174 
175   label = gtk_label_new_with_mnemonic (_("Remove _From Position:"));
176   gtk_label_set_xalign (GTK_LABEL (label), 1.0f);
177   gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
178   gtk_widget_show (label);
179 
180   remove_renamer->start_spinner = gtk_spin_button_new_with_range (0u, G_MAXUINT, 1u);
181   gtk_entry_set_width_chars (GTK_ENTRY (remove_renamer->start_spinner), 4);
182   gtk_entry_set_alignment (GTK_ENTRY (remove_renamer->start_spinner), 1.0f);
183   gtk_entry_set_activates_default (GTK_ENTRY (remove_renamer->start_spinner), TRUE);
184   gtk_spin_button_set_digits (GTK_SPIN_BUTTON (remove_renamer->start_spinner), 0);
185   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (remove_renamer->start_spinner), TRUE);
186   gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (remove_renamer->start_spinner), TRUE);
187   gtk_grid_attach (GTK_GRID (grid), remove_renamer->start_spinner, 1, 0, 1, 1);
188   gtk_label_set_mnemonic_widget (GTK_LABEL (label), remove_renamer->start_spinner);
189   gtk_widget_show (remove_renamer->start_spinner);
190 
191   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (remove_renamer->start_spinner));
192   exo_mutual_binding_new (G_OBJECT (remove_renamer), "start-offset", G_OBJECT (adjustment), "value");
193 
194   /* set Atk label relation for the entry */
195   object = gtk_widget_get_accessible (remove_renamer->start_spinner);
196   relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
197   relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
198   atk_relation_set_add (relations, relation);
199   g_object_unref (G_OBJECT (relation));
200 
201   combo = gtk_combo_box_text_new ();
202   klass = g_type_class_ref (THUNAR_SBR_TYPE_OFFSET_MODE);
203   for (n = 0; n < klass->n_values; ++n)
204     gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(klass->values[n].value_nick));
205   exo_mutual_binding_new (G_OBJECT (remove_renamer), "start-offset-mode", G_OBJECT (combo), "active");
206   gtk_grid_attach (GTK_GRID (grid), combo, 2, 0, 1, 1);
207   g_type_class_unref (klass);
208   gtk_widget_show (combo);
209 
210   label = gtk_label_new_with_mnemonic (_("_To Position:"));
211   gtk_label_set_xalign (GTK_LABEL (label), 1.0f);
212   gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
213   gtk_widget_show (label);
214 
215   remove_renamer->end_spinner = gtk_spin_button_new_with_range (0u, G_MAXUINT, 1u);
216   gtk_entry_set_width_chars (GTK_ENTRY (remove_renamer->end_spinner), 4);
217   gtk_entry_set_alignment (GTK_ENTRY (remove_renamer->end_spinner), 1.0f);
218   gtk_entry_set_activates_default (GTK_ENTRY (remove_renamer->end_spinner), TRUE);
219   gtk_spin_button_set_digits (GTK_SPIN_BUTTON (remove_renamer->end_spinner), 0);
220   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (remove_renamer->end_spinner), TRUE);
221   gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (remove_renamer->end_spinner), TRUE);
222   gtk_grid_attach (GTK_GRID (grid), remove_renamer->end_spinner, 1, 1, 1, 1);
223   gtk_label_set_mnemonic_widget (GTK_LABEL (label), remove_renamer->end_spinner);
224   gtk_widget_show (remove_renamer->end_spinner);
225 
226   adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (remove_renamer->end_spinner));
227   exo_mutual_binding_new (G_OBJECT (remove_renamer), "end-offset", G_OBJECT (adjustment), "value");
228 
229   /* set Atk label relation for the entry */
230   object = gtk_widget_get_accessible (remove_renamer->end_spinner);
231   relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label));
232   relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR);
233   atk_relation_set_add (relations, relation);
234   g_object_unref (G_OBJECT (relation));
235 
236   combo = gtk_combo_box_text_new ();
237   klass = g_type_class_ref (THUNAR_SBR_TYPE_OFFSET_MODE);
238   for (n = 0; n < klass->n_values; ++n)
239     gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(klass->values[n].value_nick));
240   exo_mutual_binding_new (G_OBJECT (remove_renamer), "end-offset-mode", G_OBJECT (combo), "active");
241   gtk_grid_attach (GTK_GRID (grid), combo, 2, 1, 1, 1);
242   g_type_class_unref (klass);
243   gtk_widget_show (combo);
244 }
245 
246 
247 
248 static void
thunar_sbr_remove_renamer_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)249 thunar_sbr_remove_renamer_get_property (GObject    *object,
250                                         guint       prop_id,
251                                         GValue     *value,
252                                         GParamSpec *pspec)
253 {
254   ThunarSbrRemoveRenamer *remove_renamer = THUNAR_SBR_REMOVE_RENAMER (object);
255 
256   switch (prop_id)
257     {
258     case PROP_END_OFFSET:
259       g_value_set_uint (value, thunar_sbr_remove_renamer_get_end_offset (remove_renamer));
260       break;
261 
262     case PROP_END_OFFSET_MODE:
263       g_value_set_enum (value, thunar_sbr_remove_renamer_get_end_offset_mode (remove_renamer));
264       break;
265 
266     case PROP_START_OFFSET:
267       g_value_set_uint (value, thunar_sbr_remove_renamer_get_start_offset (remove_renamer));
268       break;
269 
270     case PROP_START_OFFSET_MODE:
271       g_value_set_enum (value, thunar_sbr_remove_renamer_get_start_offset_mode (remove_renamer));
272       break;
273 
274     default:
275       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
276       break;
277     }
278 }
279 
280 
281 
282 static void
thunar_sbr_remove_renamer_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)283 thunar_sbr_remove_renamer_set_property (GObject      *object,
284                                         guint         prop_id,
285                                         const GValue *value,
286                                         GParamSpec   *pspec)
287 {
288   ThunarSbrRemoveRenamer *remove_renamer = THUNAR_SBR_REMOVE_RENAMER (object);
289 
290   switch (prop_id)
291     {
292     case PROP_END_OFFSET:
293       thunar_sbr_remove_renamer_set_end_offset (remove_renamer, g_value_get_uint (value));
294       break;
295 
296     case PROP_END_OFFSET_MODE:
297       thunar_sbr_remove_renamer_set_end_offset_mode (remove_renamer, g_value_get_enum (value));
298       break;
299 
300     case PROP_START_OFFSET:
301       thunar_sbr_remove_renamer_set_start_offset (remove_renamer, g_value_get_uint (value));
302       break;
303 
304     case PROP_START_OFFSET_MODE:
305       thunar_sbr_remove_renamer_set_start_offset_mode (remove_renamer, g_value_get_enum (value));
306       break;
307 
308     default:
309       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
310       break;
311     }
312 }
313 
314 
315 
316 static void
thunar_sbr_remove_renamer_realize(GtkWidget * widget)317 thunar_sbr_remove_renamer_realize (GtkWidget *widget)
318 {
319   /* realize the renamer widget */
320   (*GTK_WIDGET_CLASS (thunar_sbr_remove_renamer_parent_class)->realize) (widget);
321 
322   /* update the renamer state */
323   thunar_sbr_remove_renamer_update (THUNAR_SBR_REMOVE_RENAMER (widget));
324 }
325 
326 
327 
328 static gchar*
thunar_sbr_remove_renamer_process(ThunarxRenamer * renamer,ThunarxFileInfo * file,const gchar * text,guint idx)329 thunar_sbr_remove_renamer_process (ThunarxRenamer  *renamer,
330                                    ThunarxFileInfo *file,
331                                    const gchar     *text,
332                                    guint            idx)
333 {
334   ThunarSbrRemoveRenamer *remove_renamer = THUNAR_SBR_REMOVE_RENAMER (renamer);
335   const gchar            *start_pointer;
336   const gchar            *end_pointer;
337   GString                *result;
338   guint                   start_offset;
339   guint                   text_length;
340   guint                   end_offset;
341 
342   /* determine the text length */
343   text_length = g_utf8_strlen (text, -1);
344 
345   /* determine the offsets for this file name */
346   end_offset = (remove_renamer->end_offset_mode == THUNAR_SBR_OFFSET_MODE_LEFT)
347              ? remove_renamer->end_offset : (text_length - remove_renamer->end_offset);
348   start_offset = (remove_renamer->start_offset_mode == THUNAR_SBR_OFFSET_MODE_LEFT)
349                ? remove_renamer->start_offset : (text_length - remove_renamer->start_offset);
350 
351   /* check if anything should be removed */
352   if (G_UNLIKELY (start_offset >= end_offset || end_offset > text_length))
353     return g_strdup (text);
354 
355   /* determine start and end pointers */
356   end_pointer = g_utf8_offset_to_pointer (text, end_offset);
357   start_pointer = g_utf8_offset_to_pointer (text, start_offset);
358 
359   /* allocate the resulting string */
360   result = g_string_sized_new (text_length);
361   g_string_append_len (result, text, start_pointer - text);
362   g_string_append (result, end_pointer);
363   return g_string_free (result, FALSE);
364 }
365 
366 
367 
368 static void
thunar_sbr_remove_renamer_update(ThunarSbrRemoveRenamer * remove_renamer)369 thunar_sbr_remove_renamer_update (ThunarSbrRemoveRenamer *remove_renamer)
370 {
371   guint start_offset;
372   guint end_offset;
373 
374   /* check if the renamer is realized */
375   if (gtk_widget_get_realized (GTK_WIDGET (remove_renamer)))
376     {
377       /* check if start and end offset make sense */
378       end_offset = (remove_renamer->end_offset_mode == THUNAR_SBR_OFFSET_MODE_LEFT)
379                  ? remove_renamer->end_offset : (G_MAXUINT - remove_renamer->end_offset);
380       start_offset = (remove_renamer->start_offset_mode == THUNAR_SBR_OFFSET_MODE_LEFT)
381                    ? remove_renamer->start_offset : (G_MAXUINT - remove_renamer->start_offset);
382 
383       /* highlight invalid input by using theme specific colors */
384       if (G_UNLIKELY (start_offset >= end_offset))
385         {
386           gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (remove_renamer->start_spinner)), "error");
387           gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (remove_renamer->end_spinner)), "error");
388         }
389       else
390         {
391           gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET (remove_renamer->start_spinner)), "error");
392           gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET (remove_renamer->end_spinner)), "error");
393         }
394     }
395 
396   /* tell the bulk renamer that we have a new state */
397   thunarx_renamer_changed (THUNARX_RENAMER (remove_renamer));
398 }
399 
400 
401 
402 /**
403  * thunar_sbr_remove_renamer_new:
404  *
405  * Allocates a new #ThunarSbrRemoveRenamer instance.
406  *
407  * Return value: the newly allocated #ThunarSbrRemoveRenamer.
408  **/
409 ThunarSbrRemoveRenamer*
thunar_sbr_remove_renamer_new(void)410 thunar_sbr_remove_renamer_new (void)
411 {
412   return g_object_new (THUNAR_SBR_TYPE_REMOVE_RENAMER,
413                        "name", _("Remove Characters"),
414                        NULL);
415 }
416 
417 
418 
419 /**
420  * thunar_sbr_remove_renamer_get_end_offset:
421  * @remove_renamer : a #ThunarSbrRemoveRenamer.
422  *
423  * Returns the end offset of the character removal.
424  *
425  * Return value: the end offset for @remove_renamer.
426  **/
427 guint
thunar_sbr_remove_renamer_get_end_offset(ThunarSbrRemoveRenamer * remove_renamer)428 thunar_sbr_remove_renamer_get_end_offset (ThunarSbrRemoveRenamer *remove_renamer)
429 {
430   g_return_val_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer), 0);
431   return remove_renamer->end_offset;
432 }
433 
434 
435 
436 /**
437  * thunar_sbr_remove_renamer_set_end_offset:
438  * @remove_renamer : a #ThunarSbrRemoveRenamer.
439  * @end_offset     : the new end offset.
440  *
441  * Sets the end offset of @remove_renamer to @end_offset.
442  **/
443 void
thunar_sbr_remove_renamer_set_end_offset(ThunarSbrRemoveRenamer * remove_renamer,guint end_offset)444 thunar_sbr_remove_renamer_set_end_offset (ThunarSbrRemoveRenamer *remove_renamer,
445                                           guint                   end_offset)
446 {
447   g_return_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer));
448 
449   /* check if we have a new value */
450   if (G_LIKELY (remove_renamer->end_offset != end_offset))
451     {
452       /* apply the new setting */
453       remove_renamer->end_offset = end_offset;
454 
455       /* update the renamer */
456       thunar_sbr_remove_renamer_update (remove_renamer);
457 
458       /* notify listeners */
459       g_object_notify (G_OBJECT (remove_renamer), "end-offset");
460     }
461 }
462 
463 
464 
465 /**
466  * thunar_sbr_remove_renamer_get_end_offset_mode:
467  * @remove_renamer : a #ThunarSbrRemoveRenamer.
468  *
469  * Returns the end offset mode for @remove_renamer.
470  *
471  * Return value: the end offset mode for @remove_renamer.
472  **/
473 ThunarSbrOffsetMode
thunar_sbr_remove_renamer_get_end_offset_mode(ThunarSbrRemoveRenamer * remove_renamer)474 thunar_sbr_remove_renamer_get_end_offset_mode (ThunarSbrRemoveRenamer *remove_renamer)
475 {
476   g_return_val_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer), THUNAR_SBR_OFFSET_MODE_LEFT);
477   return remove_renamer->end_offset_mode;
478 }
479 
480 
481 
482 /**
483  * thunar_sbr_remove_renamer_set_end_offset_mode:
484  * @remove_renamer  : a #ThunarSbrRemoveRenamer.
485  * @end_offset_mode : the new end #ThunarSbrOffsetMode.
486  *
487  * Sets the end offset mode for @remove_renamer to @end_offset_mode.
488  **/
489 void
thunar_sbr_remove_renamer_set_end_offset_mode(ThunarSbrRemoveRenamer * remove_renamer,ThunarSbrOffsetMode end_offset_mode)490 thunar_sbr_remove_renamer_set_end_offset_mode (ThunarSbrRemoveRenamer *remove_renamer,
491                                                ThunarSbrOffsetMode     end_offset_mode)
492 {
493   g_return_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer));
494 
495   /* check if we have a new value */
496   if (G_LIKELY (remove_renamer->end_offset_mode != end_offset_mode))
497     {
498       /* apply the new setting */
499       remove_renamer->end_offset_mode = end_offset_mode;
500 
501       /* update the renamer */
502       thunar_sbr_remove_renamer_update (remove_renamer);
503 
504       /* notify listeners */
505       g_object_notify (G_OBJECT (remove_renamer), "end-offset-mode");
506     }
507 }
508 
509 
510 
511 /**
512  * thunar_sbr_remove_renamer_get_start_offset:
513  * @remove_renamer : a #ThunarSbrRemoveRenamer.
514  *
515  * Returns the start offset of the character removal.
516  *
517  * Return value: the start offset for @remove_renamer.
518  **/
519 guint
thunar_sbr_remove_renamer_get_start_offset(ThunarSbrRemoveRenamer * remove_renamer)520 thunar_sbr_remove_renamer_get_start_offset (ThunarSbrRemoveRenamer *remove_renamer)
521 {
522   g_return_val_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer), 0);
523   return remove_renamer->start_offset;
524 }
525 
526 
527 
528 /**
529  * thunar_sbr_remove_renamer_set_start_offset:
530  * @remove_renamer : a #ThunarSbrRemoveRenamer.
531  * @start_offset   : the new start offset.
532  *
533  * Sets the start offset of @remove_renamer to @start_offset.
534  **/
535 void
thunar_sbr_remove_renamer_set_start_offset(ThunarSbrRemoveRenamer * remove_renamer,guint start_offset)536 thunar_sbr_remove_renamer_set_start_offset (ThunarSbrRemoveRenamer *remove_renamer,
537                                             guint                   start_offset)
538 {
539   g_return_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer));
540 
541   /* check if we have a new value */
542   if (G_LIKELY (remove_renamer->start_offset != start_offset))
543     {
544       /* apply the new setting */
545       remove_renamer->start_offset = start_offset;
546 
547       /* update the renamer */
548       thunar_sbr_remove_renamer_update (remove_renamer);
549 
550       /* notify listeners */
551       g_object_notify (G_OBJECT (remove_renamer), "start-offset");
552     }
553 }
554 
555 
556 
557 /**
558  * thunar_sbr_remove_renamer_get_start_offset_mode:
559  * @remove_renamer : a #ThunarSbrRemoveRenamer.
560  *
561  * Returns the start offset mode for @remove_renamer.
562  *
563  * Return value: the start offset mode for @remove_renamer.
564  **/
565 ThunarSbrOffsetMode
thunar_sbr_remove_renamer_get_start_offset_mode(ThunarSbrRemoveRenamer * remove_renamer)566 thunar_sbr_remove_renamer_get_start_offset_mode (ThunarSbrRemoveRenamer *remove_renamer)
567 {
568   g_return_val_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer), THUNAR_SBR_OFFSET_MODE_LEFT);
569   return remove_renamer->start_offset_mode;
570 }
571 
572 
573 
574 /**
575  * thunar_sbr_remove_renamer_set_start_offset_mode:
576  * @remove_renamer    : a #ThunarSbrRemoveRenamer.
577  * @start_offset_mode : the new start #ThunarSbrOffsetMode.
578  *
579  * Sets the start offset mode for @remove_renamer to @start_offset_mode.
580  **/
581 void
thunar_sbr_remove_renamer_set_start_offset_mode(ThunarSbrRemoveRenamer * remove_renamer,ThunarSbrOffsetMode start_offset_mode)582 thunar_sbr_remove_renamer_set_start_offset_mode (ThunarSbrRemoveRenamer *remove_renamer,
583                                                  ThunarSbrOffsetMode     start_offset_mode)
584 {
585   g_return_if_fail (THUNAR_SBR_IS_REMOVE_RENAMER (remove_renamer));
586 
587   /* check if we have a new value */
588   if (G_LIKELY (remove_renamer->start_offset_mode != start_offset_mode))
589     {
590       /* apply the new setting */
591       remove_renamer->start_offset_mode = start_offset_mode;
592 
593       /* update the renamer */
594       thunar_sbr_remove_renamer_update (remove_renamer);
595 
596       /* notify listeners */
597       g_object_notify (G_OBJECT (remove_renamer), "start-offset-mode");
598     }
599 }
600 
601 
602