261
268
void cairo_dock_reload_buffers_in_all_docks (void)
263
g_hash_table_foreach (s_hDocksTable, (GHFunc) cairo_dock_reload_buffers_in_dock, NULL);
270
g_hash_table_foreach (s_hDocksTable, (GHFunc) cairo_dock_reload_buffers_in_dock, GINT_TO_POINTER (FALSE));
274
CairoDock *cairo_dock_alter_dock_name (const gchar *cDockName, CairoDock *pDock, const gchar *cNewName)
276
//g_return_val_if_fail (cDockName != NULL && cNewName != NULL, NULL);
279
if (cDockName != NULL)
280
pDock = g_hash_table_lookup (s_hDocksTable, cDockName);
281
g_return_val_if_fail (pDock != NULL, NULL);
284
if (cDockName != NULL)
285
g_hash_table_remove (s_hDocksTable, cDockName); // libere la cle, mais pas la valeur puisque la GDestroyFunc est a NULL.
286
if (cNewName != NULL)
287
g_hash_table_insert (s_hDocksTable, g_strdup (cNewName), pDock);
266
292
void cairo_dock_rename_dock (const gchar *cDockName, CairoDock *pDock, const gchar *cNewName)
268
g_return_if_fail (cDockName != NULL && cNewName != NULL);
270
pDock = g_hash_table_lookup (s_hDocksTable, cDockName);
272
g_hash_table_remove (s_hDocksTable, cDockName); // libere la cle, mais pas la valeur puisque la GDestroyFunc est a NULL.
273
g_hash_table_insert (s_hDocksTable, g_strdup (cNewName), pDock);
294
pDock = cairo_dock_alter_dock_name (cDockName, pDock, cNewName);
295
g_return_if_fail (pDock != NULL);
320
354
const gchar *cDockName = cairo_dock_search_dock_name (pDock);
321
355
gchar *cConfFilePath = g_strdup_printf ("%s/%s.conf", g_cCurrentThemePath, cDockName);
356
if (! g_file_test (cConfFilePath, G_FILE_TEST_EXISTS))
358
gchar *cCommand = g_strdup_printf ("cp %s/%s %s", CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_MAIN_DOCK_CONF_FILE, cConfFilePath);
322
363
cairo_dock_update_conf_file_with_position (cConfFilePath, pDock->iGapX, pDock->iGapY);
323
364
g_free (cConfFilePath);
327
void cairo_dock_get_main_dock_position (const gchar *cDockName, CairoDock *pDock)
368
gboolean cairo_dock_get_root_dock_position (const gchar *cDockName, CairoDock *pDock)
329
g_return_if_fail (cDockName != NULL && pDock != NULL);
330
if (pDock->iRefCount > 0 || pDock->bIsMainDock)
370
g_return_val_if_fail (cDockName != NULL && pDock != NULL, FALSE);
371
if (pDock->iRefCount > 0)
374
//g_print ("%s (%s)\n", __func__, cDockName);
333
375
gchar *cConfFilePath = (pDock->bIsMainDock ? g_cConfFile : g_strdup_printf ("%s/%s.conf", g_cCurrentThemePath, cDockName));
334
376
if (! g_file_test (cConfFilePath, G_FILE_TEST_EXISTS))
378
pDock->bHorizontalDock = g_pMainDock->bHorizontalDock;
379
pDock->bDirectionUp = g_pMainDock->bDirectionUp;
380
pDock->fAlign = g_pMainDock->fAlign;
336
382
if (! pDock->bIsMainDock)
337
383
g_free (cConfFilePath);
341
387
GKeyFile *pKeyFile = g_key_file_new ();
369
413
pDock->bHorizontalDock = CAIRO_DOCK_HORIZONTAL;
370
414
pDock->bDirectionUp = FALSE;
416
case CAIRO_DOCK_RIGHT :
417
pDock->bHorizontalDock = CAIRO_DOCK_VERTICAL;
418
pDock->bDirectionUp = TRUE;
372
420
case CAIRO_DOCK_LEFT :
373
421
pDock->bHorizontalDock = CAIRO_DOCK_VERTICAL;
374
422
pDock->bDirectionUp = FALSE;
376
case CAIRO_DOCK_RIGHT :
377
pDock->bHorizontalDock = CAIRO_DOCK_VERTICAL;
378
pDock->bDirectionUp = TRUE;
426
pDock->fAlign = cairo_dock_get_double_key_value (pKeyFile, "Position", "alignment", &bFlushConfFileNeeded, 0.5, NULL, NULL);
428
pDock->bAutoHide = cairo_dock_get_boolean_key_value (pKeyFile, "Position", "auto-hide", &bFlushConfFileNeeded, FALSE, "Auto-Hide", "auto-hide");
382
430
g_key_file_free (pKeyFile);
385
433
if (! pDock->bIsMainDock)
386
434
g_free (cConfFilePath);
389
void cairo_dock_remove_main_dock_config (const gchar *cDockName)
438
void cairo_dock_remove_root_dock_config (const gchar *cDockName)
391
440
gchar *cConfFilePath = g_strdup_printf ("%s/%s.conf", g_cCurrentThemePath, cDockName);
392
441
if (g_file_test (cConfFilePath, G_FILE_TEST_EXISTS))
396
445
g_free (cConfFilePath);
449
static gboolean s_bTemporaryAutoHide = FALSE;
450
static gboolean s_bQuickHide = FALSE;
452
static void _cairo_dock_quick_hide_one_root_dock (const gchar *cDockName, CairoDock *pDock, gpointer data)
454
if (pDock->iRefCount == 0)
456
pDock->bAtBottom = FALSE; // car on a deja quitte le dock lors de la fermeture du menu, donc le "leave-notify" serait ignore.
457
pDock->bAutoHideInitialValue = pDock->bAutoHide;
458
pDock->bAutoHide = TRUE;
459
pDock->bEntranceDisabled = TRUE;
460
cairo_dock_emit_leave_signal (pDock);
463
void cairo_dock_activate_temporary_auto_hide (void)
465
if (! s_bTemporaryAutoHide)
467
s_bTemporaryAutoHide = TRUE;
468
g_hash_table_foreach (s_hDocksTable, (GHFunc) _cairo_dock_quick_hide_one_root_dock, NULL);
471
void cairo_dock_quick_hide_all_docks (void)
473
if (! s_bTemporaryAutoHide)
475
s_bTemporaryAutoHide = TRUE;
477
g_hash_table_foreach (s_hDocksTable, (GHFunc) _cairo_dock_quick_hide_one_root_dock, NULL);
481
static void _cairo_dock_stop_quick_hide_one_root_dock (const gchar *cDockName, CairoDock *pDock, gpointer data)
483
if (pDock->iRefCount == 0)
485
pDock->bAutoHide = pDock->bAutoHideInitialValue;
486
pDock->bAtBottom = TRUE;
488
if (! pDock->bInside && ! pDock->bAutoHide) // on le fait re-apparaitre.
490
pDock->fFoldingFactor = 0;
492
int iNewWidth, iNewHeight;
493
cairo_dock_get_window_position_and_geometry_at_balance (pDock, CAIRO_DOCK_NORMAL_SIZE, &iNewWidth, &iNewHeight);
495
if (pDock->bHorizontalDock)
496
gdk_window_move_resize (pDock->pWidget->window,
497
pDock->iWindowPositionX,
498
pDock->iWindowPositionY,
502
gdk_window_move_resize (pDock->pWidget->window,
503
pDock->iWindowPositionY,
504
pDock->iWindowPositionX,
510
void cairo_dock_deactivate_temporary_auto_hide (void)
513
if (s_bTemporaryAutoHide)
515
s_bTemporaryAutoHide = FALSE;
516
g_hash_table_foreach (s_hDocksTable, (GHFunc) _cairo_dock_stop_quick_hide_one_root_dock, NULL);
519
void cairo_dock_stop_quick_hide (void)
522
if (s_bTemporaryAutoHide && s_bQuickHide && cairo_dock_search_window_on_our_way (g_bAutoHideOnMaximized, g_bAutoHideOnFullScreen) == NULL)
524
s_bTemporaryAutoHide = FALSE;
525
g_hash_table_foreach (s_hDocksTable, (GHFunc) _cairo_dock_stop_quick_hide_one_root_dock, NULL);
527
s_bQuickHide = FALSE;
530
void cairo_dock_allow_entrance (CairoDock *pDock)
532
pDock->bEntranceDisabled = FALSE;
535
void cairo_dock_disable_entrance (CairoDock *pDock)
537
pDock->bEntranceDisabled = TRUE;
540
gboolean cairo_dock_entrance_is_allowed (CairoDock *pDock)
542
return (! pDock->bEntranceDisabled);
545
gboolean cairo_dock_quick_hide_is_activated (void)
547
return s_bTemporaryAutoHide;
551
gboolean cairo_dock_window_hovers_dock (GtkAllocation *pWindowGeometry, CairoDock *pDock)
553
if (pWindowGeometry->width != 0 && pWindowGeometry->height != 0)
555
int iDockX = pDock->iWindowPositionX, iDockY = pDock->iWindowPositionY;
556
int iDockWidth = pDock->iCurrentWidth, iDockHeight = pDock->iCurrentHeight;
557
cd_message ("dock : (%d;%d) %dx%d", iDockX, iDockY, iDockWidth, iDockHeight);
558
if ((pWindowGeometry->x < iDockX + iDockWidth && pWindowGeometry->x + pWindowGeometry->width > iDockX) || (pWindowGeometry->y > iDockY + iDockHeight && pWindowGeometry->y + pWindowGeometry->height > iDockY))
560
cd_message (" empiete sur le dock");
566
cd_warning (" on ne peut pas dire ou elle est sur l'ecran, on va supposer qu'elle recouvre le dock");
573
void cairo_dock_synchronize_one_sub_dock_position (Icon *icon, CairoDock *pDock, gboolean bReloadBuffersIfNecessary)
575
if (icon->pSubDock != NULL)
577
cd_message ("%s (%s)", __func__, icon->acName);
578
if (icon->pSubDock->bDirectionUp != pDock->bDirectionUp || (icon->pSubDock->bDirectionUp != ((!g_bSameHorizontality) ^ pDock->bHorizontalDock)))
580
icon->pSubDock->bDirectionUp = pDock->bDirectionUp;
581
icon->pSubDock->bHorizontalDock = (!g_bSameHorizontality) ^ pDock->bHorizontalDock;
582
if (bReloadBuffersIfNecessary)
583
cairo_dock_reload_reflects_in_dock (icon->pSubDock);
584
cairo_dock_synchronize_sub_docks_position (icon->pSubDock, bReloadBuffersIfNecessary);
589
void cairo_dock_synchronize_sub_docks_position (CairoDock *pDock, gboolean bReloadBuffersIfNecessary)
593
for (ic = pDock->icons; ic != NULL; ic = ic->next)
596
cairo_dock_synchronize_one_sub_dock_position (icon, pDock, bReloadBuffersIfNecessary);
602
void cairo_dock_start_polling_screen_edge (CairoDock *pMainDock)
604
if (s_iSidPollScreenEdge == 0)
605
s_iSidPollScreenEdge = g_timeout_add (500, (GSourceFunc) cairo_dock_poll_screen_edge, (gpointer) pMainDock);
607
void cairo_dock_stop_polling_screen_edge (void)
609
if (s_iSidPollScreenEdge != 0)
611
g_source_remove (s_iSidPollScreenEdge);
612
s_iSidPollScreenEdge = 0;
616
static void _cairo_dock_pop_up_one_root_dock (gchar *cDockName, CairoDock *pDock, gpointer data)
618
if (pDock->iRefCount > 0)
620
CairoDockPositionType iScreenBorder = GPOINTER_TO_INT (data);
622
CairoDockPositionType iDockScreenBorder = (((! pDock->bHorizontalDock) << 1) | (! pDock->bDirectionUp));
623
if (iDockScreenBorder == iScreenBorder)
625
cd_message ("%s passe en avant-plan", cDockName);
626
cairo_dock_pop_up (pDock);
627
if (pDock->iSidPopDown == 0)
628
pDock->iSidPopDown = g_timeout_add (2000, (GSourceFunc) cairo_dock_pop_down, (gpointer) pDock); // au cas ou on serait pas dedans.
631
void cairo_dock_pop_up_root_docks_on_screen_edge (CairoDockPositionType iScreenBorder)
633
g_hash_table_foreach (s_hDocksTable, (GHFunc) _cairo_dock_pop_up_one_root_dock, GINT_TO_POINTER (iScreenBorder));
636
static void _cairo_dock_set_one_root_dock_on_top_layer (gchar *cDockName, CairoDock *pDock, gpointer data)
638
if (pDock->iRefCount > 0)
640
gtk_window_set_keep_below (GTK_WINDOW (pDock->pWidget), FALSE);
642
void cairo_dock_set_root_docks_on_top_layer (void)
644
g_hash_table_foreach (s_hDocksTable, (GHFunc) _cairo_dock_set_one_root_dock_on_top_layer, NULL);
648
gchar *cairo_dock_get_unique_dock_name (const gchar *cPrefix)
650
const gchar *cNamepattern = (cPrefix != NULL && *cPrefix != '\0' ? cPrefix : "dock");
651
GString *sNameString = g_string_new (cNamepattern);
654
while (g_hash_table_lookup (s_hDocksTable, sNameString->str) != NULL)
656
g_string_printf (sNameString, "%s-%d", cNamepattern, i);
660
gchar *cUniqueName = sNameString->str;
661
g_string_free (sNameString, FALSE);
666
void cairo_dock_show_hide_container (CairoContainer *pContainer)
668
if (pContainer == NULL)
670
if (! GTK_WIDGET_VISIBLE (pContainer->pWidget))
671
gtk_window_present (GTK_WINDOW (pContainer->pWidget));
673
gtk_widget_hide (pContainer->pWidget);