115
72
cairo_dock_pop_down (g_pMainDock);
117
74
g_print ("iNbConfigDialogs <- %d\n", iNbConfigDialogs);
120
77
void cairo_dock_dialog_window_created (void)
122
79
iNbConfigDialogs ++;
123
80
g_print ("iNbConfigDialogs <- %d\n", iNbConfigDialogs);
124
if (g_pMainDock != NULL) // peut arriver au 1er lancement.
81
if (g_pMainDock != NULL && cairo_dock_search_window_on_our_way (g_pMainDock, FALSE, TRUE) == NULL) // peut arriver au 1er lancement.
125
82
cairo_dock_pop_up (g_pMainDock);
129
static void _cairo_dock_reset_current_widget_list (void)
131
cairo_dock_free_generated_widget_list (s_pCurrentWidgetList);
132
s_pCurrentWidgetList = NULL;
133
g_slist_foreach (s_pExtraCurrentWidgetList, (GFunc) cairo_dock_free_generated_widget_list, NULL);
134
g_slist_free (s_pExtraCurrentWidgetList);
135
s_pExtraCurrentWidgetList = NULL;
139
static void _cairo_dock_add_image_on_button (GtkWidget *pButton, const gchar *cImage, int iSize)
144
GtkWidget *pImage = NULL;
148
iSize = GTK_ICON_SIZE_DIALOG;
149
else if (iSize >= 32)
150
iSize = GTK_ICON_SIZE_LARGE_TOOLBAR;
152
iSize = GTK_ICON_SIZE_BUTTON;
153
pImage = gtk_image_new_from_stock (cImage, iSize);
157
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (cImage, iSize, iSize, NULL);
160
pImage = gtk_image_new_from_pixbuf (pixbuf);
161
gdk_pixbuf_unref (pixbuf);
165
gtk_button_set_image (GTK_BUTTON (pButton), pImage); /// unref l'image ?...
167
static GtkToolItem *_cairo_dock_make_toolbutton (const gchar *cLabel, const gchar *cImage, int iSize)
170
return gtk_tool_button_new (NULL, cLabel);
172
GtkWidget *pImage = NULL;
176
iSize = GTK_ICON_SIZE_DIALOG;
177
else if (iSize >= 32)
178
iSize = GTK_ICON_SIZE_LARGE_TOOLBAR;
180
iSize = GTK_ICON_SIZE_BUTTON;
181
pImage = gtk_image_new_from_stock (cImage, iSize);
185
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size (cImage, iSize, iSize, NULL);
188
pImage = gtk_image_new_from_pixbuf (pixbuf);
189
gdk_pixbuf_unref (pixbuf);
193
GtkToolItem *pWidget = gtk_tool_button_new (pImage, NULL);
197
GtkWidget *pLabel = gtk_label_new (NULL);
198
gchar *cLabel2 = g_strdup_printf ("<span font_desc=\"Times New Roman 12\"><b>%s</b></span>", cLabel); /// 16
199
gtk_label_set_markup (GTK_LABEL (pLabel), cLabel2);
202
GtkWidget *pAlign = gtk_alignment_new (0., 0.5, 0., 1.);
203
gtk_alignment_set_padding (GTK_ALIGNMENT (pAlign), 0, 0, CAIRO_DOCK_GUI_MARGIN, 0); /// *2
204
gtk_container_add (GTK_CONTAINER (pAlign), pLabel);
205
gtk_tool_button_set_label_widget (GTK_TOOL_BUTTON (pWidget), pAlign);
210
static inline CairoDockGroupDescription *_cairo_dock_add_group_button (const gchar *cGroupName, const gchar *cIcon, int iCategory, const gchar *cDescription, const gchar *cPreviewFilePath, int iActivation, gboolean bConfigurable, const gchar *cOriginalConfFilePath, const gchar *cGettextDomain, const gchar **cDependencies, GList *pExternalModules, const gchar *cInternalModule)
212
//\____________ On garde une trace de ses caracteristiques.
213
CairoDockGroupDescription *pGroupDescription = g_new0 (CairoDockGroupDescription, 1);
214
pGroupDescription->cGroupName = g_strdup (cGroupName);
215
pGroupDescription->cDescription = g_strdup (cDescription);
216
pGroupDescription->iCategory = iCategory;
217
pGroupDescription->cPreviewFilePath = g_strdup (cPreviewFilePath);
218
pGroupDescription->cOriginalConfFilePath = g_strdup (cOriginalConfFilePath);
219
pGroupDescription->cIcon = g_strdup (cIcon);
220
pGroupDescription->cGettextDomain = cGettextDomain;
221
pGroupDescription->cDependencies = cDependencies;
222
pGroupDescription->pExternalModules = pExternalModules;
223
pGroupDescription->cInternalModule = cInternalModule;
225
s_pGroupDescriptionList = g_list_prepend (s_pGroupDescriptionList, pGroupDescription);
226
if (cInternalModule != NULL)
227
return pGroupDescription;
229
//\____________ On construit le bouton du groupe.
230
GtkWidget *pGroupHBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
232
pGroupDescription->pActivateButton = gtk_check_button_new ();
233
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pGroupDescription->pActivateButton), iActivation);
234
g_signal_connect (G_OBJECT (pGroupDescription->pActivateButton), "clicked", G_CALLBACK(on_click_activate_given_group), pGroupDescription);
235
if (iActivation == -1)
236
gtk_widget_set_sensitive (pGroupDescription->pActivateButton, FALSE);
237
gtk_box_pack_start (GTK_BOX (pGroupHBox),
238
pGroupDescription->pActivateButton,
243
/// Essayer de regrouper le label et l'icone dans le bouton, et mettre a jour la recherche dans le nom du groupe...
244
GtkWidget *pGroupButton = gtk_button_new ();
246
g_signal_connect (G_OBJECT (pGroupButton), "clicked", G_CALLBACK(on_click_group_button), pGroupDescription);
248
gtk_widget_set_sensitive (pGroupButton, FALSE);
249
g_signal_connect (G_OBJECT (pGroupButton), "enter", G_CALLBACK(on_enter_group_button), pGroupDescription);
250
g_signal_connect (G_OBJECT (pGroupButton), "leave", G_CALLBACK(on_leave_group_button), NULL);
251
_cairo_dock_add_image_on_button (pGroupButton,
253
CAIRO_DOCK_GROUP_ICON_SIZE);
254
gtk_box_pack_start (GTK_BOX (pGroupHBox),
260
pGroupDescription->pLabel = gtk_label_new (dgettext (pGroupDescription->cGettextDomain, cGroupName));
261
gtk_box_pack_start (GTK_BOX (pGroupHBox),
262
pGroupDescription->pLabel,
267
//\____________ On place le bouton dans sa table.
268
CairoDockCategoryWidgetTable *pCategoryWidget = &s_pCategoryWidgetTables[iCategory];
269
if (pCategoryWidget->iNbItemsInCurrentRow == s_iNbButtonsByRow)
271
pCategoryWidget->iNbItemsInCurrentRow = 0;
272
pCategoryWidget->iNbRows ++;
274
gtk_table_attach_defaults (GTK_TABLE (pCategoryWidget->pTable),
276
pCategoryWidget->iNbItemsInCurrentRow,
277
pCategoryWidget->iNbItemsInCurrentRow+1,
278
pCategoryWidget->iNbRows,
279
pCategoryWidget->iNbRows+1);
280
pCategoryWidget->iNbItemsInCurrentRow ++;
281
return pGroupDescription;
284
static gboolean _cairo_dock_add_one_module_widget (/*gchar *cModuleName, */CairoDockModule *pModule, const gchar *cActiveModules)
286
const gchar *cModuleName = pModule->pVisitCard->cModuleName;
287
if (pModule->cConfFilePath == NULL && ! g_bEasterEggs)
288
pModule->cConfFilePath = cairo_dock_check_module_conf_file (pModule->pVisitCard);
290
if (! pModule->pInterface->stopModule)
292
else if (g_pMainDock == NULL && cActiveModules != NULL) // avant chargement du theme.
294
gchar *str = g_strstr_len (cActiveModules, strlen (cActiveModules), cModuleName);
295
iActive = (str != NULL &&
296
(str[strlen(cModuleName)] == '\0' || str[strlen(cModuleName)] == ';') &&
297
(str == cActiveModules || *(str-1) == ';'));
300
iActive = (pModule->pInstancesList != NULL);
302
CairoDockGroupDescription *pGroupDescription = _cairo_dock_add_group_button (cModuleName,
303
pModule->pVisitCard->cIconFilePath,
304
pModule->pVisitCard->iCategory,
305
pModule->pVisitCard->cDescription,
306
pModule->pVisitCard->cPreviewFilePath,
308
pModule->cConfFilePath != NULL,
310
pModule->pVisitCard->cGettextDomain,
313
pModule->pVisitCard->cInternalModule);
314
//g_print ("+ %s : %x;%x\n", cModuleName,pGroupDescription, pGroupDescription->pActivateButton);
315
pGroupDescription->cOriginalConfFilePath = g_strdup_printf ("%s/%s", pModule->pVisitCard->cShareDataDir, pModule->pVisitCard->cConfFileName); // petite optimisation, pour pas dupliquer la chaine 2 fois.
316
pGroupDescription->load_custom_widget = pModule->pInterface->load_custom_widget;
318
return TRUE; // continue.
322
static gboolean on_expose (GtkWidget *pWidget,
323
GdkEventExpose *pExpose,
326
if (! mySystem.bConfigPanelTransparency)
328
cairo_t *pCairoContext = gdk_cairo_create (pWidget->window);
330
gtk_window_get_size (GTK_WINDOW (pWidget), &w, &h);
331
cairo_pattern_t *pPattern = cairo_pattern_create_linear (0,0,
334
cairo_pattern_set_extend (pPattern, CAIRO_EXTEND_REPEAT);
335
cairo_pattern_add_color_stop_rgba (pPattern,
338
cairo_pattern_add_color_stop_rgba (pPattern,
340
241/255., 234/255., 255/255., 0.8);
341
cairo_pattern_add_color_stop_rgba (pPattern,
343
255/255., 255/255., 255/255., 0.9);
344
cairo_set_source (pCairoContext, pPattern);
346
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_SOURCE);
347
cairo_paint (pCairoContext);
349
cairo_pattern_destroy (pPattern);
350
cairo_destroy (pCairoContext);
353
GtkWidget *cairo_dock_build_main_ihm (const gchar *cConfFilePath, gboolean bMaintenanceMode)
355
//\_____________ On construit la fenetre.
356
if (s_pMainWindow != NULL)
358
gtk_window_present (GTK_WINDOW (s_pMainWindow));
359
return s_pMainWindow;
361
s_pMainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
362
//gtk_container_set_border_width (s_pMainWindow, CAIRO_DOCK_GUI_MARGIN);
363
gchar *cIconPath = g_strdup_printf ("%s/%s", CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_ICON);
364
gtk_window_set_icon_from_file (GTK_WINDOW (s_pMainWindow), cIconPath, NULL);
367
GtkWidget *pMainHBox = gtk_hbox_new (FALSE, 0); /// CAIRO_DOCK_GUI_MARGIN
368
gtk_container_add (GTK_CONTAINER (s_pMainWindow), pMainHBox);
369
///gtk_container_set_border_width (GTK_CONTAINER (pMainHBox), CAIRO_DOCK_GUI_MARGIN);
371
if (g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] > CAIRO_DOCK_CONF_PANEL_WIDTH)
373
s_iPreviewWidth = CAIRO_DOCK_PREVIEW_WIDTH;
374
s_iNbButtonsByRow = CAIRO_DOCK_NB_BUTTONS_BY_ROW;
376
else if (g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] > CAIRO_DOCK_CONF_PANEL_WIDTH_MIN)
378
double a = 1.*(CAIRO_DOCK_PREVIEW_WIDTH - CAIRO_DOCK_PREVIEW_WIDTH_MIN) / (CAIRO_DOCK_CONF_PANEL_WIDTH - CAIRO_DOCK_CONF_PANEL_WIDTH_MIN);
379
double b = CAIRO_DOCK_PREVIEW_WIDTH_MIN - CAIRO_DOCK_CONF_PANEL_WIDTH_MIN * a;
380
s_iPreviewWidth = a * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] + b;
381
s_iNbButtonsByRow = CAIRO_DOCK_NB_BUTTONS_BY_ROW - 1;
385
s_iPreviewWidth = CAIRO_DOCK_PREVIEW_WIDTH_MIN;
386
s_iNbButtonsByRow = CAIRO_DOCK_NB_BUTTONS_BY_ROW_MIN;
388
GtkWidget *pCategoriesVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
389
gtk_widget_set_size_request (pCategoriesVBox, s_iPreviewWidth+2*CAIRO_DOCK_GUI_MARGIN, CAIRO_DOCK_PREVIEW_HEIGHT);
390
gtk_box_pack_start (GTK_BOX (pMainHBox),
396
GtkWidget *pVBox = gtk_vbox_new (FALSE, 0);
397
gtk_box_pack_start (GTK_BOX (pMainHBox),
402
s_pGroupsVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_TABLE_MARGIN);
403
GtkWidget *pScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
404
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
405
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), s_pGroupsVBox);
406
gtk_box_pack_start (GTK_BOX (pVBox),
412
if (g_iDesktopEnv != CAIRO_DOCK_KDE && g_iDesktopEnv != CAIRO_DOCK_UNKNOWN_ENV && mySystem.bConfigPanelTransparency)
414
cairo_dock_set_colormap_for_window (s_pMainWindow);
415
gtk_widget_set_app_paintable (s_pMainWindow, TRUE);
416
g_signal_connect (G_OBJECT (s_pMainWindow),
418
G_CALLBACK (on_expose),
421
/*g_signal_connect (G_OBJECT (s_pGroupsVBox),
423
G_CALLBACK (on_expose),
426
//\_____________ On construit les boutons de chaque categorie.
427
GtkWidget *pCategoriesFrame = gtk_frame_new (NULL);
428
gtk_container_set_border_width (GTK_CONTAINER (pCategoriesFrame), CAIRO_DOCK_GUI_MARGIN);
429
gtk_frame_set_shadow_type (GTK_FRAME (pCategoriesFrame), GTK_SHADOW_OUT);
432
gchar *cLabel = g_strdup_printf ("<span font_desc=\"Times New Roman 12\" color=\"#81728C\"><b><u>%s :</u></b></span>", _("Categories"));
433
pLabel = gtk_label_new (NULL);
434
gtk_label_set_markup (GTK_LABEL (pLabel), cLabel);
436
gtk_frame_set_label_widget (GTK_FRAME (pCategoriesFrame), pLabel);
438
gtk_box_pack_start (GTK_BOX (pCategoriesVBox),
444
s_pToolBar = gtk_toolbar_new ();
445
gtk_toolbar_set_orientation (GTK_TOOLBAR (s_pToolBar), GTK_ORIENTATION_VERTICAL);
446
gtk_toolbar_set_style (GTK_TOOLBAR (s_pToolBar), GTK_TOOLBAR_BOTH_HORIZ);
447
gtk_toolbar_set_show_arrow (GTK_TOOLBAR (s_pToolBar), FALSE);
448
gtk_toolbar_set_icon_size (GTK_TOOLBAR (s_pToolBar), GTK_ICON_SIZE_LARGE_TOOLBAR);
449
gtk_container_add (GTK_CONTAINER (pCategoriesFrame), s_pToolBar);
451
GtkToolItem *pCategoryButton;
452
pCategoryButton = _cairo_dock_make_toolbutton (_("All"),
454
CAIRO_DOCK_CATEGORY_ICON_SIZE);
455
g_signal_connect (G_OBJECT (pCategoryButton), "clicked", G_CALLBACK(on_click_all_button), NULL);
456
gtk_toolbar_insert (GTK_TOOLBAR (s_pToolBar) , pCategoryButton,-1);
459
for (i = 0; i < CAIRO_DOCK_NB_CATEGORY; i ++)
461
pCategoryButton = _cairo_dock_make_toolbutton (gettext (cCategoriesDescription[2*i]),
462
cCategoriesDescription[2*i+1],
463
CAIRO_DOCK_CATEGORY_ICON_SIZE);
464
g_signal_connect (G_OBJECT (pCategoryButton), "clicked", G_CALLBACK(on_click_category_button), GINT_TO_POINTER (i));
465
gtk_toolbar_insert (GTK_TOOLBAR (s_pToolBar) , pCategoryButton,-1);
469
//\_____________ On construit les widgets table de chaque categorie.
470
CairoDockCategoryWidgetTable *pCategoryWidget;
471
for (i = 0; i < CAIRO_DOCK_NB_CATEGORY; i ++)
473
pCategoryWidget = &s_pCategoryWidgetTables[i];
475
pCategoryWidget->pFrame = gtk_frame_new (NULL);
476
gtk_container_set_border_width (GTK_CONTAINER (pCategoryWidget->pFrame), CAIRO_DOCK_GUI_MARGIN);
477
gtk_frame_set_shadow_type (GTK_FRAME (pCategoryWidget->pFrame), GTK_SHADOW_OUT);
479
pLabel = gtk_label_new (NULL);
480
cLabel = g_strdup_printf ("<span font_desc=\"Times New Roman 12\"><b>%s</b></span>", gettext (cCategoriesDescription[2*i]));
481
gtk_label_set_markup (GTK_LABEL (pLabel), cLabel);
483
gtk_frame_set_label_widget (GTK_FRAME (pCategoryWidget->pFrame), pLabel);
485
pCategoryWidget->pTable = gtk_table_new (1,
488
gtk_table_set_row_spacings (GTK_TABLE (pCategoryWidget->pTable), CAIRO_DOCK_GUI_MARGIN);
489
gtk_table_set_col_spacings (GTK_TABLE (pCategoryWidget->pTable), CAIRO_DOCK_GUI_MARGIN);
490
gtk_container_add (GTK_CONTAINER (pCategoryWidget->pFrame),
491
pCategoryWidget->pTable);
492
gtk_box_pack_start (GTK_BOX (s_pGroupsVBox),
493
pCategoryWidget->pFrame,
500
//\_____________ On remplit avec les groupes du fichier.
501
GError *erreur = NULL;
502
GKeyFile* pKeyFile = g_key_file_new();
503
g_key_file_load_from_file (pKeyFile, cConfFilePath, 0, &erreur); // inutile de garder les commentaires ici.
506
cd_warning ("while trying to load %s : %s", cConfFilePath, erreur->message);
507
g_error_free (erreur);
508
g_key_file_free (pKeyFile);
513
gchar **pGroupList = g_key_file_get_groups (pKeyFile, &length);
515
CairoDockInternalModule *pInternalModule;
516
gchar *cOriginalConfFilePath = g_strdup_printf ("%s/%s", CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_CONF_FILE);
517
for (i = 0; i < length; i ++)
519
cGroupName = pGroupList[i];
520
pInternalModule = cairo_dock_find_internal_module_from_name (cGroupName);
521
if (pInternalModule == NULL)
524
_cairo_dock_add_group_button (cGroupName,
525
pInternalModule->cIcon,
526
pInternalModule->iCategory,
527
pInternalModule->cDescription,
528
NULL, // pas de prevue
529
-1, // <=> non desactivable
530
TRUE, // <=> configurable
531
cOriginalConfFilePath,
532
NULL, // domaine de traduction : celui du dock.
533
pInternalModule->cDependencies,
534
pInternalModule->pExternalModules,
537
g_free (cOriginalConfFilePath);
538
g_strfreev (pGroupList);
541
//\_____________ On remplit avec les modules.
542
gchar *cActiveModules = (g_pMainDock == NULL ? g_key_file_get_string (pKeyFile, "System", "modules", NULL) : NULL);
543
cairo_dock_foreach_module_in_alphabetical_order ((GCompareFunc) _cairo_dock_add_one_module_widget, cActiveModules);
544
g_free (cActiveModules);
545
g_key_file_free (pKeyFile);
548
//\_____________ On ajoute le cadre d'activation du module.
549
s_pGroupFrame = gtk_frame_new ("pouet");
550
gtk_container_set_border_width (GTK_CONTAINER (s_pGroupFrame), CAIRO_DOCK_GUI_MARGIN);
551
gtk_frame_set_shadow_type (GTK_FRAME (s_pGroupFrame), GTK_SHADOW_OUT);
552
gtk_box_pack_start (GTK_BOX (pCategoriesVBox),
557
s_pActivateButton = gtk_check_button_new_with_label (_("Activate this module"));
558
g_signal_connect (G_OBJECT (s_pActivateButton), "clicked", G_CALLBACK(on_click_activate_current_group), NULL);
559
gtk_container_add (GTK_CONTAINER (s_pGroupFrame), s_pActivateButton);
560
gtk_widget_show_all (s_pActivateButton);
562
//\_____________ On ajoute la zone de prevue.
563
GtkWidget *pInfoVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
564
gtk_box_pack_start (GTK_BOX (pCategoriesVBox),
570
s_pPreviewImage = gtk_image_new_from_pixbuf (NULL);
571
gtk_container_add (GTK_CONTAINER (pInfoVBox), s_pPreviewImage);
573
//\_____________ On ajoute le filtre.
574
GtkWidget *pFilterFrame = gtk_frame_new (NULL);
575
cLabel = g_strdup_printf ("<span font_desc=\"Times New Roman 12\" color=\"#81728C\"><b><u>%s :</u></b></span>", _("Filter"));
576
pLabel = gtk_label_new (NULL);
577
gtk_label_set_markup (GTK_LABEL (pLabel), cLabel);
579
gtk_frame_set_label_widget (GTK_FRAME (pFilterFrame), pLabel);
580
gtk_container_set_border_width (GTK_CONTAINER (s_pGroupFrame), CAIRO_DOCK_GUI_MARGIN);
581
gtk_frame_set_shadow_type (GTK_FRAME (s_pGroupFrame), GTK_SHADOW_OUT);
582
gtk_box_pack_start (GTK_BOX (pCategoriesVBox),
587
GtkWidget *pOptionVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
588
gtk_container_add (GTK_CONTAINER (pFilterFrame), pOptionVBox);
590
GtkWidget *pFilterBox = gtk_hbox_new (FALSE, 0);
591
gtk_box_pack_start (GTK_BOX (pOptionVBox),
596
s_pFilterEntry = gtk_entry_new ();
597
g_signal_connect (s_pFilterEntry, "activate", G_CALLBACK (cairo_dock_activate_filter), NULL);
598
gtk_box_pack_start (GTK_BOX (pFilterBox),
603
GtkWidget *pClearButton = gtk_button_new ();
604
_cairo_dock_add_image_on_button (pClearButton,
607
g_signal_connect (pClearButton, "clicked", G_CALLBACK (cairo_dock_clear_filter), s_pFilterEntry);
608
gtk_box_pack_start (GTK_BOX (pFilterBox),
614
cairo_dock_reset_filter_state ();
615
GtkWidget *pOptionButton = gtk_check_button_new_with_label (_("All words"));
616
g_signal_connect (pOptionButton, "toggled", G_CALLBACK (cairo_dock_toggle_all_words), NULL);
617
gtk_box_pack_start (GTK_BOX (pOptionVBox),
622
pOptionButton = gtk_check_button_new_with_label (_("Highlight words"));
623
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pOptionButton), TRUE);
624
g_signal_connect (pOptionButton, "toggled", G_CALLBACK (cairo_dock_toggle_highlight_words), NULL);
625
gtk_box_pack_start (GTK_BOX (pOptionVBox),
630
pOptionButton = gtk_check_button_new_with_label (_("Hide others"));
631
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pOptionButton), TRUE);
632
g_signal_connect (pOptionButton, "toggled", G_CALLBACK (cairo_dock_toggle_hide_others), NULL);
633
gtk_box_pack_start (GTK_BOX (pOptionVBox),
638
pOptionButton = gtk_check_button_new_with_label (_("Search in description"));
639
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pOptionButton), TRUE);
640
g_signal_connect (pOptionButton, "toggled", G_CALLBACK (cairo_dock_toggle_search_in_tooltip), NULL);
641
gtk_box_pack_start (GTK_BOX (pOptionVBox),
647
//\_____________ On ajoute les boutons.
648
GtkWidget *pButtonsHBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
649
gtk_box_pack_end (GTK_BOX (pVBox),
655
GtkWidget *pQuitButton = gtk_button_new_from_stock (GTK_STOCK_QUIT);
656
g_signal_connect (G_OBJECT (pQuitButton), "clicked", G_CALLBACK(on_click_quit), s_pMainWindow);
657
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
663
s_pBackButton = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
664
g_signal_connect (G_OBJECT (s_pBackButton), "clicked", G_CALLBACK(on_click_back_button), NULL);
665
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
671
s_pOkButton = gtk_button_new_from_stock (GTK_STOCK_OK);
672
g_signal_connect (G_OBJECT (s_pOkButton), "clicked", G_CALLBACK(on_click_ok), s_pMainWindow);
673
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
679
s_pApplyButton = gtk_button_new_from_stock (GTK_STOCK_APPLY);
680
g_signal_connect (G_OBJECT (s_pApplyButton), "clicked", G_CALLBACK(on_click_apply), NULL);
681
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
687
//\_____________ On ajoute la barre de status a la fin.
688
s_pStatusBar = gtk_statusbar_new ();
689
gtk_box_pack_start (GTK_BOX (pButtonsHBox),
695
gtk_window_resize (GTK_WINDOW (s_pMainWindow),
696
MIN (CAIRO_DOCK_CONF_PANEL_WIDTH, g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]),
697
MIN (CAIRO_DOCK_CONF_PANEL_HEIGHT, g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - (g_pMainDock && g_pMainDock->container.bIsHorizontal ? g_pMainDock->iMaxDockHeight : 0)));
699
if (g_pMainDock != NULL && ! myAccessibility.bReserveSpace) // evitons d'empieter sur le dock.
701
if (g_pMainDock->container.bIsHorizontal)
703
if (g_pMainDock->container.bDirectionUp)
704
gtk_window_move (GTK_WINDOW (s_pMainWindow), 0, 0);
706
gtk_window_move (GTK_WINDOW (s_pMainWindow), 0, g_pMainDock->iMaxDockHeight);
710
gtk_widget_show_all (s_pMainWindow);
711
gtk_widget_hide (s_pApplyButton);
712
gtk_widget_hide (s_pOkButton);
713
gtk_widget_hide (s_pGroupFrame);
714
gtk_widget_hide (s_pPreviewImage);
716
cairo_dock_dialog_window_created ();
718
if (bMaintenanceMode)
720
gtk_window_set_title (GTK_WINDOW (s_pMainWindow), _("< Maintenance mode >"));
721
GMainLoop *pBlockingLoop = g_main_loop_new (NULL, FALSE);
722
g_object_set_data (G_OBJECT (s_pMainWindow), "loop", pBlockingLoop);
723
g_signal_connect (s_pMainWindow,
725
G_CALLBACK (on_delete_main_gui),
728
g_print ("debut de boucle bloquante ...\n");
729
GDK_THREADS_LEAVE ();
730
g_main_loop_run (pBlockingLoop);
731
GDK_THREADS_ENTER ();
732
g_print ("fin de boucle bloquante\n");
734
g_main_loop_unref (pBlockingLoop);
738
gtk_window_set_title (GTK_WINDOW (s_pMainWindow), _("Configuration of Cairo-Dock"));
739
g_signal_connect (G_OBJECT (s_pMainWindow),
741
G_CALLBACK (on_delete_main_gui),
744
return s_pMainWindow;
748
GtkWidget *cairo_dock_get_preview_image (int *iPreviewWidth)
750
*iPreviewWidth = s_iPreviewWidth;
751
return s_pPreviewImage;
754
GtkWidget *cairo_dock_get_main_window (void)
756
return s_pMainWindow;
759
CairoDockGroupDescription *cairo_dock_get_current_group (void)
761
return s_pCurrentGroup;
764
GSList *cairo_dock_get_current_widget_list (void)
766
return s_pCurrentWidgetList;
770
void cairo_dock_hide_all_categories (void)
772
CairoDockCategoryWidgetTable *pCategoryWidget;
774
for (i = 0; i < CAIRO_DOCK_NB_CATEGORY; i ++)
776
pCategoryWidget = &s_pCategoryWidgetTables[i];
777
gtk_widget_hide (pCategoryWidget->pFrame);
780
gtk_widget_show (s_pOkButton);
781
gtk_widget_show (s_pApplyButton);
784
void cairo_dock_show_all_categories (void)
787
gtk_statusbar_pop (GTK_STATUSBAR (s_pStatusBar), 0);
789
//\_______________ On detruit le widget du groupe courant.
790
if (s_pCurrentGroupWidget != NULL)
792
gtk_widget_destroy (s_pCurrentGroupWidget);
793
s_pCurrentGroupWidget = NULL;
794
_cairo_dock_reset_current_widget_list ();
796
s_pCurrentGroup = NULL;
799
//\_______________ On montre chaque module.
800
CairoDockCategoryWidgetTable *pCategoryWidget;
802
for (i = 0; i < CAIRO_DOCK_NB_CATEGORY; i ++)
804
pCategoryWidget = &s_pCategoryWidgetTables[i];
805
gtk_widget_show_all (pCategoryWidget->pFrame);
807
gtk_widget_hide (s_pOkButton);
808
gtk_widget_hide (s_pApplyButton);
809
gtk_widget_hide (s_pGroupFrame);
811
//\_______________ On actualise le titre de la fenetre.
812
gtk_window_set_title (GTK_WINDOW (cairo_dock_get_main_window ()), _("Configuration of Cairo-Dock"));
813
if (s_path == NULL || s_path->data != GINT_TO_POINTER (0))
814
s_path = g_slist_prepend (s_path, GINT_TO_POINTER (0));
816
//\_______________ On declenche le filtre.
817
cairo_dock_trigger_current_filter ();
820
void cairo_dock_show_one_category (int iCategory)
823
gtk_statusbar_pop (GTK_STATUSBAR (s_pStatusBar), 0);
825
//\_______________ On detruit le widget du groupe courant.
826
if (s_pCurrentGroupWidget != NULL)
828
gtk_widget_destroy (s_pCurrentGroupWidget);
829
s_pCurrentGroupWidget = NULL;
830
_cairo_dock_reset_current_widget_list ();
831
s_pCurrentGroup = NULL;
834
//\_______________ On montre chaque module de la categorie.
835
CairoDockCategoryWidgetTable *pCategoryWidget;
837
for (i = 0; i < CAIRO_DOCK_NB_CATEGORY; i ++)
839
pCategoryWidget = &s_pCategoryWidgetTables[i];
841
gtk_widget_hide (pCategoryWidget->pFrame);
843
gtk_widget_show_all (pCategoryWidget->pFrame);
845
gtk_widget_hide (s_pOkButton);
846
gtk_widget_hide (s_pApplyButton);
847
gtk_widget_hide (s_pGroupFrame);
849
//\_______________ On actualise le titre de la fenetre.
850
gtk_window_set_title (GTK_WINDOW (cairo_dock_get_main_window ()), gettext (cCategoriesDescription[2*iCategory]));
851
if (s_path == NULL || s_path->data != GINT_TO_POINTER (iCategory+1))
852
s_path = g_slist_prepend (s_path, GINT_TO_POINTER (iCategory+1));
854
//\_______________ On declenche le filtre.
855
cairo_dock_trigger_current_filter ();
858
void cairo_dock_insert_extern_widget_in_gui (GtkWidget *pWidget)
860
if (s_pCurrentGroupWidget != NULL)
861
gtk_widget_destroy (s_pCurrentGroupWidget);
862
s_pCurrentGroupWidget = pWidget;
864
gtk_box_pack_start (GTK_BOX (s_pGroupsVBox),
868
CAIRO_DOCK_GUI_MARGIN);
869
gtk_widget_show_all (pWidget);
872
GtkWidget *cairo_dock_present_group_widget (const gchar *cConfFilePath, CairoDockGroupDescription *pGroupDescription, gboolean bSingleGroup, CairoDockModuleInstance *pInstance)
874
cd_debug ("%s (%s, %s)", __func__, cConfFilePath, pGroupDescription->cGroupName);
875
//cairo_dock_set_status_message (NULL, "");
877
gtk_statusbar_pop (GTK_STATUSBAR (s_pStatusBar), 0);
878
g_free (pGroupDescription->cConfFilePath);
879
pGroupDescription->cConfFilePath = g_strdup (cConfFilePath);
881
//\_______________ On cree le widget du groupe.
882
GKeyFile* pKeyFile = cairo_dock_open_key_file (cConfFilePath);
883
g_return_val_if_fail (pKeyFile != NULL, NULL);
885
_cairo_dock_reset_current_widget_list ();
887
GPtrArray *pDataGarbage = g_ptr_array_new ();
891
pWidget = cairo_dock_build_group_widget (pKeyFile,
892
pGroupDescription->cGroupName,
893
pGroupDescription->cGettextDomain,
894
cairo_dock_get_main_window (),
895
&s_pCurrentWidgetList,
897
pGroupDescription->cOriginalConfFilePath);
901
pWidget = cairo_dock_build_key_file_widget (pKeyFile,
902
pGroupDescription->cGettextDomain,
903
cairo_dock_get_main_window (),
904
&s_pCurrentWidgetList,
906
pGroupDescription->cOriginalConfFilePath);
909
//\_______________ On complete avec les modules additionnels.
910
if (pGroupDescription->pExternalModules != NULL)
912
// on cree les widgets de tous les modules externes dans un meme notebook.
913
g_print ("on cree les widgets de tous les modules externes\n");
914
GtkWidget *pNoteBook = NULL;
915
GKeyFile* pExtraKeyFile;
916
CairoDockModule *pModule;
917
CairoDockModuleInstance *pExtraInstance;
918
GSList *pExtraCurrentWidgetList = NULL;
919
CairoDockGroupDescription *pExtraGroupDescription;
921
for (p = pGroupDescription->pExternalModules; p != NULL; p = p->next)
923
//g_print (" + %s\n", p->data);
924
pModule = cairo_dock_find_module_from_name (p->data);
927
if (pModule->cConfFilePath == NULL) // on n'est pas encore passe par la dans le cas ou le plug-in n'a pas ete active; mais on veut pouvoir configurer un plug-in meme lorsqu'il est inactif.
929
pModule->cConfFilePath = cairo_dock_check_module_conf_file (pModule->pVisitCard);
931
//g_print (" + %s\n", pModule->cConfFilePath);
933
pExtraGroupDescription = cairo_dock_find_module_description (p->data);
934
//g_print (" pExtraGroupDescription : %x\n", pExtraGroupDescription);
935
if (pExtraGroupDescription == NULL)
938
pExtraKeyFile = cairo_dock_open_key_file (pModule->cConfFilePath);
939
if (pExtraKeyFile == NULL)
942
pExtraCurrentWidgetList = NULL;
943
pNoteBook = cairo_dock_build_key_file_widget (pExtraKeyFile,
944
pExtraGroupDescription->cGettextDomain,
945
cairo_dock_get_main_window (),
946
&pExtraCurrentWidgetList,
948
pExtraGroupDescription->cOriginalConfFilePath); /// TODO : fournir pNoteBook a la fonction.
949
s_pExtraCurrentWidgetList = g_slist_prepend (s_pExtraCurrentWidgetList, pExtraCurrentWidgetList);
951
pExtraInstance = (pModule->pInstancesList ? pModule->pInstancesList->data : NULL); // il y'a la une limitation : les modules attaches a un module interne ne peuvent etre instancie plus d'une fois. Dans la pratique ca ne pose aucun probleme.
952
if (pExtraInstance != NULL && pExtraGroupDescription->load_custom_widget != NULL)
953
pExtraGroupDescription->load_custom_widget (pExtraInstance, pKeyFile);
954
g_key_file_free (pExtraKeyFile);
957
// on rajoute la page du module interne en 1er dans le notebook.
958
if (pNoteBook != NULL)
960
GtkWidget *pLabel = gtk_label_new (dgettext (pGroupDescription->cGettextDomain, pGroupDescription->cGroupName));
961
GtkWidget *pLabelContainer = NULL;
962
GtkWidget *pAlign = NULL;
963
if (pGroupDescription->cIcon != NULL && *pGroupDescription->cIcon != '\0')
965
pLabelContainer = gtk_hbox_new (FALSE, CAIRO_DOCK_ICON_MARGIN);
966
pAlign = gtk_alignment_new (0., 0.5, 0., 0.);
967
gtk_container_add (GTK_CONTAINER (pAlign), pLabelContainer);
969
GtkWidget *pImage = gtk_image_new ();
971
if (*pGroupDescription->cIcon != '/')
972
pixbuf = gtk_widget_render_icon (pImage,
973
pGroupDescription->cIcon ,
974
GTK_ICON_SIZE_BUTTON,
977
pixbuf = gdk_pixbuf_new_from_file_at_size (pGroupDescription->cIcon, CAIRO_DOCK_TAB_ICON_SIZE, CAIRO_DOCK_TAB_ICON_SIZE, NULL);
980
gtk_image_set_from_pixbuf (GTK_IMAGE (pImage), pixbuf);
981
gdk_pixbuf_unref (pixbuf);
983
gtk_container_add (GTK_CONTAINER (pLabelContainer),
985
gtk_container_add (GTK_CONTAINER (pLabelContainer), pLabel);
986
gtk_widget_show_all (pLabelContainer);
989
GtkWidget *pScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
990
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
991
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (pScrolledWindow), pWidget);
993
gtk_notebook_prepend_page (GTK_NOTEBOOK (pNoteBook), pScrolledWindow, (pAlign != NULL ? pAlign : pLabel));
998
if (pInstance != NULL && pGroupDescription->load_custom_widget != NULL)
999
pGroupDescription->load_custom_widget (pInstance, pKeyFile);
1000
g_key_file_free (pKeyFile);
1002
//\_______________ On affiche le widget du groupe dans l'interface.
1003
cairo_dock_hide_all_categories ();
1005
cairo_dock_insert_extern_widget_in_gui (pWidget); // devient le widget courant.
1007
s_pCurrentGroup = pGroupDescription;
1009
gtk_window_set_title (GTK_WINDOW (cairo_dock_get_main_window ()), gettext (pGroupDescription->cGroupName));
1011
//\_______________ On met a jour la frame du groupe (label + check-button).
1012
GtkWidget *pLabel = gtk_label_new (NULL);
1013
gchar *cLabel = g_strdup_printf ("<span font_desc=\"Times New Roman 12\" color=\"#81728C\"><u><b>%s</b></u></span>", pGroupDescription->cGroupName);
1014
gtk_label_set_markup (GTK_LABEL (pLabel), cLabel);
1016
gtk_frame_set_label_widget (GTK_FRAME (s_pGroupFrame), pLabel);
1017
gtk_widget_show_all (s_pGroupFrame);
1019
g_signal_handlers_block_by_func (s_pActivateButton, on_click_activate_current_group, NULL);
1020
CairoDockModule *pModule = cairo_dock_find_module_from_name (pGroupDescription->cGroupName);
1021
if (pModule != NULL && pModule->pInterface->stopModule != NULL)
1023
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s_pActivateButton), pModule->pInstancesList != NULL);
1024
gtk_widget_set_sensitive (s_pActivateButton, TRUE);
1028
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (s_pActivateButton), TRUE);
1029
gtk_widget_set_sensitive (s_pActivateButton, FALSE);
1031
g_signal_handlers_unblock_by_func (s_pActivateButton, on_click_activate_current_group, NULL);
1032
if (s_path == NULL || s_path->data != pGroupDescription)
1033
s_path = g_slist_prepend (s_path, pGroupDescription);
1035
//\_______________ On declenche le filtre.
1036
cairo_dock_trigger_current_filter ();
1038
//\_______________ On gere les dependances.
1039
if (pGroupDescription->cDependencies != NULL && ! pGroupDescription->bIgnoreDependencies && g_pMainDock != NULL)
1041
pGroupDescription->bIgnoreDependencies = TRUE; // cette fonction re-entrante.
1042
gboolean bReload = FALSE;
1043
const gchar *cModuleName, *cMessage;
1044
CairoDockModule *pDependencyModule;
1045
GError *erreur = NULL;
1047
for (i = 0; pGroupDescription->cDependencies[i] != NULL; i += 2)
1049
cModuleName = pGroupDescription->cDependencies[i];
1050
cMessage = pGroupDescription->cDependencies[i+1];
1052
pDependencyModule = cairo_dock_find_module_from_name (cModuleName);
1053
if (pDependencyModule == NULL)
1055
Icon *pIcon = cairo_dock_get_current_active_icon ();
1057
pIcon = cairo_dock_get_dialogless_icon ();
1058
CairoDock *pDock = cairo_dock_search_dock_from_name (pIcon != NULL ? pIcon->cParentDockName : NULL);
1059
cairo_dock_show_temporary_dialog_with_icon (_("The module '%s' is not present. You need to install it or its dependencies to make the most of this module."), pIcon, CAIRO_CONTAINER (pDock), 10, "same icon");
1061
else if (pDependencyModule != pModule)
1063
if (pDependencyModule->pInstancesList == NULL && pDependencyModule->pInterface->initModule != NULL)
1065
gchar *cWarning = g_strdup_printf (_("The module '%s' is not activated."), cModuleName);
1066
gchar *cQuestion = g_strdup_printf ("%s\n%s\n%s", cWarning, gettext (cMessage), _("Do you want to activate it now ?"));
1067
int iAnswer = cairo_dock_ask_general_question_and_wait (cQuestion);
1071
if (iAnswer == GTK_RESPONSE_YES)
1073
cairo_dock_activate_module (pDependencyModule, &erreur);
1076
cd_warning (erreur->message);
1077
g_error_free (erreur);
1087
cairo_dock_reload_current_group_widget (NULL);
1088
pGroupDescription->bIgnoreDependencies = FALSE;
1095
CairoDockGroupDescription *cairo_dock_find_module_description (const gchar *cModuleName)
1097
g_return_val_if_fail (cModuleName != NULL, NULL);
1098
CairoDockGroupDescription *pGroupDescription = NULL;
1099
GList *pElement = NULL;
1100
for (pElement = s_pGroupDescriptionList; pElement != NULL; pElement = pElement->next)
1102
pGroupDescription = pElement->data;
1103
if (strcmp (pGroupDescription->cGroupName, cModuleName) == 0)
1104
return pGroupDescription ;
86
//////////////////////////
87
// DYNAMIC CONFIG PANEL //
88
//////////////////////////
90
GtkWidget *cairo_dock_get_widget_from_name (const gchar *cGroupName, const gchar *cKeyName)
92
if (s_pGuiBackend && s_pGuiBackend->get_widgets_from_name)
94
GSList *pList = s_pGuiBackend->get_widgets_from_name (cGroupName, cKeyName);
1109
void cairo_dock_present_module_gui (CairoDockModule *pModule)
1111
g_return_if_fail (pModule != NULL);
1113
CairoDockGroupDescription *pGroupDescription = cairo_dock_find_module_description (pModule->pVisitCard->cModuleName);
1114
if (pGroupDescription == NULL)
1117
CairoDockModuleInstance *pModuleInstance = (pModule->pInstancesList != NULL ? pModule->pInstancesList->data : NULL);
1118
gchar *cConfFilePath = (pModuleInstance != NULL ? pModuleInstance->cConfFilePath : pModule->cConfFilePath);
1119
cairo_dock_present_group_widget (cConfFilePath, pGroupDescription, FALSE, pModuleInstance);
1122
void cairo_dock_present_module_instance_gui (CairoDockModuleInstance *pModuleInstance)
1124
g_return_if_fail (pModuleInstance != NULL);
1126
CairoDockGroupDescription *pGroupDescription = cairo_dock_find_module_description (pModuleInstance->pModule->pVisitCard->cModuleName);
1127
if (pGroupDescription == NULL)
1130
cairo_dock_present_group_widget (pModuleInstance->cConfFilePath, pGroupDescription, FALSE, pModuleInstance);
1133
void cairo_dock_show_group (CairoDockGroupDescription *pGroupDescription)
1135
g_return_if_fail (pGroupDescription != NULL);
1136
gboolean bSingleGroup;
1137
gchar *cConfFilePath;
1138
CairoDockModuleInstance *pModuleInstance = NULL;
1139
CairoDockModule *pModule = cairo_dock_find_module_from_name (pGroupDescription->cGroupName);
1140
if (pModule == NULL) // c'est un groupe du fichier de conf principal.
1142
cConfFilePath = g_cConfFile;
1143
bSingleGroup = TRUE;
1145
else // c'est un module, on recupere son fichier de conf en entier.
1147
if (pModule->cConfFilePath == NULL) // on n'est pas encore passe par la dans le cas ou le plug-in n'a pas ete active; mais on veut pouvoir configurer un plug-in meme lorsqu'il est inactif.
1149
pModule->cConfFilePath = cairo_dock_check_module_conf_file (pModule->pVisitCard);
1151
if (pModule->cConfFilePath == NULL)
1153
cd_warning ("couldn't load a conf file for this module => can't configure it.");
1157
pModuleInstance = (pModule->pInstancesList != NULL ? pModule->pInstancesList->data : NULL);
1158
cConfFilePath = (pModuleInstance != NULL ? pModuleInstance->cConfFilePath : pModule->cConfFilePath);
1160
bSingleGroup = FALSE;
1163
cairo_dock_present_group_widget (cConfFilePath, pGroupDescription, bSingleGroup, pModuleInstance);
1166
void cairo_dock_free_categories (void)
1168
memset (s_pCategoryWidgetTables, 0, sizeof (s_pCategoryWidgetTables)); // les widgets a l'interieur sont detruits avec la fenetre.
1170
CairoDockGroupDescription *pGroupDescription;
1172
for (pElement = s_pGroupDescriptionList; pElement != NULL; pElement = pElement->next) /// utile de supprimer cette liste ? ...
1174
pGroupDescription = pElement->data;
1175
g_free (pGroupDescription->cGroupName);
1176
g_free (pGroupDescription->cDescription);
1177
g_free (pGroupDescription->cPreviewFilePath);
1179
g_list_free (s_pGroupDescriptionList);
1180
s_pGroupDescriptionList = NULL;
1182
s_pPreviewImage = NULL;
1185
s_pApplyButton = NULL;
1187
s_pMainWindow = NULL;
1189
s_pStatusBar = NULL;
1191
if (s_pCurrentGroup != NULL)
1193
g_free (s_pCurrentGroup->cConfFilePath);
1194
s_pCurrentGroup->cConfFilePath = NULL;
1195
s_pCurrentGroup = NULL;
1197
_cairo_dock_reset_current_widget_list ();
1198
s_pCurrentGroupWidget = NULL; // detruit en meme temps que la fenetre.
1199
g_slist_free (s_path);
1205
void cairo_dock_write_current_group_conf_file (gchar *cConfFilePath, CairoDockModuleInstance *pInstance)
1207
g_return_if_fail (cConfFilePath != NULL && s_pCurrentWidgetList != NULL);
1208
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
1209
if (pKeyFile == NULL)
1212
cairo_dock_update_keyfile_from_widget_list (pKeyFile, s_pCurrentWidgetList);
1213
if (pInstance != NULL && pInstance->pModule->pInterface->save_custom_widget != NULL)
1214
pInstance->pModule->pInterface->save_custom_widget (pInstance, pKeyFile);
1215
cairo_dock_write_keys_to_file (pKeyFile, cConfFilePath);
1216
g_key_file_free (pKeyFile);
1219
void cairo_dock_write_extra_group_conf_file (gchar *cConfFilePath, CairoDockModuleInstance *pInstance, int iNumExtraModule)
1221
g_return_if_fail (cConfFilePath != NULL && s_pExtraCurrentWidgetList != NULL);
1222
GSList *pWidgetList = g_slist_nth_data (s_pExtraCurrentWidgetList, iNumExtraModule);
1223
g_return_if_fail (pWidgetList != NULL);
1225
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
1226
if (pKeyFile == NULL)
1229
cairo_dock_update_keyfile_from_widget_list (pKeyFile, pWidgetList);
1230
if (pInstance != NULL && pInstance->pModule->pInterface->save_custom_widget != NULL)
1231
pInstance->pModule->pInterface->save_custom_widget (pInstance, pKeyFile);
1232
cairo_dock_write_keys_to_file (pKeyFile, cConfFilePath);
1233
g_key_file_free (pKeyFile);
1238
gboolean cairo_dock_build_normal_gui (gchar *cConfFilePath, const gchar *cGettextDomain, const gchar *cTitle, int iWidth, int iHeight, CairoDockApplyConfigFunc pAction, gpointer pUserData, GFreeFunc pFreeUserData, GtkWidget **pWindow)
1240
//\_____________ On construit la fenetre.
1241
GtkWidget *pMainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1242
gtk_window_set_icon_from_file (GTK_WINDOW (pMainWindow), CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON, NULL);
1244
gtk_window_set_title (GTK_WINDOW (pMainWindow), cTitle);
1246
GtkWidget *pMainVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
1247
gtk_container_add (GTK_CONTAINER (pMainWindow), pMainVBox);
1249
//\_____________ On construit l'IHM du fichier de conf.
1250
GSList *pWidgetList = NULL;
1251
GPtrArray *pDataGarbage = g_ptr_array_new ();
1252
GtkWidget *pNoteBook = cairo_dock_build_conf_file_widget (cConfFilePath,
1258
gtk_box_pack_start (GTK_BOX (pMainVBox),
1264
//\_____________ On ajoute les boutons.
1265
GtkWidget *pButtonsHBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN*2);
1266
gtk_box_pack_end (GTK_BOX (pMainVBox),
1272
GtkWidget *pQuitButton = gtk_button_new_from_stock (GTK_STOCK_QUIT);
1273
g_signal_connect (G_OBJECT (pQuitButton), "clicked", G_CALLBACK(on_click_normal_quit), pMainWindow);
1274
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
1280
if (pAction != NULL)
1282
GtkWidget *pApplyButton = gtk_button_new_from_stock (GTK_STOCK_APPLY);
1283
g_signal_connect (G_OBJECT (pApplyButton), "clicked", G_CALLBACK(on_click_normal_apply), pMainWindow);
1284
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
101
void cairo_dock_reload_current_module_widget_full (CairoDockModuleInstance *pInstance, int iShowPage)
103
g_return_if_fail (pInstance != NULL);
104
if (pInstance->pModule->pVisitCard->cInternalModule != NULL)
106
cairo_dock_show_module_gui (pInstance->pModule->pVisitCard->cInternalModule);
1292
GtkWidget *pOkButton = gtk_button_new_from_stock (GTK_STOCK_OK);
1293
g_signal_connect (G_OBJECT (pOkButton), "clicked", G_CALLBACK(on_click_normal_ok), pMainWindow);
1294
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
1301
//\_____________ On ajoute la barre d'etat a la fin.
1302
GtkWidget *pStatusBar = gtk_statusbar_new ();
1303
gtk_box_pack_start (GTK_BOX (pButtonsHBox), // pMainVBox
1308
g_object_set_data (G_OBJECT (pMainWindow), "status-bar", pStatusBar);
1310
gtk_window_resize (GTK_WINDOW (pMainWindow), iWidth, iHeight);
1312
gtk_widget_show_all (pMainWindow);
1313
cairo_dock_dialog_window_created ();
1315
g_object_set_data (G_OBJECT (pMainWindow), "conf-file", g_strdup (cConfFilePath));
1316
g_object_set_data (G_OBJECT (pMainWindow), "widget-list", pWidgetList);
1317
g_object_set_data (G_OBJECT (pMainWindow), "garbage", pDataGarbage);
1319
if (pAction != NULL)
1321
g_object_set_data (G_OBJECT (pMainWindow), "action", pAction);
1322
g_object_set_data (G_OBJECT (pMainWindow), "action-data", pUserData);
1323
g_object_set_data (G_OBJECT (pMainWindow), "free-data", pFreeUserData);
1324
g_signal_connect (G_OBJECT (pMainWindow),
1326
G_CALLBACK (on_delete_normal_gui),
1329
*pWindow = pMainWindow;
1333
gtk_window_set_modal (GTK_WINDOW (pMainWindow), TRUE);
1334
GMainLoop *pBlockingLoop = g_main_loop_new (NULL, FALSE);
1335
g_object_set_data (G_OBJECT (pMainWindow), "loop", pBlockingLoop);
1336
g_signal_connect (G_OBJECT (pMainWindow),
1338
G_CALLBACK (on_delete_normal_gui),
1341
g_print ("debut de boucle bloquante ...\n");
1342
GDK_THREADS_LEAVE ();
1343
g_main_loop_run (pBlockingLoop);
1344
GDK_THREADS_ENTER ();
1345
g_print ("fin de boucle bloquante\n");
1347
g_main_loop_unref (pBlockingLoop);
1348
g_object_set_data (G_OBJECT (pMainWindow), "loop", NULL);
1350
iResult = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (pMainWindow), "result"));
1351
cd_debug ("iResult : %d", iResult);
1352
gtk_widget_destroy (pMainWindow);
1361
gpointer cairo_dock_get_previous_widget (void)
1363
if (s_path == NULL || s_path->next == NULL)
1365
if (s_path != NULL) // utile ?...
1367
g_slist_free (s_path);
1373
//s_path = g_list_delete_link (s_path, s_path);
1374
GSList *tmp = s_path;
1375
s_path = s_path->next;
1379
return s_path->data;
1382
gpointer cairo_dock_get_current_widget (void)
1389
return s_path->data;
1394
void cairo_dock_reload_current_group_widget_full (CairoDockModuleInstance *pInstance, int iShowPage)
1396
g_return_if_fail (s_pCurrentGroupWidget != NULL && s_pCurrentGroup != NULL && s_pCurrentWidgetList != NULL);
110
cairo_dock_show_module_instance_gui (pInstance, iShowPage);
112
/**g_return_if_fail (s_pCurrentGroupWidget != NULL && s_pCurrentGroup != NULL && cairo_dock_get_current_widget_list () != NULL);
1398
114
int iNotebookPage = (GTK_IS_NOTEBOOK (s_pCurrentGroupWidget) ?
1399
115
(iShowPage >= 0 ?
1575
static GtkWidget *s_pLauncherWindow = NULL;
1576
static GtkWidget *s_pCurrentLauncherWidget = NULL;
1577
static GtkWidget *s_pLauncherTreeView = NULL;
1578
static GtkWidget *s_pLauncherPane = NULL;
1579
static GtkWidget *s_pLauncherScrolledWindow = NULL;
1581
static gboolean _search_icon_in_line (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer *data)
1584
gtk_tree_model_get (model, iter,
1586
if (pIcon == data[0])
1588
g_print (" found !\n");
1589
memcpy (data[1], iter, sizeof (GtkTreeIter));
1590
data[2] = GINT_TO_POINTER (TRUE);
1591
return TRUE; // stop iterating.
1595
static gboolean _search_icon_in_model (GtkWidget *pTreeView, Icon *pIcon, GtkTreeIter *iter)
1599
g_print ("%s (%s)\n", __func__, pIcon->cName);
1600
GtkTreeModel * model = gtk_tree_view_get_model (GTK_TREE_VIEW (pTreeView));
1601
gpointer data[3] = {pIcon, iter, GINT_TO_POINTER (FALSE)};
1602
gtk_tree_model_foreach (model,
1603
(GtkTreeModelForeachFunc) _search_icon_in_line,
1605
return GPOINTER_TO_INT (data[2]);
1608
static gboolean _cairo_dock_select_one_launcher_in_tree (GtkTreeSelection * selection, GtkTreeModel * model, GtkTreePath * path, gboolean path_currently_selected, gpointer data)
1610
g_print ("%s (path_currently_selected:%d)\n", __func__, path_currently_selected);
1611
if (path_currently_selected)
1614
if (! gtk_tree_model_get_iter (model, &iter, path))
1617
cairo_dock_delete_current_launcher_widget ();
1619
gchar *cName = NULL;
1621
gtk_tree_model_get (model, &iter,
1624
gtk_window_set_title (GTK_WINDOW (s_pLauncherWindow), cName);
1626
if (pIcon == NULL) // ligne correspondante a un dock principal.
1629
// on charge son .conf
1630
if (pIcon->cDesktopFileName != NULL)
1632
g_print ("on presente %s...\n", pIcon->cDesktopFileName);
1633
gchar *cConfFilePath = (*pIcon->cDesktopFileName == '/' ? g_strdup (pIcon->cDesktopFileName) : g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, pIcon->cDesktopFileName));
1635
CairoDockDesktopFileType iLauncherType;
1636
if (CAIRO_DOCK_IS_URI_LAUNCHER (pIcon))
1637
iLauncherType = CAIRO_DOCK_DESKTOP_FILE_FOR_FILE;
1638
else if (CAIRO_DOCK_IS_SEPARATOR (pIcon))
1639
iLauncherType = CAIRO_DOCK_DESKTOP_FILE_FOR_SEPARATOR;
1640
else if (pIcon->pSubDock != NULL && pIcon->cClass == NULL)
1641
iLauncherType = CAIRO_DOCK_DESKTOP_FILE_FOR_CONTAINER;
1643
iLauncherType = CAIRO_DOCK_DESKTOP_FILE_FOR_LAUNCHER;
1644
cairo_dock_update_launcher_desktop_file (cConfFilePath, iLauncherType);
1646
GSList *pWidgetList = NULL;
1647
GPtrArray *pDataGarbage = g_ptr_array_new ();
1648
s_pCurrentLauncherWidget = cairo_dock_build_conf_file_widget (cConfFilePath,
1655
gtk_paned_pack2 (GTK_PANED (s_pLauncherPane), s_pCurrentLauncherWidget, TRUE, FALSE);
1657
g_object_set_data (G_OBJECT (s_pLauncherWindow), "widget-list", pWidgetList);
1658
g_object_set_data (G_OBJECT (s_pLauncherWindow), "garbage", pDataGarbage);
1659
g_object_set_data (G_OBJECT (s_pLauncherWindow), "current-icon", pIcon);
1661
g_free (cConfFilePath);
1662
gtk_widget_show_all (s_pCurrentLauncherWidget);
1664
else if (CAIRO_DOCK_IS_APPLET (pIcon))
1666
GSList *pWidgetList = NULL;
1667
GPtrArray *pDataGarbage = g_ptr_array_new ();
1669
GKeyFile* pKeyFile = cairo_dock_open_key_file (pIcon->pModuleInstance->cConfFilePath);
1670
g_return_val_if_fail (pKeyFile != NULL, FALSE);
1672
gchar *cOriginalConfFilePath = g_strdup_printf ("%s/%s", pIcon->pModuleInstance->pModule->pVisitCard->cShareDataDir, pIcon->pModuleInstance->pModule->pVisitCard->cConfFileName);
1673
s_pCurrentLauncherWidget = cairo_dock_build_group_widget (pKeyFile, "Icon", pIcon->pModuleInstance->pModule->pVisitCard->cGettextDomain, s_pLauncherWindow, &pWidgetList, pDataGarbage, cOriginalConfFilePath);
1674
g_free (cOriginalConfFilePath);
1676
gtk_paned_pack2 (GTK_PANED (s_pLauncherPane), s_pCurrentLauncherWidget, TRUE, FALSE);
1678
g_object_set_data (G_OBJECT (s_pLauncherWindow), "widget-list", pWidgetList);
1679
g_object_set_data (G_OBJECT (s_pLauncherWindow), "garbage", pDataGarbage);
1680
g_object_set_data (G_OBJECT (s_pLauncherWindow), "current-icon", pIcon);
1681
gtk_widget_show_all (s_pCurrentLauncherWidget);
1686
static void _cairo_dock_add_one_sub_dock_to_model (CairoDock *pDock, GtkTreeStore *model, GtkTreeIter *pParentIter)
1691
GError *erreur = NULL;
1692
GdkPixbuf *pixbuf = NULL;
1693
gchar *cImagePath = NULL;
1694
for (ic = pDock->icons; ic != NULL; ic = ic->next)
1697
if (! CAIRO_DOCK_IS_LAUNCHER (pIcon) && ! CAIRO_DOCK_IS_USER_SEPARATOR (pIcon) && ! CAIRO_DOCK_IS_APPLET (pIcon))
1700
if (pIcon->fPersonnalScale > 0)
1703
if (pIcon->cFileName != NULL)
1705
cImagePath = cairo_dock_search_icon_s_path (pIcon->cFileName);
1707
if (cImagePath == NULL || ! g_file_test (cImagePath, G_FILE_TEST_EXISTS))
1709
g_free (cImagePath);
1710
if (CAIRO_DOCK_IS_SEPARATOR (pIcon))
1712
cImagePath = cairo_dock_generate_file_path (myIcons.cSeparatorImage);
1716
cImagePath = cairo_dock_generate_file_path (CAIRO_DOCK_DEFAULT_ICON_NAME);
1717
if (cImagePath == NULL || ! g_file_test (cImagePath, G_FILE_TEST_EXISTS))
1719
g_free (cImagePath);
1720
cImagePath = g_strdup (CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_DEFAULT_ICON_NAME);
1725
if (cImagePath != NULL)
1727
pixbuf = gdk_pixbuf_new_from_file_at_size (cImagePath, 32, 32, &erreur);
1730
cd_warning (erreur->message);
1731
g_error_free (erreur);
1736
gtk_tree_store_append (model, &iter, pParentIter);
1737
gtk_tree_store_set (model, &iter,
1738
0, CAIRO_DOCK_IS_USER_SEPARATOR (pIcon) ? "separator" : (pIcon->cInitialName ? pIcon->cInitialName : pIcon->cName),
1743
if (CAIRO_DOCK_IS_LAUNCHER (pIcon) && pIcon->pSubDock != NULL && ! CAIRO_DOCK_IS_URI_LAUNCHER (pIcon))
1745
_cairo_dock_add_one_sub_dock_to_model (pIcon->pSubDock, model, &iter);
1748
g_free (cImagePath);
1751
g_object_unref (pixbuf);
1755
static void _cairo_dock_add_one_root_dock_to_model (const gchar *cName, CairoDock *pDock, GtkTreeStore *model)
1757
if (pDock->iRefCount != 0)
1761
// on ajoute une ligne pour le dock.
1762
gtk_tree_store_append (model, &iter, NULL);
1763
gtk_tree_store_set (model, &iter,
1768
// on ajoute chaque lanceur.
1769
_cairo_dock_add_one_sub_dock_to_model (pDock, model, &iter);
1771
static GtkTreeModel *_cairo_dock_build_tree_model (void)
1773
GtkTreeStore *model = gtk_tree_store_new (3,
1776
G_TYPE_POINTER); // nom du lanceur, image, Icon.
1777
cairo_dock_foreach_docks ((GHFunc) _cairo_dock_add_one_root_dock_to_model, model);
1778
return GTK_TREE_MODEL (model);
1781
static inline void _select_item (Icon *pIcon)
1784
if (_search_icon_in_model (s_pLauncherTreeView, pIcon, &iter))
1786
GtkTreeModel * model = gtk_tree_view_get_model (GTK_TREE_VIEW (s_pLauncherTreeView));
1787
GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
1788
gtk_tree_view_expand_to_path (GTK_TREE_VIEW (s_pLauncherTreeView), path);
1789
gtk_tree_path_free (path);
1791
GtkTreeSelection *pSelection = gtk_tree_view_get_selection (GTK_TREE_VIEW (s_pLauncherTreeView));
1792
gtk_tree_selection_select_iter (pSelection, &iter);
1796
gtk_window_set_title (GTK_WINDOW (s_pLauncherWindow), _("Configuration of the launchers"));
253
void cairo_dock_register_gui_backend (CairoDockGuiBackend *pBackend)
255
g_free (s_pGuiBackend);
256
s_pGuiBackend = pBackend;
259
GtkWidget *cairo_dock_show_main_gui (void)
261
GtkWidget *pWindow = NULL;
262
if (s_pGuiBackend && s_pGuiBackend->show_main_gui)
263
pWindow = s_pGuiBackend->show_main_gui ();
264
if (pWindow && g_pMainDock != NULL && ! myAccessibility.bReserveSpace) // evitons d'empieter sur le dock.
266
if (g_pMainDock->container.bIsHorizontal)
268
if (g_pMainDock->container.bDirectionUp)
269
gtk_window_move (GTK_WINDOW (pWindow), 0, 0);
271
gtk_window_move (GTK_WINDOW (pWindow), 0, g_pMainDock->iMinDockHeight+10);
275
if (g_pMainDock->container.bDirectionUp)
276
gtk_window_move (GTK_WINDOW (pWindow), 0, 0);
278
gtk_window_move (GTK_WINDOW (pWindow), g_pMainDock->iMinDockHeight+10, 0);
282
gchar *cModeFile = g_strdup_printf ("%s/%s", g_cCairoDockDataDir, ".config-mode");
283
if (! g_file_test (cModeFile, G_FILE_TEST_EXISTS))
285
g_file_set_contents (cModeFile,
289
Icon *pIcon = cairo_dock_get_dialogless_icon ();
290
cairo_dock_show_temporary_dialog_with_default_icon (_("This is the simple config panel of Cairo-Dock.\n After you got familiar with it, and if you want to customise your theme\n, you can switch to an advanced mode.\n You can switch from a mode to another at any time."), pIcon, CAIRO_CONTAINER (g_pMainDock), 15000);
296
void cairo_dock_show_module_instance_gui (CairoDockModuleInstance *pModuleInstance, int iShowPage)
298
if (s_pGuiBackend && s_pGuiBackend->show_module_instance_gui)
299
s_pGuiBackend->show_module_instance_gui (pModuleInstance, iShowPage);
302
void cairo_dock_show_module_gui (const gchar *cModuleName)
304
if (s_pGuiBackend && s_pGuiBackend->show_module_gui)
305
s_pGuiBackend->show_module_gui (cModuleName);
308
void cairo_dock_close_gui (void)
310
if (s_pGuiBackend && s_pGuiBackend->close_gui)
311
s_pGuiBackend->close_gui ();
319
static gboolean on_delete_generic_gui (GtkWidget *pWidget, GdkEvent *event, GMainLoop *pBlockingLoop)
321
g_print ("%s ()\n", __func__);
322
if (pBlockingLoop != NULL && g_main_loop_is_running (pBlockingLoop))
324
g_main_loop_quit (pBlockingLoop);
327
gpointer pUserData = g_object_get_data (G_OBJECT (pWidget), "action-data");
328
GFreeFunc pFreeUserData = g_object_get_data (G_OBJECT (pWidget), "free-data");
329
if (pFreeUserData != NULL)
330
pFreeUserData (pUserData);
332
GSList *pWidgetList = g_object_get_data (G_OBJECT (pWidget), "widget-list");
333
cairo_dock_free_generated_widget_list (pWidgetList);
335
GPtrArray *pDataGarbage = g_object_get_data (G_OBJECT (pWidget), "garbage");
338
gchar *cConfFilePath = g_object_get_data (G_OBJECT (pWidget), "conf-file");
339
g_free (cConfFilePath);
341
cairo_dock_dialog_window_destroyed ();
343
return (pBlockingLoop != NULL); // TRUE <=> ne pas detruire la fenetre.
346
static void on_click_generic_apply (GtkButton *button, GtkWidget *pWindow)
348
//g_print ("%s ()\n", __func__);
349
GSList *pWidgetList = g_object_get_data (G_OBJECT (pWindow), "widget-list");
350
gchar *cConfFilePath = g_object_get_data (G_OBJECT (pWindow), "conf-file");
351
GKeyFile *pKeyFile = cairo_dock_open_key_file (cConfFilePath);
352
g_return_if_fail (pKeyFile != NULL);
354
cairo_dock_update_keyfile_from_widget_list (pKeyFile, pWidgetList);
355
cairo_dock_write_keys_to_file (pKeyFile, cConfFilePath);
356
g_key_file_free (pKeyFile);
358
CairoDockApplyConfigFunc pAction = g_object_get_data (G_OBJECT (pWindow), "action");
359
gpointer pUserData = g_object_get_data (G_OBJECT (pWindow), "action-data");
363
gboolean bKeepWindow = pAction (pUserData);
364
if (!bKeepWindow) // on recharge la fenetre.
366
cairo_dock_reload_generic_gui (pWindow);
370
g_object_set_data (G_OBJECT (pWindow), "result", GINT_TO_POINTER (1));
373
static void on_click_generic_quit (GtkButton *button, GtkWidget *pWindow)
375
g_print ("%s ()\n", __func__);
376
GMainLoop *pBlockingLoop = g_object_get_data (G_OBJECT (pWindow), "loop");
379
g_signal_emit_by_name (pWindow, "delete-event", NULL, &bReturn);
380
///on_delete_generic_gui (pWindow, NULL, pBlockingLoop);
382
if (pBlockingLoop == NULL)
383
gtk_widget_destroy (pWindow);
386
static void on_click_generic_ok (GtkButton *button, GtkWidget *pWindow)
388
//g_print ("%s ()\n", __func__);
390
on_click_generic_apply (button, pWindow);
391
on_click_generic_quit (button, pWindow);
394
GtkWidget *cairo_dock_build_generic_gui_window (const gchar *cTitle, int iWidth, int iHeight, CairoDockApplyConfigFunc pAction, gpointer pUserData, GFreeFunc pFreeUserData)
396
//\_____________ On construit la fenetre.
397
GtkWidget *pMainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
398
gtk_window_set_icon_from_file (GTK_WINDOW (pMainWindow), CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON, NULL);
400
gtk_window_set_title (GTK_WINDOW (pMainWindow), cTitle);
402
GtkWidget *pMainVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
403
gtk_container_add (GTK_CONTAINER (pMainWindow), pMainVBox);
405
//\_____________ On ajoute les boutons.
406
GtkWidget *pButtonsHBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN*2);
407
gtk_box_pack_end (GTK_BOX (pMainVBox),
413
GtkWidget *pQuitButton = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
414
g_signal_connect (G_OBJECT (pQuitButton), "clicked", G_CALLBACK(on_click_generic_quit), pMainWindow);
415
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
423
GtkWidget *pApplyButton = gtk_button_new_from_stock (GTK_STOCK_APPLY);
424
g_signal_connect (G_OBJECT (pApplyButton), "clicked", G_CALLBACK(on_click_generic_apply), pMainWindow);
425
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
433
GtkWidget *pApplyButton = gtk_button_new_from_stock (GTK_STOCK_OK);
434
g_signal_connect (G_OBJECT (pApplyButton), "clicked", G_CALLBACK(on_click_generic_ok), pMainWindow);
435
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
442
//\_____________ On ajoute la barre d'etat a la fin.
443
GtkWidget *pStatusBar = gtk_statusbar_new ();
444
gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (pStatusBar), FALSE);
445
gtk_box_pack_start (GTK_BOX (pButtonsHBox), // pMainVBox
450
g_object_set_data (G_OBJECT (pMainWindow), "status-bar", pStatusBar);
452
gtk_window_resize (GTK_WINDOW (pMainWindow), iWidth, iHeight);
454
gtk_widget_show_all (pMainWindow);
455
cairo_dock_dialog_window_created ();
460
g_object_set_data (G_OBJECT (pMainWindow), "action", pAction);
461
g_object_set_data (G_OBJECT (pMainWindow), "action-data", pUserData);
462
g_object_set_data (G_OBJECT (pMainWindow), "free-data", pFreeUserData);
463
g_signal_connect (G_OBJECT (pMainWindow),
465
G_CALLBACK (on_delete_generic_gui),
471
gboolean cairo_dock_build_generic_gui (const gchar *cConfFilePath, const gchar *cGettextDomain, const gchar *cTitle, int iWidth, int iHeight, CairoDockApplyConfigFunc pAction, gpointer pUserData, GFreeFunc pFreeUserData, GtkWidget **pWindow)
473
//\_____________ On construit la fenetre.
474
GtkWidget *pMainWindow = cairo_dock_build_generic_gui_window (cTitle, iWidth, iHeight, pAction, pUserData, pFreeUserData);
476
//\_____________ On construit l'IHM du fichier de conf.
477
GSList *pWidgetList = NULL;
478
GPtrArray *pDataGarbage = g_ptr_array_new ();
479
GtkWidget *pNoteBook = cairo_dock_build_conf_file_widget (cConfFilePath,
486
//\_____________ On l'insere dans la fenetre.
487
GtkWidget *pMainVBox = gtk_bin_get_child (GTK_BIN (pMainWindow));
488
gtk_box_pack_start (GTK_BOX (pMainVBox),
493
gtk_widget_show_all (pMainWindow);
495
g_object_set_data (G_OBJECT (pMainWindow), "conf-file", g_strdup (cConfFilePath));
496
g_object_set_data (G_OBJECT (pMainWindow), "widget-list", pWidgetList);
497
g_object_set_data (G_OBJECT (pMainWindow), "garbage", pDataGarbage);
503
*pWindow = pMainWindow;
507
GList *children = gtk_container_get_children (GTK_CONTAINER (pMainVBox));
508
GList *w = g_list_last (children);
509
g_return_val_if_fail (w != NULL, FALSE);
510
GtkWidget *pButtonsHBox = w->data;
512
GtkWidget *pOkButton = gtk_button_new_from_stock (GTK_STOCK_OK);
513
g_signal_connect (G_OBJECT (pOkButton), "clicked", G_CALLBACK(on_click_generic_ok), pMainWindow);
514
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
520
gtk_window_set_modal (GTK_WINDOW (pMainWindow), TRUE);
521
GMainLoop *pBlockingLoop = g_main_loop_new (NULL, FALSE);
522
g_object_set_data (G_OBJECT (pMainWindow), "loop", pBlockingLoop);
523
g_signal_connect (G_OBJECT (pMainWindow),
525
G_CALLBACK (on_delete_generic_gui),
528
g_print ("debut de boucle bloquante ...\n");
529
GDK_THREADS_LEAVE ();
530
g_main_loop_run (pBlockingLoop);
531
GDK_THREADS_ENTER ();
532
g_print ("fin de boucle bloquante\n");
534
g_main_loop_unref (pBlockingLoop);
535
g_object_set_data (G_OBJECT (pMainWindow), "loop", NULL);
537
iResult = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (pMainWindow), "result"));
538
cd_debug ("iResult : %d", iResult);
539
gtk_widget_destroy (pMainWindow);
547
void cairo_dock_reload_generic_gui (GtkWidget *pWindow)
549
//g_print ("%s ()", __func__);
550
GSList *pWidgetList = g_object_get_data (G_OBJECT (pWindow), "widget-list");
551
cairo_dock_free_generated_widget_list (pWidgetList);
553
g_object_set_data (G_OBJECT (pWindow), "widget-list", NULL);
555
GPtrArray *pDataGarbage = g_object_get_data (G_OBJECT (pWindow), "garbage");
557
g_object_set_data (G_OBJECT (pWindow), "garbage", NULL);
559
GtkWidget *pMainVBox = gtk_bin_get_child (GTK_BIN (pWindow));
560
GList *children = gtk_container_get_children (GTK_CONTAINER (pMainVBox));
561
g_return_if_fail (children != NULL);
562
GtkWidget *pNoteBook = children->data;
563
gtk_widget_destroy (pNoteBook);
565
gchar *cConfFilePath = g_object_get_data (G_OBJECT (pWindow), "conf-file");
566
pNoteBook = cairo_dock_build_conf_file_widget (cConfFilePath, NULL, pWindow, &pWidgetList, pDataGarbage, cConfFilePath);
567
gtk_box_pack_start (GTK_BOX (pMainVBox),
572
gtk_widget_show_all (pNoteBook);
573
g_object_set_data (G_OBJECT (pWindow), "widget-list", pWidgetList);
574
g_object_set_data (G_OBJECT (pWindow), "garbage", pDataGarbage);
578
//////////////////////////
579
// LAUNCHER GUI BACKEND //
580
//////////////////////////
582
void cairo_dock_register_launcher_gui_backend (CairoDockLauncherGuiBackend *pBackend)
584
g_free (s_pLauncherGuiBackend);
585
s_pLauncherGuiBackend = pBackend;
1799
588
GtkWidget *cairo_dock_build_launcher_gui (Icon *pIcon)
1801
g_print ("%s ()\n", __func__);
1802
//\_____________ On construit la fenetre.
1803
if (s_pLauncherWindow != NULL)
1805
cairo_dock_delete_current_launcher_widget ();
1807
_select_item (pIcon);
1809
gtk_window_present (GTK_WINDOW (s_pLauncherWindow));
1810
return s_pLauncherWindow;
1812
s_pLauncherWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1813
gtk_window_set_icon_from_file (GTK_WINDOW (s_pLauncherWindow), CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON, NULL);
1815
GtkWidget *pMainVBox = gtk_vbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN);
1816
gtk_container_add (GTK_CONTAINER (s_pLauncherWindow), pMainVBox);
1818
s_pLauncherPane = gtk_hpaned_new ();
1819
gtk_box_pack_start (GTK_BOX (pMainVBox),
1825
//\_____________ On construit l'arbre des launceurs.
1826
GtkTreeModel *model = _cairo_dock_build_tree_model();
1828
//\_____________ On construit le tree-view avec.
1829
s_pLauncherTreeView = gtk_tree_view_new_with_model (model);
1830
g_object_unref (model);
1831
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (s_pLauncherTreeView), FALSE);
1832
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (s_pLauncherTreeView), TRUE);
1833
//g_signal_connect (s_pLauncherTreeView, "realize", G_CALLBACK (gtk_tree_view_expand_all), NULL);
1835
GtkTreeSelection *pSelection = gtk_tree_view_get_selection (GTK_TREE_VIEW (s_pLauncherTreeView));
1836
gtk_tree_selection_set_mode (pSelection, GTK_SELECTION_SINGLE);
1837
gtk_tree_selection_set_select_function (pSelection,
1838
(GtkTreeSelectionFunc) _cairo_dock_select_one_launcher_in_tree,
1842
GtkCellRenderer *rend;
1843
rend = gtk_cell_renderer_text_new ();
1844
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (s_pLauncherTreeView), -1, NULL, rend, "text", 0, NULL);
1845
rend = gtk_cell_renderer_pixbuf_new ();
1846
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (s_pLauncherTreeView), -1, NULL, rend, "pixbuf", 1, NULL);
1848
s_pLauncherScrolledWindow = gtk_scrolled_window_new (NULL, NULL);
1849
gtk_widget_set (s_pLauncherScrolledWindow, "height-request", CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT - 30, NULL);
1850
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (s_pLauncherScrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1851
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (s_pLauncherScrolledWindow), s_pLauncherTreeView);
1852
gtk_paned_pack1 (GTK_PANED (s_pLauncherPane), s_pLauncherScrolledWindow, TRUE, FALSE);
1854
//\_____________ On ajoute les boutons.
1855
GtkWidget *pButtonsHBox = gtk_hbox_new (FALSE, CAIRO_DOCK_GUI_MARGIN*2);
1856
gtk_box_pack_end (GTK_BOX (pMainVBox),
1862
GtkWidget *pQuitButton = gtk_button_new_from_stock (GTK_STOCK_QUIT);
1863
g_signal_connect (G_OBJECT (pQuitButton), "clicked", G_CALLBACK(on_click_launcher_quit), s_pLauncherWindow);
1864
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
1870
GtkWidget *pApplyButton = gtk_button_new_from_stock (GTK_STOCK_APPLY);
1871
g_signal_connect (G_OBJECT (pApplyButton), "clicked", G_CALLBACK(on_click_launcher_apply), s_pLauncherWindow);
1872
gtk_box_pack_end (GTK_BOX (pButtonsHBox),
1878
//\_____________ On ajoute la barre d'etat.
1879
GtkWidget *pStatusBar = gtk_statusbar_new ();
1880
gtk_box_pack_start (GTK_BOX (pButtonsHBox), // pMainVBox
1885
g_object_set_data (G_OBJECT (s_pLauncherWindow), "status-bar", pStatusBar);
1887
gtk_window_resize (GTK_WINDOW (s_pLauncherWindow), CAIRO_DOCK_LAUNCHER_PANEL_WIDTH, CAIRO_DOCK_LAUNCHER_PANEL_HEIGHT);
1889
gtk_widget_show_all (s_pLauncherWindow);
1890
cairo_dock_dialog_window_created ();
1892
g_signal_connect (G_OBJECT (s_pLauncherWindow),
1894
G_CALLBACK (on_delete_launcher_gui),
1897
//\_____________ On selectionne l'entree courante.
1898
_select_item (pIcon);
1900
return s_pLauncherWindow;
1903
void cairo_dock_free_launcher_gui (void)
1905
s_pLauncherWindow = NULL;
1906
s_pCurrentLauncherWidget = NULL;
1907
s_pLauncherPane = NULL;
1908
s_pLauncherTreeView = NULL;
1909
s_pLauncherScrolledWindow = NULL;
1912
void cairo_dock_delete_current_launcher_widget (void)
1914
g_return_if_fail (s_pLauncherWindow != NULL);
1916
if (s_pCurrentLauncherWidget != NULL)
1918
gtk_widget_destroy (s_pCurrentLauncherWidget);
1919
s_pCurrentLauncherWidget = NULL;
1921
GSList *pWidgetList = g_object_get_data (G_OBJECT (s_pLauncherWindow), "widget-list");
1922
if (pWidgetList != NULL)
1924
cairo_dock_free_generated_widget_list (pWidgetList);
1925
g_object_set_data (G_OBJECT (s_pLauncherWindow), "widget-list", NULL);
1927
GPtrArray *pDataGarbage = g_object_get_data (G_OBJECT (s_pLauncherWindow), "garbage");
1928
if (pDataGarbage != NULL)
1931
g_object_set_data (G_OBJECT (s_pLauncherWindow), "garbage", NULL);
1934
g_object_set_data (G_OBJECT (s_pLauncherWindow), "current-icon", NULL);
590
if (s_pLauncherGuiBackend && s_pLauncherGuiBackend->show_gui)
591
s_pLauncherGuiBackend->show_gui (pIcon);
594
static guint s_iSidRefreshGUI = 0;
595
static gboolean _refresh_launcher_gui (gpointer data)
597
if (s_pLauncherGuiBackend && s_pLauncherGuiBackend->refresh_gui)
598
s_pLauncherGuiBackend->refresh_gui ();
600
s_iSidRefreshGUI = 0;
1937
603
void cairo_dock_refresh_launcher_gui (void)
1939
if (cairo_dock_is_loading ())
605
if (s_iSidRefreshGUI != 0)
1941
g_print ("%s ()\n", __func__);
1942
if (s_pLauncherWindow == NULL)
1944
Icon *pCurrentIcon = g_object_get_data (G_OBJECT (s_pLauncherWindow), "current-icon");
1946
cairo_dock_delete_current_launcher_widget ();
1948
GtkTreeModel *model = _cairo_dock_build_tree_model();
1950
gtk_tree_view_set_model (GTK_TREE_VIEW (s_pLauncherTreeView), GTK_TREE_MODEL (model));
1951
g_object_unref (model);
1953
_select_item (pCurrentIcon);
1955
gtk_widget_show_all (s_pLauncherWindow);
1956
g_object_set_data (G_OBJECT (s_pLauncherWindow), "current-icon", pCurrentIcon);
608
s_iSidRefreshGUI = g_idle_add ((GSourceFunc) _refresh_launcher_gui, NULL);
612
////////////////////////
613
// CONFIG MODE SWITCH //
614
////////////////////////
616
static gboolean s_bAdvancedMode = FALSE;
617
void cairo_dock_load_user_gui_backend (void)
619
gchar *cModeFile = g_strdup_printf ("%s/%s", g_cCairoDockDataDir, ".config-mode");
621
gchar *cContent = NULL;
622
g_file_get_contents (cModeFile,
627
if (!cContent || atoi (cContent) == 0)
629
cairo_dock_register_simple_gui_backend ();
630
s_bAdvancedMode = FALSE;
634
cairo_dock_register_main_gui_backend ();
635
s_bAdvancedMode = TRUE;
640
static void on_click_switch_mode (GtkButton *button, gpointer data)
642
cairo_dock_close_gui ();
644
s_bAdvancedMode = !s_bAdvancedMode;
645
gchar *cModeFile = g_strdup_printf ("%s/%s", g_cCairoDockDataDir, ".config-mode");
646
gchar *cMode = g_strdup_printf ("%d", s_bAdvancedMode);
647
g_file_set_contents (cModeFile,
653
cairo_dock_register_main_gui_backend ();
655
cairo_dock_register_simple_gui_backend ();
659
cairo_dock_show_main_gui ();
661
GtkWidget *cairo_dock_make_switch_gui_button (void)
663
GtkWidget *pSwitchButton = gtk_button_new_with_label (s_bAdvancedMode ? _("Simple Mode") : _("Advanced Mode"));
664
if (!s_bAdvancedMode)
665
gtk_widget_set_tooltip_text (pSwitchButton, _("The advanced mode lets you tweak every single parameter of the dock. It is a powerful tool to customize your current theme."));
667
GtkWidget *pImage = gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_BUTTON);
668
gtk_button_set_image (GTK_BUTTON (pSwitchButton), pImage);
669
g_signal_connect (G_OBJECT (pSwitchButton), "clicked", G_CALLBACK(on_click_switch_mode), NULL);
670
return pSwitchButton;