X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdialogs%2Fexport.cpp;h=dd96431f07782df199740596ff73963bdb0e03db;hb=4cb9ed4c3d183554e888e636844f8e3c2e666c40;hp=66b307272debd961b16f5c88760605316b2016e1;hpb=b87450ff8d0425ab9fd17f42287a2f5337b152a2;p=inkscape.git diff --git a/src/dialogs/export.cpp b/src/dialogs/export.cpp index 66b307272..dd96431f0 100644 --- a/src/dialogs/export.cpp +++ b/src/dialogs/export.cpp @@ -1,11 +1,7 @@ -#define __SP_EXPORT_C__ - -/** \file - * \brief PNG export dialog +/** @file + * @brief PNG export dialog */ - -/* - * Authors: +/* Authors: * Lauris Kaplinski * bulia byak * Johan Engelen @@ -20,6 +16,9 @@ # include "config.h" #endif +// This has to be included prior to anything that includes setjmp.h, it croaks otherwise +#include + #include #include #include @@ -30,6 +29,9 @@ #include #include #include +#ifdef WITH_GNOME_VFS +# include // gnome_vfs_initialized +#endif #include #include "helper/unit-menu.h" @@ -47,9 +49,9 @@ #include "selection-chemistry.h" #include "dialog-events.h" -#include "../prefs-utils.h" -#include "../verbs.h" -#include "../interface.h" +#include "preferences.h" +#include "verbs.h" +#include "interface.h" #include "extension/output.h" #include "extension/db.h" @@ -63,7 +65,7 @@ #define DPI_BASE PX_PER_IN -#define EXPORT_COORD_PRECISION 3 +#define EXPORT_COORD_PRECISION 3 #define MIN_ONSCREEN_DISTANCE 50 @@ -71,32 +73,32 @@ static void sp_export_area_toggled ( GtkToggleButton *tb, GtkObject *base ); static void sp_export_export_clicked ( GtkButton *button, GtkObject *base ); static void sp_export_browse_clicked ( GtkButton *button, gpointer userdata ); -static void sp_export_area_x_value_changed ( GtkAdjustment *adj, +static void sp_export_area_x_value_changed ( GtkAdjustment *adj, GtkObject *base); - -static void sp_export_area_y_value_changed ( GtkAdjustment *adj, + +static void sp_export_area_y_value_changed ( GtkAdjustment *adj, GtkObject *base); - -static void sp_export_area_width_value_changed ( GtkAdjustment *adj, + +static void sp_export_area_width_value_changed ( GtkAdjustment *adj, GtkObject *base); - -static void sp_export_area_height_value_changed ( GtkAdjustment *adj, + +static void sp_export_area_height_value_changed ( GtkAdjustment *adj, GtkObject *base); - -static void sp_export_bitmap_width_value_changed ( GtkAdjustment *adj, + +static void sp_export_bitmap_width_value_changed ( GtkAdjustment *adj, GtkObject *base); - -static void sp_export_bitmap_height_value_changed ( GtkAdjustment *adj, + +static void sp_export_bitmap_height_value_changed ( GtkAdjustment *adj, GtkObject *base); - -static void sp_export_xdpi_value_changed ( GtkAdjustment *adj, + +static void sp_export_xdpi_value_changed ( GtkAdjustment *adj, GtkObject *base); - -static void sp_export_selection_changed ( Inkscape::Application *inkscape, - Inkscape::Selection *selection, + +static void sp_export_selection_changed ( Inkscape::Application *inkscape, + Inkscape::Selection *selection, GtkObject *base); -static void sp_export_selection_modified ( Inkscape::Application *inkscape, - Inkscape::Selection *selection, +static void sp_export_selection_modified ( Inkscape::Application *inkscape, + Inkscape::Selection *selection, guint flags, GtkObject *base ); @@ -110,7 +112,7 @@ static void sp_export_filename_modified (GtkObject * object, gpointer data); static inline void sp_export_find_default_selection(GtkWidget * dlg); static void sp_export_detect_size(GtkObject * base); -static const gchar *prefs_path = "dialogs.export"; +static Glib::ustring const prefs_path = "/dialogs/export/"; // these all need to be reinitialized to their defaults during dialog_destroy static GtkWidget *dlg = NULL; @@ -139,7 +141,7 @@ static const char * selection_labels[SELECTION_NUMBER_OF] = { N_("_Page"), N_("_Drawing"), N_("_Selection"), N_("_Custom")}; static void -sp_export_dialog_destroy ( GtkObject *object, gpointer data ) +sp_export_dialog_destroy ( GtkObject */*object*/, gpointer /*data*/ ) { sp_signal_disconnect_by_data (INKSCAPE, dlg); @@ -157,7 +159,7 @@ sp_export_dialog_destroy ( GtkObject *object, gpointer data ) /// Called when dialog is closed or inkscape is shut down. static bool -sp_export_dialog_delete ( GtkObject *object, GdkEvent *event, gpointer data ) +sp_export_dialog_delete ( GtkObject */*object*/, GdkEvent */*event*/, gpointer /*data*/ ) { gtk_window_get_position ((GtkWindow *) dlg, &x, &y); @@ -165,11 +167,12 @@ sp_export_dialog_delete ( GtkObject *object, GdkEvent *event, gpointer data ) if (x<0) x=0; if (y<0) y=0; - - prefs_set_int_attribute (prefs_path, "x", x); - prefs_set_int_attribute (prefs_path, "y", y); - prefs_set_int_attribute (prefs_path, "w", w); - prefs_set_int_attribute (prefs_path, "h", h); + + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setInt(prefs_path + "x", x); + prefs->setInt(prefs_path + "y", y); + prefs->setInt(prefs_path + "w", w); + prefs->setInt(prefs_path + "h", h); return FALSE; // which means, go ahead and destroy it @@ -196,7 +199,7 @@ sp_export_dialog_delete ( GtkObject *object, GdkEvent *event, gpointer data ) */ static void -sp_export_spinbutton_new ( gchar *key, float val, float min, float max, +sp_export_spinbutton_new ( gchar const *key, float val, float min, float max, float step, float page, GtkWidget *us, GtkWidget *t, int x, int y, const gchar *ll, const gchar *lr, @@ -204,7 +207,7 @@ sp_export_spinbutton_new ( gchar *key, float val, float min, float max, GCallback cb, GtkWidget *dlg ) { GtkObject *a = gtk_adjustment_new (val, min, max, step, page, page); - gtk_object_set_data (a, "key", key); + gtk_object_set_data (a, "key", const_cast(key)); gtk_object_set_data (GTK_OBJECT (dlg), (const gchar *)key, a); if (us) { @@ -286,50 +289,50 @@ sp_export_dialog_area_box (GtkWidget * dlg) b->set_data("key", GINT_TO_POINTER(i)); gtk_object_set_data (GTK_OBJECT (dlg), selection_names[i], b->gobj()); togglebox->pack_start(*b, false, true, 0); - gtk_signal_connect ( GTK_OBJECT (b->gobj()), "clicked", + gtk_signal_connect ( GTK_OBJECT (b->gobj()), "clicked", GTK_SIGNAL_FUNC (sp_export_area_toggled), dlg ); } - g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", + g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (sp_export_selection_changed), dlg ); - g_signal_connect ( G_OBJECT (INKSCAPE), "modify_selection", + g_signal_connect ( G_OBJECT (INKSCAPE), "modify_selection", G_CALLBACK (sp_export_selection_modified), dlg ); - g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", + g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_export_selection_changed), dlg ); - + Gtk::Table* t = new Gtk::Table(2, 6, FALSE); t->set_row_spacings (4); t->set_col_spacings (4); - sp_export_spinbutton_new ( "x0", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), + sp_export_spinbutton_new ( "x0", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), GTK_WIDGET(t->gobj()), 0, 0, _("_x0:"), NULL, EXPORT_COORD_PRECISION, 1, - G_CALLBACK ( sp_export_area_x_value_changed), + G_CALLBACK ( sp_export_area_x_value_changed), dlg ); - sp_export_spinbutton_new ( "x1", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), + sp_export_spinbutton_new ( "x1", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), GTK_WIDGET(t->gobj()), 2, 0, _("x_1:"), NULL, EXPORT_COORD_PRECISION, 1, - G_CALLBACK (sp_export_area_x_value_changed), + G_CALLBACK (sp_export_area_x_value_changed), dlg ); - sp_export_spinbutton_new ( "width", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, - us->gobj(), GTK_WIDGET(t->gobj()), 4, 0, _("Width:"), NULL, EXPORT_COORD_PRECISION, 1, - G_CALLBACK - (sp_export_area_width_value_changed), + sp_export_spinbutton_new ( "width", 0.0, 0.0, PNG_UINT_31_MAX, 0.1, 1.0, + us->gobj(), GTK_WIDGET(t->gobj()), 4, 0, _("Wid_th:"), NULL, EXPORT_COORD_PRECISION, 1, + G_CALLBACK + (sp_export_area_width_value_changed), dlg ); - sp_export_spinbutton_new ( "y0", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), + sp_export_spinbutton_new ( "y0", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), GTK_WIDGET(t->gobj()), 0, 1, _("_y0:"), NULL, EXPORT_COORD_PRECISION, 1, - G_CALLBACK (sp_export_area_y_value_changed), + G_CALLBACK (sp_export_area_y_value_changed), dlg ); - sp_export_spinbutton_new ( "y1", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), + sp_export_spinbutton_new ( "y1", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, us->gobj(), GTK_WIDGET(t->gobj()), 2, 1, _("y_1:"), NULL, EXPORT_COORD_PRECISION, 1, - G_CALLBACK (sp_export_area_y_value_changed), + G_CALLBACK (sp_export_area_y_value_changed), dlg ); - sp_export_spinbutton_new ( "height", 0.0, -1000000.0, 1000000.0, 0.1, 1.0, - us->gobj(), GTK_WIDGET(t->gobj()), 4, 1, _("Height:"), NULL, EXPORT_COORD_PRECISION, 1, - G_CALLBACK (sp_export_area_height_value_changed), + sp_export_spinbutton_new ( "height", 0.0, 0.0, PNG_UINT_31_MAX, 0.1, 1.0, + us->gobj(), GTK_WIDGET(t->gobj()), 4, 1, _("Hei_ght:"), NULL, EXPORT_COORD_PRECISION, 1, + G_CALLBACK (sp_export_area_height_value_changed), dlg ); vb->pack_start(*togglebox, false, false, 3); @@ -340,12 +343,54 @@ sp_export_dialog_area_box (GtkWidget * dlg) } // end of sp_export_dialog_area_box +gchar* create_filepath_from_id (const gchar *id, const gchar *file_entry_text) { + + if (id == NULL) /* This should never happen */ + id = "bitmap"; + + gchar * directory = NULL; + + if (directory == NULL && file_entry_text != NULL && file_entry_text[0] != '\0') { + // std::cout << "Directory from dialog" << std::endl; + directory = g_dirname(file_entry_text); + } + + if (directory == NULL) { + /* Grab document directory */ + if (SP_DOCUMENT_URI(SP_ACTIVE_DOCUMENT)) { + // std::cout << "Directory from document" << std::endl; + directory = g_dirname(SP_DOCUMENT_URI(SP_ACTIVE_DOCUMENT)); + } + } + + if (directory == NULL) { + // std::cout << "Home Directory" << std::endl; + directory = homedir_path(NULL); + } + + gchar * id_ext = g_strconcat(id, ".png", NULL); + gchar *filename = g_build_filename(directory, id_ext, NULL); + g_free(directory); + g_free(id_ext); + return filename; +} + +static void +batch_export_clicked (GtkWidget *widget, GtkObject *base) +{ + Gtk::Widget *vb_singleexport = (Gtk::Widget *)gtk_object_get_data(base, "vb_singleexport"); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))) { + vb_singleexport->set_sensitive(false); + } else { + vb_singleexport->set_sensitive(true); + } +} + void sp_export_dialog (void) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (!dlg) { - Gtk::VBox* vb; - Gtk::HBox* hb; gchar title[500]; sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_FILE_EXPORT), title); @@ -353,13 +398,13 @@ sp_export_dialog (void) dlg = sp_window_new (title, TRUE); if (x == -1000 || y == -1000) { - x = prefs_get_int_attribute (prefs_path, "x", 0); - y = prefs_get_int_attribute (prefs_path, "y", 0); + x = prefs->getInt(prefs_path + "x", 0); + y = prefs->getInt(prefs_path + "y", 0); } if (w ==0 || h == 0) { - w = prefs_get_int_attribute (prefs_path, "w", 0); - h = prefs_get_int_attribute (prefs_path, "h", 0); + w = prefs->getInt(prefs_path + "w", 0); + h = prefs->getInt(prefs_path + "h", 0); } // if (x<0) x=0; @@ -397,15 +442,20 @@ sp_export_dialog (void) GtkTooltips *tt = gtk_tooltips_new(); - vb = new Gtk::VBox(false, 3); + Gtk::VBox *vb = new Gtk::VBox(false, 3); vb->set_border_width(3); gtk_container_add (GTK_CONTAINER (dlg), GTK_WIDGET(vb->gobj())); + Gtk::VBox *vb_singleexport = new Gtk::VBox(false, 0); + vb_singleexport->set_border_width(0); + vb->pack_start(*vb_singleexport); + gtk_object_set_data(GTK_OBJECT(dlg), "vb_singleexport", vb_singleexport); + /* Export area frame */ { Gtk::VBox *area_box = sp_export_dialog_area_box(dlg); area_box->set_border_width(3); - vb->pack_start(*area_box, false, false, 0); + vb_singleexport->pack_start(*area_box, false, false, 0); } /* Bitmap size frame */ @@ -424,40 +474,36 @@ sp_export_dialog (void) t->set_col_spacings (4); size_box->pack_start(*t); - sp_export_spinbutton_new ( "bmwidth", 16.0, 1.0, 1000000.0, 1.0, 10.0, + sp_export_spinbutton_new ( "bmwidth", 16.0, 1.0, 1000000.0, 1.0, 10.0, NULL, GTK_WIDGET(t->gobj()), 0, 0, _("_Width:"), _("pixels at"), 0, 1, - G_CALLBACK - (sp_export_bitmap_width_value_changed), + G_CALLBACK + (sp_export_bitmap_width_value_changed), dlg ); - sp_export_spinbutton_new ( "xdpi", - prefs_get_double_attribute - ( "dialogs.export.defaultxdpi", - "value", DPI_BASE), + sp_export_spinbutton_new ( "xdpi", + prefs->getDouble("/dialogs/export/defaultxdpi/value", DPI_BASE), 0.01, 100000.0, 0.1, 1.0, NULL, GTK_WIDGET(t->gobj()), 3, 0, NULL, _("dp_i"), 2, 1, - G_CALLBACK (sp_export_xdpi_value_changed), + G_CALLBACK (sp_export_xdpi_value_changed), dlg ); - sp_export_spinbutton_new ( "bmheight", 16.0, 1.0, 1000000.0, 1.0, 10.0, - NULL, GTK_WIDGET(t->gobj()), 0, 1, - _("Height:"), _("pixels at"), 0, 1, + sp_export_spinbutton_new ( "bmheight", 16.0, 1.0, 1000000.0, 1.0, 10.0, + NULL, GTK_WIDGET(t->gobj()), 0, 1, + _("_Height:"), _("pixels at"), 0, 1, G_CALLBACK - (sp_export_bitmap_height_value_changed), + (sp_export_bitmap_height_value_changed), dlg ); /** \todo - * Needs fixing: there's no way to set ydpi currently, so we use + * Needs fixing: there's no way to set ydpi currently, so we use * the defaultxdpi value here, too... */ - sp_export_spinbutton_new ( "ydpi", prefs_get_double_attribute - ( "dialogs.export.defaultxdpi", - "value", DPI_BASE), + sp_export_spinbutton_new ( "ydpi", prefs->getDouble("/dialogs/export/defaultxdpi/value", DPI_BASE), 0.01, 100000.0, 0.1, 1.0, NULL, GTK_WIDGET(t->gobj()), 3, 1, NULL, _("dpi"), 2, 0, NULL, dlg ); - vb->pack_start(*size_box); + vb_singleexport->pack_start(*size_box); } /* File entry */ @@ -525,7 +571,7 @@ sp_export_dialog (void) g_signal_connect ( G_OBJECT (fe->gobj()), "changed", G_CALLBACK (sp_export_filename_modified), dlg); - hb = new Gtk::HBox(FALSE, 5); + Gtk::HBox *hb = new Gtk::HBox(FALSE, 5); { // true = has mnemonic @@ -561,7 +607,30 @@ sp_export_dialog (void) // mnemonic in frame label moves focus to filename: flabel->set_mnemonic_widget(*fe); - vb->pack_start(*file_box); + vb_singleexport->pack_start(*file_box); + } + + { + Gtk::HBox* batch_box = new Gtk::HBox(FALSE, 5); + GtkWidget *be = gtk_check_button_new_with_label(_("Batch export all selected objects")); + gtk_widget_set_sensitive(GTK_WIDGET(be), TRUE); + gtk_object_set_data(GTK_OBJECT(dlg), "batch_checkbox", be); + batch_box->pack_start(*Glib::wrap(be), false, false); + gtk_tooltips_set_tip(tt, be, _("Export each selected object into its own PNG file, using export hints if any (caution, overwrites without asking!)"), NULL); + batch_box->show_all(); + g_signal_connect(G_OBJECT(be), "toggled", GTK_SIGNAL_FUNC(batch_export_clicked), dlg); + vb->pack_start(*batch_box); + } + + { + Gtk::HBox* hide_box = new Gtk::HBox(FALSE, 5); + GtkWidget *he = gtk_check_button_new_with_label(_("Hide all except selected")); + gtk_widget_set_sensitive(GTK_WIDGET(he), TRUE); + gtk_object_set_data(GTK_OBJECT(dlg), "hide_checkbox", he); + hide_box->pack_start(*Glib::wrap(he), false, false); + gtk_tooltips_set_tip(tt, he, _("In the exported image, hide all objects except those that are selected"), NULL); + hide_box->show_all(); + vb->pack_start(*hide_box); } /* Buttons */ @@ -598,6 +667,26 @@ sp_export_dialog (void) return; } // end of sp_export_dialog() +static void +sp_export_update_checkbuttons (GtkObject *base) +{ + gint num = g_slist_length((GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList()); + GtkWidget *be = (GtkWidget *)gtk_object_get_data(base, "batch_checkbox"); + GtkWidget *he = (GtkWidget *)gtk_object_get_data(base, "hide_checkbox"); + if (num >= 2) { + gtk_widget_set_sensitive (be, true); + gtk_button_set_label (GTK_BUTTON(be), g_strdup_printf (ngettext("Batch export %d selected object","Batch export %d selected objects",num), num)); + } else { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(be), FALSE); + gtk_widget_set_sensitive (be, FALSE); + } + if (num > 0) { + gtk_widget_set_sensitive (he, true); + } else { + gtk_widget_set_sensitive (he, false); + } +} + static inline void sp_export_find_default_selection(GtkWidget * dlg) { @@ -609,14 +698,14 @@ sp_export_find_default_selection(GtkWidget * dlg) /* Try using the preferences */ if (key == SELECTION_NUMBER_OF) { - const gchar *what = NULL; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); int i = SELECTION_NUMBER_OF; - what = prefs_get_string_attribute ("dialogs.export.exportarea", "value"); + Glib::ustring what = prefs->getString("/dialogs/export/exportarea/value"); - if (what != NULL) { + if (!what.empty()) { for (i = 0; i < SELECTION_NUMBER_OF; i++) { - if (!strcmp (what, selection_names[i])) { + if (what == selection_names[i]) { break; } } @@ -633,18 +722,18 @@ sp_export_find_default_selection(GtkWidget * dlg) selection_names[key]); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); - return; + sp_export_update_checkbuttons (GTK_OBJECT(dlg)); } /** - * \brief If selection changed or a different document activated, we must + * \brief If selection changed or a different document activated, we must * recalculate any chosen areas * */ static void -sp_export_selection_changed ( Inkscape::Application *inkscape, - Inkscape::Selection *selection, +sp_export_selection_changed ( Inkscape::Application *inkscape, + Inkscape::Selection *selection, GtkObject *base ) { selection_type current_key; @@ -668,15 +757,15 @@ sp_export_selection_changed ( Inkscape::Application *inkscape, GtkToggleButton * button; button = (GtkToggleButton *)gtk_object_get_data(base, selection_names[current_key]); sp_export_area_toggled(button, base); - } // end of if() + } - return; -} // end of sp_export_selection_changed() + sp_export_update_checkbuttons (base); +} static void -sp_export_selection_modified ( Inkscape::Application *inkscape, - Inkscape::Selection *selection, - guint flags, +sp_export_selection_modified ( Inkscape::Application */*inkscape*/, + Inkscape::Selection */*selection*/, + guint /*flags*/, GtkObject *base ) { selection_type current_key; @@ -687,14 +776,12 @@ sp_export_selection_modified ( Inkscape::Application *inkscape, if ( SP_ACTIVE_DESKTOP ) { SPDocument *doc; doc = sp_desktop_document (SP_ACTIVE_DESKTOP); - NR::Rect bbox = sp_item_bbox_desktop (SP_ITEM (SP_DOCUMENT_ROOT (doc))); - - if (!(bbox.min()[NR::X] > bbox.max()[NR::X] && - bbox.min()[NR::Y] > bbox.max()[NR::Y])) { - sp_export_set_area (base, bbox.min()[NR::X], - bbox.min()[NR::Y], - bbox.max()[NR::X], - bbox.max()[NR::Y]); + Geom::OptRect bbox = sp_item_bbox_desktop (SP_ITEM (SP_DOCUMENT_ROOT (doc))); + if (bbox) { + sp_export_set_area (base, bbox->min()[Geom::X], + bbox->min()[Geom::Y], + bbox->max()[Geom::X], + bbox->max()[Geom::Y]); } } break; @@ -748,7 +835,7 @@ sp_export_area_toggled (GtkToggleButton *tb, GtkObject *base) if ( SP_ACTIVE_DESKTOP ) { SPDocument *doc; - NR::Rect bbox; + Geom::OptRect bbox; doc = sp_desktop_document (SP_ACTIVE_DESKTOP); /* Notice how the switch is used to 'fall through' here to get @@ -758,7 +845,7 @@ sp_export_area_toggled (GtkToggleButton *tb, GtkObject *base) case SELECTION_SELECTION: if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false) { - bbox = (sp_desktop_selection (SP_ACTIVE_DESKTOP))->bounds(); + bbox = sp_desktop_selection (SP_ACTIVE_DESKTOP)->bounds(); /* Only if there is a selection that we can set do we break, otherwise we fall through to the drawing */ @@ -767,23 +854,20 @@ sp_export_area_toggled (GtkToggleButton *tb, GtkObject *base) break; } case SELECTION_DRAWING: - /** \todo + /** \todo * This returns wrong values if the document has a viewBox. */ bbox = sp_item_bbox_desktop (SP_ITEM (SP_DOCUMENT_ROOT (doc))); - /* If the drawing is valid, then we'll use it and break otherwise we drop through to the page settings */ - if (!(bbox.min()[NR::X] > bbox.max()[NR::X] && - bbox.min()[NR::Y] > bbox.max()[NR::Y])) { + if (bbox) { // std::cout << "Using selection: DRAWING" << std::endl; key = SELECTION_DRAWING; break; } case SELECTION_PAGE: - bbox = NR::Rect(NR::Point(0.0, 0.0), - NR::Point(sp_document_width(doc), sp_document_height(doc)) - ); + bbox = Geom::Rect(Geom::Point(0.0, 0.0), + Geom::Point(sp_document_width(doc), sp_document_height(doc))); // std::cout << "Using selection: PAGE" << std::endl; key = SELECTION_PAGE; @@ -792,18 +876,18 @@ sp_export_area_toggled (GtkToggleButton *tb, GtkObject *base) default: break; } // switch - + // remember area setting - prefs_set_string_attribute ( "dialogs.export.exportarea", - "value", selection_names[key]); - - if (key != SELECTION_CUSTOM) { - sp_export_set_area (base, bbox.min()[NR::X], - bbox.min()[NR::Y], - bbox.max()[NR::X], - bbox.max()[NR::Y]); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setString("/dialogs/export/exportarea/value", selection_names[key]); + + if ( key != SELECTION_CUSTOM && bbox ) { + sp_export_set_area (base, bbox->min()[Geom::X], + bbox->min()[Geom::Y], + bbox->max()[Geom::X], + bbox->max()[Geom::Y]); } - + } // end of if ( SP_ACTIVE_DESKTOP ) @@ -846,35 +930,8 @@ sp_export_area_toggled (GtkToggleButton *tb, GtkObject *base) break; } } - if (id == NULL) /* This should never happen */ - id = "bitmap"; - gchar * directory = NULL; - const gchar * file_entry_text; - - file_entry_text = gtk_entry_get_text(GTK_ENTRY(file_entry)); - if (directory == NULL && file_entry_text != NULL && file_entry_text[0] != '\0') { - // std::cout << "Directory from dialog" << std::endl; - directory = g_dirname(file_entry_text); - } - - if (directory == NULL) { - /* Grab document directory */ - if (SP_DOCUMENT_URI(SP_ACTIVE_DOCUMENT)) { - // std::cout << "Directory from document" << std::endl; - directory = g_dirname(SP_DOCUMENT_URI(SP_ACTIVE_DOCUMENT)); - } - } - - if (directory == NULL) { - // std::cout << "Home Directory" << std::endl; - directory = homedir_path(NULL); - } - - gchar * id_ext = g_strconcat(id, ".png", NULL); - filename = g_build_filename(directory, id_ext, NULL); - g_free(directory); - g_free(id_ext); + filename = create_filepath_from_id (id, gtk_entry_get_text(GTK_ENTRY(file_entry))); } } break; @@ -906,7 +963,7 @@ sp_export_area_toggled (GtkToggleButton *tb, GtkObject *base) /// Called when dialog is deleted static gint -sp_export_progress_delete ( GtkWidget *widget, GdkEvent *event, GObject *base ) +sp_export_progress_delete ( GtkWidget */*widget*/, GdkEvent */*event*/, GObject *base ) { g_object_set_data (base, "cancel", (gpointer) 1); return TRUE; @@ -914,7 +971,7 @@ sp_export_progress_delete ( GtkWidget *widget, GdkEvent *event, GObject *base ) /// Called when progress is cancelled static void -sp_export_progress_cancel ( GtkWidget *widget, GObject *base ) +sp_export_progress_cancel ( GtkWidget */*widget*/, GObject *base ) { g_object_set_data (base, "cancel", (gpointer) 1); } // end of sp_export_progress_cancel() @@ -944,12 +1001,137 @@ sp_export_progress_callback (float value, void *data) } // end of sp_export_progress_callback() +GtkWidget * +create_progress_dialog (GtkObject *base, gchar *progress_text) { + GtkWidget *dlg, *prg, *btn; /* progressbar-stuff */ + + dlg = gtk_dialog_new (); + gtk_window_set_title (GTK_WINDOW (dlg), _("Export in progress")); + prg = gtk_progress_bar_new (); + sp_transientize (dlg); + gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE); + g_object_set_data ((GObject *) base, "progress", prg); + + gtk_progress_bar_set_text ((GtkProgressBar *) prg, progress_text); + + gtk_progress_bar_set_orientation ( (GtkProgressBar *) prg, + GTK_PROGRESS_LEFT_TO_RIGHT); + gtk_box_pack_start ((GtkBox *) ((GtkDialog *) dlg)->vbox, + prg, FALSE, FALSE, 4 ); + btn = gtk_dialog_add_button ( GTK_DIALOG (dlg), + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL ); + + g_signal_connect ( (GObject *) dlg, "delete_event", + (GCallback) sp_export_progress_delete, base); + g_signal_connect ( (GObject *) btn, "clicked", + (GCallback) sp_export_progress_cancel, base); + gtk_window_set_modal ((GtkWindow *) dlg, TRUE); + gtk_widget_show_all (dlg); + + return dlg; +} + +// FIXME: Some lib function should be available to do this ... +static gchar * +filename_add_extension (const gchar *filename, const gchar *extension) +{ + const gchar *dot; + + dot = strrchr (filename, '.'); + if ( !dot ) + return g_strconcat (filename, ".", extension, NULL); + { + if (dot[1] == '\0') + return g_strconcat (filename, extension, NULL); + else + { + if (g_strcasecmp (dot + 1, extension) == 0) + return g_strdup (filename); + else + { + return g_strconcat (filename, ".", extension, NULL); + } + } + } +} + /// Called when export button is clicked static void -sp_export_export_clicked (GtkButton *button, GtkObject *base) +sp_export_export_clicked (GtkButton */*button*/, GtkObject *base) { if (!SP_ACTIVE_DESKTOP) return; + SPNamedView *nv = sp_desktop_namedview(SP_ACTIVE_DESKTOP); + + GtkWidget *be = (GtkWidget *)gtk_object_get_data(base, "batch_checkbox"); + GtkWidget *he = (GtkWidget *)gtk_object_get_data(base, "hide_checkbox"); + bool hide = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (he)); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (be))) { + // Batch export of selected objects + + gint num = g_slist_length((GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList()); + gint n = 0; + + if (num < 1) + return; + + gchar *progress_text = g_strdup_printf (_("Exporting %d files"), num); + GtkWidget *prog_dlg = create_progress_dialog (base, progress_text); + g_free (progress_text); + + for (GSList *i = (GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList(); + i != NULL; + i = i->next) { + SPItem *item = (SPItem *) i->data; + // retrieve export filename hint + const gchar *fn = SP_OBJECT_REPR(item)->attribute("inkscape:export-filename"); + if (!fn) { + fn = create_filepath_from_id (SP_OBJECT_ID(item), NULL); + } + + // retrieve export dpi hints + const gchar *dpi_hint = SP_OBJECT_REPR(item)->attribute("inkscape:export-xdpi"); // only xdpi, ydpi is always the same now + gdouble dpi = 0.0; + if (dpi_hint) { + dpi = atof(dpi_hint); + } + if (dpi == 0.0) { + dpi = DPI_BASE; + } + + Geom::OptRect area; + sp_item_invoke_bbox(item, area, sp_item_i2d_affine((SPItem *) item), TRUE); + if (area) { + gint width = (gint) (area->width() * dpi / PX_PER_IN + 0.5); + gint height = (gint) (area->height() * dpi / PX_PER_IN + 0.5); + + if (width > 1 && height > 1) { + /* Do export */ + if (!sp_export_png_file (sp_desktop_document (SP_ACTIVE_DESKTOP), fn, + *area, width, height, dpi, dpi, + nv->pagecolor, + NULL, NULL, TRUE, // overwrite without asking + hide ? (GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList() : NULL + )) { + gchar * error; + gchar * safeFile = Inkscape::IO::sanitizeString(fn); + error = g_strdup_printf(_("Could not export to filename %s.\n"), safeFile); + sp_ui_error_dialog(error); + g_free(safeFile); + g_free(error); + } + } + } + n++; + sp_export_progress_callback((float)n/num, base); + } + + gtk_widget_destroy (prog_dlg); + g_object_set_data (G_OBJECT (base), "cancel", (gpointer) 0); + + } else { + GtkWidget *fe = (GtkWidget *)gtk_object_get_data(base, "filename"); gchar const *filename = gtk_entry_get_text(GTK_ENTRY(fe)); @@ -959,8 +1141,8 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) float const y1 = sp_export_value_get_px(base, "y1"); float const xdpi = sp_export_value_get(base, "xdpi"); float const ydpi = sp_export_value_get(base, "ydpi"); - int const width = int(sp_export_value_get(base, "bmwidth") + 0.5); - int const height = int(sp_export_value_get(base, "bmheight") + 0.5); + unsigned long int const width = int(sp_export_value_get(base, "bmwidth") + 0.5); + unsigned long int const height = int(sp_export_value_get(base, "bmheight") + 0.5); if (filename == NULL || *filename == '\0') { sp_ui_error_dialog(_("You have to enter a filename")); @@ -972,7 +1154,7 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) return; } - gchar *dirname = g_dirname(filename); + gchar *dirname = g_path_get_dirname(filename); if ( dirname == NULL || !Inkscape::IO::file_test(dirname, (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) ) { @@ -987,43 +1169,24 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) } g_free(dirname); - SPNamedView *nv = sp_desktop_namedview(SP_ACTIVE_DESKTOP); - GtkWidget *dlg, *prg, *btn; /* progressbar-stuff */ - char *fn; - gchar *text; + // make sure that .png is the extension of the file: + gchar * filename_ext = filename_add_extension(filename, "png"); + gtk_entry_set_text(GTK_ENTRY(fe), filename_ext); - dlg = gtk_dialog_new (); - gtk_window_set_title (GTK_WINDOW (dlg), _("Export in progress")); - prg = gtk_progress_bar_new (); - sp_transientize (dlg); - gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE); - g_object_set_data ((GObject *) base, "progress", prg); - fn = g_path_get_basename (filename); - text = g_strdup_printf ( _("Exporting %s (%d x %d)"), - fn, width, height); + gchar *fn = g_path_get_basename (filename_ext); + + gchar *progress_text = g_strdup_printf (_("Exporting %s (%lu x %lu)"), fn, width, height); g_free (fn); - gtk_progress_bar_set_text ((GtkProgressBar *) prg, text); - g_free (text); - gtk_progress_bar_set_orientation ( (GtkProgressBar *) prg, - GTK_PROGRESS_LEFT_TO_RIGHT); - gtk_box_pack_start ((GtkBox *) ((GtkDialog *) dlg)->vbox, - prg, FALSE, FALSE, 4 ); - btn = gtk_dialog_add_button ( GTK_DIALOG (dlg), - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL ); - - g_signal_connect ( (GObject *) dlg, "delete_event", - (GCallback) sp_export_progress_delete, base); - g_signal_connect ( (GObject *) btn, "clicked", - (GCallback) sp_export_progress_cancel, base); - gtk_window_set_modal ((GtkWindow *) dlg, TRUE); - gtk_widget_show_all (dlg); - + GtkWidget *prog_dlg = create_progress_dialog (base, progress_text); + g_free (progress_text); + /* Do export */ - if (!sp_export_png_file (sp_desktop_document (SP_ACTIVE_DESKTOP), filename, - x0, y0, x1, y1, width, height, xdpi, ydpi, - nv->pagecolor, - sp_export_progress_callback, base)) { + if (!sp_export_png_file (sp_desktop_document (SP_ACTIVE_DESKTOP), filename_ext, + Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1)), width, height, xdpi, ydpi, + nv->pagecolor, + sp_export_progress_callback, base, FALSE, + hide ? (GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList() : NULL + )) { gchar * error; gchar * safeFile = Inkscape::IO::sanitizeString(filename); error = g_strdup_printf(_("Could not export to filename %s.\n"), safeFile); @@ -1035,10 +1198,10 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) /* Reset the filename so that it can be changed again by changing selections and all that */ g_free(original_name); - original_name = g_strdup(filename); + original_name = g_strdup(filename_ext); gtk_object_set_data (GTK_OBJECT (base), "filename-modified", (gpointer)FALSE); - gtk_widget_destroy (dlg); + gtk_widget_destroy (prog_dlg); g_object_set_data (G_OBJECT (base), "cancel", (gpointer) 0); /* Setup the values in the document */ @@ -1054,8 +1217,8 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) sp_document_set_undo_sensitive(doc, false); temp_string = repr->attribute("inkscape:export-filename"); - if (temp_string == NULL || strcmp(temp_string, filename)) { - repr->setAttribute("inkscape:export-filename", filename); + if (temp_string == NULL || strcmp(temp_string, filename_ext)) { + repr->setAttribute("inkscape:export-filename", filename_ext); modified = true; } temp_string = repr->attribute("inkscape:export-xdpi"); @@ -1068,10 +1231,11 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) sp_repr_set_svg_double(repr, "inkscape:export-ydpi", ydpi); modified = true; } - - if (modified) - repr->setAttribute("sodipodi:modified", "TRUE"); sp_document_set_undo_sensitive(doc, saved); + + if (modified) { + doc->setModifiedSinceSave(); + } break; } case SELECTION_SELECTION: { @@ -1088,12 +1252,12 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) const gchar * temp_string; if (repr->attribute("id") == NULL || - !(g_strrstr(filename, repr->attribute("id")) != NULL && + !(g_strrstr(filename_ext, repr->attribute("id")) != NULL && (!SP_DOCUMENT_URI(SP_ACTIVE_DOCUMENT) || strcmp(g_dirname(filename), g_dirname(SP_DOCUMENT_URI(SP_ACTIVE_DOCUMENT))) == 0))) { temp_string = repr->attribute("inkscape:export-filename"); - if (temp_string == NULL || strcmp(temp_string, filename)) { - repr->setAttribute("inkscape:export-filename", filename); + if (temp_string == NULL || strcmp(temp_string, filename_ext)) { + repr->setAttribute("inkscape:export-filename", filename_ext); modified = true; } } @@ -1108,64 +1272,41 @@ sp_export_export_clicked (GtkButton *button, GtkObject *base) modified = true; } } + sp_document_set_undo_sensitive(doc, saved); if (modified) { - Inkscape::XML::Node * repr = sp_document_repr_root(doc); - repr->setAttribute("sodipodi:modified", "TRUE"); + doc->setModifiedSinceSave(); } - - sp_document_set_undo_sensitive(doc, saved); break; } default: break; } + g_free (filename_ext); - return; -} // end of sp_export_export_clicked() - - -// FIXME: Some lib function should be available to do this ... -static gchar * -filename_add_extension (const gchar *filename, const gchar *extension) -{ - gchar *dot; - - dot = strrchr (filename, '.'); - if ( !dot ) - return g_strconcat (filename, ".", extension, NULL); - { - if (dot[1] == '\0') - return g_strconcat (filename, extension, NULL); - else - { - if (g_strcasecmp (dot + 1, extension) == 0) - return g_strdup (filename); - else - { - return g_strconcat (filename, ".", extension, NULL); - } } - } -} + +} // end of sp_export_export_clicked() /// Called when Browse button is clicked static void -sp_export_browse_clicked (GtkButton *button, gpointer userdata) +sp_export_browse_clicked (GtkButton */*button*/, gpointer /*userdata*/) { GtkWidget *fs, *fe; const gchar *filename; fs = gtk_file_chooser_dialog_new (_("Select a filename for exporting"), - NULL, + (GtkWindow*)dlg, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL ); #ifdef WITH_GNOME_VFS - gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER (fs), false); + if (gnome_vfs_initialized()) { + gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(fs), false); + } #endif fe = (GtkWidget *)g_object_get_data (G_OBJECT (dlg), "filename"); @@ -1187,15 +1328,12 @@ sp_export_browse_clicked (GtkButton *button, gpointer userdata) gchar *file; file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fs)); - // make sure that .png is the extension of the file: - gchar * file_ext = filename_add_extension(file, "png"); - gchar * utf8file = g_filename_to_utf8( file_ext, -1, NULL, NULL, NULL ); + gchar * utf8file = g_filename_to_utf8( file, -1, NULL, NULL, NULL ); gtk_entry_set_text (GTK_ENTRY (fe), utf8file); g_object_set_data (G_OBJECT (dlg), "filename", fe); - g_free(file_ext); g_free(utf8file); g_free(file); } @@ -1207,14 +1345,14 @@ sp_export_browse_clicked (GtkButton *button, gpointer userdata) // TODO: Move this to nr-rect-fns.h. static bool -sp_export_bbox_equal(NR::Rect const &one, NR::Rect const &two) -{ +sp_export_bbox_equal(Geom::Rect const &one, Geom::Rect const &two) +{ double const epsilon = pow(10.0, -EXPORT_COORD_PRECISION); return ( - (fabs(one.min()[NR::X] - two.min()[NR::X]) < epsilon) && - (fabs(one.min()[NR::Y] - two.min()[NR::Y]) < epsilon) && - (fabs(one.max()[NR::X] - two.max()[NR::X]) < epsilon) && - (fabs(one.max()[NR::Y] - two.max()[NR::Y]) < epsilon) + (fabs(one.min()[Geom::X] - two.min()[Geom::X]) < epsilon) && + (fabs(one.min()[Geom::Y] - two.min()[Geom::Y]) < epsilon) && + (fabs(one.max()[Geom::X] - two.max()[Geom::X]) < epsilon) && + (fabs(one.max()[Geom::Y] - two.max()[Geom::Y]) < epsilon) ); } @@ -1247,11 +1385,11 @@ sp_export_detect_size(GtkObject * base) { selection_type this_test[SELECTION_NUMBER_OF + 1]; selection_type key = SELECTION_NUMBER_OF; - NR::Point x(sp_export_value_get_px (base, "x0"), - sp_export_value_get_px (base, "y0")); - NR::Point y(sp_export_value_get_px (base, "x1"), - sp_export_value_get_px (base, "y1")); - NR::Rect current_bbox(x, y); + Geom::Point x(sp_export_value_get_px (base, "x0"), + sp_export_value_get_px (base, "y0")); + Geom::Point y(sp_export_value_get_px (base, "x1"), + sp_export_value_get_px (base, "y1")); + Geom::Rect current_bbox(x, y); //std::cout << "Current " << current_bbox; this_test[0] = (selection_type)(GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(base), "selection-type"))); @@ -1268,10 +1406,10 @@ sp_export_detect_size(GtkObject * base) { switch (this_test[i]) { case SELECTION_SELECTION: if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false) { - NR::Rect bbox = (sp_desktop_selection (SP_ACTIVE_DESKTOP))->bounds(); + Geom::OptRect bbox = (sp_desktop_selection (SP_ACTIVE_DESKTOP))->bounds(); //std::cout << "Selection " << bbox; - if (sp_export_bbox_equal(bbox,current_bbox)) { + if ( bbox && sp_export_bbox_equal(*bbox,current_bbox)) { key = SELECTION_SELECTION; } } @@ -1279,10 +1417,10 @@ sp_export_detect_size(GtkObject * base) { case SELECTION_DRAWING: { SPDocument *doc = sp_desktop_document (SP_ACTIVE_DESKTOP); - NR::Rect bbox = sp_item_bbox_desktop (SP_ITEM (SP_DOCUMENT_ROOT (doc))); + Geom::OptRect bbox = sp_item_bbox_desktop (SP_ITEM (SP_DOCUMENT_ROOT (doc))); // std::cout << "Drawing " << bbox2; - if (sp_export_bbox_equal(bbox,current_bbox)) { + if ( bbox && sp_export_bbox_equal(*bbox,current_bbox) ) { key = SELECTION_DRAWING; } break; @@ -1293,10 +1431,10 @@ sp_export_detect_size(GtkObject * base) { doc = sp_desktop_document (SP_ACTIVE_DESKTOP); - NR::Point x(0.0, 0.0); - NR::Point y(sp_document_width(doc), - sp_document_height(doc)); - NR::Rect bbox(x, y); + Geom::Point x(0.0, 0.0); + Geom::Point y(sp_document_width(doc), + sp_document_height(doc)); + Geom::Rect bbox(x, y); // std::cout << "Page " << bbox; if (sp_export_bbox_equal(bbox,current_bbox)) { @@ -1420,7 +1558,7 @@ sp_export_area_y_value_changed (GtkAdjustment *adj, GtkObject *base) /// Called when x1-x0 or area width is changed static void -sp_export_area_width_value_changed (GtkAdjustment *adj, GtkObject *base) +sp_export_area_width_value_changed (GtkAdjustment */*adj*/, GtkObject *base) { float x0, x1, xdpi, width, bmwidth; @@ -1457,7 +1595,7 @@ sp_export_area_width_value_changed (GtkAdjustment *adj, GtkObject *base) /// Called when y1-y0 or area height is changed. static void -sp_export_area_height_value_changed (GtkAdjustment *adj, GtkObject *base) +sp_export_area_height_value_changed (GtkAdjustment */*adj*/, GtkObject *base) { float y0, y1, ydpi, height, bmheight; @@ -1540,7 +1678,7 @@ sp_export_set_image_x (GtkObject *base) /// Called when pixel width is changed static void -sp_export_bitmap_width_value_changed (GtkAdjustment *adj, GtkObject *base) +sp_export_bitmap_width_value_changed (GtkAdjustment */*adj*/, GtkObject *base) { float x0, x1, bmwidth, xdpi; @@ -1575,7 +1713,7 @@ sp_export_bitmap_width_value_changed (GtkAdjustment *adj, GtkObject *base) /// Called when pixel height is changed static void -sp_export_bitmap_height_value_changed (GtkAdjustment *adj, GtkObject *base) +sp_export_bitmap_height_value_changed (GtkAdjustment */*adj*/, GtkObject *base) { float y0, y1, bmheight, xdpi; @@ -1637,7 +1775,7 @@ sp_export_bitmap_height_value_changed (GtkAdjustment *adj, GtkObject *base) currently be independent. This is likely to change in the future. */ void -sp_export_xdpi_value_changed (GtkAdjustment *adj, GtkObject *base) +sp_export_xdpi_value_changed (GtkAdjustment */*adj*/, GtkObject *base) { float x0, x1, xdpi, bmwidth; @@ -1656,7 +1794,8 @@ sp_export_xdpi_value_changed (GtkAdjustment *adj, GtkObject *base) xdpi = sp_export_value_get (base, "xdpi"); // remember xdpi setting - prefs_set_double_attribute ("dialogs.export.defaultxdpi", "value", xdpi); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/export/defaultxdpi/value", xdpi); bmwidth = (x1 - x0) * xdpi / DPI_BASE; @@ -1829,9 +1968,9 @@ sp_export_filename_modified (GtkObject * object, gpointer data) Local Variables: mode:c++ c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)) + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :