PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/gimp-2.8.0/plug-ins/print/print-settings.c

#
C | 305 lines | 198 code | 63 blank | 44 comment | 23 complexity | 15037c00737796fb2e94d4be834d64c3 MD5 | raw file
Possible License(s): LGPL-3.0, BSD-3-Clause, GPL-3.0
  1. /* GIMP - The GNU Image Manipulation Program
  2. * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #include "config.h"
  18. #include <libgimp/gimp.h>
  19. #include <libgimp/gimpui.h>
  20. #include "print.h"
  21. #include "print-settings.h"
  22. #include "print-utils.h"
  23. #define PRINT_SETTINGS_MAJOR_VERSION 0
  24. #define PRINT_SETTINGS_MINOR_VERSION 4
  25. #define PRINT_SETTINGS_NAME "print-settings"
  26. static GKeyFile * print_settings_key_file_from_settings (PrintData *data);
  27. static void print_settings_add_to_key_file (const gchar *key,
  28. const gchar *value,
  29. gpointer data);
  30. static GKeyFile * print_settings_key_file_from_resource_file (void);
  31. static GKeyFile * print_settings_key_file_from_parasite (gint32 image_ID);
  32. static gboolean print_settings_load_from_key_file (PrintData *data,
  33. GKeyFile *key_file);
  34. static gboolean print_settings_check_version (GKeyFile *key_file);
  35. /*
  36. * set GtkPrintSettings from the contents of a "print-settings"
  37. * image parasite, or, if none exists, from a resource
  38. * file of the same name
  39. */
  40. gboolean
  41. print_settings_load (PrintData *data)
  42. {
  43. GKeyFile *key_file = print_settings_key_file_from_parasite (data->image_id);
  44. if (! key_file)
  45. key_file = print_settings_key_file_from_resource_file ();
  46. if (key_file)
  47. {
  48. print_settings_load_from_key_file (data, key_file);
  49. g_key_file_free (key_file);
  50. return TRUE;
  51. }
  52. return FALSE;
  53. }
  54. /*
  55. * save all settings as a resource file "print-settings"
  56. * and as an image parasite
  57. */
  58. void
  59. print_settings_save (PrintData *data)
  60. {
  61. GKeyFile *key_file = print_settings_key_file_from_settings (data);
  62. /* image setup */
  63. if (gimp_image_is_valid (data->image_id))
  64. {
  65. g_key_file_set_integer (key_file, "image-setup",
  66. "unit", data->unit);
  67. g_key_file_set_double (key_file, "image-setup",
  68. "x-resolution", data->xres);
  69. g_key_file_set_double (key_file, "image-setup",
  70. "y-resolution", data->yres);
  71. g_key_file_set_double (key_file, "image-setup",
  72. "x-offset", data->offset_x);
  73. g_key_file_set_double (key_file, "image-setup",
  74. "y-offset", data->offset_y);
  75. g_key_file_set_integer (key_file, "image-setup",
  76. "center-mode", data->center);
  77. g_key_file_set_boolean (key_file, "image-setup",
  78. "use-full-page", data->use_full_page);
  79. g_key_file_set_boolean (key_file, "image-setup",
  80. "crop-marks", data->draw_crop_marks);
  81. print_utils_key_file_save_as_parasite (key_file,
  82. data->image_id,
  83. PRINT_SETTINGS_NAME);
  84. }
  85. /* some settings shouldn't be made persistent on a global level,
  86. * so they are only stored in the image, not in the rcfile
  87. */
  88. g_key_file_remove_key (key_file, "image-setup", "x-resolution", NULL);
  89. g_key_file_remove_key (key_file, "image-setup", "y-resolution", NULL);
  90. g_key_file_remove_key (key_file, "image-setup", "x-offset", NULL);
  91. g_key_file_remove_key (key_file, "image-setup", "y-offset", NULL);
  92. g_key_file_remove_key (key_file, PRINT_SETTINGS_NAME, "n-copies", NULL);
  93. print_utils_key_file_save_as_rcfile (key_file, PRINT_SETTINGS_NAME);
  94. g_key_file_free (key_file);
  95. }
  96. /*
  97. * serialize print settings into a GKeyFile
  98. */
  99. static GKeyFile *
  100. print_settings_key_file_from_settings (PrintData *data)
  101. {
  102. GtkPrintOperation *operation = data->operation;
  103. GtkPrintSettings *settings;
  104. GKeyFile *key_file = g_key_file_new ();
  105. /* put version information into the file */
  106. g_key_file_set_integer (key_file, "meta", "major-version",
  107. PRINT_SETTINGS_MAJOR_VERSION);
  108. g_key_file_set_integer (key_file, "meta", "minor-version",
  109. PRINT_SETTINGS_MINOR_VERSION);
  110. /* save the contents of the GtkPrintSettings for the operation */
  111. settings = gtk_print_operation_get_print_settings (operation);
  112. if (settings)
  113. gtk_print_settings_foreach (settings,
  114. print_settings_add_to_key_file, key_file);
  115. return key_file;
  116. }
  117. /*
  118. * callback used in gtk_print_settings_foreach loop
  119. */
  120. static void
  121. print_settings_add_to_key_file (const gchar *key,
  122. const gchar *value,
  123. gpointer data)
  124. {
  125. GKeyFile *key_file = data;
  126. g_key_file_set_value (key_file, PRINT_SETTINGS_NAME, key, value);
  127. }
  128. /*
  129. * deserialize a "print-settings" resource file into a GKeyFile
  130. */
  131. static GKeyFile *
  132. print_settings_key_file_from_resource_file (void)
  133. {
  134. GKeyFile *key_file;
  135. key_file = print_utils_key_file_load_from_rcfile (PRINT_SETTINGS_NAME);
  136. if (key_file && ! print_settings_check_version (key_file))
  137. {
  138. g_key_file_free (key_file);
  139. return NULL;
  140. }
  141. return key_file;
  142. }
  143. /* load information from an image parasite called "print-settings"
  144. * return a GKeyFile containing the information if a valid parasite is found,
  145. * NULL otherwise
  146. */
  147. static GKeyFile *
  148. print_settings_key_file_from_parasite (gint32 image_ID)
  149. {
  150. GKeyFile *key_file;
  151. key_file = print_utils_key_file_load_from_parasite (image_ID,
  152. PRINT_SETTINGS_NAME);
  153. if (key_file && ! print_settings_check_version (key_file))
  154. {
  155. g_key_file_free (key_file);
  156. return NULL;
  157. }
  158. return key_file;
  159. }
  160. static gboolean
  161. print_settings_load_from_key_file (PrintData *data,
  162. GKeyFile *key_file)
  163. {
  164. GtkPrintOperation *operation = data->operation;
  165. GtkPrintSettings *settings;
  166. gchar **keys;
  167. gsize n_keys;
  168. gint i;
  169. settings = gtk_print_operation_get_print_settings (operation);
  170. if (! settings)
  171. settings = gtk_print_settings_new ();
  172. keys = g_key_file_get_keys (key_file, PRINT_SETTINGS_NAME, &n_keys, NULL);
  173. if (! keys)
  174. return FALSE;
  175. for (i = 0; i < n_keys; i++)
  176. {
  177. gchar *value;
  178. value = g_key_file_get_value (key_file,
  179. PRINT_SETTINGS_NAME, keys[i], NULL);
  180. if (value)
  181. {
  182. gtk_print_settings_set (settings, keys[i], value);
  183. g_free (value);
  184. }
  185. }
  186. g_strfreev (keys);
  187. if (g_key_file_has_key (key_file, "image-setup", "unit", NULL))
  188. {
  189. data->unit = g_key_file_get_integer (key_file, "image-setup",
  190. "unit", NULL);
  191. }
  192. if (g_key_file_has_key (key_file, "image-setup", "x-resolution", NULL) &&
  193. g_key_file_has_key (key_file, "image-setup", "y-resolution", NULL))
  194. {
  195. data->xres = g_key_file_get_double (key_file, "image-setup",
  196. "x-resolution", NULL);
  197. data->yres = g_key_file_get_double (key_file, "image-setup",
  198. "y-resolution", NULL);
  199. }
  200. if (g_key_file_has_key (key_file, "image-setup", "x-offset", NULL) &&
  201. g_key_file_has_key (key_file, "image-setup", "y-offset", NULL))
  202. {
  203. data->offset_x = g_key_file_get_double (key_file, "image-setup",
  204. "x-offset", NULL);
  205. data->offset_y = g_key_file_get_double (key_file, "image-setup",
  206. "y-offset", NULL);
  207. }
  208. if (g_key_file_has_key (key_file, "image-setup", "center-mode", NULL))
  209. {
  210. data->center = g_key_file_get_integer (key_file, "image-setup",
  211. "center-mode", NULL);
  212. }
  213. if (g_key_file_has_key (key_file, "image-setup", "use-full-page", NULL))
  214. {
  215. data->use_full_page = g_key_file_get_boolean (key_file, "image-setup",
  216. "use-full-page", NULL);
  217. }
  218. if (g_key_file_has_key (key_file, "image-setup", "crop-marks", NULL))
  219. {
  220. data->draw_crop_marks = g_key_file_get_boolean (key_file, "image-setup",
  221. "crop-marks", NULL);
  222. }
  223. gtk_print_operation_set_print_settings (operation, settings);
  224. return TRUE;
  225. }
  226. static gboolean
  227. print_settings_check_version (GKeyFile *key_file)
  228. {
  229. gint major_version;
  230. gint minor_version;
  231. if (! g_key_file_has_group (key_file, "meta"))
  232. return FALSE;
  233. major_version = g_key_file_get_integer (key_file,
  234. "meta", "major-version", NULL);
  235. if (major_version != PRINT_SETTINGS_MAJOR_VERSION)
  236. return FALSE;
  237. minor_version = g_key_file_get_integer (key_file,
  238. "meta", "minor-version", NULL);
  239. if (minor_version != PRINT_SETTINGS_MINOR_VERSION)
  240. return FALSE;
  241. return TRUE;
  242. }