]> Dogcows Code - chaz/tint2/blob - src/tint2conf/main.c
tint2conf : double clic to applied, config file.
[chaz/tint2] / src / tint2conf / main.c
1 /**************************************************************************
2 *
3 * Tint2conf
4 *
5 * Copyright (C) 2009 Thierry lorthiois (lorthiois@bbsoft.fr)
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version 2
9 * as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 **************************************************************************/
19
20 #include <stdio.h>
21 #include <locale.h>
22 #include <gtk/gtk.h>
23 #include <glib.h>
24 #include <glib/gstdio.h>
25 #include <glib/gi18n.h>
26
27 #include "common.h"
28
29
30 // TODO
31 // ** add, saveas
32 // - liste de fichiers tint2rc*
33 // - menu contextuel dans liste
34 // - double clic dans liste
35 // - données globales
36 // - delete
37 // - rename
38 // - apply
39 // - sauvegarde et lecture taille de fenetre
40 // - activation des menus sur sélection dans la liste
41 // - dialogue propriétés ...
42
43
44 #define LONG_VERSION_STRING "0.7"
45
46 enum { LIST_ITEM = 0, N_COLUMNS };
47
48 // default config file and directory
49 char *pathConfig = 0;
50 char *pathDir = 0;
51
52 GtkWidget *themeView;
53
54 static GtkUIManager *myUIManager = NULL;
55
56 static void menuAddWidget (GtkUIManager *, GtkWidget *, GtkContainer *);
57 static void viewPopup(GtkWidget *wid,GdkEventButton *event,GtkWidget *menu);
58
59 // action on menus
60 static void menuAdd (GtkWindow * parent);
61 //static void menuSaveAs (GtkWindow *parent);
62 static void menuDelete (void);
63 static void menuProperties (void);
64 static void menuRename (void);
65 static void menuQuit (void);
66 static void menuRefresh (void);
67 static void menuRefreshAll (void);
68 static void menuApply (void);
69 static void menuAbout(GtkWindow * parent);
70
71 static void onPopupMenu(GtkWidget *self, GdkEventButton *event);
72 static void viewRowActivated( GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data);
73
74 // TreeView
75 static void loadTheme();
76 static void init_list(GtkWidget *list);
77 static void add_to_list(GtkWidget *list, const gchar *str);
78 void on_changed(GtkWidget *widget, gpointer label);
79
80 void read_config(char **defaultTheme);
81 void write_config(char *defaultTheme);
82 void check_theme();
83
84
85 // define menubar and toolbar
86 static const char *fallback_ui_file =
87 "<ui>"
88 " <menubar name='MenuBar'>"
89 " <menu action='ThemeMenu'>"
90 " <menuitem action='ThemeAdd'/>"
91 // " <menuitem action='ThemeSaveAs'/>"
92 " <separator/>"
93 " <menuitem action='ThemeDelete'/>"
94 " <separator/>"
95 " <menuitem action='ThemeProperties'/>"
96 " <menuitem action='ThemeRename'/>"
97 " <separator/>"
98 " <menuitem action='ThemeQuit'/>"
99 " </menu>"
100 " <menu action='ViewMenu'>"
101 " <menuitem action='ViewRefresh'/>"
102 " <menuitem action='ViewRefreshAll'/>"
103 " </menu>"
104 " <menu action='HelpMenu'>"
105 " <menuitem action='HelpAbout'/>"
106 " </menu>"
107 " </menubar>"
108 " <toolbar name='ToolBar'>"
109 " <toolitem action='ViewRefreshAll'/>"
110 " <separator/>"
111 " <toolitem action='ThemeProperties'/>"
112 " <toolitem action='ViewApply'/>"
113 " </toolbar>"
114 "</ui>";
115
116 // define menubar and toolbar action
117 static GtkActionEntry entries[] = {
118 {"ThemeMenu", NULL, "Theme", NULL, NULL, NULL},
119 {"ThemeAdd", GTK_STOCK_ADD, "_Add...", "<Control>N", "Add theme", G_CALLBACK (menuAdd)},
120 // {"ThemeSaveAs", GTK_STOCK_SAVE_AS, "_Save as...", NULL, "Save theme as", G_CALLBACK (menuSaveAs)},
121 {"ThemeDelete", GTK_STOCK_DELETE, "_Delete", NULL, "Delete theme", G_CALLBACK (menuDelete)},
122 {"ThemeProperties", GTK_STOCK_PROPERTIES, "_Properties...", NULL, "Show properties", G_CALLBACK (menuProperties)},
123 {"ThemeRename", NULL, "_Rename...", NULL, "Rename theme", G_CALLBACK (menuRename)},
124 {"ThemeQuit", GTK_STOCK_QUIT, "_Quit", "<control>Q", "Quit", G_CALLBACK (menuQuit)},
125 {"ViewMenu", NULL, "View", NULL, NULL, NULL},
126 {"ViewRefresh", GTK_STOCK_REFRESH, "Refresh", NULL, "Refresh", G_CALLBACK (menuRefresh)},
127 {"ViewRefreshAll", GTK_STOCK_REFRESH, "Refresh all", NULL, "Refresh all", G_CALLBACK (menuRefreshAll)},
128 {"ViewApply", GTK_STOCK_APPLY, "Apply", NULL, "Apply theme", G_CALLBACK (menuApply)},
129 {"HelpMenu", NULL, "Help", NULL, NULL, NULL},
130 {"HelpAbout", GTK_STOCK_ABOUT, "_About", "<Control>A", "About", G_CALLBACK (menuAbout)}
131 };
132
133
134 int main (int argc, char ** argv)
135 {
136 GtkWidget *window, *popup, *item;
137 GtkWidget *vBox = NULL;
138 GtkActionGroup *actionGroup;
139 GtkTreeViewColumn *col;
140 GtkTreeSelection *sel;
141
142 gtk_init (&argc, &argv);
143 g_thread_init( NULL );
144 check_theme();
145
146 // define main layout : container, menubar, toolbar
147 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
148 gtk_window_set_title(GTK_WINDOW(window), _("Panel theming"));
149 gtk_window_set_default_size(GTK_WINDOW(window), 600, 350);
150 g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (menuQuit), NULL);
151 vBox = gtk_vbox_new (FALSE, 0);
152 gtk_container_add (GTK_CONTAINER(window), vBox);
153
154 actionGroup = gtk_action_group_new ("menuActionGroup");
155 gtk_action_group_add_actions (actionGroup, entries, G_N_ELEMENTS (entries), NULL);
156 myUIManager = gtk_ui_manager_new();
157 gtk_ui_manager_insert_action_group (myUIManager, actionGroup, 0);
158 gtk_ui_manager_add_ui_from_string ( myUIManager, fallback_ui_file, -1, NULL );
159 g_signal_connect(myUIManager, "add_widget", G_CALLBACK (menuAddWidget), vBox);
160 gtk_ui_manager_ensure_update(myUIManager);
161
162 // define tree view
163 themeView = gtk_tree_view_new();
164 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(themeView), FALSE);
165 //gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(themeView), TRUE);
166 //col = GTK_TREE_VIEW_COLUMN (g_object_new (GTK_TYPE_TREE_VIEW_COLUMN, "title", _("Theme"), "resizable", TRUE, "sizing", GTK_TREE_VIEW_COLUMN_FIXED, NULL));
167 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(themeView));
168 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(sel), GTK_SELECTION_SINGLE);
169 gtk_box_pack_start(GTK_BOX(vBox), themeView, TRUE, TRUE, 0);
170 gtk_widget_show(themeView);
171 g_signal_connect(themeView, "popup-menu", G_CALLBACK(onPopupMenu), NULL);
172 g_signal_connect(themeView, "row-activated", G_CALLBACK(viewRowActivated), NULL);
173 g_signal_connect(sel, "changed", G_CALLBACK(on_changed), NULL);
174 //g_signal_connect(themeView, "button-press-event", G_CALLBACK(onViewButtonPressed), (void *)onViewButtonPressed);
175 //g_signal_connect(themeView, "button-release-event", G_CALLBACK(onViewButtonReleased), NULL);
176
177 GtkCellRenderer *renderer;
178 GtkTreeViewColumn *column;
179 GtkListStore *store;
180 renderer = gtk_cell_renderer_text_new();
181 column = gtk_tree_view_column_new_with_attributes("List Items", renderer, "text", LIST_ITEM, NULL);
182 gtk_tree_view_append_column(GTK_TREE_VIEW(themeView), column);
183 store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);
184 gtk_tree_view_set_model(GTK_TREE_VIEW(themeView), GTK_TREE_MODEL(store));
185 g_object_unref(store);
186
187 // popup menu
188 // all you need to do is add the GDK_BUTTON_PRESS_MASK to the window's events
189 gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
190 popup = gtk_menu_new();
191 item = gtk_menu_item_new_with_label("victory");
192 gtk_menu_shell_append(GTK_MENU_SHELL(popup), item);
193 gtk_menu_attach_to_widget(GTK_MENU(popup), window, NULL);
194 gtk_widget_show_all(popup);
195 g_signal_connect(G_OBJECT(window),"button-press-event", G_CALLBACK(viewPopup), (gpointer)popup);
196
197 // load themes
198 loadTheme(themeView);
199
200 // rig up idle/thread routines
201 //Glib::Thread::create(sigc::mem_fun(window.view, &Thumbview::load_cache_images), true);
202 //Glib::Thread::create(sigc::mem_fun(window.view, &Thumbview::create_cache_images), true);
203
204 gtk_widget_show_all(window);
205 gtk_main ();
206 return 0;
207 }
208
209
210 static void menuAddWidget (GtkUIManager * p_uiManager, GtkWidget * p_widget, GtkContainer * p_box)
211 {
212 gtk_box_pack_start(GTK_BOX(p_box), p_widget, FALSE, FALSE, 0);
213 gtk_widget_show(p_widget);
214 }
215
216
217 static void viewPopup(GtkWidget *wid, GdkEventButton *event, GtkWidget *menu)
218 {
219 if((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) {
220 gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,event->button,event->time);
221 }
222 }
223
224
225 static void menuAbout(GtkWindow * parent)
226 {
227 const char *authors[] = { "Thierry Lorthiois", "Christian Ruppert (Build system)", NULL };
228
229 gtk_show_about_dialog( parent, "name", g_get_application_name( ),
230 "comments", _("Theming tool for tint2 panel"),
231 "version", LONG_VERSION_STRING,
232 "copyright", _("Copyright 2009 tint2 team\nLicense GNU GPL version 2"),
233 "logo-icon-name", NULL, "authors", authors,
234 /* Translators: translate "translator-credits" as
235 your name to have it appear in the credits in the "About"
236 dialog */
237 "translator-credits", _("translator-credits"),
238 NULL );
239 }
240
241
242 static void menuAdd (GtkWindow *parent)
243 {
244 GtkWidget *dialog;
245 GtkFileChooser *chooser;
246 GtkFileFilter *filter;
247
248 dialog = gtk_file_chooser_dialog_new(_("Add a theme"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, NULL);
249 chooser = GTK_FILE_CHOOSER(dialog);
250
251 gtk_file_chooser_set_current_folder(chooser, g_get_home_dir());
252 gtk_file_chooser_set_select_multiple(chooser, TRUE);
253
254 filter = gtk_file_filter_new();
255 gtk_file_filter_set_name(filter, _("Tint2 theme files"));
256 gtk_file_filter_add_pattern(filter, "*.tint2rc");
257 gtk_file_chooser_add_filter(chooser, filter);
258
259 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
260 GSList *l, *list = gtk_file_chooser_get_filenames(chooser);
261
262 gchar *file, *pt1, *name, *path;
263 for (l = list; l ; l = l->next) {
264 file = (char *)l->data;
265 pt1 = strrchr (file, '/');
266 if (pt1) {
267 pt1++;
268 if (*pt1) {
269 name = strndup(pt1, 65000);
270 path = g_build_filename (g_get_user_config_dir(), "tint2", name, NULL);
271 copy_file(file, path);
272 g_free(path);
273 pt1 = strstr(name, ".tint2rc");
274 if (pt1) {
275 file = strndup(name, pt1-name);
276 add_to_list(themeView, file);
277 g_free(file);
278 }
279 g_free(name);
280 }
281 }
282 //tr_core_torrents_added( core );
283 }
284
285 g_slist_foreach(list, (GFunc)g_free, NULL);
286 g_slist_free(list);
287 }
288 gtk_widget_destroy (dialog);
289 }
290
291 /*
292 static void menuSaveAs (GtkWindow *parent)
293 {
294 GtkWidget *dialog;
295 GtkFileChooser *chooser;
296
297 dialog = gtk_file_chooser_dialog_new (_("Save theme as"), parent, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
298 chooser = GTK_FILE_CHOOSER(dialog);
299
300 gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE);
301 gtk_file_chooser_set_current_folder (chooser, g_get_home_dir());
302 gtk_file_chooser_set_current_name (chooser, _("Untitled document"));
303
304 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
305 char *filename = gtk_file_chooser_get_filename(chooser);
306 printf("fichier %s\n", filename);
307 //save_to_file (filename);
308 g_free (filename);
309 }
310 gtk_widget_destroy (dialog);
311 }
312 */
313
314 static void menuDelete (void)
315 {
316 GtkTreeSelection *sel;
317 GtkTreeIter iter;
318 GtkTreeModel *model;
319 char *value, *name1, *name2;
320
321 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(themeView));
322 //model = GTK_TREE_MODEL(window->liststore);
323 if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(sel), &model, &iter)) {
324 gtk_tree_model_get(model, &iter, LIST_ITEM, &value, -1);
325 name1 = g_build_filename (g_get_user_config_dir(), "tint2", value, NULL);
326 name2 = g_strdup_printf("%s.tint2rc", name1);
327 g_free(name1);
328
329 //g_remove(name2);
330 /*
331 GtkListStore *store;
332 GtkTreeIter iter;
333 store = GTK_LIST_STORE(model);
334 gtk_list_store_remove(store, &iter);
335 */
336 g_free(value);
337 g_free(name2);
338 }
339 }
340
341
342 static void menuProperties (void)
343 {
344 system("python /home/thil/Desktop/tintwizard/tintwizard.py");
345 }
346
347
348 static void menuRename (void)
349 {
350 printf("menuRename\n");
351 // g_rename
352 }
353
354
355 static void menuQuit (void)
356 {
357 gtk_main_quit ();
358 }
359
360
361 static void menuRefresh (void)
362 {
363 printf("menuRefresh\n");
364 }
365
366
367 static void menuRefreshAll (void)
368 {
369 printf("menuRefreshAll\n");
370 }
371
372
373 static void menuApply (void)
374 {
375 GtkTreeSelection *sel;
376 GtkTreeIter iter;
377 GtkTreeModel *model;
378 char *value, *name1, *name2;
379
380 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(themeView));
381 if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(sel), &model, &iter)) {
382 gtk_tree_model_get(model, &iter, LIST_ITEM, &value, -1);
383 name1 = g_build_filename (g_get_user_config_dir(), "tint2", value, NULL);
384 name2 = g_strdup_printf("%s.tint2rc", name1);
385 g_free(name1);
386
387 copy_file(name2, pathConfig);
388 write_config(value);
389 g_free(value);
390 g_free(name2);
391
392 // restart panel
393 system("killall -SIGUSR1 tint2");
394 }
395 }
396
397
398 static void onPopupMenu(GtkWidget *self, GdkEventButton *event)
399 {
400 //GtkWidget *menu = action_get_widget("/main-window-popup");
401
402 //gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, (event ? event->button : 0), (event ? event->time : 0));
403 }
404
405
406 static void viewRowActivated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
407 {
408 menuApply();
409 }
410
411
412 static void loadTheme(GtkWidget *list)
413 {
414 GDir *dir;
415 gchar *file, *pt1, *name;
416
417 dir = g_dir_open(pathDir, 0, NULL);
418 while ((file = g_dir_read_name(dir))) {
419 pt1 = strstr(file, ".tint2rc");
420 if (pt1) {
421 name = strndup(file, pt1-file);
422 add_to_list(list, name);
423 g_free(name);
424 }
425 }
426 g_dir_close(dir);
427
428 // search default theme
429 GtkTreeIter iter;
430 GtkTreeModel *model;
431 name = NULL;
432 read_config(&name);
433 if (name) {
434 printf("defaultTheme %s\n", name);
435 //gtk_tree_selection_select_iter(GtkTreeSelection *selection, GtkTreeIter *iter);
436 }
437 }
438
439
440 // theme file management
441 void read_config(char **defaultTheme)
442 {
443 char *path;
444
445 path = g_build_filename (g_get_user_config_dir(), "tint2", "tint2confrc", NULL);
446 if (g_file_test (path, G_FILE_TEST_EXISTS)) {
447 FILE *fp;
448 char line[80];
449 char *key, *value;
450 if ((fp = fopen(path, "r")) != NULL) {
451 while (fgets(line, sizeof(line), fp) != NULL) {
452 if (parse_line(line, &key, &value)) {
453 if (strcmp (key, "default_theme") == 0) {
454 *defaultTheme = strdup (value);
455 }
456 free (key);
457 free (value);
458 }
459 }
460 fclose (fp);
461 }
462 }
463 g_free(path);
464 }
465
466
467 void write_config(char *defaultTheme)
468 {
469 char *path;
470 FILE *fp;
471
472 path = g_build_filename (g_get_user_config_dir(), "tint2", "tint2confrc", NULL);
473 fp = fopen(path, "w");
474 if (fp != NULL) {
475 fputs("#---------------------------------------------\n", fp);
476 fputs("# TINT2CONF CONFIG FILE\n", fp);
477 fprintf(fp, "default_theme = %s\n\n", defaultTheme);
478 fclose (fp);
479 }
480 g_free(path);
481 }
482
483
484 void check_theme()
485 {
486 pathDir = g_build_filename (g_get_user_config_dir(), "tint2", NULL);
487 if (!g_file_test (pathDir, G_FILE_TEST_IS_DIR))
488 g_mkdir(pathDir, 0777);
489
490 pathConfig = g_build_filename (g_get_user_config_dir(), "tint2", "tint2rc", NULL);
491
492 }
493
494
495 static void add_to_list(GtkWidget *list, const gchar *str)
496 {
497 GtkListStore *store;
498 GtkTreeIter iter;
499
500 store = GTK_LIST_STORE(gtk_tree_view_get_model (GTK_TREE_VIEW(list)));
501
502 gtk_list_store_append(store, &iter);
503 gtk_list_store_set(store, &iter, LIST_ITEM, str, -1);
504 }
505
506
507 void on_changed(GtkWidget *widget, gpointer label)
508 {
509 GtkTreeIter iter;
510 GtkTreeModel *model;
511 char *value;
512
513 if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget), &model, &iter)) {
514 gtk_tree_model_get(model, &iter, LIST_ITEM, &value, -1);
515 //gtk_label_set_text(GTK_LABEL(label), value);
516 g_free(value);
517 }
518
519 }
520
521
This page took 0.056405 seconds and 5 git commands to generate.