[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
gEDA-cvs: CVS update: g_funcs.c
User: pcjc2
Date: 07/02/23 18:32:12
Modified: . Tag: noscreen g_funcs.c g_keys.c g_register.c
i_callbacks.c x_autonumber.c x_image.c
Log:
sync with trunk
Revision Changes Path
No revision
No revision
1.19.6.2 +8 -2 eda/geda/gaf/gschem/src/g_funcs.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: g_funcs.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/g_funcs.c,v
retrieving revision 1.19.6.1
retrieving revision 1.19.6.2
diff -u -b -r1.19.6.1 -r1.19.6.2
--- g_funcs.c 11 Feb 2007 23:58:55 -0000 1.19.6.1
+++ g_funcs.c 23 Feb 2007 23:32:12 -0000 1.19.6.2
@@ -94,9 +94,15 @@
SCM_ARG1, "gschem-image");
if (output_filename) {
- x_image_lowlevel (global_window_current, output_filename);
+ x_image_lowlevel (global_window_current, output_filename,
+ global_window_current->image_width,
+ global_window_current->image_height,
+ "png");
} else {
- x_image_lowlevel (global_window_current, SCM_STRING_CHARS (filename));
+ x_image_lowlevel (global_window_current, SCM_STRING_CHARS (filename),
+ global_window_current->image_width,
+ global_window_current->image_height,
+ "png");
}
return SCM_BOOL_T;
1.4.6.1 +2 -0 eda/geda/gaf/gschem/src/g_keys.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: g_keys.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/g_keys.c,v
retrieving revision 1.4
retrieving revision 1.4.6.1
diff -u -b -r1.4 -r1.4.6.1
--- g_keys.c 9 Sep 2006 02:56:42 -0000 1.4
+++ g_keys.c 23 Feb 2007 23:32:12 -0000 1.4.6.1
@@ -281,6 +281,8 @@
DEFINE_G_KEYS(options_grid)
DEFINE_G_KEYS(options_snap)
DEFINE_G_KEYS(options_snap_size)
+DEFINE_G_KEYS(options_scale_up_snap_size)
+DEFINE_G_KEYS(options_scale_down_snap_size)
DEFINE_G_KEYS(options_rubberband)
DEFINE_G_KEYS(options_show_log_window)
DEFINE_G_KEYS(options_show_coord_window)
1.49.2.2 +2 -0 eda/geda/gaf/gschem/src/g_register.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: g_register.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/g_register.c,v
retrieving revision 1.49.2.1
retrieving revision 1.49.2.2
diff -u -b -r1.49.2.1 -r1.49.2.2
--- g_register.c 11 Feb 2007 23:58:56 -0000 1.49.2.1
+++ g_register.c 23 Feb 2007 23:32:12 -0000 1.49.2.2
@@ -296,6 +296,8 @@
{ "attributes-visibility-toggle", 0, 0, 0, g_keys_attributes_visibility_toggle },
{ "options-text-size", 0, 0, 0, g_keys_options_text_size },
{ "options-snap-size", 0, 0, 0, g_keys_options_snap_size },
+ { "options-scale-up-snap-size", 0, 0, 0, g_keys_options_scale_up_snap_size },
+ { "options-scale-down-snap-size",0, 0, 0, g_keys_options_scale_down_snap_size },
{ "options-action-feedback", 0, 0, 0, g_keys_options_afeedback },
{ "options-grid", 0, 0, 0, g_keys_options_grid },
{ "options-snap", 0, 0, 0, g_keys_options_snap },
1.70.2.5 +60 -43 eda/geda/gaf/gschem/src/i_callbacks.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: i_callbacks.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/i_callbacks.c,v
retrieving revision 1.70.2.4
retrieving revision 1.70.2.5
diff -u -b -r1.70.2.4 -r1.70.2.5
--- i_callbacks.c 12 Feb 2007 01:53:32 -0000 1.70.2.4
+++ i_callbacks.c 23 Feb 2007 23:32:12 -0000 1.70.2.5
@@ -446,49 +446,10 @@
DEFINE_I_CALLBACK(file_write_png)
{
TOPLEVEL *w_current = (TOPLEVEL *) data;
- char *base=NULL;
- char *img_filename=NULL;
exit_if_null(w_current);
-#if 0
-#ifndef HAS_LIBGD
- /*! \todo integrate these to messages */
- fprintf(stderr,
- _("libgd not installed or disabled, "
- "so this feature is disabled\n"));
- s_log_message(
- _("libgd not installed or disabled, "
- "so this feature is disabled\n"));
- return;
-#endif
-#endif
- /* get the base file name */
- if (strcmp(fnameext_get(w_current->page_current->page_filename),
- ".sch") == 0) {
- /* the filename ends with .sch */
- base = fnameext_remove(w_current->page_current->page_filename);
- } else {
- /* the filename does not end with .sch */
- base = g_strdup (w_current->page_current->page_filename);
- }
- if(base == NULL) {
- /*! \todo do something */
- }
-
- /* add ".png" tp the base filename */
- img_filename = fnameext_add(base, ".png");
- g_free(base);
-
- if (output_filename) {
- x_image_setup(w_current, output_filename);
- } else {
- x_image_setup(w_current, img_filename);
- }
-
- if (img_filename) {
- g_free(img_filename);
- }
+ x_image_setup(w_current);
}
/*! \todo Finish function documentation!!!
@@ -1114,24 +1075,42 @@
{
TOPLEVEL *w_current = (TOPLEVEL *) data;
OBJECT *o_current;
+ GList* selection_copy;
+ GList* s_current;
exit_if_null(w_current);
i_update_middle_button(w_current, i_callback_edit_update, _("Update"));
/* anything selected ? */
if (o_select_selected(w_current)) {
- /* yes, update each selected component */
- GList *s_current =
- w_current->page_current->selection_list;
+ /* yes, update each selected component, but operate from a copy of the */
+ /* selection list, since o_update_component will modify the selection */
+
+ /* After the following code executes, only OBJ_COMPLEX object will be */
+ /* left selected. */
+
+ /* g_list_copy does a shallow copy which is exactly what we need here */
+ selection_copy = g_list_copy(w_current->page_current->selection_list);
+ s_current = selection_copy;
while (s_current != NULL) {
o_current = (OBJECT *) s_current->data;
g_assert (o_current != NULL);
if (o_current->type == OBJ_COMPLEX) {
o_update_component (w_current, o_current);
}
+ else
+ {
+ /* object was not a OBJ_COMPLEX, so unselect it. */
+ o_selection_remove (&(w_current->page_current->selection_list),
+ o_current);
+ }
s_current = s_current->next;
}
+ g_list_free(selection_copy);
+
+ /* Make sure the display is up to date */
+ o_redraw_all(w_current);
} else {
/* nothing selected, go back to select state */
o_redraw_cleanstates(w_current);
@@ -3335,6 +3314,44 @@
snap_size_dialog(w_current);
}
+/*! \brief Multiply by two the snap grid size.
+ * \par Function Description
+ * Callback function for the scale-up snap grid size hotkey.
+ * Multiply by two the snap grid size.
+ */
+DEFINE_I_CALLBACK(options_scale_up_snap_size)
+{
+ TOPLEVEL *w_current = (TOPLEVEL *) data;
+
+ exit_if_null(w_current);
+
+ w_current->snap_size *= 2;
+ w_current->page_current->CHANGED=1; /* maybe remove those two lines */
+ o_undo_savestate(w_current, UNDO_ALL);
+
+ o_redraw_all(w_current);
+}
+
+/*! \brief Divide by two the snap grid size.
+ * \par Function Description
+ * Callback function for the scale-down snap grid size hotkey.
+ * Divide by two the snap grid size (if it's and even number).
+ */
+DEFINE_I_CALLBACK(options_scale_down_snap_size)
+{
+ TOPLEVEL *w_current = (TOPLEVEL *) data;
+
+ exit_if_null(w_current);
+
+ if (w_current->snap_size % 2 == 0)
+ w_current->snap_size /= 2;
+ w_current->page_current->CHANGED=1; /* maybe remove those two lines */
+ o_undo_savestate(w_current, UNDO_ALL);
+
+ o_redraw_all(w_current);
+
+}
+
/*! \todo Finish function documentation!!!
* \brief
* \par Function Description
1.2.2.3 +1 -1 eda/geda/gaf/gschem/src/x_autonumber.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: x_autonumber.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/x_autonumber.c,v
retrieving revision 1.2.2.2
retrieving revision 1.2.2.3
diff -u -b -r1.2.2.2 -r1.2.2.3
--- x_autonumber.c 11 Feb 2007 23:58:57 -0000 1.2.2.2
+++ x_autonumber.c 23 Feb 2007 23:32:12 -0000 1.2.2.3
@@ -893,7 +893,7 @@
g_free(path);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
- 0, names[i],
+ 0, _(names[i]),
1, pixbuf,
-1);
}
1.27.2.3 +389 -338 eda/geda/gaf/gschem/src/x_image.c
(In the diff below, changes in quantity of whitespace are not shown.)
Index: x_image.c
===================================================================
RCS file: /home/cvspsrv/cvsroot/eda/geda/gaf/gschem/src/x_image.c,v
retrieving revision 1.27.2.2
retrieving revision 1.27.2.3
diff -u -b -r1.27.2.2 -r1.27.2.3
--- x_image.c 11 Feb 2007 23:58:58 -0000 1.27.2.2
+++ x_image.c 23 Feb 2007 23:32:12 -0000 1.27.2.3
@@ -19,6 +19,7 @@
#include <config.h>
#include <stdio.h>
+#include <unistd.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
@@ -26,6 +27,8 @@
#include <string.h>
#endif
+#include <glib.h>
+
#include <libgeda/libgeda.h>
#include "../include/globals.h"
@@ -36,197 +39,260 @@
#include <dmalloc.h>
#endif
-#define GLADE_HOOKUP_OBJECT(component,widget,name) \
- g_object_set_data_full (G_OBJECT (component), name, \
- gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
+#define X_IMAGE_DEFAULT_SIZE "800x600"
-/* static const gchar *list_item_data_key="list_item_data"; */
+#ifndef HAS_LIBGD
+#define X_IMAGE_SIZE_MENU_NAME "image_size_menu"
+#define X_IMAGE_TYPE_MENU_NAME "image_type_menu"
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-gint image_320(GtkWidget *w, TOPLEVEL *w_current)
-{
- w_current->image_width = 320;
- w_current->image_height = 240;
- return(0);
-}
+#define X_IMAGE_DEFAULT_TYPE "PNG"
+#endif
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-gint image_640(GtkWidget *w, TOPLEVEL *w_current)
-{
- w_current->image_width = 640;
- w_current->image_height = 480;
- return(0);
-}
+static char *x_image_sizes[] = {"320x240", "640x480", "800x600", "1200x768",
+ "1280x960", "1600x1200", "3200x2400", NULL};
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-gint image_800(GtkWidget *w, TOPLEVEL *w_current)
-{
- w_current->image_width = 800;
- w_current->image_height = 600;
- return(0);
-}
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+/* gtk_combo_box_get_active_text was included in GTK 2.6, so we need to store
+ the different image type descriptions in a list. */
+GSList *image_type_descriptions = NULL;
+#endif
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-gint image_1024(GtkWidget *w, TOPLEVEL *w_current)
-{
- w_current->image_width = 1024;
- w_current->image_height = 768;
- return(0);
-}
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-gint image_1280(GtkWidget *w, TOPLEVEL *w_current)
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+static void free_image_type_descriptions_list ()
{
- w_current->image_width = 1280;
- w_current->image_height = 960;
- return(0);
-}
+ GSList *ptr;
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-gint image_1600(GtkWidget *w, TOPLEVEL *w_current)
-{
- w_current->image_width = 1600;
- w_current->image_height = 1200;
- return(0);
+ /* Free the data stored in each node */
+ ptr = image_type_descriptions;
+ while (ptr) {
+ g_free(ptr->data);
+ ptr->data = NULL;
+ ptr = g_slist_next(ptr);
+ }
+
+ /* Free the list */
+ if (!ptr)
+ g_slist_free(image_type_descriptions);
+ image_type_descriptions = NULL;
}
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
+#endif
+
+/*! \brief Create the options of the image size combobox
+ * \par This function adds the options of the image size to the given combobox.
+ * \param combo [in] the combobox to add the options to.
+ * \return nothing
+ * \note
+ * This function is only used in this file, there are other create_menus...
*/
-gint image_3200(GtkWidget *w, TOPLEVEL *w_current)
+static void create_size_menu (GtkComboBox *combo)
{
- w_current->image_width = 3200;
- w_current->image_height = 2400;
- return(0);
+ char *buf;
+ char *default_size;
+ int i, default_index = 0;
+
+ default_size = g_strdup_printf(X_IMAGE_DEFAULT_SIZE);
+ for (i=0; x_image_sizes[i] != NULL;i++) {
+ /* Create a new string and add it as an option*/
+ buf = g_strdup_printf(x_image_sizes[i]);
+ gtk_combo_box_append_text (GTK_COMBO_BOX (combo), buf);
+
+ /* Compare with the default size, to get the default index */
+ if (strcasecmp(buf, default_size ) == 0) {
+ default_index = i;
+ }
+ g_free(buf);
+ }
+ g_free(default_size);
+
+ /* Set the default menu */
+ gtk_combo_box_set_active(GTK_COMBO_BOX (combo), default_index);
+
+ return;
}
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
+/*! \brief Create the options of the image type combobox
+ * \par This function adds the options of the image type to the given combobox.
+ * \param combo [in] the combobox to add the options to.
+ * \return nothing
* \note
- * this is from gtktest.c and only used in this file,
- * there are other create_menus...
+ * This function is only used in this file, there are other create_menus...
*/
-static GtkWidget *create_menu_size(TOPLEVEL *w_current)
+static void create_type_menu(GtkComboBox *combo)
{
- GtkWidget *menu;
- GtkWidget *menuitem;
- GSList *group;
+#ifndef HAS_LIBGD
+ GSList *formats = gdk_pixbuf_get_formats ();
+ GSList *ptr;
char *buf;
+ int i=0, default_index=0;
- menu = gtk_menu_new ();
- group = NULL;
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+ /* If GTK < 2.6, free the descriptions list */
+ free_image_type_descriptions_list();
+#endif
+
+ ptr = formats;
+ while (ptr) {
+ if (gdk_pixbuf_format_is_writable (ptr->data)) {
+ /* Get the format description and add it to the menu */
+ buf = g_strdup_printf(gdk_pixbuf_format_get_description(ptr->data));
+ gtk_combo_box_append_text (GTK_COMBO_BOX (combo), buf);
+
+ /* If GTK < 2.6, then add it also to the descriptions list. */
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+ image_type_descriptions = g_slist_append(image_type_descriptions,
+ buf);
+#endif
- buf = g_strdup_printf("320x240");
- menuitem = gtk_radio_menu_item_new_with_label (group, buf);
+ /* Compare the name with "png" and store the index */
+ buf = g_strdup_printf(gdk_pixbuf_format_get_name(ptr->data));
+ if (strcasecmp(buf, X_IMAGE_DEFAULT_TYPE) == 0) {
+ default_index = i;
+ }
g_free(buf);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- (GtkSignalFunc) image_320,
- w_current);
+ }
+ i++;
+ ptr = ptr->next;
+ }
+ g_slist_free (formats);
- gtk_widget_show (menuitem);
+ /* Set the default menu */
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo), default_index);
+#else
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "PNG");
- buf = g_strdup_printf("640x480");
- menuitem = gtk_radio_menu_item_new_with_label (group, buf);
- g_free(buf);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- (GtkSignalFunc) image_640,
- w_current);
+ /* Set the default menu */
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+#endif
+ return;
+}
- gtk_widget_show (menuitem);
+/*! \brief Given a gdk-pixbuf image type description, it returns the type,
+ * or extension of the image.
+ * \par Return the gdk-pixbuf image type, or extension, which has the
+ * given gdk-pixbuf description.
+ * \param description The gdk-pixbuf image type description.
+ * \return The gdk-pixbuf type, or extension, of the image.
+ * \note This function is only used in this file.
+ */
+static char *x_image_get_type_from_description(char *description) {
+#ifndef HAS_LIBGD
+ gchar *descr = g_strdup_printf(description);
+ GSList *formats = gdk_pixbuf_get_formats ();
+ GSList *ptr;
+ gchar *ptr_descr;
+
+ ptr = formats;
+ while (ptr) {
+ ptr_descr = gdk_pixbuf_format_get_description (ptr->data);
+ if (strcasecmp(ptr_descr, descr) == 0) {
+ g_free(descr);
+ return(gdk_pixbuf_format_get_name(ptr->data));
+ }
- buf = g_strdup_printf("800x600");
- menuitem = gtk_radio_menu_item_new_with_label (group, buf);
- g_free(buf);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- (GtkSignalFunc) image_800,
- w_current);
- gtk_widget_show (menuitem);
+ ptr = ptr->next;
+ }
+ g_free (descr);
+ return NULL;
+#else
+ /* When using libgd, there is only one supported type: PNG */
+ return(g_strdup("png"));
+#endif
- buf = g_strdup_printf("1024x768");
- menuitem = gtk_radio_menu_item_new_with_label (group, buf);
- g_free(buf);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- (GtkSignalFunc) image_1024,
- w_current);
- gtk_widget_show (menuitem);
+}
- buf = g_strdup_printf("1280x960");
- menuitem = gtk_radio_menu_item_new_with_label (group, buf);
- g_free(buf);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- (GtkSignalFunc) image_1280,
- w_current);
- gtk_widget_show (menuitem);
+/*! \brief Update the filename of a file dialog, when the image type has changed.
+ * \par Given a combobox inside a file chooser dialog, this function updates
+ * the filename displayed by the dialog, removing the current extension, and
+ * adding the extension of the image type selected.
+ * \param combo [in] A combobox inside a file chooser dialog, with gdk-pixbuf image type descriptions.
+ * \param w_current [in] the TOPLEVEL structure.
+ * \return nothing.
+ *
+ */
+static void x_image_update_dialog_filename(GtkComboBox *combo,
+ TOPLEVEL *w_current) {
+
+ char* image_type_descr = NULL;
+ char *image_type = NULL;
+ char *old_image_filename = NULL;
+ char *file_basename = NULL;
+ char *file_name = NULL ;
+ char *new_image_filename = NULL;
+ GtkWidget *file_chooser;
+
+ /* Get the current image type */
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+ GSList *ptr;
+ /* If GTK < 2.6, get the description from the descriptions list */
+ ptr = g_slist_nth(image_type_descriptions,
+ gtk_combo_box_get_active(GTK_COMBO_BOX(combo)));
+ image_type_descr = (char *) (ptr->data);
+#else
+ image_type_descr = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo));
+#endif
+ image_type = x_image_get_type_from_description(image_type_descr);
- buf = g_strdup_printf("1600x1200");
- menuitem = gtk_radio_menu_item_new_with_label (group, buf);
- g_free(buf);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- (GtkSignalFunc) image_1600,
- w_current);
- gtk_widget_show (menuitem);
+ /* Get the parent dialog */
+ file_chooser = gtk_widget_get_ancestor(GTK_WIDGET(combo),
+ GTK_TYPE_FILE_CHOOSER);
- buf = g_strdup_printf("3200x2400");
- menuitem = gtk_radio_menu_item_new_with_label (group, buf);
- g_free(buf);
- group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
- gtk_menu_append (GTK_MENU (menu), menuitem);
- gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
- (GtkSignalFunc) image_3200,
- w_current);
- gtk_widget_show (menuitem);
+ /* Get the previous file name. If none, revert to the page filename */
+ old_image_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser));
+ if (!old_image_filename) {
+ old_image_filename = w_current->page_current->page_filename;
+ }
- gtk_menu_set_active(GTK_MENU (menu),2);
+ /* Get the file name, without extension */
+ if (old_image_filename) {
+ file_basename = g_path_get_basename(old_image_filename);
+
+ if (g_strrstr(file_basename, ".") != NULL) {
+ file_name = g_strndup(file_basename,
+ g_strrstr(file_basename, ".") - file_basename);
+ }
+ }
+
+ /* Add the extension */
+ if (file_name) {
+ new_image_filename = g_strdup_printf("%s.%s", file_name,
+ image_type);
+ } else {
+ new_image_filename = g_strdup_printf("%s.%s", file_basename,
+ image_type);
+ }
- return menu;
+ /* Set the new filename */
+ if (file_chooser) {
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(file_chooser),
+ new_image_filename);
+ } else {
+ s_log_message("x_image_update_dialog_filename: No parent file chooser found!.\n");
+ fprintf(stderr, "x_image_update_dialog_filename: No parent file chooser found!.\n");
+ }
+
+ g_free(file_name);
+ g_free(file_basename);
+ g_free(new_image_filename);
+#ifdef HAS_LIBGD
+ g_free(image_type);
+#endif
}
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
+/*! \brief Write the image file, with the desired options.
+ * \par This function writes the image file, with the options set in the
+ * dialog by the user.
+ * \param w_current [in] the TOPLEVEL structure.
+ * \param filename [in] the image filename.
+ * \param desired_width [in] the image width chosen by the user.
+ * \param desired_height [in] the image height chosen by the user.
+ * \param filetype [in] image filetype.
+ * \return nothing
*
*/
-void x_image_lowlevel(TOPLEVEL *w_current, const char* filename)
+void x_image_lowlevel(TOPLEVEL *w_current, const char* filename,
+ int desired_width, int desired_height, char *filetype)
{
int width, height;
int save_height, save_width;
@@ -234,12 +300,13 @@
int page_width, page_height, page_center_left, page_center_top;
#ifndef HAS_LIBGD
GdkPixbuf *pixbuf;
- char *filetype;
+ GError *gerror = NULL;
+ GtkWidget *dialog;
#endif
float prop;
- width = w_current->image_width;
- height = w_current->image_height;
+ w_current->image_width = width = desired_width;
+ w_current->image_height = height = desired_height;
save_width = w_current->width;
save_height = w_current->height;
@@ -288,10 +355,36 @@
#else
pixbuf = x_image_get_pixbuf(w_current);
if (pixbuf != NULL) {
- filetype = g_strdup("png");
- if (!gdk_pixbuf_save(pixbuf, filename, filetype, NULL, NULL)) {
- fprintf(stderr, "x_image_lowlevel: Unable to save PNG file %s.\n", filename);
- s_log_message(_("x_image_lowlevel: Unable to write PNG file.\n"));
+ if (!gdk_pixbuf_save(pixbuf, filename, filetype, &gerror, NULL)) {
+ fprintf(stderr, "x_image_lowlevel: Unable to save %s file %s.\n",
+ filetype, filename);
+ fprintf(stderr, "%s\n", gerror->message);
+ s_log_message(_("x_image_lowlevel: Unable to write %s file %s.\n"),
+ filetype, filename);
+ s_log_message(gerror->message);
+
+ /* Warn the user */
+ dialog = gtk_message_dialog_new (GTK_WINDOW(w_current->main_window),
+ GTK_DIALOG_MODAL
+ | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ _("There was the following error when saving image with type %s to filename:\n%s\n\n%s.\n"),
+ filetype, filename, gerror->message
+ );
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ /* Free the gerror */
+ g_error_free(gerror);
+ gerror = NULL;
+
+ /* Unlink the output file */
+ /* It's not safe to unlink the file if there was an error.
+ For example: if the operation was not allowed due to permissions,
+ the _previous existing_ file will be removed */
+ /* unlink(filename); */
}
else {
if (w_current->image_color == TRUE) {
@@ -333,188 +426,146 @@
#endif
}
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
+/*! \brief Display the image file selection dialog.
+ * \par Display the image file selection dialog, allowing the user to
+ * set several options, like image size and image type.
+ * When the user hits "ok", then it writes the image file.
+ * \param w_current [in] the TOPLEVEL structure.
+ * \return nothing
*/
-gint x_image_write(GtkWidget *w, TOPLEVEL *w_current)
+void x_image_setup (TOPLEVEL *w_current)
{
- const char *filename=NULL;
- GtkWidget *widget;
-
- widget = g_object_get_data (G_OBJECT (w_current->iwindow), "filename_entry");
-
- filename = gtk_entry_get_text(GTK_ENTRY(widget));
- if (filename[0] != '\0') {
- x_image_lowlevel(w_current, filename);
- }
-
- gtk_widget_destroy(w_current->iwindow);
- w_current->iwindow=NULL;
- return 0;
-}
+ GtkWidget *dialog;
+ GtkWidget *vbox1;
+ GtkWidget *hbox;
+ GtkWidget *label1;
+ GtkWidget *size_combo;
+ GtkWidget *vbox2;
+ GtkWidget *label2;
+ GtkWidget *type_combo;
+#ifndef HAS_LIBGD
+ char *image_type_descr;
+#endif
+ char *filename;
+ char *image_size;
+ char *image_type;
+ int width, height;
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-gint x_image_cancel(GtkWidget *w, TOPLEVEL *w_current)
-{
- /* gtk_grab_remove(w_current->iwindow);*/
- gtk_widget_destroy(w_current->iwindow);
- w_current->iwindow=NULL;
- return(0);
-}
+ hbox = gtk_hbox_new(FALSE, 0);
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-void x_image_response(GtkWidget * widget, gint response, TOPLEVEL *w_current)
-{
- switch(response) {
- case GTK_RESPONSE_REJECT:
- case GTK_RESPONSE_DELETE_EVENT:
- x_image_cancel(widget, w_current);
- break;
- case GTK_RESPONSE_ACCEPT:
- x_image_write(widget, w_current);
- break;
- default:
- printf("x_image_response(): strange signal %d\n", response);
- }
-}
+ /* Image size selection */
+ vbox1 = gtk_vbox_new(TRUE, 0);
+ label1 = gtk_label_new (_("Width x Height"));
+ gtk_widget_show (label1);
+ gtk_misc_set_alignment( GTK_MISC (label1), 0, 0);
+ gtk_misc_set_padding (GTK_MISC (label1), 0, 0);
+ gtk_box_pack_start (GTK_BOX (vbox1),
+ label1, FALSE, FALSE, 0);
+
+ size_combo = gtk_combo_box_new_text ();
+ create_size_menu (GTK_COMBO_BOX(size_combo));
+
+ gtk_widget_show (size_combo);
+ gtk_box_pack_start (GTK_BOX (vbox1), size_combo, TRUE, TRUE, 0);
+ gtk_widget_show(vbox1);
+
+ /* Image type selection */
+ vbox2 = gtk_vbox_new(TRUE, 0);
+ label2 = gtk_label_new (_("Image type"));
+ gtk_widget_show (label2);
+ gtk_misc_set_alignment( GTK_MISC (label2), 0, 0);
+ gtk_misc_set_padding (GTK_MISC (label2), 0, 0);
+ gtk_box_pack_start (GTK_BOX (vbox2),
+ label2, FALSE, FALSE, 0);
+
+ type_combo = gtk_combo_box_new_text ();
+ gtk_box_pack_start (GTK_BOX (vbox2), type_combo, TRUE, TRUE, 0);
+ create_type_menu (GTK_COMBO_BOX(type_combo));
+
+ /* Connect the changed signal to the callback, so the filename
+ gets updated every time the image type is changed */
+ g_signal_connect (type_combo, "changed",
+ G_CALLBACK(x_image_update_dialog_filename),
+ w_current);
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-void x_image_select_filename(GtkWidget *w, GtkWidget *image_dialog)
-{
- GtkWidget *widget;
- GtkWidget *filechooser;
- const gchar *filename;
+ gtk_widget_show (type_combo);
+ gtk_widget_show(vbox2);
- filechooser = gtk_file_chooser_dialog_new (_("Select Image Filename..."),
- GTK_WINDOW (image_dialog),
+ /* Create the dialog */
+ dialog = gtk_file_chooser_dialog_new (_("Write image..."),
+ GTK_WINDOW(w_current->main_window),
GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK,
- GTK_RESPONSE_ACCEPT, NULL);
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ NULL);
- widget = g_object_get_data (G_OBJECT (image_dialog), "filename_entry");
- filename = gtk_entry_get_text (GTK_ENTRY (widget));
+ /* Add the extra widgets to the dialog*/
+ gtk_box_pack_start(GTK_BOX(hbox), vbox1, FALSE, FALSE, 10);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 10);
+
+ gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER(dialog), hbox);
+
+ g_object_set (dialog,
+ /* GtkFileChooser */
+ "select-multiple", FALSE,
+#if ((GTK_MAJOR_VERSION > 2) || ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION >=8)))
+ /* only in GTK 2.8 */
+ "do-overwrite-confirmation", TRUE,
+#endif
+ NULL);
- gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), filename);
+ /* Update the filename */
+ x_image_update_dialog_filename(GTK_COMBO_BOX(type_combo), w_current);
- gtk_dialog_set_default_response(GTK_DIALOG(filechooser),
+ gtk_dialog_set_default_response(GTK_DIALOG(dialog),
GTK_RESPONSE_ACCEPT);
- if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT) {
- filename =
- gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
- gtk_entry_set_text (GTK_ENTRY (widget), filename);
- }
-
- gtk_widget_destroy (filechooser);
-}
-
-
-/*! \todo Finish function documentation!!!
- * \brief
- * \par Function Description
- *
- */
-void x_image_setup (TOPLEVEL *w_current, char *filename)
-{
- GtkWidget *label;
- GtkWidget *box;
- GtkWidget *hbox;
- GtkWidget *optionmenu;
- GtkWidget *filename_entry;
- GtkWidget *button;
+ gtk_window_position (GTK_WINDOW (dialog),
+ GTK_WIN_POS_MOUSE);
- /* only create the dialog if it's not there yet */
- if (!w_current->iwindow) {
+ gtk_container_set_border_width(GTK_CONTAINER(dialog),
+ DIALOG_BORDER_SPACING);
+ gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox),
+ DIALOG_V_SPACING);
- w_current->iwindow = gtk_dialog_new_with_buttons(_("Write Image..."),
- GTK_WINDOW(w_current->main_window),
- GTK_DIALOG_MODAL,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_REJECT,
- GTK_STOCK_OK,
- GTK_RESPONSE_ACCEPT,
- NULL);
+ gtk_widget_show (dialog);
- gtk_dialog_set_default_response(GTK_DIALOG(w_current->iwindow),
- GTK_RESPONSE_ACCEPT);
+ if (gtk_dialog_run((GTK_DIALOG(dialog))) == GTK_RESPONSE_ACCEPT) {
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+ image_size =
+ x_image_sizes[gtk_combo_box_get_active(GTK_COMBO_BOX(size_combo))];
+#else
+ image_size = gtk_combo_box_get_active_text(GTK_COMBO_BOX(size_combo));
+#endif
- gtk_window_position (GTK_WINDOW (w_current->iwindow),
- GTK_WIN_POS_MOUSE);
+#ifndef HAS_LIBGD
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+ GSList *ptr;
+ /* If GTK < 2.6, get the description from the descriptions list */
+ ptr = g_slist_nth(image_type_descriptions,
+ gtk_combo_box_get_active(GTK_COMBO_BOX(type_combo)));
+ image_type_descr = (char *) (ptr->data);
+#else
+ image_type_descr = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_combo));
+#endif
- gtk_signal_connect(GTK_OBJECT(w_current->iwindow), "response",
- GTK_SIGNAL_FUNC(x_image_response), w_current);
+ image_type = x_image_get_type_from_description(image_type_descr);
+#else
+ /* Image type not used when using libgd */
+ image_type = NULL;
+#endif
+ sscanf(image_size, "%ix%i", &width, &height);
+ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
- box = GTK_DIALOG(w_current->iwindow)->vbox;
- gtk_container_set_border_width(GTK_CONTAINER(w_current->iwindow),
- DIALOG_BORDER_SPACING);
- gtk_box_set_spacing(GTK_BOX(box), DIALOG_V_SPACING);
+ x_image_lowlevel(w_current, filename, width, height, image_type);
+ }
- label = gtk_label_new (_("Width x Height:"));
- gtk_misc_set_alignment( GTK_MISC (label), 0, 0);
- gtk_misc_set_padding (GTK_MISC (label), 0, 0);
- gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
-
- optionmenu = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu),
- create_menu_size (w_current));
- gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 2);
- gtk_box_pack_start (GTK_BOX (box), optionmenu, FALSE, FALSE, 0);
-
- label = gtk_label_new (_("Filename:"));
- gtk_misc_set_alignment( GTK_MISC (label), 0, 0);
- gtk_misc_set_padding (GTK_MISC (label), 0, 0);
- gtk_box_pack_start (GTK_BOX (box),
- label, FALSE, FALSE, 0);
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION < 6))
+ /* If GTK < 2.6, free the descriptions list */
+ free_image_type_descriptions_list();
+#endif
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
- filename_entry = gtk_entry_new_with_max_length (200);
- gtk_editable_select_region (GTK_EDITABLE (filename_entry), 0, -1);
- gtk_box_pack_start (GTK_BOX (hbox),
- filename_entry, TRUE, TRUE, 0);
-
- button = gtk_button_new();
- gtk_container_add(GTK_CONTAINER(button),
- gtk_image_new_from_stock(GTK_STOCK_OPEN,
- GTK_ICON_SIZE_SMALL_TOOLBAR));
- gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
-
- gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
- g_signal_connect(button, "clicked",
- GTK_SIGNAL_FUNC (x_image_select_filename),
- w_current->iwindow);
-
- GLADE_HOOKUP_OBJECT(w_current->iwindow,filename_entry,"filename_entry");
-
- gtk_widget_show_all (w_current->iwindow);
- }
-
- else { /* dialog already created */
- gtk_window_present(GTK_WINDOW(w_current->iwindow));
- }
-
- /* always set the data entries in the dialog */
- filename_entry = g_object_get_data (G_OBJECT (w_current->iwindow),
- "filename_entry");
- gtk_entry_set_text(GTK_ENTRY(filename_entry), filename);
- w_current->image_width = 800;
- w_current->image_height = 600;
+ gtk_widget_destroy (dialog);
}
/*! \todo Finish function documentation!!!
_______________________________________________
geda-cvs mailing list
geda-cvs@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-cvs