2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
22
#define __USE_XOPEN_EXTENDED
24
#include <glib/gstdio.h>
25
#include <glib/gi18n.h>
27
#include "cairo-dock-modules.h"
28
#include "cairo-dock-log.h"
29
#include "cairo-dock-animations.h"
30
#include "cairo-dock-gui-manager.h"
31
#include "cairo-dock-applet-facility.h" // play_sound
32
#include "cairo-dock-dialogs.h"
33
#include "cairo-dock-applications-manager.h"
34
#include "cairo-dock-dock-manager.h"
35
#include "cairo-dock-themes-manager.h"
36
#include "cairo-dock-gauge.h"
37
#include "cairo-dock-config.h"
38
#include "cairo-dock-keyfile-utilities.h"
39
#include "cairo-dock-renderer-manager.h"
40
#include "cairo-dock-gui-factory.h"
41
#include "cairo-dock-task.h"
42
#include "cairo-dock-load.h"
43
#include "cairo-dock-callbacks.h" // cairo_dock_launch_command_sync
45
#define CAIRO_DOCK_GUI_MARGIN 4
46
#define CAIRO_DOCK_ICON_MARGIN 6
47
#define CAIRO_DOCK_PREVIEW_WIDTH 400
48
#define CAIRO_DOCK_PREVIEW_HEIGHT 250
49
#define CAIRO_DOCK_APPLET_ICON_SIZE 32
50
#define CAIRO_DOCK_TAB_ICON_SIZE 32
51
#define CAIRO_DOCK_FRAME_ICON_SIZE 24
53
extern CairoDock *g_pMainDock;
54
extern gchar *g_cCairoDockDataDir;
55
extern gchar *g_cConfFile;
56
extern gchar *g_cCurrentThemePath;
58
static GtkListStore *s_pRendererListStore = NULL;
59
static GtkListStore *s_pDecorationsListStore = NULL;
60
static GtkListStore *s_pDecorationsListStore2 = NULL;
61
static GtkListStore *s_pAnimationsListStore = NULL;
62
static GtkListStore *s_pDialogDecoratorListStore = NULL;
63
static GtkListStore *s_pGaugeListStore = NULL;
64
static GtkListStore *s_pDocksListStore = NULL;
65
static GtkListStore *s_pIconThemeListStore = NULL;
67
#define _allocate_new_model(...)\
68
gtk_list_store_new (CAIRO_DOCK_MODEL_NB_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_INT, G_TYPE_INT)
70
static void _cairo_dock_activate_one_element (GtkCellRendererToggle * cell_renderer, gchar * path, GtkTreeModel * model)
73
if (! gtk_tree_model_get_iter_from_string (model, &iter, path))
76
gtk_tree_model_get (model, &iter, CAIRO_DOCK_MODEL_ACTIVE, &bState, -1);
78
gtk_list_store_set (GTK_LIST_STORE (model), &iter, CAIRO_DOCK_MODEL_ACTIVE, !bState, -1);
81
static gboolean _cairo_dock_increase_order (GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter, int *pOrder)
84
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_ORDER, &iMyOrder, -1);
86
if (iMyOrder == *pOrder)
88
gtk_list_store_set (GTK_LIST_STORE (model), iter, CAIRO_DOCK_MODEL_ORDER, iMyOrder + 1, -1);
94
static gboolean _cairo_dock_decrease_order (GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter, int *pOrder)
97
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_ORDER, &iMyOrder, -1);
99
if (iMyOrder == *pOrder)
101
gtk_list_store_set (GTK_LIST_STORE (model), iter, CAIRO_DOCK_MODEL_ORDER, iMyOrder - 1, -1);
107
static gboolean _cairo_dock_decrease_order_if_greater (GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter, int *pOrder)
110
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_ORDER, &iMyOrder, -1);
112
if (iMyOrder > *pOrder)
114
gtk_list_store_set (GTK_LIST_STORE (model), iter, CAIRO_DOCK_MODEL_ORDER, iMyOrder - 1, -1);
120
static void _cairo_dock_go_up (GtkButton *button, GtkTreeView *pTreeView)
122
GtkTreeSelection *pSelection = gtk_tree_view_get_selection (pTreeView);
124
GtkTreeModel *pModel;
126
if (! gtk_tree_selection_get_selected (pSelection, &pModel, &iter))
130
gtk_tree_model_get (pModel, &iter, CAIRO_DOCK_MODEL_ORDER, &iOrder, -1);
135
gtk_tree_model_foreach (GTK_TREE_MODEL (pModel), (GtkTreeModelForeachFunc) _cairo_dock_increase_order, &iOrder);
137
gtk_list_store_set (GTK_LIST_STORE (pModel), &iter, CAIRO_DOCK_MODEL_ORDER, iOrder, -1);
140
static void _cairo_dock_go_down (GtkButton *button, GtkTreeView *pTreeView)
142
GtkTreeSelection *pSelection = gtk_tree_view_get_selection (pTreeView);
144
GtkTreeModel *pModel;
146
if (! gtk_tree_selection_get_selected (pSelection, &pModel, &iter))
150
gtk_tree_model_get (pModel, &iter, CAIRO_DOCK_MODEL_ORDER, &iOrder, -1);
152
if (iOrder > gtk_tree_model_iter_n_children (pModel, NULL) - 1)
155
gtk_tree_model_foreach (GTK_TREE_MODEL (pModel), (GtkTreeModelForeachFunc) _cairo_dock_decrease_order, &iOrder);
157
gtk_list_store_set (GTK_LIST_STORE (pModel), &iter, CAIRO_DOCK_MODEL_ORDER, iOrder, -1);
160
static void _cairo_dock_add (GtkButton *button, gpointer *data)
162
GtkTreeView *pTreeView = data[0];
163
GtkWidget *pEntry = data[1];
166
memset (&iter, 0, sizeof (GtkTreeIter));
168
GtkTreeModel *pModel = gtk_tree_view_get_model (pTreeView);
169
gtk_list_store_append (GTK_LIST_STORE (pModel), &iter);
171
gtk_list_store_set (GTK_LIST_STORE (pModel), &iter,
172
CAIRO_DOCK_MODEL_ACTIVE, TRUE,
173
CAIRO_DOCK_MODEL_NAME, gtk_entry_get_text (GTK_ENTRY (pEntry)),
174
CAIRO_DOCK_MODEL_ORDER, gtk_tree_model_iter_n_children (pModel, NULL) - 1, -1);
176
GtkTreeSelection *pSelection = gtk_tree_view_get_selection (pTreeView);
177
gtk_tree_selection_select_iter (pSelection, &iter);
180
static void _cairo_dock_remove (GtkButton *button, gpointer *data)
182
GtkTreeView *pTreeView = data[0];
183
GtkWidget *pEntry = data[1];
185
GtkTreeSelection *pSelection = gtk_tree_view_get_selection (pTreeView);
186
GtkTreeModel *pModel;
189
if (! gtk_tree_selection_get_selected (pSelection, &pModel, &iter))
192
gchar *cValue = NULL;
194
gtk_tree_model_get (pModel, &iter,
195
CAIRO_DOCK_MODEL_NAME, &cValue,
196
CAIRO_DOCK_MODEL_ORDER, &iOrder, -1);
198
gtk_list_store_remove (GTK_LIST_STORE (pModel), &iter);
199
gtk_tree_model_foreach (GTK_TREE_MODEL (pModel), (GtkTreeModelForeachFunc) _cairo_dock_decrease_order_if_greater, &iOrder);
201
gtk_entry_set_text (GTK_ENTRY (pEntry), cValue);
205
static gboolean on_delete_async_widget (GtkWidget *pMainWindow, GdkEvent *event, GtkWidget *pWidget)
207
//g_print ("%s ()\n", __func__);
208
CairoDockTask *pTask = g_object_get_data (G_OBJECT (pWidget), "cd-task");
211
cairo_dock_discard_task (pTask);
212
g_object_set_data (G_OBJECT (pWidget), "cd-task", NULL);
214
g_object_unref (G_OBJECT (pWidget));
218
static inline void _set_preview_image (const gchar *cPreviewFilePath, GtkImage *pPreviewImage)
220
int iPreviewWidth, iPreviewHeight;
221
GdkPixbuf *pPreviewPixbuf = NULL;
222
if (gdk_pixbuf_get_file_info (cPreviewFilePath, &iPreviewWidth, &iPreviewHeight) != NULL)
224
iPreviewWidth = MIN (iPreviewWidth, CAIRO_DOCK_PREVIEW_WIDTH);
225
iPreviewHeight = MIN (iPreviewHeight, CAIRO_DOCK_PREVIEW_HEIGHT);
226
g_print ("preview : %dx%d\n", iPreviewWidth, iPreviewHeight); //
227
pPreviewPixbuf = gdk_pixbuf_new_from_file_at_size (cPreviewFilePath, iPreviewWidth, iPreviewHeight, NULL);
229
if (pPreviewPixbuf == NULL)
231
pPreviewPixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
237
gtk_image_set_from_pixbuf (pPreviewImage, pPreviewPixbuf);
238
gdk_pixbuf_unref (pPreviewPixbuf);
241
static void _on_got_readme (const gchar *cDescription, GtkWidget *pDescriptionLabel)
243
//g_print ("%s ()\n", __func__);
244
gtk_label_set_markup (GTK_LABEL (pDescriptionLabel), cDescription ? cDescription : "");
246
CairoDockTask *pTask = g_object_get_data (G_OBJECT (pDescriptionLabel), "cd-task");
249
//g_print ("remove the task\n");
250
cairo_dock_discard_task (pTask);
251
g_object_set_data (G_OBJECT (pDescriptionLabel), "cd-task", NULL);
254
static void _on_got_preview_file (const gchar *cPreviewFilePath, GtkWidget *pPreviewImage)
256
if (cPreviewFilePath != NULL)
258
_set_preview_image (cPreviewFilePath, GTK_IMAGE (pPreviewImage));
259
g_remove (cPreviewFilePath);
261
CairoDockTask *pTask = g_object_get_data (G_OBJECT (pPreviewImage), "cd-task");
264
cairo_dock_discard_task (pTask);
265
g_object_set_data (G_OBJECT (pPreviewImage), "cd-task", NULL);
268
static void _cairo_dock_selection_changed (GtkTreeModel *model, GtkTreeIter iter, gpointer *data)
270
static gchar *s_cPrevPreview = NULL, *s_cPrevReadme = NULL;
271
GtkLabel *pDescriptionLabel = data[0];
272
gtk_label_set_justify (GTK_LABEL (pDescriptionLabel), GTK_JUSTIFY_FILL);
273
gtk_label_set_line_wrap (pDescriptionLabel, TRUE);
274
GtkImage *pPreviewImage = data[1];
275
GError *erreur = NULL;
276
gchar *cDescriptionFilePath = NULL, *cPreviewFilePath = NULL, *cName = NULL;
277
gtk_tree_model_get (model, &iter,
278
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, &cDescriptionFilePath,
279
CAIRO_DOCK_MODEL_IMAGE, &cPreviewFilePath, -1);
281
if (cDescriptionFilePath != NULL && (1 || !s_cPrevReadme || strcmp (s_cPrevReadme, cDescriptionFilePath) != 0))
283
CairoDockTask *pTask = g_object_get_data (G_OBJECT (pDescriptionLabel), "cd-task");
284
//g_print ("prev task : %x\n", pTask);
287
cairo_dock_discard_task (pTask);
288
g_object_set_data (G_OBJECT (pDescriptionLabel), "cd-task", NULL);
290
g_free (s_cPrevReadme);
291
s_cPrevReadme = g_strdup (cDescriptionFilePath);
292
if (strncmp (cDescriptionFilePath, "http://", 7) == 0) // fichier distant.
294
cd_debug ("fichier readme distant (%s)", cDescriptionFilePath);
296
gchar *str = strrchr (cDescriptionFilePath, '/');
297
g_return_if_fail (str != NULL);
300
gtk_label_set_markup (pDescriptionLabel, "...");
301
pTask = cairo_dock_get_distant_file_content_async (cDescriptionFilePath, "", str+1, (GFunc) _on_got_readme, pDescriptionLabel);
302
g_object_set_data (G_OBJECT (pDescriptionLabel), "cd-task", pTask);
303
//g_print ("new task : %x\n", pTask);
305
else if (*cDescriptionFilePath == '/') // fichier local
308
gchar *cDescription = NULL;
309
g_file_get_contents (cDescriptionFilePath,
313
gtk_label_set_markup (pDescriptionLabel, cDescription ? cDescription : "");
314
g_free (cDescription);
316
else if (strcmp (cDescriptionFilePath, "none") != 0) // texte de la description.
318
gtk_label_set_markup (pDescriptionLabel, cDescriptionFilePath);
321
gtk_label_set_markup (pDescriptionLabel, "");
324
if (cPreviewFilePath != NULL && (1 || !s_cPrevPreview || strcmp (s_cPrevPreview, cPreviewFilePath) != 0))
326
g_free (s_cPrevPreview);
327
s_cPrevPreview = g_strdup (cPreviewFilePath);
329
gboolean bDistant = FALSE;
330
if (strncmp (cPreviewFilePath, "http://", 7) == 0) // fichier distant.
332
cd_debug ("fichier preview distant (%s)", cPreviewFilePath);
334
gchar *str = strrchr (cPreviewFilePath, '/');
335
g_return_if_fail (str != NULL);
338
CairoDockTask *pTask = g_object_get_data (G_OBJECT (pPreviewImage), "cd-task");
340
cairo_dock_discard_task (pTask);
342
pTask = cairo_dock_download_file_async (cPreviewFilePath, "", str+1, NULL, (GFunc) _on_got_preview_file, pPreviewImage);
343
g_object_set_data (G_OBJECT (pPreviewImage), "cd-task", pTask);
345
else // fichier local ou rien.
346
_set_preview_image (cPreviewFilePath, pPreviewImage);
349
g_free (cDescriptionFilePath);
350
g_free (cPreviewFilePath);
353
static void _cairo_dock_select_custom_item_in_combo (GtkComboBox *widget, gpointer *data)
355
GtkTreeModel *model = gtk_combo_box_get_model (widget);
356
g_return_if_fail (model != NULL);
359
if (!gtk_combo_box_get_active_iter (widget, &iter))
362
GtkWidget *parent = data[1];
363
GtkWidget *pKeyBox = data[0];
364
int iNbWidgets = GPOINTER_TO_INT (data[2]);
365
GList *children = gtk_container_get_children (GTK_CONTAINER (parent));
366
GList *c = g_list_find (children, pKeyBox);
367
g_return_if_fail (c != NULL && c->next != NULL);
370
gtk_tree_model_get (model, &iter,
371
CAIRO_DOCK_MODEL_RESULT, &cName, -1);
373
gboolean bActive = (cName != NULL && strcmp (cName, "personnal") == 0);
376
for (c = c->next, i = 0; c != NULL && i < iNbWidgets; c = c->next, i ++)
379
gtk_widget_set_sensitive (w, bActive);
382
g_list_free (children);
386
static void _cairo_dock_select_one_item_in_combo (GtkComboBox *widget, gpointer *data)
388
GtkTreeModel *model = gtk_combo_box_get_model (widget);
389
g_return_if_fail (model != NULL);
392
if (!gtk_combo_box_get_active_iter (widget, &iter))
395
_cairo_dock_selection_changed (model, iter, data);
398
static gboolean _cairo_dock_select_one_item_in_tree (GtkTreeSelection * selection, GtkTreeModel * model, GtkTreePath * path, gboolean path_currently_selected, gpointer *data)
400
if (path_currently_selected)
403
if (! gtk_tree_model_get_iter (model, &iter, path))
406
_cairo_dock_selection_changed (model, iter, data);
410
static void _cairo_dock_select_one_item_in_control_combo (GtkComboBox *widget, gpointer *data)
412
GtkTreeModel *model = gtk_combo_box_get_model (widget);
413
g_return_if_fail (model != NULL);
416
if (!gtk_combo_box_get_active_iter (widget, &iter))
419
int iNumItem = gtk_combo_box_get_active (widget);
420
//gtk_tree_model_get (model, &iter, CAIRO_DOCK_MODEL_ORDER, &iNumItem, -1);
422
GtkWidget *parent = data[1];
423
GtkWidget *pKeyBox = data[0];
424
int iNbWidgets = GPOINTER_TO_INT (data[2]);
425
GList *children = gtk_container_get_children (GTK_CONTAINER (parent));
426
GList *c = g_list_find (children, pKeyBox);
427
g_return_if_fail (c != NULL);
431
for (c = c->next, i = 0; c != NULL && i < iNbWidgets; c = c->next, i ++)
434
//g_print (" %d/%d -> %d\n", i, iNbWidgets, i == iNumItem);
435
if (GTK_IS_EXPANDER (w))
437
gtk_expander_set_expanded (GTK_EXPANDER (w), i == iNumItem);
441
gtk_widget_set_sensitive (w, i == iNumItem);
445
g_list_free (children);
447
static void _cairo_dock_select_one_item_in_control_combo_selective (GtkComboBox *widget, gpointer *data)
449
GtkTreeModel *model = gtk_combo_box_get_model (widget);
450
g_return_if_fail (model != NULL);
453
if (!gtk_combo_box_get_active_iter (widget, &iter))
456
int iOrder1, iOrder2;
457
gtk_tree_model_get (model, &iter,
458
CAIRO_DOCK_MODEL_ORDER, &iOrder1,
459
CAIRO_DOCK_MODEL_ORDER2, &iOrder2, -1);
461
GtkWidget *parent = data[1];
462
GtkWidget *pKeyBox = data[0];
463
int iNbWidgets = GPOINTER_TO_INT (data[2]);
464
//g_print ("%s (%d, %d / %d)\n", __func__, iOrder1, iOrder2, iNbWidgets);
465
GList *children = gtk_container_get_children (GTK_CONTAINER (parent));
466
GList *c = g_list_find (children, pKeyBox);
467
g_return_if_fail (c != NULL);
471
for (c = c->next, i = 0; c != NULL && i < iNbWidgets; c = c->next, i ++)
474
//g_print ("%d in ]%d;%d[\n", i, iOrder1, iOrder1 + iOrder2);
475
gtk_widget_set_sensitive (w, i >= iOrder1 - 1 && i < iOrder1 + iOrder2 - 1);
478
g_list_free (children);
481
static void _cairo_dock_show_image_preview (GtkFileChooser *pFileChooser, GtkImage *pPreviewImage)
483
gchar *cFileName = gtk_file_chooser_get_preview_filename (pFileChooser);
484
if (cFileName == NULL)
486
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (cFileName, 64, 64, NULL);
490
gtk_image_set_from_pixbuf (pPreviewImage, pixbuf);
491
gdk_pixbuf_unref (pixbuf);
492
gtk_file_chooser_set_preview_widget_active (pFileChooser, TRUE);
495
gtk_file_chooser_set_preview_widget_active (pFileChooser, FALSE);
497
static void _cairo_dock_pick_a_file (GtkButton *button, gpointer *data)
499
GtkEntry *pEntry = data[0];
500
gint iFileType = GPOINTER_TO_INT (data[1]);
501
GtkWindow *pParentWindow = data[2];
503
GtkWidget* pFileChooserDialog = gtk_file_chooser_dialog_new (
504
(iFileType == 0 ? "Pick up a file" : "Pick up a directory"),
506
(iFileType == 0 ? GTK_FILE_CHOOSER_ACTION_OPEN : GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER),
512
const gchar *cFilePath = gtk_entry_get_text (pEntry);
513
gchar *cDirectoryPath = (cFilePath == NULL || *cFilePath != '/' ? g_strdup (g_cCurrentThemePath) : g_path_get_dirname (cFilePath));
514
//g_print (">>> on se place sur '%s'\n", cDirectoryPath);
515
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (pFileChooserDialog), cDirectoryPath);
516
g_free (cDirectoryPath);
517
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (pFileChooserDialog), FALSE);
519
GtkWidget *pPreviewImage = gtk_image_new ();
520
gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (pFileChooserDialog), pPreviewImage);
521
g_signal_connect (GTK_FILE_CHOOSER (pFileChooserDialog), "update-preview", G_CALLBACK (_cairo_dock_show_image_preview), pPreviewImage);
523
gtk_widget_show (pFileChooserDialog);
524
int answer = gtk_dialog_run (GTK_DIALOG (pFileChooserDialog));
525
if (answer == GTK_RESPONSE_OK)
527
gchar *cFilePath = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (pFileChooserDialog));
528
gtk_entry_set_text (pEntry, cFilePath);
530
gtk_widget_destroy (pFileChooserDialog);
534
static void _cairo_dock_play_a_sound (GtkButton *button, gpointer *data)
536
GtkWidget *pEntry = data[0];
537
const gchar *cSoundPath = gtk_entry_get_text (GTK_ENTRY (pEntry));
538
cairo_dock_play_sound (cSoundPath);
541
static void _cairo_dock_set_original_value (GtkButton *button, gpointer *data)
543
gchar *cGroupName = data[0];
544
gchar *cKeyName = data[1];
545
GSList *pSubWidgetList = data[2];
546
gchar *cOriginalConfFilePath = data[3];
547
//g_print ("%s (%s, %s, %s)\n", __func__, cGroupName, cKeyName, cOriginalConfFilePath);
551
GtkWidget *pOneWidget = pSubWidgetList->data;
552
GError *erreur = NULL;
555
GKeyFile *pKeyFile = g_key_file_new ();
556
g_key_file_load_from_file (pKeyFile, cOriginalConfFilePath, 0, &erreur); // inutile de garder les commentaires ce coup-ci.
559
cd_warning (erreur->message);
560
g_error_free (erreur);
565
if (GTK_IS_SPIN_BUTTON (pOneWidget) || GTK_IS_HSCALE (pOneWidget))
567
gboolean bIsSpin = GTK_IS_SPIN_BUTTON (pOneWidget);
568
double *fValuesList = g_key_file_get_double_list (pKeyFile, cGroupName, cKeyName, &length, &erreur);
570
for (pList = pSubWidgetList; pList != NULL && i < length; pList = pList->next, i++)
572
pOneWidget = pList->data;
574
gtk_spin_button_set_value (GTK_SPIN_BUTTON (pOneWidget), fValuesList[i]);
576
gtk_range_set_value (GTK_RANGE (pOneWidget), fValuesList[i]);
579
g_free (fValuesList);
581
else if (GTK_IS_COLOR_BUTTON (pOneWidget))
583
double *fValuesList = g_key_file_get_double_list (pKeyFile, cGroupName, cKeyName, &length, &erreur);
588
gdkColor.red = fValuesList[0] * 65535;
589
gdkColor.green = fValuesList[1] * 65535;
590
gdkColor.blue = fValuesList[2] * 65535;
591
gtk_color_button_set_color (GTK_COLOR_BUTTON (pOneWidget), &gdkColor);
593
if (length > 3 && gtk_color_button_get_use_alpha (GTK_COLOR_BUTTON (pOneWidget)))
594
gtk_color_button_set_alpha (GTK_COLOR_BUTTON (pOneWidget), fValuesList[3] * 65535);
596
g_free (fValuesList);
598
g_key_file_free (pKeyFile);
601
static void _cairo_dock_key_grab_cb (GtkWidget *wizard_window, GdkEventKey *event, GtkEntry *pEntry)
604
cd_message ("key press event\n");
605
if (gtk_accelerator_valid (event->keyval, event->state))
607
/* This lets us ignore all ignorable modifier keys, including
608
* NumLock and many others. :)
610
* The logic is: keep only the important modifiers that were pressed
612
event->state &= gtk_accelerator_get_default_mod_mask();
614
/* Generate the correct name for this key */
615
key = gtk_accelerator_name (event->keyval, event->state);
617
g_printerr ("KEY GRABBED: %s\n", key);
619
/* Re-enable widgets */
620
gtk_widget_set_sensitive (GTK_WIDGET(pEntry), TRUE);
622
/* Disconnect the key grabber */
623
g_signal_handlers_disconnect_by_func (GTK_OBJECT(wizard_window), GTK_SIGNAL_FUNC(_cairo_dock_key_grab_cb), pEntry);
625
/* Copy the pressed key to the text entry */
626
gtk_entry_set_text (GTK_ENTRY(pEntry), key);
628
/* Free the string */
633
static void _cairo_dock_key_grab_clicked (GtkButton *button, gpointer *data)
635
GtkEntry *pEntry = data[0];
636
GtkWindow *pParentWindow = data[1];
638
cd_message ("clicked\n");
639
//set widget insensitive
640
gtk_widget_set_sensitive (GTK_WIDGET(pEntry), FALSE);
641
// gtk_widget_set_sensitive (wizard_notebook, FALSE);
643
g_signal_connect (GTK_WIDGET(pParentWindow), "key-press-event", GTK_SIGNAL_FUNC(_cairo_dock_key_grab_cb), pEntry);
646
static void _cairo_dock_key_grab_class (GtkButton *button, gpointer *data)
648
GtkEntry *pEntry = data[0];
649
GtkWindow *pParentWindow = data[1];
651
cd_message ("clicked\n");
652
gtk_widget_set_sensitive (GTK_WIDGET(pEntry), FALSE); // locked (plus zoli :) )
654
gchar *cProp = cairo_dock_launch_command_sync ("xprop"); // avec "| grep CLASS | cut -d\\\" -f2", ca ne fonctionne pas et Fab n'aime pas les g_spawn_command_line_sync :) --> c'est surtout que c'est g_spawn_command_line_sync qui n'aime pas les grep.
656
gchar *str = g_strstr_len (cProp, -1, "WM_CLASS(STRING)"); // str pointant sur WM_
657
gchar *cResult = NULL; // NON CE N'EST PAS MA MOYENNE DE POINT !!!!
660
// WM_CLASS(STRING) = "gnome-terminal", "Gnome-terminal" \\ => utiliser le 2ĆØ
661
str = strchr (str, ',');
663
gchar *max = strchr (str, '"'); // on pointe le 2e "
665
cResult = g_strndup (str, max - str); // on prend ce qui est entre ""
668
cd_warning ("couldn't find the class of this window.");
670
gtk_widget_set_sensitive (GTK_WIDGET(pEntry), TRUE); // unlocked
671
gtk_entry_set_text (pEntry, cResult); // on ajoute le txt dans le box des accuses
672
g_free (cProp); // Ah, mnt C Propr' !
673
g_free (cResult); // Ou qu'elle est la poulette ???
676
void _cairo_dock_set_value_in_pair (GtkSpinButton *pSpinButton, gpointer *data)
678
GtkWidget *pPairSpinButton = data[0];
679
GtkWidget *pToggleButton = data[1];
680
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (pToggleButton)))
682
int iValue = gtk_spin_button_get_value (pSpinButton);
683
int iPairValue = gtk_spin_button_get_value (GTK_SPIN_BUTTON (pPairSpinButton));
684
if (iValue != iPairValue)
686
gtk_spin_button_set_value (GTK_SPIN_BUTTON (pPairSpinButton), iValue);
691
static void _cairo_dock_toggle_control_button (GtkCheckButton *pButton, gpointer *data)
693
GtkWidget *parent = data[1];
694
GtkWidget *pKeyBox = data[0];
695
int iNbWidgets = GPOINTER_TO_INT (data[2]);
697
GList *children = gtk_container_get_children (GTK_CONTAINER (parent));
698
GList *c = g_list_find (children, pKeyBox);
699
g_return_if_fail (c != NULL);
701
gboolean bActive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (pButton));
704
for (c = c->next, i = 0; c != NULL && i < iNbWidgets; c = c->next, i ++)
707
g_print (" %d/%d -> %d\n", i, iNbWidgets, bActive);
708
gtk_widget_set_sensitive (w, bActive);
711
g_list_free (children);
714
static void _list_icon_theme_in_dir (const gchar *cDirPath, GHashTable *pHashTable)
716
GError *erreur = NULL;
717
GDir *dir = g_dir_open (cDirPath, 0, &erreur);
720
cd_warning ("%s\n", erreur->message);
721
g_error_free (erreur);
725
const gchar *cFileName;
728
GString *sIndexFile = g_string_new ("");
729
while ((cFileName = g_dir_read_name (dir)) != NULL)
731
g_string_printf (sIndexFile, "%s/%s/index.theme", cDirPath, cFileName);
732
if (! g_file_test (sIndexFile->str, G_FILE_TEST_EXISTS))
735
GKeyFile *pKeyFile = cairo_dock_open_key_file (sIndexFile->str);
736
if (pKeyFile == NULL)
739
if (! g_key_file_get_boolean (pKeyFile, "Icon Theme", "Hidden", NULL) && g_key_file_has_key (pKeyFile, "Icon Theme", "Directories", NULL))
741
gchar *cName = g_key_file_get_string (pKeyFile, "Icon Theme", "Name", NULL);
744
g_hash_table_insert (pHashTable, cName, g_strdup (cName));
748
g_key_file_free (pKeyFile);
750
g_string_free (sIndexFile, TRUE);
754
static GHashTable *_cairo_dock_build_icon_themes_list (const gchar **cDirs)
756
GHashTable *pHashTable = g_hash_table_new_full (g_str_hash,
760
gchar *cName = g_strdup (N_("_Custom Icons_"));
761
g_hash_table_insert (pHashTable, cName, g_strdup (gettext (cName)));
764
for (i = 0; cDirs[i] != NULL; i ++)
766
_list_icon_theme_in_dir (cDirs[i], pHashTable);
771
static gboolean _add_module_to_modele (gchar *cModuleName, CairoDockModule *pModule, gpointer *data)
773
int iCategory = GPOINTER_TO_INT (data[0]);
774
if (pModule->pVisitCard->iCategory == iCategory || (iCategory == -1 && pModule->pVisitCard->iCategory != CAIRO_DOCK_CATEGORY_SYSTEM && pModule->pVisitCard->iCategory != CAIRO_DOCK_CATEGORY_THEME && ! cairo_dock_module_is_auto_loaded (pModule)))
776
//g_print (" + %s\n", pModule->pVisitCard->cIconFilePath);
777
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (pModule->pVisitCard->cIconFilePath, 32, 32, NULL);
778
GtkListStore *pModele = data[1];
780
memset (&iter, 0, sizeof (GtkTreeIter));
781
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
782
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
783
CAIRO_DOCK_MODEL_NAME, dgettext (pModule->pVisitCard->cGettextDomain, pModule->pVisitCard->cModuleName), /// cTitle ?...
784
CAIRO_DOCK_MODEL_RESULT, cModuleName,
785
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, dgettext (pModule->pVisitCard->cGettextDomain, pModule->pVisitCard->cDescription),
786
CAIRO_DOCK_MODEL_IMAGE, pModule->pVisitCard->cPreviewFilePath,
787
CAIRO_DOCK_MODEL_ICON, pixbuf,
788
CAIRO_DOCK_MODEL_STATE, pModule->pVisitCard->iCategory,
789
CAIRO_DOCK_MODEL_ACTIVE, (pModule->pInstancesList != NULL), -1);
790
g_object_unref (pixbuf);
795
static void _cairo_dock_activate_one_module (GtkCellRendererToggle * cell_renderer, gchar * path, GtkTreeModel * model)
798
if (! gtk_tree_model_get_iter_from_string (model, &iter, path))
800
gchar *cModuleName = NULL;
802
gtk_tree_model_get (model, &iter,
803
CAIRO_DOCK_MODEL_RESULT, &cModuleName,
804
CAIRO_DOCK_MODEL_ACTIVE, &bState, -1);
807
gtk_list_store_set (GTK_LIST_STORE (model), &iter, CAIRO_DOCK_MODEL_ACTIVE, bState, -1);
809
/// passer en gras ?...
811
CairoDockModule *pModule = cairo_dock_find_module_from_name (cModuleName);
812
if (g_pMainDock == NULL)
814
cairo_dock_add_remove_element_to_key (g_cConfFile, "System", "modules", cModuleName, bState);
816
else if (pModule->pInstancesList == NULL)
818
cairo_dock_activate_module_and_load (cModuleName);
822
cairo_dock_deactivate_module_and_unload (cModuleName);
824
g_free (cModuleName);
827
#define _build_list_for_gui(pListStore, cEmptyItem, pHashTable, pHFunction) do { \
828
if (pListStore != NULL)\
829
g_object_unref (pListStore);\
830
if (pHashTable == NULL) {\
833
pListStore = _allocate_new_model ();\
834
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (pListStore), CAIRO_DOCK_MODEL_NAME, GTK_SORT_ASCENDING);\
836
pHFunction (cEmptyItem, NULL, pListStore); }\
837
g_hash_table_foreach (pHashTable, (GHFunc) pHFunction, pListStore); } while (0)
839
static void _cairo_dock_add_one_renderer_item (const gchar *cName, CairoDockRenderer *pRenderer, GtkListStore *pModele)
842
memset (&iter, 0, sizeof (GtkTreeIter));
843
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
844
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
845
CAIRO_DOCK_MODEL_NAME, (pRenderer && pRenderer->cDisplayedName ? pRenderer->cDisplayedName : cName),
846
CAIRO_DOCK_MODEL_RESULT, cName,
847
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, (pRenderer != NULL ? pRenderer->cReadmeFilePath : "none"),
848
CAIRO_DOCK_MODEL_IMAGE, (pRenderer != NULL ? pRenderer->cPreviewFilePath : "none"), -1);
850
void cairo_dock_build_renderer_list_for_gui (GHashTable *pHashTable)
852
_build_list_for_gui (s_pRendererListStore, "", pHashTable, _cairo_dock_add_one_renderer_item);
854
static void _cairo_dock_add_one_decoration_item (const gchar *cName, CairoDeskletDecoration *pDecoration, GtkListStore *pModele)
857
memset (&iter, 0, sizeof (GtkTreeIter));
858
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
859
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
860
CAIRO_DOCK_MODEL_NAME, (pDecoration && pDecoration->cDisplayedName && *pDecoration->cDisplayedName != '\0' ? pDecoration->cDisplayedName : cName),
861
CAIRO_DOCK_MODEL_RESULT, cName,
862
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, "none"/*(pRenderer != NULL ? pRenderer->cReadmeFilePath : "none")*/,
863
CAIRO_DOCK_MODEL_IMAGE, "none"/*(pRenderer != NULL ? pRenderer->cPreviewFilePath : "none")*/, -1);
865
void cairo_dock_build_desklet_decorations_list_for_gui (GHashTable *pHashTable)
867
_build_list_for_gui (s_pDecorationsListStore, NULL, pHashTable, _cairo_dock_add_one_decoration_item);
869
void cairo_dock_build_desklet_decorations_list_for_applet_gui (GHashTable *pHashTable)
871
_build_list_for_gui (s_pDecorationsListStore2, "default", pHashTable, _cairo_dock_add_one_decoration_item);
873
static void _cairo_dock_add_one_animation_item (const gchar *cName, CairoDockAnimationRecord *pRecord, GtkListStore *pModele)
876
memset (&iter, 0, sizeof (GtkTreeIter));
877
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
878
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
879
CAIRO_DOCK_MODEL_NAME, (pRecord && pRecord->cDisplayedName != NULL && *pRecord->cDisplayedName != '\0' ? pRecord->cDisplayedName : cName),
880
CAIRO_DOCK_MODEL_RESULT, cName,
881
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, "none",
882
CAIRO_DOCK_MODEL_IMAGE, "none", -1);
884
void cairo_dock_build_animations_list_for_gui (GHashTable *pHashTable)
886
_build_list_for_gui (s_pAnimationsListStore, "", pHashTable, _cairo_dock_add_one_animation_item);
889
static void _cairo_dock_add_one_dialog_decorator_item (const gchar *cName, CairoDialogDecorator *pDecorator, GtkListStore *pModele)
892
memset (&iter, 0, sizeof (GtkTreeIter));
893
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
894
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
895
CAIRO_DOCK_MODEL_NAME, (pDecorator && pDecorator->cDisplayedName != NULL && *pDecorator->cDisplayedName != '\0' ? pDecorator->cDisplayedName : cName),
896
CAIRO_DOCK_MODEL_RESULT, cName,
897
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, "none",
898
CAIRO_DOCK_MODEL_IMAGE, "none", -1);
900
void cairo_dock_build_dialog_decorator_list_for_gui (GHashTable *pHashTable)
902
_build_list_for_gui (s_pDialogDecoratorListStore, NULL, pHashTable, _cairo_dock_add_one_dialog_decorator_item);
905
static void _cairo_dock_add_one_gauge_item (const gchar *cName, CairoDialogDecorator *pDecorator, GtkListStore *pModele)
908
memset (&iter, 0, sizeof (GtkTreeIter));
909
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
910
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
911
CAIRO_DOCK_MODEL_NAME, cName != NULL && *cName != '\0' ? gettext (cName) : cName,
912
CAIRO_DOCK_MODEL_RESULT, cName,
913
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, "none",
914
CAIRO_DOCK_MODEL_IMAGE, "none", -1);
916
static void cairo_dock_build_gauge_list_for_gui (GHashTable *pHashTable)
918
_build_list_for_gui (s_pGaugeListStore, NULL, pHashTable, _cairo_dock_add_one_gauge_item);
921
static void _cairo_dock_add_one_dock_item (const gchar *cName, CairoDock *pDock, GtkListStore *pModele)
923
if (pDock != NULL) // peut etre NULL (entree vide)
925
Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
926
if (CAIRO_DOCK_IS_APPLET (pPointingIcon) || CAIRO_DOCK_IS_MULTI_APPLI (pPointingIcon))
930
memset (&iter, 0, sizeof (GtkTreeIter));
931
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
932
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
933
CAIRO_DOCK_MODEL_NAME, cName,
934
CAIRO_DOCK_MODEL_RESULT, cName,
935
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, "none",
936
CAIRO_DOCK_MODEL_IMAGE, "none", -1);
938
static void cairo_dock_build_dock_list_for_gui (void)
940
if (s_pDocksListStore != NULL)
941
g_object_unref (s_pDocksListStore);
942
s_pDocksListStore = _allocate_new_model ();
943
_cairo_dock_add_one_dock_item ("", NULL, s_pDocksListStore);
944
cairo_dock_foreach_docks ((GHFunc) _cairo_dock_add_one_dock_item, s_pDocksListStore);
947
static void _cairo_dock_add_one_icon_theme_item (const gchar *cName, const gchar *cDisplayedName, GtkListStore *pModele)
950
memset (&iter, 0, sizeof (GtkTreeIter));
951
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
952
//g_print ("+ %s (%s)\n", cName, cDisplayedName);
953
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
954
CAIRO_DOCK_MODEL_NAME, cDisplayedName,
955
CAIRO_DOCK_MODEL_RESULT, cName,
956
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, "none",
957
CAIRO_DOCK_MODEL_IMAGE, "none", -1);
959
static void cairo_dock_build_icon_theme_list_for_gui (GHashTable *pHashTable)
961
_build_list_for_gui (s_pIconThemeListStore, "", pHashTable, _cairo_dock_add_one_icon_theme_item);
964
static inline void _fill_modele_with_themes (const gchar *cThemeName, CairoDockTheme *pTheme, GtkListStore *pModele, gboolean bShowState, gboolean bInsertState)
967
memset (&iter, 0, sizeof (GtkTreeIter));
968
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
969
gchar *cReadmePath = g_strdup_printf ("%s/readme", pTheme->cThemePath);
970
gchar *cPreviewPath = g_strdup_printf ("%s/preview", pTheme->cThemePath);
971
gchar *cResult = (bInsertState ? g_strdup_printf ("%s[%d]", cThemeName, pTheme->iType) : NULL);
972
gchar *cDisplayedName = NULL;
976
switch (pTheme->iType)
978
case CAIRO_DOCK_LOCAL_THEME: cType = "(Local) "; break;
979
case CAIRO_DOCK_USER_THEME: cType = "(User) "; break;
980
case CAIRO_DOCK_DISTANT_THEME: cType = "(Net) "; break;
981
case CAIRO_DOCK_NEW_THEME: cType = "(New) "; break;
982
case CAIRO_DOCK_UPDATED_THEME: cType = "(Updated)"; break;
983
default: cType = ""; break;
985
cDisplayedName = g_strconcat (cType, pTheme->cDisplayedName, NULL);
987
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
988
CAIRO_DOCK_MODEL_NAME, cDisplayedName ? cDisplayedName : pTheme->cDisplayedName,
989
CAIRO_DOCK_MODEL_RESULT, cResult ? cResult : cThemeName,
990
CAIRO_DOCK_MODEL_ACTIVE, FALSE,
991
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, cReadmePath,
992
CAIRO_DOCK_MODEL_IMAGE, cPreviewPath,
993
CAIRO_DOCK_MODEL_ORDER, pTheme->iRating,
994
CAIRO_DOCK_MODEL_ORDER2, pTheme->iSobriety,
995
CAIRO_DOCK_MODEL_STATE, pTheme->iType, -1);
996
g_free (cReadmePath);
997
g_free (cPreviewPath);
1000
g_free (cDisplayedName);
1002
static void _cairo_dock_fill_modele_with_themes (const gchar *cThemeName, CairoDockTheme *pTheme, GtkListStore *pModele)
1004
_fill_modele_with_themes (cThemeName, pTheme, pModele, FALSE, TRUE);
1006
static void _cairo_dock_fill_modele_with_short_themes (const gchar *cThemeName, CairoDockTheme *pTheme, GtkListStore *pModele)
1008
_fill_modele_with_themes (cThemeName, pTheme, pModele, TRUE, TRUE);
1011
static void _got_themes_list (GHashTable *pThemeTable, gpointer *data)
1013
if (pThemeTable == NULL)
1015
cairo_dock_set_status_message (data[1], "Couldn't list available themes (is connection alive ?)");
1019
cairo_dock_set_status_message (data[1], "");
1020
GtkWidget *pTreeView = data[0];
1021
GtkListStore *modele = gtk_tree_view_get_model (GTK_TREE_VIEW (pTreeView));
1022
g_hash_table_foreach (pThemeTable, (GHFunc)_cairo_dock_fill_modele_with_themes, modele);
1025
static void _got_themes_combo_list (GHashTable *pThemeTable, gpointer *data)
1027
if (pThemeTable == NULL)
1029
cairo_dock_set_status_message (data[1], "Couldn't list available themes (is connection alive ?)");
1033
cairo_dock_set_status_message (data[1], "");
1034
GtkWidget *pCombo = data[0];
1036
gchar *cValue = data[2];
1037
cairo_dock_fill_combo_with_themes (pCombo, pThemeTable, cValue);
1042
static gboolean _cairo_dock_test_one_name (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer *data)
1044
gchar *cName = NULL, *cResult = NULL;
1045
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_RESULT, &cResult, -1);
1046
if (cResult == NULL)
1047
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_NAME, &cName, -1);
1049
cairo_dock_extract_theme_type_from_name (cResult);
1050
if ((cResult && strcmp (data[0], cResult) == 0) || (cName && strcmp (data[0], cName) == 0))
1052
GtkTreeIter *iter_to_fill = data[1];
1053
memcpy (iter_to_fill, iter, sizeof (GtkTreeIter));
1054
gboolean *bFound = data[2];
1064
static gboolean _cairo_dock_find_iter_from_name (GtkListStore *pModele, const gchar *cName, GtkTreeIter *iter, gboolean bIsTheme)
1066
//g_print ("%s (%s)\n", __func__, cName);
1069
gboolean bFound = FALSE;
1070
gconstpointer data[4] = {cName, iter, &bFound, GINT_TO_POINTER (bIsTheme)};
1071
gtk_tree_model_foreach (GTK_TREE_MODEL (pModele), (GtkTreeModelForeachFunc) _cairo_dock_test_one_name, data);
1075
static void _cairo_dock_render_module_name (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model,GtkTreeIter *iter, gpointer data)
1077
gboolean bActive = FALSE;
1078
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_ACTIVE, &bActive, -1);
1081
g_object_set (cell, "weight", 800, "weight-set", TRUE, NULL);
1083
g_object_set (cell, "weight", 400, "weight-set", FALSE, NULL);
1086
static void _cairo_dock_render_category (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model,GtkTreeIter *iter, gpointer data)
1088
const gchar *cCategory=NULL;
1090
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_STATE, &iCategory, -1);
1093
case CAIRO_DOCK_CATEGORY_APPLET_ACCESSORY:
1094
cCategory = _("Accessory");
1095
g_object_set (cell, "foreground", "#900009", NULL); // rouge
1096
g_object_set (cell, "foreground-set", TRUE, NULL);
1098
case CAIRO_DOCK_CATEGORY_APPLET_DESKTOP:
1099
cCategory = _("Desktop");
1100
g_object_set (cell, "foreground", "#116E08", NULL); // vert
1101
g_object_set (cell, "foreground-set", TRUE, NULL);
1103
case CAIRO_DOCK_CATEGORY_APPLET_CONTROLER:
1104
cCategory = _("Controler");
1105
g_object_set (cell, "foreground", "#004EA1", NULL); // bleu
1106
g_object_set (cell, "foreground-set", TRUE, NULL);
1108
case CAIRO_DOCK_CATEGORY_PLUG_IN:
1109
cCategory = _("Plug-in");
1110
g_object_set (cell, "foreground", "#A58B0D", NULL); // jaune
1111
g_object_set (cell, "foreground-set", TRUE, NULL);
1114
if (cCategory != NULL)
1116
g_object_set (cell, "text", cCategory, NULL);
1120
#define CD_MAX_RATING 5
1121
static inline void _render_rating (GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, int iColumnIndex)
1124
gtk_tree_model_get (model, iter, iColumnIndex, &iRating, -1);
1125
if (iRating > CD_MAX_RATING)
1126
iRating = CD_MAX_RATING;
1129
GString *s = g_string_sized_new (CD_MAX_RATING*4+1);
1131
for (i= 0; i < iRating; i ++)
1132
g_string_append (s, "ā
");
1133
for (;i < CD_MAX_RATING; i ++)
1134
g_string_append (s, "ā");
1135
g_object_set (cell, "text", s->str, NULL); // markup
1136
g_string_free (s, TRUE);
1140
g_object_set (cell, "text", iColumnIndex == CAIRO_DOCK_MODEL_ORDER ? _("rate me") : "-", NULL);
1143
static void _cairo_dock_render_sobriety (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model,GtkTreeIter *iter, gpointer data)
1145
_render_rating (cell, model, iter, CAIRO_DOCK_MODEL_ORDER2);
1147
static void _cairo_dock_render_rating (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model,GtkTreeIter *iter, gpointer data)
1149
/// ignorer les themes "default"...
1150
_render_rating (cell, model, iter, CAIRO_DOCK_MODEL_ORDER);
1152
static void _cairo_dock_render_state (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model,GtkTreeIter *iter, gpointer data)
1154
const gchar *cState=NULL;
1156
gtk_tree_model_get (model, iter, CAIRO_DOCK_MODEL_STATE, &iState, -1);
1159
case CAIRO_DOCK_LOCAL_THEME:
1160
cState = _("Local");
1161
g_object_set (cell, "foreground-set", FALSE, NULL);
1163
case CAIRO_DOCK_USER_THEME:
1165
g_object_set (cell, "foreground-set", FALSE, NULL);
1167
case CAIRO_DOCK_DISTANT_THEME:
1169
g_object_set (cell, "foreground-set", FALSE, NULL);
1171
case CAIRO_DOCK_NEW_THEME:
1173
g_object_set (cell, "foreground", "#FF0000", NULL); // "red"
1174
g_object_set (cell, "foreground-set", TRUE, NULL);
1176
case CAIRO_DOCK_UPDATED_THEME:
1177
cState = _("Updated");
1178
g_object_set (cell, "foreground", "#FF0000", NULL); // "red"
1179
g_object_set (cell, "foreground-set", TRUE, NULL);
1186
g_object_set (cell, "text", cState, NULL);
1189
static GtkListStore *_make_note_list_store (void)
1191
GString *s = g_string_sized_new (CD_MAX_RATING*4+1);
1192
GtkListStore *note_list = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
1195
for (i = 1; i <= 5; i ++)
1197
g_string_assign (s, "");
1198
for (j= 0; j < i; j ++)
1199
g_string_append (s, "ā
");
1200
for (;j < CD_MAX_RATING; j ++)
1201
g_string_append (s, "ā");
1203
memset (&iter, 0, sizeof (GtkTreeIter));
1204
gtk_list_store_append (GTK_LIST_STORE (note_list), &iter);
1205
gtk_list_store_set (GTK_LIST_STORE (note_list), &iter,
1209
g_string_free (s, TRUE);
1212
static void _change_rating (GtkCellRendererText * cell, gchar * path_string, gchar * new_text, GtkTreeModel * model)
1214
//g_print ("%s (%s : %s)\n", __func__, path_string, new_text);
1215
g_return_if_fail (new_text != NULL && *new_text != '\0');
1218
if (! gtk_tree_model_get_iter_from_string (model, &it, path_string))
1222
gchar *str = new_text;
1225
if (strncmp (str, "ā
", strlen ("ā
")) == 0)
1227
str += strlen ("ā
");
1233
//g_print ("iRating : %d\n", iRating);
1235
gchar /** *cDisplayedName = NULL, */*cThemeName = NULL;
1237
gtk_tree_model_get (model, &it,
1238
///CAIRO_DOCK_MODEL_NAME, &cDisplayedName,
1239
CAIRO_DOCK_MODEL_RESULT, &cThemeName,
1240
CAIRO_DOCK_MODEL_STATE, &iState, -1);
1241
g_return_if_fail (/**cDisplayedName != NULL && */cThemeName != NULL);
1242
//g_print ("theme : %s / %s\n", cThemeName, cDisplayedName);
1244
gchar *cRatingDir = g_strdup_printf ("%s/%s/.rating", g_cCairoDockDataDir, "themes"); // il y'a un probleme ici, on ne connait pas le repertoire utilisateur des themes. donc ce code ne marche que pour les themes du dock (et n'est utilise que pour ca)
1245
gchar *cRatingFile = g_strdup_printf ("%s/%s", cRatingDir, cThemeName);
1246
//g_print ("on ecrit dans %s\n", cRatingFile);
1247
if (iState == CAIRO_DOCK_USER_THEME || iState == CAIRO_DOCK_LOCAL_THEME/**strncmp (cDisplayedName, CAIRO_DOCK_PREFIX_NET_THEME, strlen (CAIRO_DOCK_PREFIX_NET_THEME)) != 0*/ || g_file_test (cRatingFile, G_FILE_TEST_EXISTS)) // ca n'est pas un theme distant, ou l'utilisateur a deja vote auparavant pour ce theme.
1249
if (!g_file_test (cRatingDir, G_FILE_TEST_IS_DIR))
1251
if (g_mkdir (cRatingDir, 7*8*8+7*8+5) != 0)
1253
cd_warning ("couldn't create directory %s", cRatingDir);
1257
gchar *cContent = g_strdup_printf ("%d", iRating);
1258
g_file_set_contents (cRatingFile,
1264
gtk_list_store_set (GTK_LIST_STORE (model), &it, CAIRO_DOCK_MODEL_ORDER, iRating, -1);
1268
Icon *pIcon = cairo_dock_get_current_active_icon ();
1269
CairoDock *pDock = NULL;
1271
pDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
1273
cairo_dock_show_temporary_dialog_with_icon (_("You have to try the theme before you can rate it."), pIcon, CAIRO_CONTAINER (pDock), 3000, "same icon");
1275
cairo_dock_show_general_message (_("You have to try the theme before you can rate it."), 3000);
1277
///g_free (cDisplayedName);
1278
g_free (cThemeName);
1279
g_free (cRatingFile);
1280
g_free (cRatingDir);
1283
static void _cairo_dock_configure_module (GtkButton *button, gpointer *data)
1285
GtkTreeView *pCombo = data[0];
1286
GtkWindow *pDialog = data[1];
1287
gchar *cModuleName = data[2];
1289
CairoDockModule *pModule = cairo_dock_find_module_from_name (cModuleName);
1290
CairoDockInternalModule *pInternalModule = cairo_dock_find_internal_module_from_name (cModuleName);
1291
Icon *pIcon = cairo_dock_get_current_active_icon ();
1292
CairoDock *pDock = cairo_dock_search_dock_from_name (pIcon != NULL ? pIcon->cParentDockName : NULL);
1293
gchar *cMessage = NULL;
1295
if (pModule == NULL && pInternalModule == NULL)
1297
cMessage = g_strdup_printf (_("The '%s' module was not found.\nBe sure to install it in the same version as the dock to enjoy these features."), cModuleName);
1298
int iDuration = 10e3;
1299
if (pIcon != NULL && pDock != NULL)
1300
cairo_dock_show_temporary_dialog_with_icon (cMessage, pIcon, CAIRO_CONTAINER (pDock), iDuration, "same icon");
1302
cairo_dock_show_general_message (cMessage, iDuration);
1304
else if (pModule != NULL && pModule->pInstancesList == NULL)
1306
cMessage = g_strdup_printf (_("The '%s' plug-in is not active.\nBe sure to activate it to enjoy these features."), cModuleName);
1307
int iDuration = 8e3;
1308
if (pIcon != NULL && pDock != NULL)
1309
cairo_dock_show_temporary_dialog_with_icon (cMessage, pIcon, CAIRO_CONTAINER (pDock), iDuration, "same icon");
1313
cairo_dock_show_module_gui (cModuleName);
1318
#define _allocate_new_buffer\
1319
data = g_new (gconstpointer, 3); \
1320
g_ptr_array_add (pDataGarbage, data);
1322
#define _pack_in_widget_box(pSubWidget) gtk_box_pack_start (GTK_BOX (pWidgetBox), pSubWidget, FALSE, FALSE, 0)
1323
#define _pack_subwidget(pSubWidget) do {\
1324
pSubWidgetList = g_slist_append (pSubWidgetList, pSubWidget);\
1325
_pack_in_widget_box (pSubWidget); } while (0)
1326
#define _pack_hscale(pSubWidget) do {\
1327
GtkWidget *pExtendedWidget;\
1328
if (pAuthorizedValuesList != NULL && pAuthorizedValuesList[0] != NULL && pAuthorizedValuesList[1] != NULL && pAuthorizedValuesList[2] != NULL && pAuthorizedValuesList[3] != NULL) {\
1329
pExtendedWidget = gtk_hbox_new (FALSE, 0);\
1330
GtkWidget *label = gtk_label_new (dgettext (cGettextDomain, pAuthorizedValuesList[2]));\
1331
GtkWidget *pAlign = gtk_alignment_new (1., 1., 0., 0.);\
1332
gtk_container_add (GTK_CONTAINER (pAlign), label);\
1333
gtk_box_pack_start (GTK_BOX (pExtendedWidget), pAlign, FALSE, FALSE, 0);\
1334
gtk_box_pack_start (GTK_BOX (pExtendedWidget), pSubWidget, FALSE, FALSE, 0);\
1335
label = gtk_label_new (dgettext (cGettextDomain, pAuthorizedValuesList[3]));\
1336
pAlign = gtk_alignment_new (1., 1., 0., 0.);\
1337
gtk_container_add (GTK_CONTAINER (pAlign), label);\
1338
gtk_box_pack_start (GTK_BOX (pExtendedWidget), pAlign, FALSE, FALSE, 0); }\
1340
pExtendedWidget = pOneWidget; }\
1341
pSubWidgetList = g_slist_append (pSubWidgetList, pSubWidget);\
1342
_pack_in_widget_box (pExtendedWidget); } while (0)
1343
#define _add_combo_from_modele(modele, bAddPreviewWidgets, bWithEntry) do {\
1344
if (modele == NULL) { \
1345
pOneWidget = gtk_combo_box_entry_new ();\
1346
_pack_subwidget (pOneWidget); }\
1348
cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL);\
1350
pOneWidget = gtk_combo_box_entry_new_with_model (GTK_TREE_MODEL (modele), CAIRO_DOCK_MODEL_NAME); }\
1352
pOneWidget = gtk_combo_box_new_with_model (GTK_TREE_MODEL (modele));\
1353
rend = gtk_cell_renderer_text_new ();\
1354
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (pOneWidget), rend, FALSE);\
1355
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (pOneWidget), rend, "text", CAIRO_DOCK_MODEL_NAME, NULL);}\
1356
if (bAddPreviewWidgets) {\
1357
pDescriptionLabel = gtk_label_new (NULL);\
1358
g_signal_connect (pMainWindow, "destroy-event", G_CALLBACK (on_delete_async_widget), pDescriptionLabel);\
1359
g_object_ref (pDescriptionLabel);\
1360
gtk_label_set_use_markup (GTK_LABEL (pDescriptionLabel), TRUE);\
1361
gtk_widget_set_size_request (pDescriptionLabel, 500, CAIRO_DOCK_PREVIEW_HEIGHT);\
1362
gtk_label_set_justify (GTK_LABEL (pDescriptionLabel), GTK_JUSTIFY_LEFT);\
1363
gtk_label_set_line_wrap (GTK_LABEL (pDescriptionLabel), TRUE);\
1364
pPreviewImage = gtk_image_new_from_pixbuf (NULL);\
1365
g_signal_connect (pMainWindow, "delete-event", G_CALLBACK (on_delete_async_widget), pPreviewImage);\
1366
g_object_ref (pPreviewImage);\
1367
gtk_widget_set (pPreviewImage, "height-request", CAIRO_DOCK_PREVIEW_HEIGHT, "width-request", CAIRO_DOCK_PREVIEW_WIDTH, NULL);\
1368
_allocate_new_buffer;\
1369
data[0] = pDescriptionLabel;\
1370
data[1] = pPreviewImage;\
1371
g_signal_connect (G_OBJECT (pOneWidget), "changed", G_CALLBACK (_cairo_dock_select_one_item_in_combo), data);\
1372
pPreviewBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);\
1373
gtk_box_pack_start (GTK_BOX (pAdditionalItemsVBox ? pAdditionalItemsVBox : pKeyBox), pPreviewBox, FALSE, FALSE, 0);\
1374
gtk_box_pack_start (GTK_BOX (pPreviewBox), pPreviewImage, FALSE, FALSE, 0);\
1375
gtk_box_pack_start (GTK_BOX (pPreviewBox), pDescriptionLabel, FALSE, FALSE, 0); }\
1376
if (_cairo_dock_find_iter_from_name (modele, cValue, &iter, FALSE))\
1377
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (pOneWidget), &iter);\
1378
_pack_subwidget (pOneWidget);\
1379
g_free (cValue); } } while (0)
1381
gchar *cairo_dock_parse_key_comment (gchar *cKeyComment, char *iElementType, guint *iNbElements, gchar ***pAuthorizedValuesList, gboolean *bAligned, gchar **cTipString)
1383
if (cKeyComment == NULL || *cKeyComment == '\0')
1386
gchar *cUsefulComment = cKeyComment;
1387
while (*cUsefulComment == '#' || *cUsefulComment == ' ' || *cUsefulComment == '\n') // on saute les # et les espaces.
1390
int length = strlen (cUsefulComment);
1391
while (cUsefulComment[length-1] == '\n')
1393
cUsefulComment[length-1] = '\0';
1398
//\______________ On recupere le type du widget.
1399
*iElementType = *cUsefulComment;
1401
if (*cUsefulComment == '-' || *cUsefulComment == '+')
1404
//\______________ On recupere le nombre d'elements du widget.
1405
*iNbElements = atoi (cUsefulComment);
1406
if (*iNbElements == 0)
1408
while (g_ascii_isdigit (*cUsefulComment)) // on saute les chiffres.
1410
while (*cUsefulComment == ' ') // on saute les espaces.
1413
//\______________ On recupere les valeurs autorisees.
1414
if (*cUsefulComment == '[')
1417
gchar *cAuthorizedValuesChain = cUsefulComment;
1419
while (*cUsefulComment != '\0' && *cUsefulComment != ']')
1421
g_return_val_if_fail (*cUsefulComment != '\0', NULL);
1422
*cUsefulComment = '\0';
1424
while (*cUsefulComment == ' ') // on saute les espaces.
1427
if (*cAuthorizedValuesChain == '\0') // rien, on prefere le savoir plutot que d'avoir une entree vide.
1428
*pAuthorizedValuesList = g_new0 (gchar *, 1);
1430
*pAuthorizedValuesList = g_strsplit (cAuthorizedValuesChain, ";", 0);
1434
*pAuthorizedValuesList = NULL;
1437
//\______________ On recupere l'alignement.
1438
int len = strlen (cUsefulComment);
1439
if (cUsefulComment[len - 1] == '\n')
1442
cUsefulComment[len] = '\0';
1444
if (cUsefulComment[len - 1] == '/')
1446
cUsefulComment[len - 1] = '\0';
1454
//\______________ On recupere la bulle d'aide.
1455
gchar *str = strchr (cUsefulComment, '{');
1456
if (str != NULL && str != cUsefulComment)
1458
if (*(str-1) == '\n')
1466
str = strrchr (*cTipString, '}');
1475
return cUsefulComment;
1478
GtkWidget *cairo_dock_build_group_widget (GKeyFile *pKeyFile, const gchar *cGroupName, const gchar *cGettextDomain, GtkWidget *pMainWindow, GSList **pWidgetList, GPtrArray *pDataGarbage, const gchar *cOriginalConfFilePath)
1480
g_return_val_if_fail (pKeyFile != NULL && cGroupName != NULL, NULL);
1481
gchar iIdentifier = 0;
1482
gchar *cHighLightedSentence;
1483
//GPtrArray *pDataGarbage = g_ptr_array_new ();
1484
//GPtrArray *pModelGarbage = g_ptr_array_new ();
1486
gconstpointer *data;
1491
GtkWidget *pOneWidget;
1492
GSList * pSubWidgetList;
1493
GtkWidget *pLabel=NULL, *pLabelContainer;
1494
GtkWidget *pGroupBox, *pKeyBox=NULL, *pSmallVBox, *pWidgetBox=NULL;
1497
GtkWidget *pButtonAdd, *pButtonRemove;
1498
GtkWidget *pButtonDown, *pButtonUp, *pButtonConfig;
1499
GtkWidget *pButtonFileChooser, *pButtonPlay;
1500
GtkWidget *pFrame, *pFrameVBox;
1501
GtkWidget *pScrolledWindow;
1502
GtkWidget *pColorButton;
1503
GtkWidget *pFontButton;
1504
GtkWidget *pDescriptionLabel;
1505
GtkWidget *pPreviewImage;
1506
GtkWidget *pButtonConfigRenderer;
1507
GtkWidget *pToggleButton=NULL;
1508
GtkCellRenderer *rend;
1510
GtkTreeSelection *selection;
1511
GtkWidget *pBackButton;
1512
GtkWidget *pControlContainer = NULL;
1513
int iFirstSensitiveWidget = 0, iNbControlledWidgets = 0, iNbSensitiveWidgets = 0;
1514
gchar *cGroupComment, *cKeyName, *cKeyComment, *cUsefulComment, *cAuthorizedValuesChain, *cTipString, **pAuthorizedValuesList, *cSmallGroupIcon=NULL, *cDisplayedGroupName=NULL; // ne pas effacer 'cTipString' et 'cUsefulComment', ils pointent dans cKeyComment.
1515
gpointer *pGroupKeyWidget;
1517
guint k, iNbElements;
1518
int iNumPage=0, iPresentedNumPage=0;
1520
gboolean bValue, *bValueList;
1521
int iValue, iMinValue, iMaxValue, *iValueList;
1522
double fValue, fMinValue, fMaxValue, *fValueList;
1523
gchar *cValue, **cValueList, *cSmallIcon=NULL;
1525
GtkListStore *modele;
1526
gboolean bAddBackButton;
1527
GtkWidget *pPreviewBox;
1528
GtkWidget *pAdditionalItemsVBox;
1529
gboolean bIsAligned;
1534
pControlContainer = NULL;
1535
cGroupComment = g_key_file_get_comment (pKeyFile, cGroupName, NULL, NULL);
1536
if (cGroupComment != NULL)
1538
cGroupComment[strlen(cGroupComment)-1] = '\0';
1539
gchar *str = strrchr (cGroupComment, '[');
1542
cSmallGroupIcon = str+1;
1543
str = strrchr (cSmallGroupIcon, ']');
1546
str = strrchr (cSmallGroupIcon, ';');
1550
cDisplayedGroupName = str + 1;
1555
pKeyList = g_key_file_get_keys (pKeyFile, cGroupName, NULL, NULL);
1557
for (j = 0; pKeyList[j] != NULL; j ++)
1559
cKeyName = pKeyList[j];
1561
//\______________ On parse le commentaire.
1562
pAuthorizedValuesList = NULL;
1565
cKeyComment = g_key_file_get_comment (pKeyFile, cGroupName, cKeyName, NULL);
1566
cUsefulComment = cairo_dock_parse_key_comment (cKeyComment, &iElementType, &iNbElements, &pAuthorizedValuesList, &bIsAligned, &cTipString);
1567
if (cUsefulComment == NULL)
1569
g_free (cKeyComment);
1572
if (iElementType == '[') // on gere le bug de la Glib, qui rajoute les nouvelles cles apres le commentaire du groupe suivant !
1574
g_free (cKeyComment);
1578
//\______________ On cree la boite du groupe si c'est la 1ere cle valide.
1579
if (pGroupBox == NULL) // maintenant qu'on a au moins un element dans ce groupe, on cree sa page dans le notebook.
1581
pLabel = gtk_label_new (dgettext (cGettextDomain, cDisplayedGroupName ? cDisplayedGroupName : cGroupName));
1583
pLabelContainer = NULL;
1584
GtkWidget *pAlign = NULL;
1585
if (cSmallGroupIcon != NULL && *cSmallGroupIcon != '\0')
1587
pLabelContainer = gtk_hbox_new (FALSE, CAIRO_DOCK_ICON_MARGIN);
1588
pAlign = gtk_alignment_new (0., 0.5, 0., 0.);
1589
gtk_container_add (GTK_CONTAINER (pAlign), pLabelContainer);
1591
GtkWidget *pImage = gtk_image_new ();
1593
if (*cSmallGroupIcon != '/')
1594
pixbuf = gtk_widget_render_icon (pImage,
1596
GTK_ICON_SIZE_BUTTON,
1599
pixbuf = gdk_pixbuf_new_from_file_at_size (cSmallGroupIcon, CAIRO_DOCK_TAB_ICON_SIZE, CAIRO_DOCK_TAB_ICON_SIZE, NULL);
1602
gtk_image_set_from_pixbuf (GTK_IMAGE (pImage), pixbuf);
1603
gdk_pixbuf_unref (pixbuf);
1604
gtk_container_add (GTK_CONTAINER (pLabelContainer),
1607
gtk_container_add (GTK_CONTAINER (pLabelContainer),
1609
gtk_widget_show_all (pLabelContainer);
1612
pGroupBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
1613
gtk_container_set_border_width (GTK_CONTAINER (pGroupBox), CAIRO_DOCK_GUI_MARGIN);
1616
pAdditionalItemsVBox = NULL;
1617
if (iElementType != CAIRO_DOCK_WIDGET_FRAME && iElementType != CAIRO_DOCK_WIDGET_EXPANDER && iElementType != CAIRO_DOCK_WIDGET_SEPARATOR)
1619
//\______________ On cree la boite de la cle.
1620
if (iElementType == CAIRO_DOCK_WIDGET_THEME_LIST || iElementType == CAIRO_DOCK_WIDGET_THEME_LIST_ENTRY || iElementType == CAIRO_DOCK_WIDGET_VIEW_LIST)
1622
pAdditionalItemsVBox = gtk_vbox_new (FALSE, 0);
1623
gtk_box_pack_start (pFrameVBox != NULL ? GTK_BOX (pFrameVBox) : GTK_BOX (pGroupBox),
1624
pAdditionalItemsVBox,
1628
pKeyBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
1629
gtk_box_pack_start (GTK_BOX (pAdditionalItemsVBox),
1637
pKeyBox = (bIsAligned ? gtk_hbox_new : gtk_vbox_new) (FALSE, CAIRO_DOCK_GUI_MARGIN);
1638
gtk_box_pack_start (pFrameVBox != NULL ? GTK_BOX (pFrameVBox) : GTK_BOX (pGroupBox),
1645
if (cTipString != NULL)
1647
gtk_widget_set_tooltip_text (pKeyBox, dgettext (cGettextDomain, cTipString));
1649
if (iNbControlledWidgets > 0 && pControlContainer != NULL)
1651
//g_print ("ctrl (%d widgets)\n", iNbControlledWidgets);
1652
if (pControlContainer == (pFrameVBox ? pFrameVBox : pGroupBox))
1654
//g_print ("ctrl (iNbControlledWidgets:%d, iFirstSensitiveWidget:%d, iNbSensitiveWidgets:%d)\n", iNbControlledWidgets, iFirstSensitiveWidget, iNbSensitiveWidgets);
1655
iNbControlledWidgets --;
1656
if (iFirstSensitiveWidget > 0)
1657
iFirstSensitiveWidget --;
1659
GtkWidget *w = (pAdditionalItemsVBox ? pAdditionalItemsVBox : pKeyBox);
1660
if (iFirstSensitiveWidget == 0 && iNbSensitiveWidgets > 0)
1662
//g_print (" => sensitive\n");
1663
iNbSensitiveWidgets --;
1664
if (GTK_IS_EXPANDER (w))
1665
gtk_expander_set_expanded (GTK_EXPANDER (w), TRUE);
1669
//g_print (" => unsensitive\n");
1670
if (!GTK_IS_EXPANDER (w))
1671
gtk_widget_set_sensitive (w, FALSE);
1676
//\______________ On cree le label descriptif et la boite du widget.
1677
if (iElementType != CAIRO_DOCK_WIDGET_EMPTY_WIDGET)
1680
if (iElementType == CAIRO_DOCK_WIDGET_HANDBOOK)
1682
cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL);
1683
CairoDockModule *pModule = cairo_dock_find_module_from_name (cValue);
1684
if (pModule != NULL)
1686
gchar *cDescription = g_strdup_printf ("%s (v%s) by %s\n%s",
1687
pModule->pVisitCard->cModuleName,
1688
pModule->pVisitCard->cModuleVersion,
1689
pModule->pVisitCard->cAuthor,
1690
dgettext (pModule->pVisitCard->cGettextDomain,
1691
pModule->pVisitCard->cDescription));
1692
pLabel = gtk_label_new (cDescription);
1693
gtk_widget_set (pLabel, "width-request", 500, NULL); // CAIRO_DOCK_PREVIEW_WIDTH
1694
gtk_label_set_justify (GTK_LABEL (pLabel), GTK_JUSTIFY_LEFT);
1695
gtk_label_set_line_wrap (GTK_LABEL (pLabel), TRUE);
1696
g_free (cDescription);
1700
else if (*cUsefulComment != '\0' && strcmp (cUsefulComment, "...") != 0)
1702
pLabel = gtk_label_new (NULL);
1703
gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE);
1704
gtk_label_set_markup (GTK_LABEL (pLabel), dgettext (cGettextDomain, cUsefulComment));
1708
GtkWidget *pAlign = gtk_alignment_new (0., 0.5, 0., 0.);
1709
gtk_container_add (GTK_CONTAINER (pAlign), pLabel);
1710
gtk_box_pack_start (GTK_BOX (pKeyBox),
1717
pWidgetBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
1718
gtk_box_pack_end (GTK_BOX (pKeyBox),
1726
pSubWidgetList = NULL;
1727
bAddBackButton = FALSE;
1729
//\______________ On cree les widgets selon leur type.
1730
switch (iElementType)
1732
case CAIRO_DOCK_WIDGET_CHECK_BUTTON : // boolean
1733
case CAIRO_DOCK_WIDGET_CHECK_CONTROL_BUTTON : // boolean qui controle le widget suivant
1735
bValueList = g_key_file_get_boolean_list (pKeyFile, cGroupName, cKeyName, &length, NULL);
1737
for (k = 0; k < iNbElements; k ++)
1739
bValue = (k < length ? bValueList[k] : FALSE);
1740
pOneWidget = gtk_check_button_new ();
1741
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pOneWidget), bValue);
1743
if (iElementType == CAIRO_DOCK_WIDGET_CHECK_CONTROL_BUTTON)
1745
_allocate_new_buffer;
1747
data[1] = pFrameVBox != NULL ? pFrameVBox : pGroupBox;
1748
if (pAuthorizedValuesList != NULL && pAuthorizedValuesList[0] != NULL)
1749
iNbControlledWidgets = g_ascii_strtod (pAuthorizedValuesList[0], NULL);
1751
iNbControlledWidgets = 1;
1752
data[2] = GINT_TO_POINTER (iNbControlledWidgets);
1753
g_signal_connect (G_OBJECT (pOneWidget), "toggled", G_CALLBACK(_cairo_dock_toggle_control_button), data);
1754
if (! bValue) // les widgets suivants seront inactifs.
1756
iNbSensitiveWidgets = 0;
1757
iFirstSensitiveWidget = 1;
1758
pControlContainer = pFrameVBox != NULL ? pFrameVBox : pGroupBox;
1761
iNbControlledWidgets = 0;
1764
_pack_subwidget (pOneWidget);
1766
g_free (bValueList);
1769
case CAIRO_DOCK_WIDGET_SPIN_INTEGER : // integer
1770
case CAIRO_DOCK_WIDGET_HSCALE_INTEGER : // integer dans un HScale
1771
case CAIRO_DOCK_WIDGET_SIZE_INTEGER : // double integer WxH
1772
if (pAuthorizedValuesList != NULL && pAuthorizedValuesList[0] != NULL)
1774
iMinValue = g_ascii_strtod (pAuthorizedValuesList[0], NULL);
1775
if (pAuthorizedValuesList[1] != NULL)
1776
iMaxValue = g_ascii_strtod (pAuthorizedValuesList[1], NULL);
1785
if (iElementType == CAIRO_DOCK_WIDGET_SIZE_INTEGER)
1788
iValueList = g_key_file_get_integer_list (pKeyFile, cGroupName, cKeyName, &length, NULL);
1789
GtkWidget *pPrevOneWidget=NULL;
1791
if (iElementType == CAIRO_DOCK_WIDGET_SIZE_INTEGER)
1793
pToggleButton = gtk_toggle_button_new ();
1794
GtkWidget *pImage = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PAUSE, GTK_ICON_SIZE_MENU); // trouver une image...
1795
gtk_button_set_image (GTK_BUTTON (pToggleButton), pImage);
1797
for (k = 0; k < iNbElements; k ++)
1799
iValue = (k < length ? iValueList[k] : 0);
1800
GtkObject *pAdjustment = gtk_adjustment_new (iValue,
1804
MAX (1, (iMaxValue - iMinValue) / 20),
1807
if (iElementType == CAIRO_DOCK_WIDGET_HSCALE_INTEGER)
1809
pOneWidget = gtk_hscale_new (GTK_ADJUSTMENT (pAdjustment));
1810
gtk_scale_set_digits (GTK_SCALE (pOneWidget), 0);
1811
gtk_widget_set (pOneWidget, "width-request", 150, NULL);
1813
_pack_hscale (pOneWidget);
1817
pOneWidget = gtk_spin_button_new (GTK_ADJUSTMENT (pAdjustment), 1., 0);
1819
_pack_subwidget (pOneWidget);
1821
g_object_set (pAdjustment, "lower", (double) iMinValue, "upper", (double) iMaxValue, NULL); // le 'width-request' sur un GtkHScale avec 'fMinValue' non nul plante ! Donc on les met apres...
1822
gtk_adjustment_set_value (GTK_ADJUSTMENT (pAdjustment), iValue);
1824
if (iElementType == CAIRO_DOCK_WIDGET_SIZE_INTEGER && k+1 < iNbElements) // on rajoute le separateur.
1826
GtkWidget *pLabelX = gtk_label_new ("x");
1827
_pack_in_widget_box (pLabelX);
1829
if (iElementType == CAIRO_DOCK_WIDGET_SIZE_INTEGER && (k&1)) // on lie les 2 spins entre eux.
1831
if (iPrevValue == iValue)
1832
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pToggleButton), TRUE);
1833
_allocate_new_buffer;
1834
data[0] = pPrevOneWidget;
1835
data[1] = pToggleButton;
1836
g_signal_connect (G_OBJECT (pOneWidget), "value-changed", G_CALLBACK(_cairo_dock_set_value_in_pair), data);
1837
_allocate_new_buffer;
1838
data[0] = pOneWidget;
1839
data[1] = pToggleButton;
1840
g_signal_connect (G_OBJECT (pPrevOneWidget), "value-changed", G_CALLBACK(_cairo_dock_set_value_in_pair), data);
1842
pPrevOneWidget = pOneWidget;
1843
iPrevValue = iValue;
1845
if (iElementType == CAIRO_DOCK_WIDGET_SIZE_INTEGER)
1847
_pack_in_widget_box (pToggleButton);
1849
bAddBackButton = TRUE;
1850
g_free (iValueList);
1853
case CAIRO_DOCK_WIDGET_SPIN_DOUBLE : // float.
1854
case CAIRO_DOCK_WIDGET_HSCALE_DOUBLE : // float dans un HScale.
1855
if (pAuthorizedValuesList != NULL && pAuthorizedValuesList[0] != NULL)
1856
fMinValue = g_ascii_strtod (pAuthorizedValuesList[0], NULL);
1859
if (pAuthorizedValuesList != NULL && pAuthorizedValuesList[1] != NULL)
1860
fMaxValue = g_ascii_strtod (pAuthorizedValuesList[1], NULL);
1864
fValueList = g_key_file_get_double_list (pKeyFile, cGroupName, cKeyName, &length, NULL);
1865
for (k = 0; k < iNbElements; k ++)
1867
fValue = (k < length ? fValueList[k] : 0);
1869
GtkObject *pAdjustment = gtk_adjustment_new (fValue,
1872
(fMaxValue - fMinValue) / 20.,
1873
(fMaxValue - fMinValue) / 10.,
1876
if (iElementType == CAIRO_DOCK_WIDGET_HSCALE_DOUBLE)
1878
pOneWidget = gtk_hscale_new (GTK_ADJUSTMENT (pAdjustment));
1879
gtk_scale_set_digits (GTK_SCALE (pOneWidget), 3);
1880
gtk_widget_set (pOneWidget, "width-request", 150, NULL);
1882
_pack_hscale (pOneWidget);
1886
pOneWidget = gtk_spin_button_new (GTK_ADJUSTMENT (pAdjustment),
1889
_pack_subwidget (pOneWidget);
1891
g_object_set (pAdjustment, "lower", fMinValue, "upper", fMaxValue, NULL); // le 'width-request' sur un GtkHScale avec 'fMinValue' non nul plante ! Donc on les met apres...
1892
gtk_adjustment_set_value (GTK_ADJUSTMENT (pAdjustment), fValue);
1894
bAddBackButton = TRUE,
1895
g_free (fValueList);
1898
case CAIRO_DOCK_WIDGET_COLOR_SELECTOR_RGB : // float x3 avec un bouton de choix de couleur.
1899
case CAIRO_DOCK_WIDGET_COLOR_SELECTOR_RGBA : // float x4 avec un bouton de choix de couleur.
1900
iNbElements = (iElementType == CAIRO_DOCK_WIDGET_COLOR_SELECTOR_RGB ? 3 : 4);
1902
fValueList = g_key_file_get_double_list (pKeyFile, cGroupName, cKeyName, &length, NULL);
1905
gdkColor.red = fValueList[0] * 65535;
1906
gdkColor.green = fValueList[1] * 65535;
1907
gdkColor.blue = fValueList[2] * 65535;
1909
pOneWidget = gtk_color_button_new_with_color (&gdkColor);
1910
if (iElementType == CAIRO_DOCK_WIDGET_COLOR_SELECTOR_RGBA)
1912
gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (pOneWidget), TRUE);
1914
gtk_color_button_set_alpha (GTK_COLOR_BUTTON (pOneWidget), fValueList[3] * 65535);
1916
gtk_color_button_set_alpha (GTK_COLOR_BUTTON (pOneWidget), 65535);
1919
gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (pOneWidget), FALSE);
1920
_pack_subwidget (pOneWidget);
1921
bAddBackButton = TRUE,
1922
g_free (fValueList);
1925
case CAIRO_DOCK_WIDGET_VIEW_LIST : // liste des vues.
1926
_add_combo_from_modele (s_pRendererListStore, TRUE, FALSE);
1929
case CAIRO_DOCK_WIDGET_THEME_LIST : // liste les themes dans combo, avec prevue et readme.
1930
case CAIRO_DOCK_WIDGET_THEME_LIST_ENTRY : // idem mais avec une combo-entry.
1931
//\______________ On construit le widget de visualisation de themes.
1932
modele = _allocate_new_model ();
1933
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (modele), CAIRO_DOCK_MODEL_RESULT, GTK_SORT_ASCENDING);
1935
_add_combo_from_modele (modele, TRUE, iElementType == CAIRO_DOCK_WIDGET_THEME_LIST_ENTRY);
1937
//\______________ On recupere les themes.
1938
if (pAuthorizedValuesList != NULL)
1940
gchar *cShareThemesDir = NULL, *cUserThemesDir = NULL, *cDistantThemesDir = NULL;
1941
if (pAuthorizedValuesList[0] != NULL)
1943
cShareThemesDir = (*pAuthorizedValuesList[0] != '\0' ? cairo_dock_generate_file_path (pAuthorizedValuesList[0]) : NULL); // on autorise les ~/blabla.
1944
if (pAuthorizedValuesList[1] != NULL)
1946
cUserThemesDir = g_strdup_printf ("%s/%s/%s", g_cCairoDockDataDir, CAIRO_DOCK_EXTRAS_DIR, pAuthorizedValuesList[1]);
1947
cDistantThemesDir = pAuthorizedValuesList[2];
1950
cairo_dock_set_status_message_printf (pMainWindow, _("Listing themes in '%s' ..."), cDistantThemesDir);
1951
_allocate_new_buffer;
1952
data[0] = pOneWidget;
1953
data[1] = pMainWindow;
1954
data[2] = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL);
1955
CairoDockTask *pTask = cairo_dock_list_themes_async (cShareThemesDir, cUserThemesDir, cDistantThemesDir, (GFunc) _got_themes_combo_list, data);
1956
g_object_set_data (G_OBJECT (pOneWidget), "cd-task", pTask);
1957
g_signal_connect (pMainWindow, "delete-event", G_CALLBACK (on_delete_async_widget), pOneWidget);
1958
g_object_ref (pOneWidget); // on prend une reference pour que le widget reste en vie lorsqu'on recharge la fenetre (sinon le widget serait detruit sans que la fenetre ne le soit, et lors de la destruction de celle-ci, le signal delete-event serait emis, et la callback appelee avec un widget deja detruit).
1959
g_free (cUserThemesDir);
1960
g_free (cShareThemesDir);
1964
case CAIRO_DOCK_WIDGET_USER_THEME_SELECTOR : // liste des themes utilisateurs, avec une encoche a cote (pour suppression).
1965
//\______________ On construit le treeview des themes.
1966
modele = _allocate_new_model ();
1967
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (modele), CAIRO_DOCK_MODEL_NAME, GTK_SORT_ASCENDING);
1968
pOneWidget = gtk_tree_view_new ();
1969
gtk_tree_view_set_model (GTK_TREE_VIEW (pOneWidget), GTK_TREE_MODEL (modele));
1970
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (pOneWidget), FALSE);
1972
rend = gtk_cell_renderer_toggle_new ();
1973
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pOneWidget), -1, NULL, rend, "active", CAIRO_DOCK_MODEL_ACTIVE, NULL);
1974
g_signal_connect (G_OBJECT (rend), "toggled", (GCallback) _cairo_dock_activate_one_element, modele);
1976
rend = gtk_cell_renderer_text_new ();
1977
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pOneWidget), -1, NULL, rend, "text", CAIRO_DOCK_MODEL_NAME, NULL);
1979
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (pOneWidget));
1980
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
1982
pScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1983
gtk_widget_set (pScrolledWindow, "height-request", 100, NULL);
1984
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1985
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), pOneWidget);
1986
pSubWidgetList = g_slist_append (pSubWidgetList, pOneWidget);
1987
_pack_in_widget_box (pScrolledWindow);
1989
//\______________ On recupere les themes utilisateurs.
1990
if (pAuthorizedValuesList != NULL && pAuthorizedValuesList[0] != NULL && *pAuthorizedValuesList[0] != '\0')
1992
gchar *cUserThemesDir = g_strdup_printf ("%s/%s/%s", g_cCairoDockDataDir, CAIRO_DOCK_EXTRAS_DIR, pAuthorizedValuesList[0]);
1993
GHashTable *pThemeTable = cairo_dock_list_themes (NULL, cUserThemesDir, NULL);
1994
g_free (cUserThemesDir);
1996
g_hash_table_foreach (pThemeTable, (GHFunc)_cairo_dock_fill_modele_with_themes, modele);
1997
g_hash_table_destroy (pThemeTable);
2001
case CAIRO_DOCK_WIDGET_ANIMATION_LIST : // liste des animations.
2002
_add_combo_from_modele (s_pAnimationsListStore, FALSE, FALSE);
2005
case CAIRO_DOCK_WIDGET_DIALOG_DECORATOR_LIST : // liste des decorateurs de dialogue.
2006
_add_combo_from_modele (s_pDialogDecoratorListStore, FALSE, FALSE);
2009
case CAIRO_DOCK_WIDGET_DESKLET_DECORATION_LIST : // liste des decorations de desklet.
2010
case CAIRO_DOCK_WIDGET_DESKLET_DECORATION_LIST_WITH_DEFAULT : // idem mais avec le choix "defaut" en plus.
2012
_add_combo_from_modele ((iElementType == CAIRO_DOCK_WIDGET_DESKLET_DECORATION_LIST ? s_pDecorationsListStore : s_pDecorationsListStore2), FALSE, FALSE);
2014
_allocate_new_buffer;
2016
data[1] = pFrameVBox != NULL ? pFrameVBox : pGroupBox;
2017
iNbControlledWidgets = 9;
2018
data[2] = GINT_TO_POINTER (iNbControlledWidgets);
2019
iNbControlledWidgets --; // car dans cette fonction, on ne compte pas le separateur.
2020
g_signal_connect (G_OBJECT (pOneWidget), "changed", G_CALLBACK (_cairo_dock_select_custom_item_in_combo), data);
2022
GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (pOneWidget));
2024
if (pOneWidget && gtk_combo_box_get_active_iter (GTK_COMBO_BOX (pOneWidget), &iter))
2026
gchar *cName = NULL;
2027
gtk_tree_model_get (model, &iter,
2028
CAIRO_DOCK_MODEL_RESULT, &cName, -1);
2029
if (! cName || strcmp (cName, "personnal") != 0)
2031
iNbSensitiveWidgets = 0;
2032
iFirstSensitiveWidget = 1;
2033
pControlContainer = pFrameVBox != NULL ? pFrameVBox : pGroupBox;
2036
iNbControlledWidgets = 0;
2042
case CAIRO_DOCK_WIDGET_GAUGE_LIST : // liste des themes de jauge.
2043
if (s_pGaugeListStore == NULL)
2045
GHashTable *pGaugeTable = cairo_dock_list_available_gauges ();
2046
cairo_dock_build_gauge_list_for_gui (pGaugeTable);
2047
g_hash_table_destroy (pGaugeTable);
2049
_add_combo_from_modele (s_pGaugeListStore, FALSE, FALSE);
2052
case CAIRO_DOCK_WIDGET_DOCK_LIST : // liste des docks existant.
2053
cairo_dock_build_dock_list_for_gui ();
2054
modele = s_pDocksListStore;
2055
pOneWidget = gtk_combo_box_entry_new_with_model (GTK_TREE_MODEL (modele), CAIRO_DOCK_MODEL_NAME);
2057
cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL);
2059
if (_cairo_dock_find_iter_from_name (modele, cValue, &iter, FALSE))
2060
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (pOneWidget), &iter);
2063
_pack_subwidget (pOneWidget);
2066
case CAIRO_DOCK_WIDGET_ICON_THEME_LIST :
2068
gchar *cUserPath = g_strdup_printf ("%s/.icons", g_getenv ("HOME"));
2069
const gchar *path[3];
2070
path[0] = (const gchar *)cUserPath;
2071
path[1] = "/usr/share/icons";
2074
if (s_pIconThemeListStore != NULL)
2076
gtk_list_store_clear (s_pIconThemeListStore);
2077
s_pIconThemeListStore = NULL;
2080
GHashTable *pHashTable = _cairo_dock_build_icon_themes_list (path);
2083
cairo_dock_build_icon_theme_list_for_gui (pHashTable);
2085
g_hash_table_destroy (pHashTable);
2086
_add_combo_from_modele (s_pIconThemeListStore, FALSE, FALSE);
2088
_pack_subwidget (pOneWidget);
2092
case CAIRO_DOCK_WIDGET_MODULE_LIST :
2094
//\______________ On remplit un modele avec les modules de la categorie.
2096
if (pAuthorizedValuesList && pAuthorizedValuesList[0] != NULL)
2097
iCategory = atoi (pAuthorizedValuesList[0]);
2098
modele = _allocate_new_model ();
2099
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (modele), CAIRO_DOCK_MODEL_NAME, GTK_SORT_ASCENDING);
2100
_allocate_new_buffer;
2101
data[0] = GINT_TO_POINTER (iCategory);
2103
cairo_dock_foreach_module ((GHRFunc) _add_module_to_modele, data);
2105
//\______________ On construit le treeview des modules.
2106
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (modele), CAIRO_DOCK_MODEL_NAME, GTK_SORT_ASCENDING);
2107
pOneWidget = gtk_tree_view_new ();
2108
gtk_tree_view_set_model (GTK_TREE_VIEW (pOneWidget), GTK_TREE_MODEL (modele));
2109
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (pOneWidget), TRUE);
2110
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (pOneWidget), TRUE);
2111
GtkTreeViewColumn* col;
2113
rend = gtk_cell_renderer_toggle_new ();
2114
col = gtk_tree_view_column_new_with_attributes (NULL, rend, "active", CAIRO_DOCK_MODEL_ACTIVE, NULL);
2115
gtk_tree_view_column_set_sort_column_id (col, CAIRO_DOCK_MODEL_ACTIVE);
2116
gtk_tree_view_append_column (GTK_TREE_VIEW (pOneWidget), col);
2117
g_signal_connect (G_OBJECT (rend), "toggled", (GCallback) _cairo_dock_activate_one_module, modele);
2119
rend = gtk_cell_renderer_pixbuf_new ();
2120
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pOneWidget), -1, NULL, rend, "pixbuf", CAIRO_DOCK_MODEL_ICON, NULL);
2122
rend = gtk_cell_renderer_text_new ();
2123
col = gtk_tree_view_column_new_with_attributes (_("module"), rend, "text", CAIRO_DOCK_MODEL_NAME, NULL);
2124
gtk_tree_view_column_set_cell_data_func (col, rend, (GtkTreeCellDataFunc)_cairo_dock_render_module_name, NULL, NULL);
2125
gtk_tree_view_column_set_sort_column_id (col, CAIRO_DOCK_MODEL_NAME);
2126
gtk_tree_view_append_column (GTK_TREE_VIEW (pOneWidget), col);
2128
rend = gtk_cell_renderer_text_new ();
2129
col = gtk_tree_view_column_new_with_attributes (_("category"), rend, "text", CAIRO_DOCK_MODEL_STATE, NULL);
2130
gtk_tree_view_column_set_cell_data_func (col, rend, (GtkTreeCellDataFunc)_cairo_dock_render_category, NULL, NULL);
2131
gtk_tree_view_column_set_sort_column_id (col, CAIRO_DOCK_MODEL_STATE);
2132
gtk_tree_view_append_column (GTK_TREE_VIEW (pOneWidget), col);
2134
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (pOneWidget));
2135
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
2137
pScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
2138
gtk_widget_set (pScrolledWindow, "height-request", 2*CAIRO_DOCK_PREVIEW_HEIGHT, NULL);
2139
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2140
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), pOneWidget);
2141
pSubWidgetList = g_slist_append (pSubWidgetList, pOneWidget);
2142
_pack_in_widget_box (pScrolledWindow);
2144
//\______________ On construit le widget de prevue et on le rajoute a la suite.
2145
pDescriptionLabel = gtk_label_new (NULL);
2146
g_signal_connect (pMainWindow, "delete-event", G_CALLBACK (on_delete_async_widget), pDescriptionLabel);
2147
g_object_ref (pDescriptionLabel);
2148
gtk_label_set_use_markup (GTK_LABEL (pDescriptionLabel), TRUE);
2149
gtk_widget_set (pDescriptionLabel,
2150
"width-request", CAIRO_DOCK_PREVIEW_WIDTH, NULL);
2151
gtk_label_set_justify (GTK_LABEL (pDescriptionLabel), GTK_JUSTIFY_LEFT);
2152
gtk_label_set_line_wrap (GTK_LABEL (pDescriptionLabel), TRUE);
2153
pPreviewImage = gtk_image_new_from_pixbuf (NULL);
2154
g_signal_connect (pMainWindow, "delete-event", G_CALLBACK (on_delete_async_widget), pPreviewImage);
2155
g_object_ref (pPreviewImage);
2156
gtk_widget_set (pPreviewImage,
2157
"height-request", CAIRO_DOCK_PREVIEW_HEIGHT,
2158
"width-request", CAIRO_DOCK_PREVIEW_WIDTH, NULL);
2159
_allocate_new_buffer;
2160
data[0] = pDescriptionLabel;
2161
data[1] = pPreviewImage;
2162
gtk_tree_selection_set_select_function (selection,
2163
(GtkTreeSelectionFunc) _cairo_dock_select_one_item_in_tree,
2166
pPreviewBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
2167
gtk_box_pack_start (GTK_BOX (pPreviewBox), pPreviewImage, FALSE, FALSE, 0);
2168
gtk_box_pack_start (GTK_BOX (pPreviewBox), pDescriptionLabel, FALSE, FALSE, 0);
2169
_pack_in_widget_box (pPreviewBox);
2171
//\______________ On affiche un message par defaut.
2172
gchar *cDefaultMessage = g_strdup_printf ("<b><span font_desc=\"Sans 14\">%s</span></b>", _("Click on an applet in order to have a preview and a description of it."));
2173
gtk_label_set_markup (GTK_LABEL (pDescriptionLabel), cDefaultMessage);
2174
g_free (cDefaultMessage);
2175
_set_preview_image (CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_LOGO, GTK_IMAGE (pPreviewImage));
2179
case CAIRO_DOCK_WIDGET_JUMP_TO_MODULE : // bouton raccourci vers un autre module
2180
case CAIRO_DOCK_WIDGET_JUMP_TO_MODULE_IF_EXISTS : // idem mais seulement affiche si le module existe.
2181
if (pAuthorizedValuesList == NULL || pAuthorizedValuesList[0] == NULL || *pAuthorizedValuesList[0] == '\0')
2184
const gchar *cModuleName = NULL;
2185
CairoDockInternalModule *pInternalModule = cairo_dock_find_internal_module_from_name (pAuthorizedValuesList[0]);
2186
if (pInternalModule != NULL)
2187
cModuleName = pInternalModule->cModuleName;
2190
CairoDockModule *pModule = cairo_dock_find_module_from_name (pAuthorizedValuesList[0]);
2191
if (pModule != NULL)
2192
cModuleName = pModule->pVisitCard->cModuleName;
2195
if (iElementType == CAIRO_DOCK_WIDGET_JUMP_TO_MODULE_IF_EXISTS)
2197
gtk_widget_set_sensitive (pLabel, FALSE);
2200
cd_warning ("module '%s' not found", pAuthorizedValuesList[0]);
2201
cModuleName = g_strdup (pAuthorizedValuesList[0]); // petite fuite memoire dans ce cas tres rare ...
2204
pOneWidget = gtk_button_new_from_stock (GTK_STOCK_JUMP_TO);
2205
_allocate_new_buffer;
2206
data[0] = pOneWidget;
2207
data[1] = pMainWindow;
2208
data[2] = cModuleName;
2209
g_signal_connect (G_OBJECT (pOneWidget),
2211
G_CALLBACK (_cairo_dock_configure_module),
2213
_pack_subwidget (pOneWidget);
2216
case CAIRO_DOCK_WIDGET_LIST : // a list of strings.
2217
case CAIRO_DOCK_WIDGET_NUMBERED_LIST : // a list of numbered strings.
2218
case CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST : // a list of numbered strings whose current choice defines the sensitivity of the widgets below.
2219
case CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST_SELECTIVE : // a list of numbered strings whose current choice defines the sensitivity of the widgets below given in the list.
2220
case CAIRO_DOCK_WIDGET_LIST_WITH_ENTRY : // a list of strings with possibility to select a non-existing one.
2221
if ((iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST || iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST_SELECTIVE) && pAuthorizedValuesList == NULL)
2223
pControlContainer = NULL;
2224
iNbControlledWidgets = 0;
2227
cValue = g_key_file_get_locale_string (pKeyFile, cGroupName, cKeyName, NULL, NULL); // nous permet de recuperer les ';' aussi.
2228
// on construit la combo.
2229
modele = _allocate_new_model ();
2230
if (iElementType == CAIRO_DOCK_WIDGET_LIST_WITH_ENTRY)
2232
pOneWidget = gtk_combo_box_entry_new_with_model (GTK_TREE_MODEL (modele), CAIRO_DOCK_MODEL_NAME);
2236
pOneWidget = gtk_combo_box_new_with_model (GTK_TREE_MODEL (modele));
2237
rend = gtk_cell_renderer_text_new ();
2238
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (pOneWidget), rend, FALSE);
2239
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (pOneWidget), rend, "text", CAIRO_DOCK_MODEL_NAME, NULL);
2243
if (pAuthorizedValuesList != NULL)
2246
int iSelectedItem = -1, iOrder1, iOrder2;
2247
gboolean bNumberedList = (iElementType == CAIRO_DOCK_WIDGET_NUMBERED_LIST || iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST || iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST_SELECTIVE);
2249
iSelectedItem = atoi (cValue);
2250
gchar *cResult = (bNumberedList ? g_new0 (gchar , 10) : NULL);
2251
int dk = (iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST_SELECTIVE ? 3 : 1);
2252
iNbControlledWidgets = 0;
2253
for (k = 0; pAuthorizedValuesList[k] != NULL; k += dk) // on ajoute toutes les chaines possibles a la combo.
2256
gtk_list_store_append (GTK_LIST_STORE (modele), &iter);
2257
if (iSelectedItem == -1 && cValue && strcmp (cValue, pAuthorizedValuesList[k]) == 0)
2258
iSelectedItem = k/dk;
2260
if (cResult != NULL)
2261
snprintf (cResult, 9, "%d", k/dk);
2263
if (iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST_SELECTIVE)
2265
iOrder1 = atoi (pAuthorizedValuesList[k+1]);
2266
iOrder2 = atoi (pAuthorizedValuesList[k+2]);
2267
iNbControlledWidgets = MAX (iNbControlledWidgets, iOrder1 + iOrder2 - 1);
2268
//g_print ("iSelectedItem:%d ; k/dk:%d\n", iSelectedItem , k/dk);
2269
if (iSelectedItem == k/dk)
2271
iFirstSensitiveWidget = iOrder1;
2272
iNbSensitiveWidgets = iOrder2;
2277
iOrder1 = iOrder2 = k;
2279
gtk_list_store_set (GTK_LIST_STORE (modele), &iter,
2280
CAIRO_DOCK_MODEL_NAME, (bNumberedList ? dgettext (cGettextDomain, pAuthorizedValuesList[k]) : pAuthorizedValuesList[k]),
2281
CAIRO_DOCK_MODEL_RESULT, (cResult != NULL ? cResult : pAuthorizedValuesList[k]),
2282
CAIRO_DOCK_MODEL_ORDER, iOrder1,
2283
CAIRO_DOCK_MODEL_ORDER2, iOrder2, -1);
2287
// on active l'element courant.
2288
if (iElementType != CAIRO_DOCK_WIDGET_LIST_WITH_ENTRY && iSelectedItem == -1) // si le choix courant n'etait pas dans la liste, on decide de selectionner le 1er.
2290
if (k != 0) // rien dans le gtktree => plantage.
2291
gtk_combo_box_set_active (GTK_COMBO_BOX (pOneWidget), iSelectedItem);
2292
if (iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST || iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST_SELECTIVE)
2294
pControlContainer = (pFrameVBox != NULL ? pFrameVBox : pGroupBox);
2295
_allocate_new_buffer;
2297
data[1] = pControlContainer;
2298
if (iElementType == CAIRO_DOCK_WIDGET_NUMBERED_CONTROL_LIST)
2300
iNbControlledWidgets = k;
2301
data[2] = GINT_TO_POINTER (iNbControlledWidgets);
2302
g_signal_connect (G_OBJECT (pOneWidget), "changed", G_CALLBACK (_cairo_dock_select_one_item_in_control_combo), data);
2303
iFirstSensitiveWidget = iSelectedItem+1; // on decroit jusqu'a 0.
2304
iNbSensitiveWidgets = 1;
2305
//g_print ("CONTROL : %d,%d,%d\n", iNbControlledWidgets, iFirstSensitiveWidget, iNbSensitiveWidgets);
2309
data[2] = GINT_TO_POINTER (iNbControlledWidgets);
2310
g_signal_connect (G_OBJECT (pOneWidget), "changed", G_CALLBACK (_cairo_dock_select_one_item_in_control_combo_selective), data);
2312
//g_print (" pControlContainer:%x\n", pControlContainer);
2315
_pack_subwidget (pOneWidget);
2319
case CAIRO_DOCK_WIDGET_TREE_VIEW_SORT : // N strings listed from top to bottom.
2320
case CAIRO_DOCK_WIDGET_TREE_VIEW_SORT_AND_MODIFY : // same with possibility to add/remove some.
2321
case CAIRO_DOCK_WIDGET_TREE_VIEW_MULTI_CHOICE : // N strings that can be selected or not.
2322
// on construit le tree view.
2323
cValueList = g_key_file_get_locale_string_list (pKeyFile, cGroupName, cKeyName, NULL, &length, NULL);
2324
pOneWidget = gtk_tree_view_new ();
2325
modele = _allocate_new_model ();
2326
gtk_tree_view_set_model (GTK_TREE_VIEW (pOneWidget), GTK_TREE_MODEL (modele));
2327
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (modele), CAIRO_DOCK_MODEL_ORDER, GTK_SORT_ASCENDING);
2328
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (pOneWidget), FALSE);
2330
if (iElementType == CAIRO_DOCK_WIDGET_TREE_VIEW_MULTI_CHOICE)
2332
rend = gtk_cell_renderer_toggle_new ();
2333
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pOneWidget), -1, NULL, rend, "active", CAIRO_DOCK_MODEL_ACTIVE, NULL);
2334
g_signal_connect (G_OBJECT (rend), "toggled", (GCallback) _cairo_dock_activate_one_element, modele);
2337
rend = gtk_cell_renderer_text_new ();
2338
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pOneWidget), -1, NULL, rend, "text", CAIRO_DOCK_MODEL_NAME, NULL);
2339
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (pOneWidget));
2340
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
2342
pSubWidgetList = g_slist_append (pSubWidgetList, pOneWidget);
2344
pScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
2345
g_print ("length:%d\n", length);
2347
if (pAuthorizedValuesList != NULL && pAuthorizedValuesList[0] != NULL)
2348
for (k = 0; pAuthorizedValuesList[k] != NULL; k++);
2351
gtk_widget_set (pScrolledWindow, "height-request", (iElementType == CAIRO_DOCK_WIDGET_TREE_VIEW_SORT_AND_MODIFY ? 100 : MIN (100, k * 25)), NULL);
2352
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2353
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), pOneWidget);
2354
_pack_in_widget_box (pScrolledWindow);
2356
if (iElementType != CAIRO_DOCK_WIDGET_TREE_VIEW_MULTI_CHOICE)
2358
pSmallVBox = gtk_vbox_new (FALSE, 3);
2359
_pack_in_widget_box (pSmallVBox);
2361
pButtonUp = gtk_button_new_from_stock (GTK_STOCK_GO_UP);
2362
g_signal_connect (G_OBJECT (pButtonUp),
2364
G_CALLBACK (_cairo_dock_go_up),
2366
gtk_box_pack_start (GTK_BOX (pSmallVBox),
2372
pButtonDown = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN);
2373
g_signal_connect (G_OBJECT (pButtonDown),
2375
G_CALLBACK (_cairo_dock_go_down),
2377
gtk_box_pack_start (GTK_BOX (pSmallVBox),
2384
if (iElementType == CAIRO_DOCK_WIDGET_TREE_VIEW_SORT_AND_MODIFY)
2386
pTable = gtk_table_new (2, 2, FALSE);
2387
_pack_in_widget_box (pTable);
2389
_allocate_new_buffer;
2391
pButtonAdd = gtk_button_new_from_stock (GTK_STOCK_ADD);
2392
g_signal_connect (G_OBJECT (pButtonAdd),
2394
G_CALLBACK (_cairo_dock_add),
2396
gtk_table_attach (GTK_TABLE (pTable),
2400
GTK_SHRINK, GTK_SHRINK,
2402
pButtonRemove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
2403
g_signal_connect (G_OBJECT (pButtonRemove),
2405
G_CALLBACK (_cairo_dock_remove),
2407
gtk_table_attach (GTK_TABLE (pTable),
2411
GTK_SHRINK, GTK_SHRINK,
2413
pEntry = gtk_entry_new ();
2414
gtk_table_attach (GTK_TABLE (pTable),
2418
GTK_SHRINK, GTK_SHRINK,
2421
data[0] = pOneWidget;
2426
if (iElementType == CAIRO_DOCK_WIDGET_TREE_VIEW_SORT_AND_MODIFY) // on liste les choix actuels tout simplement.
2428
for (k = 0; k < length; k ++)
2430
cValue = cValueList[k];
2431
if (cValue != NULL) // paranoia.
2433
memset (&iter, 0, sizeof (GtkTreeIter));
2434
gtk_list_store_append (modele, &iter);
2435
gtk_list_store_set (modele, &iter,
2436
CAIRO_DOCK_MODEL_ACTIVE, TRUE,
2437
CAIRO_DOCK_MODEL_NAME, cValue,
2438
CAIRO_DOCK_MODEL_RESULT, cValue,
2439
CAIRO_DOCK_MODEL_ORDER, k, -1);
2443
else if (pAuthorizedValuesList != NULL) // on liste les choix possibles dans l'ordre choisi. Pour CAIRO_DOCK_WIDGET_TREE_VIEW_MULTI_CHOICE, on complete avec ceux n'ayant pas ete selectionnes.
2445
gint iNbPossibleValues = 0, iOrder = 0;
2446
while (pAuthorizedValuesList[iNbPossibleValues] != NULL)
2447
iNbPossibleValues ++;
2449
for (l = 0; l < length; l ++)
2451
cValue = cValueList[l];
2452
if (! g_ascii_isdigit (*cValue)) // ancien format.
2454
g_print ("old format\n");
2456
for (k = 0; k < iNbPossibleValues; k ++) // on cherche la correspondance.
2458
if (strcmp (cValue, pAuthorizedValuesList[k]) == 0)
2460
g_print (" correspondance %s <-> %d\n", cValue, k);
2461
g_free (cValueList[l]);
2462
cValueList[l] = g_strdup_printf ("%d", k);
2463
cValue = cValueList[l];
2467
if (k < iNbPossibleValues)
2473
iValue = atoi (cValue);
2475
if (iValue < iNbPossibleValues)
2477
memset (&iter, 0, sizeof (GtkTreeIter));
2478
gtk_list_store_append (modele, &iter);
2479
gtk_list_store_set (modele, &iter,
2480
CAIRO_DOCK_MODEL_ACTIVE, TRUE,
2481
CAIRO_DOCK_MODEL_NAME, dgettext (cGettextDomain, pAuthorizedValuesList[iValue]),
2482
CAIRO_DOCK_MODEL_RESULT, cValue,
2483
CAIRO_DOCK_MODEL_ORDER, iOrder ++, -1);
2487
if (iOrder < iNbPossibleValues) // il reste des valeurs a inserer (ce peut etre de nouvelles valeurs apparues lors d'une maj du fichier de conf, donc CAIRO_DOCK_WIDGET_TREE_VIEW_SORT est concerne aussi).
2490
for (k = 0; pAuthorizedValuesList[k] != NULL; k ++)
2492
cValue = pAuthorizedValuesList[k];
2493
for (l = 0; l < length; l ++)
2495
iValue = atoi (cValueList[l]);
2496
if (iValue == k) // a deja ete inseree.
2500
if (l == length) // elle n'a pas encore ete inseree.
2502
snprintf (cResult, 9, "%d", k);
2503
memset (&iter, 0, sizeof (GtkTreeIter));
2504
gtk_list_store_append (modele, &iter);
2505
gtk_list_store_set (modele, &iter,
2506
CAIRO_DOCK_MODEL_ACTIVE, (iElementType == CAIRO_DOCK_WIDGET_TREE_VIEW_SORT),
2507
CAIRO_DOCK_MODEL_NAME, dgettext (cGettextDomain, cValue),
2508
CAIRO_DOCK_MODEL_RESULT, cResult,
2509
CAIRO_DOCK_MODEL_ORDER, iOrder ++, -1);
2516
case CAIRO_DOCK_WIDGET_THEME_SELECTOR : // tree view with 4 sortable columns.
2517
//\______________ On construit le treeview des themes.
2518
modele = _allocate_new_model ();
2519
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (modele), CAIRO_DOCK_MODEL_NAME, GTK_SORT_ASCENDING);
2520
pOneWidget = gtk_tree_view_new ();
2521
gtk_tree_view_set_model (GTK_TREE_VIEW (pOneWidget), GTK_TREE_MODEL (modele));
2522
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (pOneWidget), TRUE);
2523
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (pOneWidget), TRUE);
2524
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (pOneWidget));
2525
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
2526
g_object_set_data (G_OBJECT (pOneWidget), "get-active-line-only", GINT_TO_POINTER (1));
2527
GtkTreeViewColumn* col;
2529
rend = gtk_cell_renderer_text_new ();
2530
col = gtk_tree_view_column_new_with_attributes (_("state"), rend, "text", CAIRO_DOCK_MODEL_STATE, NULL);
2531
gtk_tree_view_column_set_sort_column_id (col, CAIRO_DOCK_MODEL_STATE);
2532
gtk_tree_view_column_set_cell_data_func (col, rend, (GtkTreeCellDataFunc)_cairo_dock_render_state, NULL, NULL);
2533
gtk_tree_view_append_column (GTK_TREE_VIEW (pOneWidget), col);
2535
rend = gtk_cell_renderer_text_new ();
2536
col = gtk_tree_view_column_new_with_attributes (_("theme"), rend, "text", CAIRO_DOCK_MODEL_NAME, NULL);
2537
gtk_tree_view_column_set_sort_column_id (col, CAIRO_DOCK_MODEL_NAME);
2538
gtk_tree_view_append_column (GTK_TREE_VIEW (pOneWidget), col);
2540
GtkListStore *note_list = _make_note_list_store ();
2541
rend = gtk_cell_renderer_combo_new ();
2542
g_object_set (G_OBJECT (rend),
2548
g_signal_connect (G_OBJECT (rend), "edited", (GCallback) _change_rating, modele);
2549
col = gtk_tree_view_column_new_with_attributes (_("rating"), rend, "text", CAIRO_DOCK_MODEL_ORDER, NULL);
2550
gtk_tree_view_column_set_sort_column_id (col, CAIRO_DOCK_MODEL_ORDER);
2551
gtk_tree_view_column_set_cell_data_func (col, rend, (GtkTreeCellDataFunc)_cairo_dock_render_rating, NULL, NULL);
2552
gtk_tree_view_append_column (GTK_TREE_VIEW (pOneWidget), col);
2554
rend = gtk_cell_renderer_text_new ();
2555
col = gtk_tree_view_column_new_with_attributes (_("sobriety"), rend, "text", CAIRO_DOCK_MODEL_ORDER2, NULL);
2556
gtk_tree_view_column_set_sort_column_id (col, CAIRO_DOCK_MODEL_ORDER2);
2557
gtk_tree_view_column_set_cell_data_func (col, rend, (GtkTreeCellDataFunc)_cairo_dock_render_sobriety, NULL, NULL);
2558
gtk_tree_view_append_column (GTK_TREE_VIEW (pOneWidget), col);
2559
// barres de defilement
2560
GtkObject *adj = gtk_adjustment_new (0., 0., 100., 1, 10, 10);
2561
gtk_tree_view_set_vadjustment (GTK_TREE_VIEW (pOneWidget), GTK_ADJUSTMENT (adj));
2562
pScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
2563
gtk_widget_set (pScrolledWindow, "height-request", CAIRO_DOCK_PREVIEW_HEIGHT+20, NULL); // prevue + readme.
2564
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2565
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), pOneWidget);
2566
pSubWidgetList = g_slist_append (pSubWidgetList, pOneWidget);
2567
_pack_in_widget_box (pScrolledWindow);
2569
//\______________ On construit le widget de prevue et on le rajoute a la suite.
2570
pDescriptionLabel = gtk_label_new (NULL);
2571
g_signal_connect (pMainWindow, "delete-event", G_CALLBACK (on_delete_async_widget), pDescriptionLabel);
2572
g_object_ref (pDescriptionLabel);
2573
gtk_label_set_use_markup (GTK_LABEL (pDescriptionLabel), TRUE);
2574
gtk_widget_set (pDescriptionLabel,
2575
"width-request", CAIRO_DOCK_PREVIEW_WIDTH, NULL);
2576
gtk_label_set_justify (GTK_LABEL (pDescriptionLabel), GTK_JUSTIFY_LEFT);
2577
gtk_label_set_line_wrap (GTK_LABEL (pDescriptionLabel), TRUE);
2578
pPreviewImage = gtk_image_new_from_pixbuf (NULL);
2579
g_signal_connect (pMainWindow, "delete-event", G_CALLBACK (on_delete_async_widget), pPreviewImage);
2580
g_object_ref (pPreviewImage);
2581
gtk_widget_set (pPreviewImage,
2582
"height-request", CAIRO_DOCK_PREVIEW_HEIGHT,
2583
"width-request", CAIRO_DOCK_PREVIEW_WIDTH, NULL);
2584
_allocate_new_buffer;
2585
data[0] = pDescriptionLabel;
2586
data[1] = pPreviewImage;
2587
gtk_tree_selection_set_select_function (selection,
2588
(GtkTreeSelectionFunc) _cairo_dock_select_one_item_in_tree,
2591
pPreviewBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
2592
gtk_box_pack_start (GTK_BOX (pPreviewBox), pPreviewImage, FALSE, FALSE, 0);
2593
gtk_box_pack_start (GTK_BOX (pPreviewBox), pDescriptionLabel, FALSE, FALSE, 0);
2594
_pack_in_widget_box (pPreviewBox);
2596
//\______________ On recupere les themes.
2597
if (pAuthorizedValuesList != NULL)
2599
gchar *cShareThemesDir = NULL, *cUserThemesDir = NULL, *cDistantThemesDir = NULL;
2600
if (pAuthorizedValuesList[0] != NULL)
2602
cShareThemesDir = (*pAuthorizedValuesList[0] != '\0' ? pAuthorizedValuesList[0] : NULL);
2603
if (pAuthorizedValuesList[1] != NULL)
2605
cUserThemesDir = g_strdup_printf ("%s/%s/%s", g_cCairoDockDataDir, CAIRO_DOCK_EXTRAS_DIR, pAuthorizedValuesList[1]);
2606
cDistantThemesDir = pAuthorizedValuesList[2];
2610
_allocate_new_buffer;
2611
data[0] = pOneWidget;
2612
data[1] = pMainWindow;
2613
CairoDockTask *pTask = cairo_dock_list_themes_async (cShareThemesDir, cUserThemesDir, cDistantThemesDir, (GFunc) _got_themes_list, data);
2614
g_object_set_data (G_OBJECT (pOneWidget), "cd-task", pTask);
2615
g_signal_connect (pMainWindow, "delete-event", G_CALLBACK (on_delete_async_widget), pOneWidget);
2616
g_object_ref (pOneWidget);
2617
/**GHashTable *pThemeTable = cairo_dock_list_themes (cShareThemesDir, cUserThemesDir, cDistantThemesDir);
2618
g_hash_table_foreach (pThemeTable, (GHFunc)_cairo_dock_fill_modele_with_themes, modele);
2619
g_hash_table_destroy (pThemeTable);*/
2620
g_free (cUserThemesDir);
2624
case 'r' : // deprecated.
2625
cd_warning ("\nTHIS CONF FILE IS OUT OF DATE\n");
2628
case CAIRO_DOCK_WIDGET_FONT_SELECTOR : // string avec un selecteur de font a cote du GtkEntry.
2629
cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL);
2630
pOneWidget = gtk_font_button_new_with_font (cValue);
2631
gtk_font_button_set_show_style (GTK_FONT_BUTTON (pOneWidget), TRUE);
2632
gtk_font_button_set_show_size (GTK_FONT_BUTTON (pOneWidget), TRUE);
2633
gtk_font_button_set_use_size (GTK_FONT_BUTTON (pOneWidget), TRUE);
2634
gtk_font_button_set_use_font (GTK_FONT_BUTTON (pOneWidget), TRUE);
2635
_pack_subwidget (pOneWidget);
2639
case CAIRO_DOCK_WIDGET_LINK : // string avec un lien internet a cote.
2640
cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL);
2641
pOneWidget = gtk_link_button_new_with_label (cValue, pAuthorizedValuesList && pAuthorizedValuesList[0] ? pAuthorizedValuesList[0] : _("link"));
2642
_pack_subwidget (pOneWidget);
2647
case CAIRO_DOCK_WIDGET_STRING_ENTRY : // string (Merci Fab !) :-P
2648
case CAIRO_DOCK_WIDGET_PASSWORD_ENTRY : // string de type "password", crypte dans le .conf et cache dans l'UI (Merci Tofe !) :-)
2649
case CAIRO_DOCK_WIDGET_FILE_SELECTOR : // string avec un selecteur de fichier a cote du GtkEntry.
2650
case CAIRO_DOCK_WIDGET_FOLDER_SELECTOR : // string avec un selecteur de repertoire a cote du GtkEntry.
2651
case CAIRO_DOCK_WIDGET_SOUND_SELECTOR : // string avec un selecteur de fichier a cote du GtkEntry et un boutton play.
2652
case CAIRO_DOCK_WIDGET_SHORTKEY_SELECTOR : // string avec un selecteur de touche clavier (Merci Ctaf !)
2653
case CAIRO_DOCK_WIDGET_CLASS_SELECTOR : // string avec un selecteur de class (Merci Matttbe !)
2654
// on construit l'entree de texte.
2655
cValue = g_key_file_get_locale_string (pKeyFile, cGroupName, cKeyName, NULL, NULL); // nous permet de recuperer les ';' aussi.
2656
pOneWidget = gtk_entry_new ();
2657
pEntry = pOneWidget;
2658
if( iElementType == CAIRO_DOCK_WIDGET_PASSWORD_ENTRY ) // on cache le texte entre et on decrypte 'cValue'.
2660
gtk_entry_set_visibility (GTK_ENTRY (pOneWidget), FALSE);
2661
gchar *cDecryptedString = NULL;
2662
cairo_dock_decrypt_string ( cValue, &cDecryptedString );
2664
cValue = cDecryptedString;
2666
gtk_entry_set_text (GTK_ENTRY (pOneWidget), cValue);
2667
_pack_subwidget (pOneWidget);
2669
// on ajoute des boutons qui la rempliront.
2670
if (iElementType == CAIRO_DOCK_WIDGET_FILE_SELECTOR || iElementType == CAIRO_DOCK_WIDGET_FOLDER_SELECTOR || iElementType == CAIRO_DOCK_WIDGET_SOUND_SELECTOR) // on ajoute un selecteur de fichier.
2672
_allocate_new_buffer;
2674
data[1] = GINT_TO_POINTER (iElementType != CAIRO_DOCK_WIDGET_SOUND_SELECTOR ? (iElementType == CAIRO_DOCK_WIDGET_FILE_SELECTOR ? 0 : 1) : 0);
2675
data[2] = pMainWindow;
2676
pButtonFileChooser = gtk_button_new_from_stock (GTK_STOCK_OPEN);
2677
g_signal_connect (G_OBJECT (pButtonFileChooser),
2679
G_CALLBACK (_cairo_dock_pick_a_file),
2681
_pack_in_widget_box (pButtonFileChooser);
2682
if (iElementType == CAIRO_DOCK_WIDGET_SOUND_SELECTOR) //Sound Play Button
2684
pButtonPlay = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY); //Outch
2685
g_signal_connect (G_OBJECT (pButtonPlay),
2687
G_CALLBACK (_cairo_dock_play_a_sound),
2689
_pack_in_widget_box (pButtonPlay);
2692
else if (iElementType == CAIRO_DOCK_WIDGET_SHORTKEY_SELECTOR || iElementType == CAIRO_DOCK_WIDGET_CLASS_SELECTOR) // on ajoute un selecteur de touches/classe.
2694
GtkWidget *pGrabKeyButton = gtk_button_new_with_label(_("grab"));
2695
_allocate_new_buffer;
2696
data[0] = pOneWidget;
2697
data[1] = pMainWindow;
2698
gtk_widget_add_events(pMainWindow, GDK_KEY_PRESS_MASK);
2699
if (iElementType == CAIRO_DOCK_WIDGET_CLASS_SELECTOR)
2701
g_signal_connect (G_OBJECT (pGrabKeyButton),
2703
G_CALLBACK (_cairo_dock_key_grab_class),
2708
g_signal_connect (G_OBJECT (pGrabKeyButton),
2710
G_CALLBACK (_cairo_dock_key_grab_clicked),
2713
_pack_in_widget_box (pGrabKeyButton);
2718
case CAIRO_DOCK_WIDGET_EMPTY_WIDGET : // container pour widget personnalise.
2719
pOneWidget = gtk_hbox_new (0, FALSE);
2720
pSubWidgetList = g_slist_append (pSubWidgetList, pOneWidget);
2721
gtk_box_pack_start(GTK_BOX (pFrameVBox != NULL ? pFrameVBox : pGroupBox),
2728
case CAIRO_DOCK_WIDGET_TEXT_LABEL : // juste le label de texte.
2731
case CAIRO_DOCK_WIDGET_HANDBOOK : // le label contenant le manuel de l'applet, il a ete place avant.
2732
cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL);
2733
CairoDockModule *pModule = cairo_dock_find_module_from_name (cValue);
2734
if (pModule == NULL)
2737
int iPreviewWidth, iPreviewHeight;
2738
GdkPixbuf *pPreviewPixbuf = NULL;
2740
if (gdk_pixbuf_get_file_info (pModule->pVisitCard->cPreviewFilePath, &iPreviewWidth, &iPreviewHeight) != NULL) // The return value is owned by GdkPixbuf and should not be freed.
2742
if (iPreviewWidth > w)
2744
iPreviewHeight *= 1.*w/iPreviewWidth;
2747
if (iPreviewHeight > h)
2749
iPreviewWidth *= 1.*h/iPreviewHeight;
2752
pPreviewPixbuf = gdk_pixbuf_new_from_file_at_size (pModule->pVisitCard->cPreviewFilePath, iPreviewWidth, iPreviewHeight, NULL);
2754
if (pPreviewPixbuf != NULL)
2756
pPreviewImage = gtk_image_new_from_pixbuf (NULL);
2757
gtk_image_set_from_pixbuf (GTK_IMAGE (pPreviewImage), pPreviewPixbuf);
2758
gdk_pixbuf_unref (pPreviewPixbuf);
2759
_pack_in_widget_box (pPreviewImage);
2763
case CAIRO_DOCK_WIDGET_FRAME : // frame.
2764
case CAIRO_DOCK_WIDGET_EXPANDER : // frame dans un expander.
2765
if (pAuthorizedValuesList == NULL)
2772
if (pAuthorizedValuesList[0] == NULL || *pAuthorizedValuesList[0] == '\0')
2773
cValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyName, NULL); // utile ?
2776
cValue = pAuthorizedValuesList[0];
2777
cSmallIcon = pAuthorizedValuesList[1];
2780
gchar *cFrameTitle = g_strdup_printf ("<b>%s</b>", dgettext (cGettextDomain, cValue));
2781
pLabel= gtk_label_new (NULL);
2782
gtk_label_set_markup (GTK_LABEL (pLabel), cFrameTitle);
2783
g_free (cFrameTitle);
2785
pLabelContainer = NULL;
2786
if (cSmallIcon != NULL)
2788
pLabelContainer = gtk_hbox_new (FALSE, CAIRO_DOCK_ICON_MARGIN/2);
2789
GtkWidget *pImage = gtk_image_new ();
2791
if (*cSmallIcon != '/')
2792
pixbuf = gtk_widget_render_icon (pImage,
2797
pixbuf = gdk_pixbuf_new_from_file_at_size (cSmallIcon, CAIRO_DOCK_FRAME_ICON_SIZE, CAIRO_DOCK_FRAME_ICON_SIZE, NULL);
2800
gtk_image_set_from_pixbuf (GTK_IMAGE (pImage), pixbuf);
2801
gdk_pixbuf_unref (pixbuf);
2803
gtk_container_add (GTK_CONTAINER (pLabelContainer),
2806
gtk_container_add (GTK_CONTAINER (pLabelContainer),
2810
GtkWidget *pExternFrame;
2811
if (iElementType == CAIRO_DOCK_WIDGET_FRAME)
2813
pExternFrame = gtk_frame_new (NULL);
2814
gtk_container_set_border_width (GTK_CONTAINER (pExternFrame), CAIRO_DOCK_GUI_MARGIN);
2815
gtk_frame_set_shadow_type (GTK_FRAME (pExternFrame), GTK_SHADOW_OUT);
2816
gtk_frame_set_label_widget (GTK_FRAME (pExternFrame), (pLabelContainer != NULL ? pLabelContainer : pLabel));
2817
pFrame = pExternFrame;
2818
//g_print ("on met pLabelContainer:%x (%x > %x)\n", pLabelContainer, gtk_frame_get_label_widget (GTK_FRAME (pFrame)), pLabel);
2822
pExternFrame = gtk_expander_new (NULL);
2823
gtk_expander_set_expanded (GTK_EXPANDER (pExternFrame), FALSE);
2824
gtk_expander_set_label_widget (GTK_EXPANDER (pExternFrame), (pLabelContainer != NULL ? pLabelContainer : pLabel));
2825
pFrame = gtk_frame_new (NULL);
2826
gtk_container_set_border_width (GTK_CONTAINER (pFrame), CAIRO_DOCK_GUI_MARGIN);
2827
gtk_frame_set_shadow_type (GTK_FRAME (pFrame), GTK_SHADOW_OUT);
2828
gtk_container_add (GTK_CONTAINER (pExternFrame),
2831
//pSubWidgetList = g_slist_append (pSubWidgetList, pExternFrame);
2833
gtk_box_pack_start (GTK_BOX (pGroupBox),
2839
pFrameVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
2840
gtk_container_add (GTK_CONTAINER (pFrame),
2843
if (pAuthorizedValuesList[0] == NULL || *pAuthorizedValuesList[0] == '\0')
2847
if (iNbControlledWidgets > 0 && pControlContainer != NULL)
2850
if (pControlContainer == pGroupBox)
2852
g_print ("ctrl (iNbControlledWidgets:%d, iFirstSensitiveWidget:%d, iNbSensitiveWidgets:%d)\n", iNbControlledWidgets, iFirstSensitiveWidget, iNbSensitiveWidgets);
2853
iNbControlledWidgets --;
2854
if (iFirstSensitiveWidget > 0)
2855
iFirstSensitiveWidget --;
2857
GtkWidget *w = pExternFrame;
2858
if (iFirstSensitiveWidget == 0 && iNbSensitiveWidgets > 0)
2860
g_print (" => sensitive\n");
2861
iNbSensitiveWidgets --;
2862
if (GTK_IS_EXPANDER (w))
2863
gtk_expander_set_expanded (GTK_EXPANDER (w), TRUE);
2867
g_print (" => unsensitive\n");
2868
if (!GTK_IS_EXPANDER (w))
2869
gtk_widget_set_sensitive (w, FALSE);
2876
case CAIRO_DOCK_WIDGET_SEPARATOR : // separateur.
2878
GtkWidget *pAlign = gtk_alignment_new (.5, 0., 0.8, 0.);
2879
pOneWidget = gtk_hseparator_new ();
2880
gtk_container_add (GTK_CONTAINER (pAlign), pOneWidget);
2881
gtk_box_pack_start (GTK_BOX (pFrameVBox != NULL ? pFrameVBox : pGroupBox),
2890
cd_warning ("this conf file has an unknown widget type ! (%c)", iElementType);
2894
if (pSubWidgetList != NULL)
2896
pGroupKeyWidget = g_new (gpointer, 6);
2897
pGroupKeyWidget[0] = g_strdup (cGroupName); // car on ne pourra pas le liberer s'il est partage entre plusieurs 'data'.
2898
pGroupKeyWidget[1] = cKeyName;
2899
pGroupKeyWidget[2] = pSubWidgetList;
2900
pGroupKeyWidget[3] = (gchar *)cOriginalConfFilePath;
2901
pGroupKeyWidget[4] = pLabel;
2902
pGroupKeyWidget[5] = pKeyBox; // on ne peut pas remonter a la keybox a partir du label a cause du cas particulier des widgets a prevue.
2903
*pWidgetList = g_slist_prepend (*pWidgetList, pGroupKeyWidget);
2904
if (bAddBackButton && cOriginalConfFilePath != NULL)
2906
pBackButton = gtk_button_new ();
2907
GtkWidget *pImage = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU); // gtk_image_new_from_stock (GTK_STOCK_UNDO, GTK_ICON_SIZE_BUTTON);
2908
gtk_button_set_image (GTK_BUTTON (pBackButton), pImage);
2909
g_signal_connect (G_OBJECT (pBackButton), "clicked", G_CALLBACK(_cairo_dock_set_original_value), pGroupKeyWidget);
2910
_pack_in_widget_box (pBackButton);
2914
if (pAuthorizedValuesList != NULL)
2915
g_strfreev (pAuthorizedValuesList);
2916
g_free (cKeyComment);
2918
g_free (cGroupComment); // cSmallGroupIcon et cDisplayedGroupName pointaient dessus.
2919
g_free (pKeyList); // on libere juste la liste de chaines, pas les chaines a l'interieur.
2921
if (iNbControlledWidgets > 0)
2922
cd_warning ("this conf file has an invalid combo list somewhere !");
2928
GtkWidget *cairo_dock_build_key_file_widget (GKeyFile* pKeyFile, const gchar *cGettextDomain, GtkWidget *pMainWindow, GSList **pWidgetList, GPtrArray *pDataGarbage, const gchar *cOriginalConfFilePath)
2931
gchar **pGroupList = g_key_file_get_groups (pKeyFile, &length);
2932
g_return_val_if_fail (pGroupList != NULL, NULL);
2934
GtkWidget *pNoteBook = gtk_notebook_new ();
2935
gtk_notebook_set_scrollable (GTK_NOTEBOOK (pNoteBook), TRUE);
2936
gtk_notebook_popup_enable (GTK_NOTEBOOK (pNoteBook));
2937
g_object_set (G_OBJECT (pNoteBook), "tab-pos", GTK_POS_TOP, NULL);
2939
GtkWidget *pGroupWidget, *pLabel, *pLabelContainer, *pAlign;
2940
gchar *cGroupName, *cGroupComment, *cIcon;
2941
int iCategory, i = 0;
2942
while (pGroupList[i] != NULL)
2944
cGroupName = pGroupList[i];
2946
//\____________ On recupere les caracteristiques du groupe.
2947
cGroupComment = g_key_file_get_comment (pKeyFile, cGroupName, NULL, NULL);
2950
if (cGroupComment != NULL)
2952
cGroupComment[strlen(cGroupComment)-1] = '\0';
2953
gchar *ptr = cGroupComment;
2956
ptr = strrchr (cGroupComment, '\n');
2960
ptr = cGroupComment;
2965
gchar *str = strchr (ptr, ';');
2969
if (*(str-1) == ']')
2975
str = strchr (ptr, ';');
2978
iCategory = atoi (ptr);
2982
if (ptr[strlen(ptr)-1] == ']')
2983
ptr[strlen(ptr)-1] = '\0';
2988
//\____________ On construit son widget.
2989
pLabel = gtk_label_new (dgettext (cGettextDomain, cGroupName));
2990
pLabelContainer = NULL;
2992
if (cIcon != NULL && *cIcon != '\0')
2994
pLabelContainer = gtk_hbox_new (FALSE, CAIRO_DOCK_ICON_MARGIN);
2995
pAlign = gtk_alignment_new (0., 0.5, 0., 0.);
2996
gtk_container_add (GTK_CONTAINER (pAlign), pLabelContainer);
2998
GtkWidget *pImage = gtk_image_new ();
3001
pixbuf = gtk_widget_render_icon (pImage,
3003
GTK_ICON_SIZE_BUTTON,
3006
pixbuf = gdk_pixbuf_new_from_file_at_size (cIcon, CAIRO_DOCK_TAB_ICON_SIZE, CAIRO_DOCK_TAB_ICON_SIZE, NULL);
3009
gtk_image_set_from_pixbuf (GTK_IMAGE (pImage), pixbuf);
3010
gdk_pixbuf_unref (pixbuf);
3012
gtk_container_add (GTK_CONTAINER (pLabelContainer),
3014
gtk_container_add (GTK_CONTAINER (pLabelContainer), pLabel);
3015
gtk_widget_show_all (pLabelContainer);
3017
g_free (cGroupComment);
3019
pGroupWidget = cairo_dock_build_group_widget (pKeyFile, cGroupName, cGettextDomain, pMainWindow, pWidgetList, pDataGarbage, cOriginalConfFilePath);
3021
GtkWidget *pScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
3022
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3023
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), pGroupWidget);
3025
gtk_notebook_append_page (GTK_NOTEBOOK (pNoteBook), pScrolledWindow, (pAlign != NULL ? pAlign : pLabel));
3030
g_strfreev (pGroupList);
3034
GtkWidget *cairo_dock_build_conf_file_widget (const gchar *cConfFilePath, const gchar *cGettextDomain, GtkWidget *pMainWindow, GSList **pWidgetList, GPtrArray *pDataGarbage, const gchar *cOriginalConfFilePath)
3036
//\_____________ On recupere les groupes du fichier.
3037
GKeyFile* pKeyFile = cairo_dock_open_key_file (cConfFilePath);
3038
if (pKeyFile == NULL)
3041
//\_____________ On construit le widget.
3042
GtkWidget *pNoteBook = cairo_dock_build_key_file_widget (pKeyFile, cGettextDomain, pMainWindow, pWidgetList, pDataGarbage, cOriginalConfFilePath);
3044
g_key_file_free (pKeyFile);
3050
static gboolean _cairo_dock_get_active_elements (GtkTreeModel * model, GtkTreePath * path, GtkTreeIter * iter, GSList **pStringList)
3052
//g_print ("%s ()\n", __func__);
3054
gchar *cValue = NULL, *cResult = NULL;
3055
gtk_tree_model_get (model, iter,
3056
CAIRO_DOCK_MODEL_ACTIVE, &bActive,
3057
CAIRO_DOCK_MODEL_NAME, &cValue,
3058
CAIRO_DOCK_MODEL_RESULT, &cResult, -1);
3059
if (cResult != NULL)
3067
*pStringList = g_slist_append (*pStringList, cValue);
3075
static void _cairo_dock_get_each_widget_value (gpointer *data, GKeyFile *pKeyFile)
3077
gchar *cGroupName = data[0];
3078
gchar *cKeyName = data[1];
3079
GSList *pSubWidgetList = data[2];
3080
if (pSubWidgetList == NULL)
3083
gsize i = 0, iNbElements = g_slist_length (pSubWidgetList);
3084
GtkWidget *pOneWidget = pSubWidgetList->data;
3086
if (GTK_IS_CHECK_BUTTON (pOneWidget))
3088
gboolean *tBooleanValues = g_new0 (gboolean, iNbElements);
3089
for (pList = pSubWidgetList; pList != NULL; pList = pList->next)
3091
pOneWidget = pList->data;
3092
tBooleanValues[i] = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (pOneWidget));
3095
if (iNbElements > 1)
3096
g_key_file_set_boolean_list (pKeyFile, cGroupName, cKeyName, tBooleanValues, iNbElements);
3098
g_key_file_set_boolean (pKeyFile, cGroupName, cKeyName, tBooleanValues[0]);
3099
g_free (tBooleanValues);
3101
else if (GTK_IS_SPIN_BUTTON (pOneWidget) || GTK_IS_HSCALE (pOneWidget))
3103
gboolean bIsSpin = GTK_IS_SPIN_BUTTON (pOneWidget);
3105
if ((bIsSpin && gtk_spin_button_get_digits (GTK_SPIN_BUTTON (pOneWidget)) == 0) || (! bIsSpin && gtk_scale_get_digits (GTK_SCALE (pOneWidget)) == 0))
3107
int *tIntegerValues = g_new0 (int, iNbElements);
3108
for (pList = pSubWidgetList; pList != NULL; pList = pList->next)
3110
pOneWidget = pList->data;
3111
tIntegerValues[i] = (bIsSpin ? gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (pOneWidget)) : gtk_range_get_value (GTK_RANGE (pOneWidget)));
3114
if (iNbElements > 1)
3115
g_key_file_set_integer_list (pKeyFile, cGroupName, cKeyName, tIntegerValues, iNbElements);
3117
g_key_file_set_integer (pKeyFile, cGroupName, cKeyName, tIntegerValues[0]);
3118
g_free (tIntegerValues);
3122
double *tDoubleValues = g_new0 (double, iNbElements);
3123
for (pList = pSubWidgetList; pList != NULL; pList = pList->next)
3125
pOneWidget = pList->data;
3126
tDoubleValues[i] = (bIsSpin ? gtk_spin_button_get_value (GTK_SPIN_BUTTON (pOneWidget)) : gtk_range_get_value (GTK_RANGE (pOneWidget)));
3129
if (iNbElements > 1)
3130
g_key_file_set_double_list (pKeyFile, cGroupName, cKeyName, tDoubleValues, iNbElements);
3132
g_key_file_set_double (pKeyFile, cGroupName, cKeyName, tDoubleValues[0]);
3133
g_free (tDoubleValues);
3136
else if (GTK_IS_COMBO_BOX (pOneWidget))
3139
gchar *cValue = NULL;
3140
if (GTK_IS_COMBO_BOX_ENTRY (pOneWidget))
3142
cValue = gtk_combo_box_get_active_text (GTK_COMBO_BOX (pOneWidget));
3144
else if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (pOneWidget), &iter))
3146
GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (pOneWidget));
3148
gtk_tree_model_get (model, &iter, CAIRO_DOCK_MODEL_RESULT, &cValue, -1);
3150
g_key_file_set_string (pKeyFile, cGroupName, cKeyName, (cValue != NULL ? cValue : ""));
3153
else if (GTK_IS_FONT_BUTTON (pOneWidget))
3155
const gchar *cFontName = gtk_font_button_get_font_name (GTK_FONT_BUTTON (pOneWidget));
3156
g_key_file_set_string (pKeyFile, cGroupName, cKeyName, cFontName);
3158
else if (GTK_IS_COLOR_BUTTON (pOneWidget))
3161
gtk_color_button_get_color (GTK_COLOR_BUTTON (pOneWidget), &gdkColor);
3164
col[0] = (double) gdkColor.red / 65535.;
3165
col[1] = (double) gdkColor.green / 65535.;
3166
col[2] = (double) gdkColor.blue / 65535.;
3167
if (gtk_color_button_get_use_alpha (GTK_COLOR_BUTTON (pOneWidget)))
3170
col[3] = (double) gtk_color_button_get_alpha (GTK_COLOR_BUTTON (pOneWidget)) / 65535.;
3176
g_key_file_set_double_list (pKeyFile, cGroupName, cKeyName, col, iNbColors);
3178
else if (GTK_IS_ENTRY (pOneWidget))
3180
gchar *cValue = NULL;
3181
const gchar *cWidgetValue = gtk_entry_get_text (GTK_ENTRY (pOneWidget));
3182
if( !gtk_entry_get_visibility(GTK_ENTRY (pOneWidget)) )
3184
cairo_dock_encrypt_string( cWidgetValue, &cValue );
3188
cValue = g_strdup (cWidgetValue);
3190
const gchar* const * cPossibleLocales = g_get_language_names ();
3191
gchar *cKeyNameFull, *cTranslatedValue;
3192
// g_key_file_set_locale_string ne marche pas avec une locale NULL comme le fait 'g_key_file_get_locale_string', il faut donc le faire a la main !
3194
for (i = 0; cPossibleLocales[i] != NULL; i++)
3196
cKeyNameFull = g_strdup_printf ("%s[%s]", cKeyName, cPossibleLocales[i]);
3197
cTranslatedValue = g_key_file_get_string (pKeyFile, cGroupName, cKeyNameFull, NULL);
3198
g_free (cKeyNameFull);
3199
if (cTranslatedValue != NULL && strcmp (cTranslatedValue, "") != 0)
3201
g_free (cTranslatedValue);
3204
g_free (cTranslatedValue);
3206
if (cPossibleLocales[i] != NULL)
3207
g_key_file_set_locale_string (pKeyFile, cGroupName, cKeyName, cPossibleLocales[i], cValue);
3209
g_key_file_set_string (pKeyFile, cGroupName, cKeyName, cValue);
3213
else if (GTK_IS_TREE_VIEW (pOneWidget))
3215
gboolean bGetActiveOnly = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (pOneWidget), "get-active-line-only"));
3216
//g_print ("%s : bGetActiveOnly=%d\n", cKeyName, bGetActiveOnly);
3217
GtkTreeModel *pModel = gtk_tree_view_get_model (GTK_TREE_VIEW (pOneWidget));
3218
gchar **tStringValues = NULL;
3222
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (pOneWidget));
3223
GList *pRows = gtk_tree_selection_get_selected_rows (selection, NULL);
3224
iNbElements = g_list_length (pRows);
3225
tStringValues = g_new0 (gchar *, iNbElements + 1);
3230
for (r = pRows; r != NULL; r = r->next)
3234
if (! gtk_tree_model_get_iter (pModel, &iter, cPath))
3237
gchar *cName = NULL;
3238
gtk_tree_model_get (pModel, &iter, CAIRO_DOCK_MODEL_RESULT, &cName, -1);
3239
tStringValues[i++] = cName;
3245
GSList *pActiveElementList = NULL;
3246
gtk_tree_model_foreach (GTK_TREE_MODEL (pModel), (GtkTreeModelForeachFunc) _cairo_dock_get_active_elements, &pActiveElementList);
3247
iNbElements = g_slist_length (pActiveElementList);
3248
tStringValues = g_new0 (gchar *, iNbElements + 1);
3251
GSList * pListElement;
3252
for (pListElement = pActiveElementList; pListElement != NULL; pListElement = pListElement->next)
3254
//g_print (" %d) %s\n", i, pListElement->data);
3255
tStringValues[i++] = pListElement->data;
3257
g_slist_free (pActiveElementList); // ses donnees sont dans 'tStringValues' et seront donc liberees avec.
3259
if (iNbElements > 1)
3260
g_key_file_set_string_list (pKeyFile, cGroupName, cKeyName, (const gchar * const *)tStringValues, iNbElements);
3262
g_key_file_set_string (pKeyFile, cGroupName, cKeyName, (tStringValues[0] != NULL ? tStringValues[0] : ""));
3263
g_strfreev (tStringValues);
3266
void cairo_dock_update_keyfile_from_widget_list (GKeyFile *pKeyFile, GSList *pWidgetList)
3268
g_slist_foreach (pWidgetList, (GFunc) _cairo_dock_get_each_widget_value, pKeyFile);
3273
static void _cairo_dock_free_widget_list (gpointer *data, gpointer user_data)
3278
g_slist_free (data[2]); // les elements de data[2] sont les widgets, et se feront liberer lors de la destruction de la fenetre.
3280
void cairo_dock_free_generated_widget_list (GSList *pWidgetList)
3282
g_slist_foreach (pWidgetList, (GFunc) _cairo_dock_free_widget_list, NULL);
3283
g_slist_free (pWidgetList);
3287
static int _cairo_dock_find_widget_from_name (gpointer *data, gpointer *pUserData)
3289
gchar *cWantedGroupName = pUserData[0];
3290
gchar *cWantedKeyName = pUserData[1];
3292
gchar *cGroupName = data[0];
3293
gchar *cKeyName = data[1];
3295
if (strcmp (cGroupName, cWantedGroupName) == 0 && strcmp (cKeyName, cWantedKeyName) == 0)
3300
GSList *cairo_dock_find_widgets_from_name (GSList *pWidgetList, const gchar *cGroupName, const gchar *cKeyName)
3302
const gchar *data[2] = {cGroupName, cKeyName};
3303
GSList *pElement = g_slist_find_custom (pWidgetList, data, (GCompareFunc) _cairo_dock_find_widget_from_name);
3304
if (pElement == NULL)
3307
gpointer *pWidgetData = pElement->data;
3308
GSList *pSubWidgetList = pWidgetData[2];
3309
return pSubWidgetList;
3311
GtkWidget *cairo_dock_find_widget_from_name (GSList *pWidgetList, const gchar *cGroupName, const gchar *cKeyName)
3313
GSList *pSubWidgetList = cairo_dock_find_widgets_from_name (pWidgetList, cGroupName, cKeyName);
3314
g_return_val_if_fail (pSubWidgetList != NULL, NULL);
3315
return pSubWidgetList->data;
3319
void cairo_dock_fill_combo_with_themes (GtkWidget *pCombo, GHashTable *pThemeTable, gchar *cActiveTheme)
3321
GtkTreeModel *modele = gtk_combo_box_get_model (GTK_COMBO_BOX (pCombo));
3322
g_return_if_fail (modele != NULL);
3323
g_hash_table_foreach (pThemeTable, (GHFunc)_cairo_dock_fill_modele_with_short_themes, modele);
3326
cairo_dock_extract_theme_type_from_name (cActiveTheme);
3327
if (_cairo_dock_find_iter_from_name (GTK_LIST_STORE (modele), cActiveTheme, &iter, TRUE))
3329
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (pCombo), &iter);
3331
g_signal_emit_by_name (pCombo, "changed", NULL, &bReturn);
3332
g_print ("%s found \n", cActiveTheme);
3336
void cairo_dock_fill_combo_with_list (GtkWidget *pCombo, GList *pElementList, const gchar *cActiveElement)
3338
GtkTreeModel *pModele = gtk_combo_box_get_model (GTK_COMBO_BOX (pCombo));
3339
g_return_if_fail (pModele != NULL);
3343
for (l = pElementList; l != NULL; l = l->next)
3345
gchar *cElement = l->data;
3346
memset (&iter, 0, sizeof (GtkTreeIter));
3347
gtk_list_store_append (GTK_LIST_STORE (pModele), &iter);
3348
gtk_list_store_set (GTK_LIST_STORE (pModele), &iter,
3349
CAIRO_DOCK_MODEL_NAME, cElement,
3350
CAIRO_DOCK_MODEL_RESULT, cElement,
3351
CAIRO_DOCK_MODEL_DESCRIPTION_FILE, "none",
3352
CAIRO_DOCK_MODEL_IMAGE, "none", -1);
3355
if (cActiveElement != NULL && _cairo_dock_find_iter_from_name (GTK_LIST_STORE (pModele), cActiveElement, &iter, FALSE))
3356
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (pCombo), &iter);