1 /* Included directly into dhp-object.c just to keep this whole mess out
2  * of that file until it's not done so stupidly. */
3 
devhelp_plugin_load_settings(DevhelpPlugin * self,const gchar * filename)4 void devhelp_plugin_load_settings(DevhelpPlugin *self, const gchar *filename)
5 {
6 	GError *error;
7 	GKeyFile *kf;
8 	gboolean value;
9 
10 	g_return_if_fail(DEVHELP_IS_PLUGIN(self));
11 
12 	kf = g_key_file_new();
13 	self->priv->kf = kf;
14 
15 	if (!g_key_file_load_from_file(kf, filename, G_KEY_FILE_KEEP_COMMENTS, NULL))
16 		return;
17 
18 	if (g_key_file_has_group(kf, "webview"))
19 	{
20 		gchar *last_uri = NULL;
21 		if (g_key_file_has_key(kf, "webview", "location", NULL))
22 		{
23 			gint location = g_key_file_get_integer(kf, "webview", "location", NULL);
24 			switch(location)
25 			{
26 				case 0:
27 					devhelp_plugin_set_webview_location(self,
28 						DEVHELP_PLUGIN_WEBVIEW_LOCATION_NONE);
29 					break;
30 				case 1:
31 					devhelp_plugin_set_webview_location(self,
32 						DEVHELP_PLUGIN_WEBVIEW_LOCATION_SIDEBAR);
33 					break;
34 				case 2:
35 					devhelp_plugin_set_webview_location(self,
36 						DEVHELP_PLUGIN_WEBVIEW_LOCATION_MESSAGE_WINDOW);
37 					break;
38 				case 3:
39 					devhelp_plugin_set_webview_location(self,
40 						DEVHELP_PLUGIN_WEBVIEW_LOCATION_MAIN_NOTEBOOK);
41 					break;
42 				default:
43 					g_warning("Unknown webview location %d", location);
44 					break;
45 			}
46 		}
47 
48 		if (g_key_file_has_key(kf, "webview", "focus_webview_on_search", NULL))
49 		{
50 			self->priv->focus_webview_on_search = \
51 				g_key_file_get_boolean(kf, "webview", "focus_webview_on_search", NULL);
52 		}
53 
54 		if (g_key_file_has_key(kf, "webview", "last_uri", NULL))
55 		{
56 			last_uri = g_key_file_get_string(kf, "webview", "last_uri", NULL);
57 			if (last_uri != NULL && strlen(last_uri) == 0)
58 			{
59 				g_free(last_uri);
60 				last_uri = NULL;
61 			}
62 		}
63 
64 		if (g_key_file_has_key(kf, "webview", "custom_homepage", NULL))
65 		{
66 			gchar *custom_homepage;
67 
68 			custom_homepage = g_key_file_get_string(kf, "webview", "custom_homepage", NULL);
69 			if (custom_homepage != NULL && strlen(custom_homepage) == 0)
70 			{
71 				g_free(custom_homepage);
72 				custom_homepage = NULL;
73 			}
74 			else if (custom_homepage != NULL)
75 			{
76 				g_free(last_uri); /* always NULL or valid string */
77 				last_uri = g_strdup(custom_homepage);
78 			}
79 			self->priv->custom_homepage = custom_homepage;
80 		}
81 
82 		if (last_uri != NULL)
83 		{
84 			devhelp_plugin_set_webview_uri(self, last_uri);
85 			g_free(last_uri);
86 		}
87 
88 	} /* webview group */
89 
90 	if (g_key_file_has_group(kf, "doc_providers"))
91 	{
92 
93 		if (g_key_file_has_key(kf, "doc_providers", "devhelp", NULL))
94 		{
95 			error = NULL;
96 			value = g_key_file_get_boolean(kf, "doc_providers", "devhelp", &error);
97 			if (error != NULL)
98 				g_error_free(error);
99 			else
100 				devhelp_plugin_set_use_devhelp(self, value);
101 		}
102 
103 		if (g_key_file_has_key(kf, "doc_providers", "man_pages", NULL))
104 		{
105 			error = NULL;
106 			value = g_key_file_get_boolean(kf, "doc_providers", "man_pages", &error);
107 			if (error != NULL)
108 				g_error_free(error);
109 			else
110 				devhelp_plugin_set_use_man(self, value);
111 		}
112 
113 		if (g_key_file_has_key(kf, "doc_providers", "codesearch", NULL))
114 		{
115 			error = NULL;
116 			value = g_key_file_get_boolean(kf, "doc_providers", "codesearch", &error);
117 			if (error != NULL)
118 				g_error_free(error);
119 			else
120 				devhelp_plugin_set_use_codesearch(self, value);
121 		}
122 
123 	} /* doc_providers group */
124 
125 	if (g_key_file_has_group(kf, "devhelp"))
126 	{
127 		if (g_key_file_has_key(kf, "devhelp", "show_devhelp_sidebar", NULL))
128 		{
129 			error = NULL;
130 			value = g_key_file_get_boolean(kf, "devhelp", "show_devhelp_sidebar", &error);
131 			if (error != NULL)
132 				g_error_free(error);
133 			else
134 				devhelp_plugin_set_devhelp_sidebar_visible(self, value);
135 		}
136 
137 		if (g_key_file_has_key(kf, "devhelp", "set_sidebar_tabs_bottom", NULL))
138 		{
139 			error = NULL;
140 			value = g_key_file_get_boolean(kf, "devhelp", "set_sidebar_tabs_bottom", &error);
141 			if (error != NULL)
142 				g_error_free(error);
143 			else
144 				devhelp_plugin_set_sidebar_tabs_bottom(self, value);
145 		}
146 
147 		if (g_key_file_has_key(kf, "devhelp", "focus_sidebar_on_search", NULL))
148 		{
149 			error = NULL;
150 			value = g_key_file_get_boolean(kf, "devhelp", "focus_sidebar_on_search", &error);
151 			if (error != NULL)
152 				g_error_free(error);
153 			else
154 				self->priv->focus_sidebar_on_search = value;
155 		}
156 
157 	} /* devhelp group */
158 
159 	if (g_key_file_has_group(kf, "man_pages"))
160 	{
161 
162 		if (g_key_file_has_key(kf, "man_pages", "prog_path", NULL))
163 		{
164 			gchar *man_path;
165 			error = NULL;
166 			man_path = g_key_file_get_string(kf, "man_pages", "prog_path", &error);
167 			if (error != NULL)
168 				g_error_free(error);
169 			else if (strlen(man_path) == 0)
170 				g_free(man_path);
171 			else
172 			{
173 				g_free(self->priv->man_prog_path);
174 				self->priv->man_prog_path = man_path;
175 			}
176 		}
177 
178 		if (g_key_file_has_key(kf, "man_pages", "pager_prog", NULL))
179 		{
180 			gchar *pager;
181 			error = NULL;
182 			pager = g_key_file_get_string(kf, "man_pages", "pager_prog", &error);
183 			if (error != NULL)
184 				g_error_free(error);
185 			else if (strlen(pager) == 0)
186 				g_free(pager);
187 			else
188 			{
189 				g_free(self->priv->man_pager_prog);
190 				self->priv->man_pager_prog = pager;
191 			}
192 		}
193 
194 		if (g_key_file_has_key(kf, "man_pages", "section_order", NULL))
195 		{
196 			gchar *sect;
197 			error = NULL;
198 			sect = g_key_file_get_string(kf, "man_pages", "section_order", &error);
199 			if (error != NULL)
200 				g_error_free(error);
201 			else if (strlen(sect) == 0)
202 				g_free(sect);
203 			else
204 			{
205 				g_free(self->priv->man_section_order);
206 				self->priv->man_section_order = sect;
207 			}
208 		}
209 
210 	} /* man_pages group */
211 
212 	if (g_key_file_has_group(kf, "codesearch"))
213 	{
214 		gchar *uri;
215 
216 		if (g_key_file_has_key(kf, "codesearch", "base_uri", NULL))
217 		{
218 			error = NULL;
219 			uri = g_key_file_get_string(kf, "codesearch", "base_uri", &error);
220 			if (error != NULL)
221 				g_error_free(error);
222 			else if (strlen(uri) == 0)
223 				g_free(uri);
224 			else
225 			{
226 				g_free(self->priv->codesearch_base_uri);
227 				self->priv->codesearch_base_uri = uri;
228 			}
229 		}
230 
231 		if (g_key_file_has_key(kf, "codesearch", "uri_params", NULL))
232 		{
233 			error = NULL;
234 			uri = g_key_file_get_string(kf, "codesearch", "uri_params", &error);
235 			if (error != NULL)
236 				g_error_free(error);
237 			else if (strlen(uri) == 0)
238 				g_free(uri);
239 			else
240 			{
241 				g_free(self->priv->codesearch_params);
242 				self->priv->codesearch_params = uri;
243 			}
244 		}
245 
246 		if (g_key_file_has_key(kf, "codesearch", "use_lang_for_search", NULL))
247 		{
248 			error = NULL;
249 			value = g_key_file_get_boolean(kf, "codesearch", "use_lang_for_search", &error);
250 			if (error != NULL)
251 				g_error_free(error);
252 			else
253 				self->priv->codesearch_use_lang = value;
254 		}
255 
256 	} /* codesearch group */
257 
258 	if (g_key_file_has_group(kf, "misc"))
259 	{
260 		gint pos;
261 		error = NULL;
262 		pos = g_key_file_get_integer(kf, "misc", "main_notebook_tab_pos", &error);
263 		if (error != NULL)
264 			g_error_free(error);
265 		else
266 		{
267 			switch (pos)
268 			{
269 				case 0:
270 					self->priv->main_nb_tab_pos = GTK_POS_LEFT;
271 					break;
272 				case 1:
273 					self->priv->main_nb_tab_pos = GTK_POS_RIGHT;
274 					break;
275 				case 2:
276 					self->priv->main_nb_tab_pos = GTK_POS_TOP;
277 					break;
278 				case 3:
279 					self->priv->main_nb_tab_pos = GTK_POS_BOTTOM;
280 					break;
281 			}
282 			if (self->priv->location == DEVHELP_PLUGIN_WEBVIEW_LOCATION_MAIN_NOTEBOOK)
283 			{
284 				gtk_notebook_set_tab_pos(GTK_NOTEBOOK(self->priv->main_notebook),
285 					self->priv->main_nb_tab_pos);
286 			}
287 		}
288 	} /* misc group */
289 }
290 
291 
devhelp_plugin_store_settings(DevhelpPlugin * self,const gchar * filename)292 void devhelp_plugin_store_settings(DevhelpPlugin *self, const gchar *filename)
293 {
294 	gchar *text;
295 	GKeyFile *kf;
296 
297 	g_return_if_fail(DEVHELP_IS_PLUGIN(self));
298 
299 	if (self->priv->kf == NULL)
300 		self->priv->kf = g_key_file_new();
301 	kf = self->priv->kf;
302 
303     g_key_file_set_integer(kf, "webview", "location", (gint)self->priv->location);
304     g_key_file_set_boolean(kf, "webview", "focus_webview_on_search", self->priv->focus_webview_on_search);
305     g_key_file_set_string(kf, "webview", "custom_homepage", self->priv->custom_homepage != NULL ? self->priv->custom_homepage : "");
306     g_key_file_set_string(kf, "webview", "last_uri", devhelp_plugin_get_webview_uri(self));
307 
308     g_key_file_set_boolean(kf, "doc_providers", "devhelp", self->priv->use_devhelp);
309     g_key_file_set_boolean(kf, "doc_providers", "man_pages", self->priv->use_man);
310     g_key_file_set_boolean(kf, "doc_providers", "codesearch", self->priv->use_codesearch);
311 
312     g_key_file_set_boolean(kf, "devhelp", "show_devhelp_sidebar",
313 #if GTK_CHECK_VERSION(2,18,0)
314       gtk_widget_get_visible(self->priv->sb_notebook)
315 #else
316       GTK_WIDGET_VISIBLE(self->priv->sb_notebook)
317 #endif
318     );
319     g_key_file_set_boolean(kf, "devhelp", "set_sidebar_tabs_bottom", devhelp_plugin_get_sidebar_tabs_bottom(self));
320     g_key_file_set_boolean(kf, "devhelp", "focus_sidebar_on_search", self->priv->focus_sidebar_on_search);
321 
322     g_key_file_set_string(kf, "man_pages", "prog_path", self->priv->man_prog_path);
323     g_key_file_set_string(kf, "man_pages", "page_prog", self->priv->man_pager_prog);
324     g_key_file_set_string(kf, "man_pages", "section_order", self->priv->man_section_order);
325 
326     g_key_file_set_string(kf, "codesearch", "base_uri", self->priv->codesearch_base_uri);
327     g_key_file_set_string(kf, "codesearch", "uri_params", self->priv->codesearch_params != NULL ? self->priv->codesearch_params : "");
328     g_key_file_set_boolean(kf, "codesearch", "use_lang_for_search", self->priv->codesearch_use_lang);
329 
330     switch(self->priv->main_nb_tab_pos)
331     {
332 		case GTK_POS_LEFT:
333 			g_key_file_set_integer(kf, "misc", "main_notebook_tab_pos", 0);
334 			break;
335 		case GTK_POS_RIGHT:
336 			g_key_file_set_integer(kf, "misc", "main_notebook_tab_pos", 1);
337 			break;
338 		case GTK_POS_TOP:
339 			g_key_file_set_integer(kf, "misc", "main_notebook_tab_pos", 2);
340 			break;
341 		case GTK_POS_BOTTOM:
342 			g_key_file_set_integer(kf, "misc", "main_notebook_tab_pos", 3);
343 			break;
344 	}
345 
346 	text = g_key_file_to_data(kf, NULL, NULL);
347 	g_file_set_contents(filename, text, -1, NULL);
348 	g_free(text);
349 }
350