]> git.sur5r.net Git - glabels/blob - src/prefs-model.c
Imported Upstream version 3.4.0
[glabels] / src / prefs-model.c
1 /*
2  *  prefs-model.h
3  *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels 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  *  gLabels 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 gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "prefs-model.h"
24
25 #include <gio/gio.h>
26 #include <gtk/gtk.h>
27 #include <string.h>
28
29 #include <libglabels.h>
30 #include "marshal.h"
31 #include "str-util.h"
32 #include "color.h"
33
34 #include "debug.h"
35
36
37 /*========================================================*/
38 /* Private macros and constants.                          */
39 /*========================================================*/
40
41 /* Default values */
42 #define DEFAULT_UNITS_STRING_US     lgl_units_get_id (LGL_UNITS_INCH)
43 #define DEFAULT_PAGE_SIZE_US        "US-Letter"
44
45 #define DEFAULT_UNITS_STRING_METRIC lgl_units_get_id (LGL_UNITS_MM)
46 #define DEFAULT_PAGE_SIZE_METRIC    "A4"
47
48
49 /*========================================================*/
50 /* Private types.                                         */
51 /*========================================================*/
52
53 struct _glPrefsModelPrivate {
54
55         GSettings *locale;
56         GSettings *objects;
57         GSettings *ui;
58
59 };
60
61 enum {
62         CHANGED,
63         LAST_SIGNAL
64 };
65
66
67 /*========================================================*/
68 /* Private globals.                                       */
69 /*========================================================*/
70
71 static guint signals[LAST_SIGNAL] = {0};
72
73
74 /*========================================================*/
75 /* Private function prototypes.                           */
76 /*========================================================*/
77
78 static void           gl_prefs_model_finalize      (GObject             *object);
79
80 static void           gsettings_changed_cb         (glPrefsModel        *prefs_model);
81
82
83 /*****************************************************************************/
84 /* Boilerplate object stuff.                                                 */
85 /*****************************************************************************/
86 G_DEFINE_TYPE (glPrefsModel, gl_prefs_model, G_TYPE_OBJECT)
87
88
89 static void
90 gl_prefs_model_class_init (glPrefsModelClass *class)
91 {
92         GObjectClass *object_class = G_OBJECT_CLASS (class);
93
94         gl_debug (DEBUG_PREFS, "START");
95
96         gl_prefs_model_parent_class = g_type_class_peek_parent (class);
97
98         object_class->finalize = gl_prefs_model_finalize;
99
100         signals[CHANGED] =
101                 g_signal_new ("changed",
102                               G_OBJECT_CLASS_TYPE (object_class),
103                               G_SIGNAL_RUN_LAST,
104                               G_STRUCT_OFFSET (glPrefsModelClass, changed),
105                               NULL, NULL,
106                               gl_marshal_VOID__VOID,
107                               G_TYPE_NONE,
108                               0);
109
110         gl_debug (DEBUG_PREFS, "END");
111 }
112
113
114 static void
115 gl_prefs_model_init (glPrefsModel *this)
116 {
117         gl_debug (DEBUG_PREFS, "START");
118
119         this->priv = g_new0 (glPrefsModelPrivate, 1);
120
121         gl_debug (DEBUG_PREFS, "END");
122 }
123
124
125 static void
126 gl_prefs_model_finalize (GObject *object)
127 {
128         glPrefsModel *this = GL_PREFS_MODEL (object);
129
130         gl_debug (DEBUG_PREFS, "START");
131
132         g_return_if_fail (object && GL_IS_PREFS_MODEL (object));
133
134         g_object_unref (G_OBJECT(this->priv->locale));
135         g_object_unref (G_OBJECT(this->priv->objects));
136         g_object_unref (G_OBJECT(this->priv->ui));
137         g_free (this->priv);
138
139         G_OBJECT_CLASS (gl_prefs_model_parent_class)->finalize (object);
140
141         gl_debug (DEBUG_PREFS, "END");
142 }
143
144
145 /*****************************************************************************/
146 /* New prefs_model object.                                                   */
147 /*****************************************************************************/
148 glPrefsModel *
149 gl_prefs_model_new (void)
150 {
151         glPrefsModel *this;
152
153         gl_debug (DEBUG_PREFS, "START");
154
155         this = GL_PREFS_MODEL (g_object_new (gl_prefs_model_get_type(), NULL));
156
157         this->priv->locale  = g_settings_new ("org.gnome.glabels-3.locale");
158         this->priv->objects = g_settings_new ("org.gnome.glabels-3.objects");
159         this->priv->ui      = g_settings_new ("org.gnome.glabels-3.ui");
160
161         g_signal_connect_swapped (G_OBJECT (this->priv->locale), "changed",
162                                   G_CALLBACK (gsettings_changed_cb), this);
163         g_signal_connect_swapped (G_OBJECT (this->priv->objects), "changed",
164                                   G_CALLBACK (gsettings_changed_cb), this);
165         g_signal_connect_swapped (G_OBJECT (this->priv->ui), "changed",
166                                   G_CALLBACK (gsettings_changed_cb), this);
167
168         gl_debug (DEBUG_PREFS, "END");
169
170         return this;
171 }
172
173
174 /*****************************************************************************/
175 /* New null prefs_model object.                                              */
176 /*****************************************************************************/
177 glPrefsModel *
178 gl_prefs_model_new_null (void)
179 {
180         glPrefsModel *this;
181
182         gl_debug (DEBUG_PREFS, "START");
183
184         this = GL_PREFS_MODEL (g_object_new (gl_prefs_model_get_type(), NULL));
185
186         gl_debug (DEBUG_PREFS, "END");
187
188         return this;
189 }
190
191
192 /*****************************************************************************/
193 /* Set units.                                                                */
194 /*****************************************************************************/
195 void
196 gl_prefs_model_set_units (glPrefsModel     *this,
197                           lglUnits          units)
198 {
199         if ( this->priv->locale )
200         {
201                 g_settings_set_string (this->priv->locale,
202                                        "units",
203                                        lgl_units_get_id (units));
204         }
205 }
206
207
208 /*****************************************************************************/
209 /* Get units.                                                                */
210 /*****************************************************************************/
211 lglUnits
212 gl_prefs_model_get_units (glPrefsModel     *this)
213 {
214         if ( !this->priv->locale )
215         {
216                 return lgl_units_from_id (DEFAULT_UNITS_STRING_METRIC);
217         }
218
219         const gchar  *pgsize;
220         gchar        *string;
221         lglUnits      units;
222
223         string = g_settings_get_string (this->priv->locale, "units");
224         
225         /* If not set, make educated guess about locale default. */
226         if ( !string || (*string == '\0') )
227         {
228                 pgsize = gtk_paper_size_get_default ();
229                 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
230                 {
231                         string = g_strdup (DEFAULT_UNITS_STRING_US);
232                 }
233                 else
234                 {
235                         string = g_strdup (DEFAULT_UNITS_STRING_METRIC);
236                 }
237         }
238
239         units = lgl_units_from_id (string);
240         g_free (string);
241
242         /* If invalid, make an educated guess from locale. */
243         if (units == LGL_UNITS_INVALID)
244         {
245                 pgsize = gtk_paper_size_get_default ();
246                 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
247                 {
248                         units = LGL_UNITS_INCH;
249                 }
250                 else
251                 {
252                         units = LGL_UNITS_MM;
253                 }
254         }
255
256         return units;
257 }
258
259
260 /*****************************************************************************/
261 /* Set default page size.                                                    */
262 /*****************************************************************************/
263 void
264 gl_prefs_model_set_default_page_size (glPrefsModel     *this,
265                                       const gchar      *page_size)
266 {
267         if ( this->priv->locale )
268         {
269                 g_settings_set_string (this->priv->locale,
270                                        "default-page-size",
271                                        page_size);
272         }
273 }
274
275
276 /*****************************************************************************/
277 /* Get default page size.                                                    */
278 /*****************************************************************************/
279 gchar *
280 gl_prefs_model_get_default_page_size (glPrefsModel     *this)
281 {
282         if ( !this->priv->locale )
283         {
284                 return g_strdup (DEFAULT_PAGE_SIZE_METRIC);
285         }
286
287         const gchar *pgsize;
288         gchar       *page_size;
289         lglPaper    *paper;
290
291         page_size = g_settings_get_string (this->priv->locale, "default-page-size");
292
293         /* If not set, make educated guess about locale default. */
294         if ( !page_size || (*page_size == '\0') )
295         {
296                 pgsize = gtk_paper_size_get_default ();
297                 if ( strcmp (pgsize, GTK_PAPER_NAME_LETTER) == 0 )
298                 {
299                         page_size = g_strdup (DEFAULT_PAGE_SIZE_US);
300                 }
301                 else
302                 {
303                         page_size = g_strdup (DEFAULT_PAGE_SIZE_METRIC);
304                 }
305         }
306
307         /* Proof read the default page size -- it must be a valid id. */
308         /* (For compatability with older versions.) */
309         paper = lgl_db_lookup_paper_from_id (page_size);
310         if ( paper == NULL ) {
311                 g_free (page_size);
312                 page_size = g_strdup (DEFAULT_PAGE_SIZE_US);
313         } else {
314                 lgl_paper_free (paper);
315         }
316
317         return page_size;
318 }
319
320
321 /*****************************************************************************/
322 /* Set default font family.                                                  */
323 /*****************************************************************************/
324 void
325 gl_prefs_model_set_default_font_family (glPrefsModel     *this,
326                                         const gchar      *family)
327 {
328         if ( this->priv->objects )
329         {
330                 g_settings_set_string (this->priv->objects,
331                                        "default-font-family",
332                                        family);
333         }
334 }
335
336
337 /*****************************************************************************/
338 /* Get default font family.                                                  */
339 /*****************************************************************************/
340 gchar *
341 gl_prefs_model_get_default_font_family (glPrefsModel     *this)
342 {
343         if ( !this->priv->objects )
344         {
345                 return g_strdup ("Sans");
346         }
347
348         gchar *family = g_settings_get_string (this->priv->objects,
349                                                "default-font-family");
350
351         return family;
352 }
353
354
355 /*****************************************************************************/
356 /* Set default font size.                                                    */
357 /*****************************************************************************/
358 void
359 gl_prefs_model_set_default_font_size (glPrefsModel     *this,
360                                       gdouble           size)
361 {
362         if ( this->priv->objects )
363         {
364                 g_settings_set_double (this->priv->objects,
365                                        "default-font-size",
366                                        size);
367         }
368 }
369
370
371 /*****************************************************************************/
372 /* Get default font size.                                                    */
373 /*****************************************************************************/
374 gdouble
375 gl_prefs_model_get_default_font_size (glPrefsModel     *this)
376 {
377         if ( !this->priv->objects )
378         {
379                 return 12;
380         }
381
382         gdouble size = g_settings_get_double (this->priv->objects,
383                                               "default-font-size");
384
385         return size;
386 }
387
388
389 /*****************************************************************************/
390 /* Set default font weight.                                                  */
391 /*****************************************************************************/
392 void
393 gl_prefs_model_set_default_font_weight (glPrefsModel     *this,
394                                         PangoWeight       weight)
395 {
396         if ( this->priv->objects )
397         {
398                 g_settings_set_string (this->priv->objects,
399                                        "default-font-weight",
400                                        gl_str_util_weight_to_string(weight));
401         }
402 }
403
404
405 /*****************************************************************************/
406 /* Get default font weight.                                                  */
407 /*****************************************************************************/
408 PangoWeight
409 gl_prefs_model_get_default_font_weight (glPrefsModel     *this)
410 {
411         if ( !this->priv->objects )
412         {
413                 return PANGO_WEIGHT_NORMAL;
414         }
415
416         gchar *string = g_settings_get_string (this->priv->objects,
417                                         "default-font-weight");
418         PangoWeight weight = gl_str_util_string_to_weight (string);
419         g_free (string);
420
421         return weight;
422 }
423
424
425 /*****************************************************************************/
426 /* Set default font italic flag.                                             */
427 /*****************************************************************************/
428 void
429 gl_prefs_model_set_default_font_italic_flag (glPrefsModel     *this,
430                                              gboolean          italic_flag)
431 {
432         if ( this->priv->objects )
433         {
434                 g_settings_set_boolean (this->priv->objects,
435                                         "default-font-italic-flag",
436                                         italic_flag);
437         }
438 }
439
440
441 /*****************************************************************************/
442 /* Get default font italic flag.                                             */
443 /*****************************************************************************/
444 gboolean
445 gl_prefs_model_get_default_font_italic_flag (glPrefsModel     *this)
446 {
447         if ( !this->priv->objects )
448         {
449                 return FALSE;
450         }
451
452         gboolean italic_flag = g_settings_get_boolean (this->priv->objects,
453                                                        "default-font-italic-flag");
454
455         return italic_flag;
456 }
457
458
459 /*****************************************************************************/
460 /* Set default text color.                                                   */
461 /*****************************************************************************/
462 void
463 gl_prefs_model_set_default_text_color (glPrefsModel     *this,
464                                        guint             color)
465 {
466         if ( this->priv->objects )
467         {
468                 g_settings_set_value (this->priv->objects,
469                                       "default-text-color",
470                                       g_variant_new_uint32 (color));
471         }
472 }
473
474
475 /*****************************************************************************/
476 /* Get default text color.                                                   */
477 /*****************************************************************************/
478 guint
479 gl_prefs_model_get_default_text_color (glPrefsModel     *this)
480 {
481         if ( !this->priv->objects )
482         {
483                 return 0x000000FF;
484         }
485
486         GVariant *value = g_settings_get_value (this->priv->objects, "default-text-color");
487         guint color = g_variant_get_uint32 (value);
488         g_variant_unref (value);
489
490         return color;
491 }
492
493
494 /*****************************************************************************/
495 /* Set default text alignment.                                               */
496 /*****************************************************************************/
497 void
498 gl_prefs_model_set_default_text_alignment (glPrefsModel     *this,
499                                            PangoAlignment    alignment)
500 {
501         if ( this->priv->objects )
502         {
503                 g_settings_set_string (this->priv->objects,
504                                        "default-text-alignment",
505                                        gl_str_util_align_to_string(alignment));
506         }
507 }
508
509
510 /*****************************************************************************/
511 /* Get default text alignment.                                               */
512 /*****************************************************************************/
513 PangoAlignment
514 gl_prefs_model_get_default_text_alignment (glPrefsModel     *this)
515 {
516         if ( !this->priv->objects )
517         {
518                 return PANGO_ALIGN_LEFT;
519         }
520
521         gchar *string = g_settings_get_string (this->priv->objects,
522                                                "default-text-alignment");
523         PangoAlignment alignment = gl_str_util_string_to_align (string);
524         g_free (string);
525
526         return alignment;
527 }
528
529
530 /*****************************************************************************/
531 /* Set default text line spacing.                                            */
532 /*****************************************************************************/
533 void
534 gl_prefs_model_set_default_text_line_spacing (glPrefsModel     *this,
535                                               gdouble           spacing)
536 {
537         if ( this->priv->objects )
538         {
539                 g_settings_set_double (this->priv->objects,
540                                        "default-text-line-spacing",
541                                        spacing);
542         }
543 }
544
545
546 /*****************************************************************************/
547 /* Get default text line spacing.                                            */
548 /*****************************************************************************/
549 gdouble
550 gl_prefs_model_get_default_text_line_spacing (glPrefsModel     *this)
551 {
552         if ( !this->priv->objects )
553         {
554                 return 1;
555         }
556
557         gdouble spacing = g_settings_get_double (this->priv->objects,
558                                                  "default-text-line-spacing");
559
560         return spacing;
561 }
562
563
564 /*****************************************************************************/
565 /* Set default line width.                                                   */
566 /*****************************************************************************/
567 void
568 gl_prefs_model_set_default_line_width (glPrefsModel     *this,
569                                        gdouble           width)
570 {
571         if ( this->priv->objects )
572         {
573                 g_settings_set_double (this->priv->objects,
574                                        "default-line-width",
575                                        width);
576         }
577 }
578
579
580 /*****************************************************************************/
581 /* Get default line width.                                                   */
582 /*****************************************************************************/
583 gdouble
584 gl_prefs_model_get_default_line_width (glPrefsModel     *this)
585 {
586         if ( !this->priv->objects )
587         {
588                 return 1;
589         }
590
591         gdouble width = g_settings_get_double (this->priv->objects,
592                                                "default-line-width");
593
594         return width;
595 }
596
597
598 /*****************************************************************************/
599 /* Set default line color.                                                   */
600 /*****************************************************************************/
601 void
602 gl_prefs_model_set_default_line_color (glPrefsModel     *this,
603                                        guint             color)
604 {
605         if ( this->priv->objects )
606         {
607                 g_settings_set_value (this->priv->objects,
608                                       "default-line-color",
609                                       g_variant_new_uint32 (color));
610         }
611 }
612
613
614 /*****************************************************************************/
615 /* Get default line color.                                                   */
616 /*****************************************************************************/
617 guint
618 gl_prefs_model_get_default_line_color (glPrefsModel     *this)
619 {
620         if ( !this->priv->objects )
621         {
622                 return 0x000000FF;
623         }
624
625         GVariant *value = g_settings_get_value (this->priv->objects, "default-line-color");
626         guint color = g_variant_get_uint32 (value);
627         g_variant_unref (value);
628
629         return color;
630 }
631
632
633 /*****************************************************************************/
634 /* Set default fill color.                                                   */
635 /*****************************************************************************/
636 void
637 gl_prefs_model_set_default_fill_color (glPrefsModel     *this,
638                                        guint             color)
639 {
640         if ( this->priv->objects )
641         {
642                 g_settings_set_value (this->priv->objects,
643                                       "default-fill-color",
644                                       g_variant_new_uint32 (color));
645         }
646 }
647
648
649 /*****************************************************************************/
650 /* Get default fill color.                                                   */
651 /*****************************************************************************/
652 guint
653 gl_prefs_model_get_default_fill_color (glPrefsModel     *this)
654 {
655         if ( !this->priv->objects )
656         {
657                 return 0x00FF00FF;
658         }
659
660         GVariant *value = g_settings_get_value (this->priv->objects, "default-fill-color");
661         guint color = g_variant_get_uint32 (value);
662         g_variant_unref (value);
663
664         return color;
665 }
666
667
668 /*****************************************************************************/
669 /* Set main toolbar visible flag.                                            */
670 /*****************************************************************************/
671 void
672 gl_prefs_model_set_main_toolbar_visible (glPrefsModel     *this,
673                                          gboolean          visible)
674 {
675         if ( this->priv->ui )
676         {
677                 g_settings_set_boolean (this->priv->ui,
678                                         "main-toolbar-visible",
679                                         visible);
680         }
681 }
682
683
684 /*****************************************************************************/
685 /* Get main toolbar visible flag.                                            */
686 /*****************************************************************************/
687 gboolean
688 gl_prefs_model_get_main_toolbar_visible (glPrefsModel     *this)
689 {
690         if ( !this->priv->ui )
691         {
692                 return TRUE;
693         }
694
695         gboolean visible = g_settings_get_boolean (this->priv->ui,
696                                                    "main-toolbar-visible");
697
698         return visible;
699 }
700
701
702 /*****************************************************************************/
703 /* Set drawing toolbar visible flag.                                         */
704 /*****************************************************************************/
705 void
706 gl_prefs_model_set_drawing_toolbar_visible (glPrefsModel     *this,
707                                             gboolean          visible)
708 {
709         if ( this->priv->ui )
710         {
711                 g_settings_set_boolean (this->priv->ui,
712                                         "drawing-toolbar-visible",
713                                         visible);
714         }
715 }
716
717
718 /*****************************************************************************/
719 /* Get drawing toolbar visible flag.                                         */
720 /*****************************************************************************/
721 gboolean
722 gl_prefs_model_get_drawing_toolbar_visible (glPrefsModel     *this)
723 {
724         if ( !this->priv->ui )
725         {
726                 return TRUE;
727         }
728
729         gboolean visible = g_settings_get_boolean (this->priv->ui,
730                                                    "drawing-toolbar-visible");
731
732         return visible;
733 }
734
735
736 /*****************************************************************************/
737 /* Set property toolbar visible flag.                                        */
738 /*****************************************************************************/
739 void
740 gl_prefs_model_set_property_toolbar_visible (glPrefsModel     *this,
741                                              gboolean          visible)
742 {
743         if ( this->priv->ui )
744         {
745                 g_settings_set_boolean (this->priv->ui,
746                                         "property-toolbar-visible",
747                                         visible);
748         }
749 }
750
751
752 /*****************************************************************************/
753 /* Get property toolbar visible flag.                                        */
754 /*****************************************************************************/
755 gboolean
756 gl_prefs_model_get_property_toolbar_visible (glPrefsModel     *this)
757 {
758         if ( !this->priv->ui )
759         {
760                 return TRUE;
761         }
762
763         gboolean visible = g_settings_get_boolean (this->priv->ui,
764                                                    "property-toolbar-visible");
765
766         return visible;
767 }
768
769
770 /*****************************************************************************/
771 /* Set grid visible flag.                                                    */
772 /*****************************************************************************/
773 void
774 gl_prefs_model_set_grid_visible (glPrefsModel     *this,
775                                  gboolean          visible)
776 {
777         if ( this->priv->ui )
778         {
779                 g_settings_set_boolean (this->priv->ui,
780                                         "grid-visible",
781                                         visible);
782         }
783 }
784
785
786 /*****************************************************************************/
787 /* Get grid visible flag.                                                    */
788 /*****************************************************************************/
789 gboolean
790 gl_prefs_model_get_grid_visible (glPrefsModel     *this)
791 {
792         if ( !this->priv->ui )
793         {
794                 return TRUE;
795         }
796
797         gboolean visible = g_settings_get_boolean (this->priv->ui,
798                                                    "grid-visible");
799
800         return visible;
801 }
802
803
804 /*****************************************************************************/
805 /* Set markup visible flag.                                                  */
806 /*****************************************************************************/
807 void
808 gl_prefs_model_set_markup_visible (glPrefsModel     *this,
809                                    gboolean          visible)
810 {
811         if ( this->priv->ui )
812         {
813                 g_settings_set_boolean (this->priv->ui,
814                                         "markup-visible",
815                                         visible);
816         }
817 }
818
819
820 /*****************************************************************************/
821 /* Get markup visible flag.                                                  */
822 /*****************************************************************************/
823 gboolean
824 gl_prefs_model_get_markup_visible (glPrefsModel     *this)
825 {
826         if ( !this->priv->ui )
827         {
828                 return TRUE;
829         }
830
831         gboolean visible = g_settings_get_boolean (this->priv->ui,
832                                                    "markup-visible");
833
834         return visible;
835 }
836
837
838 /*****************************************************************************/
839 /* Set max recents.                                                          */
840 /*****************************************************************************/
841 void
842 gl_prefs_model_set_max_recents (glPrefsModel     *this,
843                                 gint              max_recents)
844 {
845         if ( this->priv->ui )
846         {
847                 g_settings_set_int (this->priv->ui,
848                                     "max-recents",
849                                     max_recents);
850         }
851 }
852
853
854 /*****************************************************************************/
855 /* Get max recents.                                                          */
856 /*****************************************************************************/
857 gint
858 gl_prefs_model_get_max_recents (glPrefsModel     *this)
859 {
860         if ( !this->priv->ui )
861         {
862                 return 10;
863         }
864
865         gint max_recents = g_settings_get_int (this->priv->ui,
866                                                "max-recents");
867
868         return max_recents;
869 }
870
871
872 /*---------------------------------------------------------------------------*/
873 /* PRIVATE.  Key changed callback.                                           */
874 /*---------------------------------------------------------------------------*/
875 static void 
876 gsettings_changed_cb (glPrefsModel *this)
877 {
878         g_signal_emit (G_OBJECT(this), signals[CHANGED], 0);
879 }
880
881
882
883
884 /*
885  * Local Variables:       -- emacs
886  * mode: C                -- emacs
887  * c-basic-offset: 8      -- emacs
888  * tab-width: 8           -- emacs
889  * indent-tabs-mode: nil  -- emacs
890  * End:                   -- emacs
891  */