47
47
#include "cairo-dock-notifications.h"
48
48
#include "cairo-dock-callbacks.h"
49
49
#include "cairo-dock-launcher-factory.h"
50
#include "cairo-dock-gui-manager.h"
50
51
#include "cairo-dock-dialogs.h"
52
53
extern CairoDock *g_pMainDock;
53
54
extern gint g_iXScreenWidth[2], g_iXScreenHeight[2];
54
55
extern gint g_iScreenWidth[2], g_iScreenHeight[2];
55
extern int g_iScreenOffsetX, g_iScreenOffsetY;
56
56
extern gboolean g_bSticky;
57
57
extern gboolean g_bKeepAbove;
58
58
extern gboolean g_bUseOpenGL;
87
87
cd_debug ("debut d'attente...");
88
88
while (gtk_events_pending ())
89
89
gtk_main_iteration ();
90
cd_debug ("fin d'attente, bInside : %d\n", pDialog->bInside);
90
cd_debug ("fin d'attente, bInside : %d\n", pDialog->container.bInside);
91
91
int iMouseX, iMouseY;
92
gdk_window_get_pointer (pDialog->pWidget->window, &iMouseX, &iMouseY, NULL);
93
if (iMouseX > 0 && iMouseX < pDialog->iWidth && iMouseY > 0 && iMouseY < pDialog->iHeight)
92
gdk_window_get_pointer (pDialog->container.pWidget->window, &iMouseX, &iMouseY, NULL);
93
if (iMouseX > 0 && iMouseX < pDialog->container.iWidth && iMouseY > 0 && iMouseY < pDialog->container.iHeight)
95
95
cd_debug ("en fait on est dedans");
99
//cd_debug ("outside (%d;%d / %dx%d)", iMouseX, iMouseY, pDialog->iWidth, pDialog->iHeight);
100
pDialog->bInside = FALSE;
99
//cd_debug ("outside (%d;%d / %dx%d)", iMouseX, iMouseY, pDialog->container.iWidth, pDialog->container.iHeight);
100
pDialog->container.bInside = FALSE;
101
101
Icon *pIcon = pDialog->pIcon;
102
102
if (pIcon != NULL /*&& (pEvent->state & GDK_BUTTON1_MASK) == 0*/)
104
pDialog->iPositionX = pEvent->x_root;
105
pDialog->iPositionY = pEvent->y_root;
104
pDialog->container.iWindowPositionX = pEvent->x_root;
105
pDialog->container.iWindowPositionY = pEvent->y_root;
106
106
CairoContainer *pContainer = cairo_dock_search_container_from_icon (pIcon);
107
107
cairo_dock_place_dialog (pDialog, pContainer);
108
///gtk_widget_queue_draw (pDialog->pWidget);
108
///gtk_widget_queue_draw (pDialog->container.pWidget);
116
116
int iButtonX, iButtonY;
117
117
int i, n = pDialog->iNbButtons;
118
iButtonY = (pDialog->bDirectionUp ?
118
iButtonY = (pDialog->container.bDirectionUp ?
119
119
pDialog->iTopMargin + pDialog->iMessageHeight + pDialog->iInteractiveHeight + CAIRO_DIALOG_VGAP :
120
pDialog->iHeight - (pDialog->iTopMargin + pDialog->iButtonsHeight));
121
int iMinButtonX = .5 * (pDialog->iWidth - (n - 1) * CAIRO_DIALOG_BUTTON_GAP - n * myDialogs.iDialogButtonWidth);
120
pDialog->container.iHeight - (pDialog->iTopMargin + pDialog->iButtonsHeight));
121
int iMinButtonX = .5 * (pDialog->container.iWidth - (n - 1) * CAIRO_DIALOG_BUTTON_GAP - n * myDialogs.iDialogButtonWidth);
122
122
for (i = 0; i < pDialog->iNbButtons; i++)
124
124
iButtonX = iMinButtonX + i * (CAIRO_DIALOG_BUTTON_GAP + myDialogs.iDialogButtonWidth);
212
212
if (pDialog->iIconTexture != 0)
214
214
x = pDialog->iLeftMargin;
215
y = (pDialog->bDirectionUp ? pDialog->iTopMargin : pDialog->iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight));
215
y = (pDialog->container.bDirectionUp ? pDialog->iTopMargin : pDialog->container.iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight));
217
217
glBindTexture (GL_TEXTURE_2D, pDialog->iIconTexture);
218
218
_cairo_dock_apply_current_texture_portion_at_size_with_offset (1.*pDialog->iCurrentFrame/pDialog->iNbFrames, 0.,
219
219
1. / pDialog->iNbFrames, 1.,
220
220
pDialog->iIconSize, pDialog->iIconSize,
221
x + pDialog->iIconSize/2, pDialog->iHeight - y - pDialog->iIconSize/2);
221
x + pDialog->iIconSize/2, pDialog->container.iHeight - y - pDialog->iIconSize/2);
224
224
if (pDialog->iTextTexture != 0)
226
226
x = pDialog->iLeftMargin + pDialog->iIconSize + CAIRO_DIALOG_TEXT_MARGIN;
227
y = (pDialog->bDirectionUp ? pDialog->iTopMargin : pDialog->iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight));
227
y = (pDialog->container.bDirectionUp ? pDialog->iTopMargin : pDialog->container.iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight));
228
228
if (pDialog->iTextHeight < pDialog->iMessageHeight) // on centre le texte.
229
229
y += (pDialog->iMessageHeight - pDialog->iTextHeight) / 2;
243
243
_cairo_dock_apply_current_texture_portion_at_size_with_offset (0., 0.,
244
244
w / pDialog->iTextWidth, 1.,
245
245
w, pDialog->iTextHeight,
246
x + pDialog->iMaxTextWidth - w/2, pDialog->iHeight - y - pDialog->iTextHeight/2);
246
x + pDialog->iMaxTextWidth - w/2, pDialog->container.iHeight - y - pDialog->iTextHeight/2);
251
251
_cairo_dock_apply_current_texture_at_size_with_offset (pDialog->iTextWidth, pDialog->iTextHeight,
252
x + pDialog->iTextWidth/2, pDialog->iHeight - y - pDialog->iTextHeight/2);
252
x + pDialog->iTextWidth/2, pDialog->container.iHeight - y - pDialog->iTextHeight/2);
258
258
int iButtonX, iButtonY;
259
259
int i, n = pDialog->iNbButtons;
260
iButtonY = (pDialog->bDirectionUp ? pDialog->iTopMargin + pDialog->iMessageHeight + pDialog->iInteractiveHeight + CAIRO_DIALOG_VGAP : pDialog->iHeight - pDialog->iTopMargin - pDialog->iButtonsHeight - CAIRO_DIALOG_VGAP);
261
int iMinButtonX = .5 * (pDialog->iWidth - (n - 1) * CAIRO_DIALOG_BUTTON_GAP - n * myDialogs.iDialogButtonWidth);
260
iButtonY = (pDialog->container.bDirectionUp ? pDialog->iTopMargin + pDialog->iMessageHeight + pDialog->iInteractiveHeight + CAIRO_DIALOG_VGAP : pDialog->container.iHeight - pDialog->iTopMargin - pDialog->iButtonsHeight - CAIRO_DIALOG_VGAP);
261
int iMinButtonX = .5 * (pDialog->container.iWidth - (n - 1) * CAIRO_DIALOG_BUTTON_GAP - n * myDialogs.iDialogButtonWidth);
262
262
for (i = 0; i < pDialog->iNbButtons; i++)
264
264
iButtonX = iMinButtonX + i * (CAIRO_DIALOG_BUTTON_GAP + myDialogs.iDialogButtonWidth);
345
345
int iButtonX, iButtonY;
346
346
int i, n = pDialog->iNbButtons;
347
iButtonY = (pDialog->bDirectionUp ? pDialog->iTopMargin + pDialog->iMessageHeight + pDialog->iInteractiveHeight + CAIRO_DIALOG_VGAP : pDialog->iHeight - pDialog->iTopMargin - pDialog->iButtonsHeight - CAIRO_DIALOG_VGAP);
348
int iMinButtonX = .5 * (pDialog->iWidth - (n - 1) * CAIRO_DIALOG_BUTTON_GAP - n * myDialogs.iDialogButtonWidth);
347
iButtonY = (pDialog->container.bDirectionUp ? pDialog->iTopMargin + pDialog->iMessageHeight + pDialog->iInteractiveHeight + CAIRO_DIALOG_VGAP : pDialog->container.iHeight - pDialog->iTopMargin - pDialog->iButtonsHeight - CAIRO_DIALOG_VGAP);
348
int iMinButtonX = .5 * (pDialog->container.iWidth - (n - 1) * CAIRO_DIALOG_BUTTON_GAP - n * myDialogs.iDialogButtonWidth);
349
349
for (i = 0; i < pDialog->iNbButtons; i++)
351
351
iButtonX = iMinButtonX + i * (CAIRO_DIALOG_BUTTON_GAP + myDialogs.iDialogButtonWidth);
364
364
GdkEventExpose *pExpose,
365
365
CairoDialog *pDialog)
367
//cd_message ("%s (%dx%d)", __func__, pDialog->iWidth, pDialog->iHeight);
367
//cd_message ("%s (%dx%d)", __func__, pDialog->container.iWidth, pDialog->container.iHeight);
369
369
if (0 && g_bUseOpenGL && (pDialog->pDecorator == NULL || pDialog->pDecorator->render_opengl != NULL) && (pDialog->pRenderer == NULL || pDialog->pRenderer->render_opengl != NULL))
371
GdkGLContext *pGlContext = gtk_widget_get_gl_context (pDialog->pWidget);
372
GdkGLDrawable *pGlDrawable = gtk_widget_get_gl_drawable (pDialog->pWidget);
371
GdkGLContext *pGlContext = gtk_widget_get_gl_context (pDialog->container.pWidget);
372
GdkGLDrawable *pGlDrawable = gtk_widget_get_gl_drawable (pDialog->container.pWidget);
373
373
if (!gdk_gl_drawable_gl_begin (pGlDrawable, pGlContext))
388
388
cairo_dock_notify (CAIRO_DOCK_RENDER_DIALOG, pDialog, 1.);
389
if (pDialog->fReflectAlpha != 0)
389
if (pDialog->container.bUseReflect)
391
391
glTranslatef (0.,
392
pDialog->iHeight - 2* (pDialog->iTopMargin + pDialog->iBubbleHeight),
392
pDialog->container.iHeight - 2* (pDialog->iTopMargin + pDialog->iBubbleHeight),
394
394
glScalef (1., -1., 1.);
395
cairo_dock_notify (CAIRO_DOCK_RENDER_DIALOG, pDialog, pDialog->fReflectAlpha);
395
cairo_dock_notify (CAIRO_DOCK_RENDER_DIALOG, pDialog, pDialog->container.fRatio);
398
398
if (gdk_gl_drawable_is_double_buffered (pGlDrawable))
522
522
cairo_dock_compute_dialog_sizes (pDialog);
525
if ((iWidth != pEvent->width || iHeight != pEvent->height))
525
if (iWidth != pEvent->width || iHeight != pEvent->height)
527
527
if ((pEvent->width != CAIRO_DIALOG_MIN_SIZE || pEvent->height != CAIRO_DIALOG_MIN_SIZE) && (pEvent->width < iWidth || pEvent->height < iHeight))
529
529
//g_print ("non, on a dit %dx%d !\n", pDialog->iBubbleWidth + pDialog->iLeftMargin + pDialog->iRightMargin,
530
530
// pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iDistanceToDock);
531
gtk_window_resize (GTK_WINDOW (pDialog->pWidget),
531
gtk_window_resize (GTK_WINDOW (pDialog->container.pWidget),
532
532
pDialog->iBubbleWidth + pDialog->iLeftMargin + pDialog->iRightMargin,
533
533
pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iDistanceToDock);
535
pDialog->iWidth = pEvent->width;
536
pDialog->iHeight = pEvent->height;
535
pDialog->container.iWidth = pEvent->width;
536
pDialog->container.iHeight = pEvent->height;
538
if (pDialog->pIcon != NULL && ! pDialog->bInside)
538
if (pDialog->pIcon != NULL && ! pDialog->container.bInside)
540
540
CairoContainer *pContainer = cairo_dock_search_container_from_icon (pDialog->pIcon);
541
//g_print ("configure (%d) => place (%s, %s, %x)\n", pDialog->bInside, pDialog->pIcon->acName, pDialog->pIcon->cParentDockName, pContainer);
541
//g_print ("configure (%d) => place (%s, %s, %x)\n", pDialog->container.bInside, pDialog->pIcon->cName, pDialog->pIcon->cParentDockName, pContainer);
542
542
cairo_dock_place_dialog (pDialog, pContainer);
545
gtk_widget_queue_draw (pDialog->pWidget); // les widgets internes peuvent avoir changer de taille sans que le dialogue n'en ait change, il faut donc redessiner tout le temps.
545
gtk_widget_queue_draw (pDialog->container.pWidget); // les widgets internes peuvent avoir changer de taille sans que le dialogue n'en ait change, il faut donc redessiner tout le temps.
551
gboolean on_unmap_dialog (GtkWidget* pWidget,
553
CairoDialog *pDialog)
555
g_print ("unmap (bAllowMinimize:%d)\n", pDialog->bAllowMinimize);
556
if (! pDialog->bAllowMinimize)
557
gtk_window_present (GTK_WINDOW (pWidget));
559
pDialog->bAllowMinimize = FALSE;
560
return TRUE; // stops other handlers from being invoked for the event.
550
564
static cairo_surface_t *_cairo_dock_load_button_icon (cairo_t *pCairoContext, const gchar *cButtonImage, const gchar *cDefaultButtonImage)
552
566
//g_print ("%s (%d ; %d)\n", __func__, myDialogs.iDialogButtonWidth, myDialogs.iDialogButtonHeight);
553
cairo_surface_t *pButtonSurface = cairo_dock_load_image_for_icon (pCairoContext,
567
cairo_surface_t *pButtonSurface = cairo_dock_create_surface_from_image_simple (cButtonImage,
555
569
myDialogs.iDialogButtonWidth,
556
570
myDialogs.iDialogButtonHeight);
634
static void _cairo_dock_isolate_dialog (CairoDialog *pDialog)
649
gboolean cairo_dock_dialog_unreference (CairoDialog *pDialog)
651
//g_print ("%s (%d)\n", __func__, pDialog->iRefCount);
652
if (pDialog != NULL && pDialog->iRefCount > 0)
654
pDialog->iRefCount --;
655
if (pDialog->iRefCount == 0) // devient nul.
657
cairo_dock_free_dialog (pDialog);
661
return FALSE; // il n'est pas mort.
667
void cairo_dock_free_dialog (CairoDialog *pDialog)
637
669
if (pDialog == NULL)
640
672
if (pDialog->iSidTimer > 0)
642
674
g_source_remove (pDialog->iSidTimer);
652
684
g_source_remove (pDialog->iSidAnimateText);
653
685
pDialog->iSidAnimateText = 0;
656
g_signal_handlers_disconnect_by_func (pDialog->pWidget, on_expose_dialog, NULL);
657
g_signal_handlers_disconnect_by_func (pDialog->pWidget, on_button_press_dialog, NULL);
658
g_signal_handlers_disconnect_by_func (pDialog->pWidget, on_configure_dialog, NULL);
659
g_signal_handlers_disconnect_by_func (pDialog->pWidget, on_enter_dialog, NULL);
660
g_signal_handlers_disconnect_by_func (pDialog->pWidget, on_leave_dialog, NULL);
662
pDialog->action_on_answer = NULL;
664
pDialog->pIcon = NULL;
666
gboolean cairo_dock_dialog_unreference (CairoDialog *pDialog)
668
//g_print ("%s (%d)\n", __func__, pDialog->iRefCount);
669
if (pDialog != NULL && pDialog->iRefCount > 0)
671
pDialog->iRefCount --;
672
if (pDialog->iRefCount == 0) // devient nul.
674
_cairo_dock_isolate_dialog (pDialog);
675
cairo_dock_free_dialog (pDialog);
679
return FALSE; // il n'est pas mort.
685
void cairo_dock_free_dialog (CairoDialog *pDialog)
691
689
s_pDialogList = g_slist_remove (s_pDialogList, pDialog);
716
714
g_free (pDialog->pButtons);
719
gtk_widget_destroy (pDialog->pWidget); // detruit aussi le widget interactif.
717
gtk_widget_destroy (pDialog->container.pWidget); // detruit aussi le widget interactif.
721
719
if (pDialog->pUserData != NULL && pDialog->pFreeUserDataFunc != NULL)
722
720
pDialog->pFreeUserDataFunc (pDialog->pUserData);
722
if (pDialog->pIcon && pDialog->pIcon->cParentDockName != NULL)
723
cairo_dock_dialog_window_destroyed ();
724
724
g_free (pDialog);
727
727
gboolean cairo_dock_remove_dialog_if_any (Icon *icon)
729
729
g_return_val_if_fail (icon != NULL, FALSE);
730
cd_debug ("%s (%s)", __func__, (icon?icon->acName : "nobody"));
730
cd_debug ("%s (%s)", __func__, (icon?icon->cName : "nobody"));
731
731
CairoDialog *pDialog;
733
733
gboolean bDialogRemoved = FALSE;
804
804
//\________________ On cree un dialogue qu'on insere immediatement dans la liste.
805
805
CairoDialog *pDialog = g_new0 (CairoDialog, 1);
806
pDialog->iType = CAIRO_DOCK_TYPE_DIALOG;
806
pDialog->container.iType = CAIRO_DOCK_TYPE_DIALOG;
807
807
pDialog->iRefCount = 1;
808
pDialog->fRatio = 1.;
809
pDialog->iAnimationDeltaT = mySystem.iCairoAnimationDeltaT;
808
pDialog->container.fRatio = 1.;
809
pDialog->container.iAnimationDeltaT = mySystem.iCairoAnimationDeltaT;
810
810
s_pDialogList = g_slist_prepend (s_pDialogList, pDialog);
812
812
//\________________ On construit la fenetre du dialogue.
813
813
//GtkWidget* pWindow = gtk_window_new (bInteractiveWindow ? GTK_WINDOW_TOPLEVEL : GTK_WINDOW_POPUP); // les popus ne prennent pas le focus. En fait, ils ne sont meme pas controles par le WM.
814
814
GtkWidget* pWindow = cairo_dock_create_container_window_no_opengl ();
816
pDialog->pWidget = pWindow;
816
pDialog->container.pWidget = pWindow;
818
818
//gtk_window_set_keep_above (GTK_WINDOW (pWindow), g_bKeepAbove || myAccessibility.bPopUp);
819
819
gtk_window_set_gravity (GTK_WINDOW (pWindow), GDK_GRAVITY_STATIC);
821
821
gtk_window_set_title (GTK_WINDOW (pWindow), "cairo-dock-dialog");
822
822
if (! bInteractive)
823
gtk_window_set_type_hint (GTK_WINDOW (pDialog->pWidget), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); // pour ne pas prendre le focus.
823
gtk_window_set_type_hint (GTK_WINDOW (pDialog->container.pWidget), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); // pour ne pas prendre le focus.
825
825
gtk_widget_add_events (pWindow, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
826
826
gtk_window_resize (GTK_WINDOW (pWindow), CAIRO_DIALOG_MIN_SIZE, CAIRO_DIALOG_MIN_SIZE);
954
955
//\________________ On prend en compte les boutons.
955
if (pAttribute->cButtonsImage != NULL && pAttribute->pActionFunc != NULL)
957
pDialog->action_on_answer = pAttribute->pActionFunc;
956
pDialog->action_on_answer = pAttribute->pActionFunc;
958
957
pDialog->pUserData = pAttribute->pUserData;
959
958
pDialog->pFreeUserDataFunc = pAttribute->pFreeDataFunc;
959
if (pAttribute->cButtonsImage != NULL && pAttribute->pActionFunc != NULL)
961
961
if (s_pButtonOkSurface == NULL || s_pButtonCancelSurface == NULL)
962
962
cairo_dock_load_dialog_buttons (CAIRO_CONTAINER (pDialog), myDialogs.cButtonOkImage, myDialogs.cButtonCancelImage);
1006
1006
//\________________ Maintenant qu'on connait tout, on calcule les tailles des divers elements.
1007
1007
cairo_dock_compute_dialog_sizes (pDialog);
1010
cairo_dock_place_dialog (pDialog, pContainer); // renseigne aussi bDirectionUp, bIsHorizontal, et iHeight.
1009
1013
//\________________ On reserve l'espace pour les decorations.
1010
1014
GtkWidget *pMainHBox = gtk_hbox_new (0, FALSE);
1011
gtk_container_add (GTK_CONTAINER (pDialog->pWidget), pMainHBox);
1015
gtk_container_add (GTK_CONTAINER (pDialog->container.pWidget), pMainHBox);
1012
1016
pDialog->pLeftPaddingBox = gtk_vbox_new (0, FALSE);
1013
1017
gtk_widget_set (pDialog->pLeftPaddingBox, "width-request", pDialog->iLeftMargin, NULL);
1014
1018
gtk_box_pack_start (GTK_BOX (pMainHBox),
1053
1059
pDialog->pButtonsWidget = cairo_dock_add_dialog_internal_box (pDialog, pDialog->iButtonsWidth, pDialog->iButtonsHeight, FALSE);
1055
pDialog->pTipWidget = cairo_dock_add_dialog_internal_box (pDialog, 0, pDialog->iMinBottomGap + pDialog->iBottomMargin, TRUE);
1061
if (pDialog->container.bDirectionUp)
1062
pDialog->pTipWidget = cairo_dock_add_dialog_internal_box (pDialog, 0, pDialog->iMinBottomGap + pDialog->iBottomMargin, TRUE);
1057
gtk_widget_show_all (pDialog->pWidget);
1064
gtk_widget_show_all (pDialog->container.pWidget);
1059
1066
//\________________ On connecte les signaux utiles.
1060
g_signal_connect (G_OBJECT (pDialog->pWidget),
1067
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1061
1068
"expose-event",
1062
1069
G_CALLBACK (on_expose_dialog),
1064
g_signal_connect (G_OBJECT (pDialog->pWidget),
1071
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1065
1072
"configure-event",
1066
1073
G_CALLBACK (on_configure_dialog),
1068
g_signal_connect (G_OBJECT (pDialog->pWidget),
1075
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1069
1076
"button-press-event",
1070
1077
G_CALLBACK (on_button_press_dialog),
1072
g_signal_connect (G_OBJECT (pDialog->pWidget),
1079
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1073
1080
"button-release-event",
1074
1081
G_CALLBACK (on_button_press_dialog),
1076
g_signal_connect (G_OBJECT (pDialog->pWidget),
1083
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1077
1084
"key-press-event",
1078
1085
G_CALLBACK (on_key_press_dialog),
1080
1087
if (pIcon != NULL) // on inhibe le deplacement du dialogue lorsque l'utilisateur est dedans.
1082
g_signal_connect (G_OBJECT (pDialog->pWidget),
1089
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1083
1090
"enter-notify-event",
1084
1091
G_CALLBACK (on_enter_dialog),
1086
g_signal_connect (G_OBJECT (pDialog->pWidget),
1093
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1087
1094
"leave-notify-event",
1088
1095
G_CALLBACK (on_leave_dialog),
1092
cairo_dock_place_dialog (pDialog, pContainer); // renseigne aussi bDirectionUp, bIsHorizontal, et iHeight.
1098
g_signal_connect (G_OBJECT (pDialog->container.pWidget),
1100
G_CALLBACK (on_unmap_dialog),
1103
///cairo_dock_place_dialog (pDialog, pContainer); // renseigne aussi bDirectionUp, bIsHorizontal, et iHeight.
1094
1105
cairo_destroy (pSourceContext);
1096
1107
if (pAttribute->iTimeLength != 0)
1097
1108
pDialog->iSidTimer = g_timeout_add (pAttribute->iTimeLength, (GSourceFunc) _cairo_dock_dialog_auto_delete, (gpointer) pDialog);
1110
if (pIcon->cParentDockName != NULL)
1111
cairo_dock_dialog_window_created ();
1099
1112
return pDialog;
1109
1122
CairoDock *pDock = CAIRO_DOCK (pContainer);
1110
1123
if (pDock->iRefCount == 0 && pDock->bAtBottom) // un dock principal au repos.
1112
*bIsHorizontal = (pDock->bHorizontalDock == CAIRO_DOCK_HORIZONTAL);
1113
if (pDock->bHorizontalDock)
1125
*bIsHorizontal = (pDock->container.bIsHorizontal == CAIRO_DOCK_HORIZONTAL);
1126
if (pDock->container.bIsHorizontal)
1115
1128
*bRight = (pIcon->fXAtRest > pDock->fFlatDockWidth / 2);
1116
*bDirectionUp = (pDock->iWindowPositionY > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1117
*iY = (*bDirectionUp ? pDock->iWindowPositionY : pDock->iWindowPositionY + pDock->iCurrentHeight);
1129
*bDirectionUp = (pDock->container.iWindowPositionY > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1130
*iY = (*bDirectionUp ? pDock->container.iWindowPositionY : pDock->container.iWindowPositionY + pDock->container.iHeight);
1121
*bRight = (pDock->iWindowPositionY < g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] / 2);
1134
*bRight = (pDock->container.iWindowPositionY < g_iScreenWidth[CAIRO_DOCK_HORIZONTAL] / 2);
1122
1135
*bDirectionUp = (pIcon->fXAtRest > pDock->fFlatDockWidth / 2);
1123
*iY = (! (*bRight) ? pDock->iWindowPositionY : pDock->iWindowPositionY + pDock->iCurrentHeight);
1136
*iY = (! (*bRight) ? pDock->container.iWindowPositionY : pDock->container.iWindowPositionY + pDock->container.iHeight);
1126
1139
if (pDock->bAutoHide)
1128
*iX = pDock->iWindowPositionX +
1129
(pIcon->fXAtRest + pIcon->fWidth * (.5 + (*bRight ? .2 : -.2) * 2*(.5-fAlign))) / pDock->fFlatDockWidth * myHiddenDock.iVisibleZoneWidth;
1141
*iX = pDock->container.iWindowPositionX +
1142
(pIcon->fXAtRest + pIcon->fWidth * (.5 + (*bRight ? .2 : -.2) * 2*(.5-fAlign))) / pDock->fFlatDockWidth * myAccessibility.iVisibleZoneWidth;
1130
1143
cd_debug ("placement sur un dock cache -> %d", *iX);
1134
*iX = pDock->iWindowPositionX +
1147
*iX = pDock->container.iWindowPositionX +
1135
1148
pIcon->fDrawX + pIcon->fWidth * pIcon->fScale * (.5 + (*bRight ? .2 : -.2) * 2*(.5-fAlign));
1138
else if (pDock->iRefCount > 0 && ! GTK_WIDGET_VISIBLE (pDock->pWidget)) // sous-dock invisible. // pDock->bAtBottom
1151
else if (pDock->iRefCount > 0 && ! GTK_WIDGET_VISIBLE (pDock->container.pWidget)) // sous-dock invisible. // pDock->bAtBottom
1140
1153
CairoDock *pParentDock = NULL;
1141
1154
Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pDock, &pParentDock);
1144
1157
else // dock actif.
1146
*bIsHorizontal = (pDock->bHorizontalDock == CAIRO_DOCK_HORIZONTAL);
1147
if (pDock->bHorizontalDock)
1159
*bIsHorizontal = (pDock->container.bIsHorizontal == CAIRO_DOCK_HORIZONTAL);
1160
if (pDock->container.bIsHorizontal)
1149
1162
*bRight = (pIcon->fXAtRest > pDock->fFlatDockWidth / 2);
1150
*bDirectionUp = (pDock->iWindowPositionY > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1151
*iY = (*bDirectionUp ? pDock->iWindowPositionY : pDock->iWindowPositionY + pDock->iCurrentHeight);
1163
*bDirectionUp = (pDock->container.iWindowPositionY > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1164
*iY = (*bDirectionUp ? pDock->container.iWindowPositionY : pDock->container.iWindowPositionY + pDock->container.iHeight);
1155
*bRight = (pDock->iWindowPositionY < g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] / 2);
1168
*bRight = (pDock->container.iWindowPositionY < g_iScreenWidth[CAIRO_DOCK_HORIZONTAL] / 2);
1156
1169
*bDirectionUp = (pIcon->fXAtRest > pDock->fFlatDockWidth / 2);
1157
*iY = (! (*bRight) ? pDock->iWindowPositionY : pDock->iWindowPositionY + pDock->iCurrentHeight);
1170
*iY = (! (*bRight) ? pDock->container.iWindowPositionY : pDock->container.iWindowPositionY + pDock->container.iHeight);
1159
*iX = pDock->iWindowPositionX + pIcon->fDrawX + pIcon->fWidth * pIcon->fScale * pIcon->fWidthFactor / 2 + pIcon->fWidth * (*bRight ? .2 : - .2);
1172
*iX = pDock->container.iWindowPositionX + pIcon->fDrawX + pIcon->fWidth * pIcon->fScale * pIcon->fWidthFactor / 2 + pIcon->fWidth * (*bRight ? .2 : - .2);
1162
1175
else if (CAIRO_DOCK_IS_DESKLET (pContainer))
1164
1177
CairoDesklet *pDesklet = CAIRO_DESKLET (pContainer);
1165
*bDirectionUp = (pDesklet->iWindowPositionY > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1166
*bIsHorizontal = (pDesklet->iWindowPositionX > 50 && pDesklet->iWindowPositionX + pDesklet->iHeight < g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - 50);
1178
*bDirectionUp = (pDesklet->container.iWindowPositionY > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1179
*bIsHorizontal = (pDesklet->container.iWindowPositionX > 50 && pDesklet->container.iWindowPositionX + pDesklet->container.iHeight < g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - 50);
1168
1181
if (*bIsHorizontal)
1170
*bRight = (pDesklet->iWindowPositionX > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1171
*iX = pDesklet->iWindowPositionX + pDesklet->iWidth * (*bRight ? .7 : .3);
1172
*iY = (*bDirectionUp ? pDesklet->iWindowPositionY : pDesklet->iWindowPositionY + pDesklet->iHeight);
1183
*bRight = (pDesklet->container.iWindowPositionX > g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1184
*iX = pDesklet->container.iWindowPositionX + pDesklet->container.iWidth * (*bRight ? .7 : .3);
1185
*iY = (*bDirectionUp ? pDesklet->container.iWindowPositionY : pDesklet->container.iWindowPositionY + pDesklet->container.iHeight);
1176
*bRight = (pDesklet->iWindowPositionX < g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1177
*iY = pDesklet->iWindowPositionX + pDesklet->iWidth * (*bRight ? 1 : 0);
1178
*iX =pDesklet->iWindowPositionY + pDesklet->iHeight / 2;
1189
*bRight = (pDesklet->container.iWindowPositionX < g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] / 2);
1190
*iY = pDesklet->container.iWindowPositionX + pDesklet->container.iWidth * (*bRight ? 1 : 0);
1191
*iX =pDesklet->container.iWindowPositionY + pDesklet->container.iHeight / 2;
1184
1197
static void _cairo_dock_dialog_find_optimal_placement (CairoDialog *pDialog)
1186
//g_print ("%s (Ybulle:%d; width:%d)\n", __func__, pDialog->iPositionY, pDialog->iWidth);
1187
g_return_if_fail (pDialog->iPositionY > 0);
1199
//g_print ("%s (Ybulle:%d; width:%d)\n", __func__, pDialog->container.iWindowPositionY, pDialog->container.iWidth);
1200
g_return_if_fail (pDialog->container.iWindowPositionY > 0);
1190
1203
CairoDialog *pDialogOnOurWay;
1192
double fXLeft = 0, fXRight = g_iXScreenWidth[pDialog->bIsHorizontal];
1205
double fXLeft = 0, fXRight = g_iXScreenWidth[pDialog->container.bIsHorizontal];
1193
1206
if (pDialog->bRight)
1196
fXRight = MAX (g_iXScreenWidth[pDialog->bIsHorizontal], pDialog->iAimedX + pDialog->iMinFrameWidth + pDialog->iRightMargin + 1); // 2*CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE
1209
fXRight = MAX (g_iXScreenWidth[pDialog->container.bIsHorizontal], pDialog->iAimedX + pDialog->iMinFrameWidth + pDialog->iRightMargin + 1); // 2*CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE
1212
1225
if (pDialogOnOurWay != pDialog)
1214
if (GTK_WIDGET_VISIBLE (pDialogOnOurWay->pWidget) && pDialogOnOurWay->pIcon != NULL)
1227
if (GTK_WIDGET_VISIBLE (pDialogOnOurWay->container.pWidget) && pDialogOnOurWay->pIcon != NULL)
1216
iYInf = (pDialog->bDirectionUp ? pDialogOnOurWay->iPositionY : pDialogOnOurWay->iPositionY + pDialogOnOurWay->iHeight - (pDialogOnOurWay->iBubbleHeight + 0));
1217
iYSup = (pDialog->bDirectionUp ? pDialogOnOurWay->iPositionY + pDialogOnOurWay->iBubbleHeight + 0 : pDialogOnOurWay->iPositionY + pDialogOnOurWay->iHeight);
1218
if (iYInf < pDialog->iPositionY + pDialog->iBubbleHeight + 0 && iYSup > pDialog->iPositionY)
1229
iYInf = (pDialog->container.bDirectionUp ? pDialogOnOurWay->container.iWindowPositionY : pDialogOnOurWay->container.iWindowPositionY + pDialogOnOurWay->container.iHeight - (pDialogOnOurWay->iBubbleHeight + 0));
1230
iYSup = (pDialog->container.bDirectionUp ? pDialogOnOurWay->container.iWindowPositionY + pDialogOnOurWay->iBubbleHeight + 0 : pDialogOnOurWay->container.iWindowPositionY + pDialogOnOurWay->container.iHeight);
1231
if (iYInf < pDialog->container.iWindowPositionY + pDialog->iBubbleHeight + 0 && iYSup > pDialog->container.iWindowPositionY)
1220
//g_print ("pDialogOnOurWay : %d - %d ; pDialog : %d - %d\n", iYInf, iYSup, pDialog->iPositionY, pDialog->iPositionY + (pDialog->iBubbleHeight + 2 * myBackground.iDockLineWidth));
1233
//g_print ("pDialogOnOurWay : %d - %d ; pDialog : %d - %d\n", iYInf, iYSup, pDialog->container.iWindowPositionY, pDialog->container.iWindowPositionY + (pDialog->iBubbleHeight + 2 * myBackground.iDockLineWidth));
1221
1234
if (pDialogOnOurWay->iAimedX < pDialog->iAimedX)
1222
fXLeft = MAX (fXLeft, pDialogOnOurWay->iPositionX + pDialogOnOurWay->iWidth);
1235
fXLeft = MAX (fXLeft, pDialogOnOurWay->container.iWindowPositionX + pDialogOnOurWay->container.iWidth);
1224
fXRight = MIN (fXRight, pDialogOnOurWay->iPositionX);
1237
fXRight = MIN (fXRight, pDialogOnOurWay->container.iWindowPositionX);
1225
1238
bCollision = TRUE;
1226
fNextYStep = (pDialog->bDirectionUp ? MAX (fNextYStep, iYInf) : MIN (fNextYStep, iYSup));
1239
fNextYStep = (pDialog->container.bDirectionUp ? MAX (fNextYStep, iYInf) : MIN (fNextYStep, iYSup));
1231
1244
//g_print (" -> [%.2f ; %.2f]\n", fXLeft, fXRight);
1233
if ((fXRight - fXLeft > pDialog->iWidth) && (
1246
if ((fXRight - fXLeft > pDialog->container.iWidth) && (
1234
1247
(pDialog->bRight && fXLeft + pDialog->iLeftMargin < pDialog->iAimedX && fXRight > pDialog->iAimedX + pDialog->iMinFrameWidth + pDialog->iRightMargin)
1236
1249
(! pDialog->bRight && fXLeft < pDialog->iAimedX - pDialog->iMinFrameWidth - pDialog->iLeftMargin && fXRight > pDialog->iAimedX + pDialog->iRightMargin)
1239
1252
if (pDialog->bRight)
1240
pDialog->iPositionX = MIN (pDialog->iAimedX - pDialog->fAlign * pDialog->iBubbleWidth - pDialog->iLeftMargin, fXRight - pDialog->iWidth);
1253
pDialog->container.iWindowPositionX = MIN (pDialog->iAimedX - pDialog->fAlign * pDialog->iBubbleWidth - pDialog->iLeftMargin, fXRight - pDialog->container.iWidth);
1242
pDialog->iPositionX = MAX (pDialog->iAimedX - pDialog->iRightMargin - pDialog->iWidth + pDialog->fAlign * pDialog->iBubbleWidth, fXLeft); /// pDialog->iBubbleWidth (?)
1255
pDialog->container.iWindowPositionX = MAX (pDialog->iAimedX - pDialog->iRightMargin - pDialog->container.iWidth + pDialog->fAlign * pDialog->iBubbleWidth, fXLeft); /// pDialog->iBubbleWidth (?)
1246
//g_print (" * Aim : (%d ; %d) ; Width : %d\n", pDialog->iAimedX, pDialog->iAimedY, pDialog->iWidth);
1247
pDialog->iPositionY = fNextYStep - (pDialog->bDirectionUp ? pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin : 0);
1259
//g_print (" * Aim : (%d ; %d) ; Width : %d\n", pDialog->iAimedX, pDialog->iAimedY, pDialog->container.iWidth);
1260
pDialog->container.iWindowPositionY = fNextYStep - (pDialog->container.bDirectionUp ? pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin : 0);
1248
1261
_cairo_dock_dialog_find_optimal_placement (pDialog);
1252
1265
void cairo_dock_place_dialog (CairoDialog *pDialog, CairoContainer *pContainer)
1254
1267
//g_print ("%s (%x;%d)\n", __func__, pDialog->pIcon, pContainer);
1255
int iPrevPositionX = pDialog->iPositionX, iPrevPositionY = pDialog->iPositionY;
1268
int iPrevPositionX = pDialog->container.iWindowPositionX, iPrevPositionY = pDialog->container.iWindowPositionY;
1256
1269
if (pContainer != NULL && pDialog->pIcon != NULL)
1258
cairo_dock_dialog_calculate_aimed_point (pDialog->pIcon, pContainer, &pDialog->iAimedX, &pDialog->iAimedY, &pDialog->bRight, &pDialog->bIsHorizontal, &pDialog->bDirectionUp, pDialog->fAlign);
1259
//g_print (" Aim (%d;%d) / %d,%d,%d\n", pDialog->iAimedX, pDialog->iAimedY, pDialog->bIsHorizontal, pDialog->bDirectionUp, pDialog->bInside);
1271
cairo_dock_dialog_calculate_aimed_point (pDialog->pIcon, pContainer, &pDialog->iAimedX, &pDialog->iAimedY, &pDialog->bRight, &pDialog->container.bIsHorizontal, &pDialog->container.bDirectionUp, pDialog->fAlign);
1272
//g_print (" Aim (%d;%d) / %d,%d,%d\n", pDialog->iAimedX, pDialog->iAimedY, pDialog->container.bIsHorizontal, pDialog->container.bDirectionUp, pDialog->container.bInside);
1261
if (pDialog->bIsHorizontal)
1274
if (pDialog->container.bIsHorizontal)
1263
if (! pDialog->bInside)
1276
if (! pDialog->container.bInside)
1265
pDialog->iPositionY = (pDialog->bDirectionUp ? pDialog->iAimedY - (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iMinBottomGap) : pDialog->iAimedY + pDialog->iMinBottomGap); // on place la bulle d'abord sans prendre en compte la pointe.
1278
pDialog->container.iWindowPositionY = (pDialog->container.bDirectionUp ? pDialog->iAimedY - (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iMinBottomGap) : pDialog->iAimedY + pDialog->iMinBottomGap); // on place la bulle d'abord sans prendre en compte la pointe.
1266
1279
_cairo_dock_dialog_find_optimal_placement (pDialog);
1268
else if (! pDialog->bDirectionUp)
1269
pDialog->iPositionY += pDialog->iDistanceToDock;
1281
else if (! pDialog->container.bDirectionUp)
1282
pDialog->container.iWindowPositionY += pDialog->iDistanceToDock;
1273
1286
int tmp = pDialog->iAimedX;
1274
1287
pDialog->iAimedX = pDialog->iAimedY;
1275
1288
pDialog->iAimedY = tmp;
1276
if (! pDialog->bInside)
1289
if (! pDialog->container.bInside)
1278
pDialog->iPositionX = (pDialog->bRight ? pDialog->iAimedX - pDialog->fAlign * pDialog->iBubbleWidth : pDialog->iAimedX - pDialog->iWidth + pDialog->fAlign * pDialog->iBubbleWidth);
1279
pDialog->iPositionY = (pDialog->bDirectionUp ? pDialog->iAimedY - (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iMinBottomGap) : pDialog->iAimedY + pDialog->iMinBottomGap); // on place la bulle (et non pas la fenetre) sans faire d'optimisation.
1291
pDialog->container.iWindowPositionX = (pDialog->bRight ? pDialog->iAimedX - pDialog->fAlign * pDialog->iBubbleWidth : pDialog->iAimedX - pDialog->container.iWidth + pDialog->fAlign * pDialog->iBubbleWidth);
1292
pDialog->container.iWindowPositionY = (pDialog->container.bDirectionUp ? pDialog->iAimedY - (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iMinBottomGap) : pDialog->iAimedY + pDialog->iMinBottomGap); // on place la bulle (et non pas la fenetre) sans faire d'optimisation.
1282
//g_print (" => position : (%d;%d)\n", pDialog->iPositionX, pDialog->iPositionY);
1295
//g_print (" => position : (%d;%d)\n", pDialog->container.iWindowPositionX, pDialog->container.iWindowPositionY);
1283
1296
int iOldDistance = pDialog->iDistanceToDock;
1284
pDialog->iDistanceToDock = (pDialog->bDirectionUp ? pDialog->iAimedY - pDialog->iPositionY - (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin) : pDialog->iPositionY - pDialog->iAimedY);
1285
if (! pDialog->bDirectionUp) // iPositionY est encore la position du coin haut gauche de la bulle et non de la fenetre.
1286
pDialog->iPositionY = pDialog->iAimedY;
1297
pDialog->iDistanceToDock = (pDialog->container.bDirectionUp ? pDialog->iAimedY - pDialog->container.iWindowPositionY - (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin) : pDialog->container.iWindowPositionY - pDialog->iAimedY);
1298
if (! pDialog->container.bDirectionUp) // iPositionY est encore la position du coin haut gauche de la bulle et non de la fenetre.
1299
pDialog->container.iWindowPositionY = pDialog->iAimedY;
1288
1301
if (pDialog->iDistanceToDock != iOldDistance)
1293
1306
if ((iOldDistance == 0) || (pDialog->iDistanceToDock < iOldDistance))
1295
1308
//g_print (" cela reduit la fenetre a %dx%d\n", pDialog->iBubbleWidth + pDialog->iLeftMargin + pDialog->iRightMargin, pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iDistanceToDock);
1296
gtk_window_resize (GTK_WINDOW (pDialog->pWidget),
1309
gtk_window_resize (GTK_WINDOW (pDialog->container.pWidget),
1297
1310
pDialog->iBubbleWidth + pDialog->iLeftMargin + pDialog->iRightMargin,
1298
1311
pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin + pDialog->iDistanceToDock);
1302
1315
else // au milieu de l'ecran courant.
1304
pDialog->bDirectionUp = TRUE;
1305
pDialog->iPositionX = g_iScreenOffsetX + (g_iScreenWidth [CAIRO_DOCK_HORIZONTAL] - pDialog->iWidth) / 2;
1306
pDialog->iPositionY = g_iScreenOffsetY + (g_iScreenHeight[CAIRO_DOCK_HORIZONTAL] - pDialog->iHeight) / 2;
1307
pDialog->iHeight = pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin;
1308
//g_print (" au milieu de l'ecran (%d;%d) %dx%d\n", pDialog->iPositionX, pDialog->iPositionY, pDialog->iWidth, pDialog->iHeight);
1317
pDialog->container.bDirectionUp = TRUE;
1318
pDialog->container.iWindowPositionX = (g_pMainDock ? g_pMainDock->iScreenOffsetX : 0) + (g_iScreenWidth [CAIRO_DOCK_HORIZONTAL] - pDialog->container.iWidth) / 2;
1319
pDialog->container.iWindowPositionY = (g_pMainDock ? g_pMainDock->iScreenOffsetY : 0) + (g_iScreenHeight[CAIRO_DOCK_HORIZONTAL] - pDialog->container.iHeight) / 2;
1320
pDialog->container.iHeight = pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin;
1321
//g_print (" au milieu de l'ecran (%d;%d) %dx%d\n", pDialog->container.iWindowPositionX, pDialog->container.iWindowPositionY, pDialog->container.iWidth, pDialog->container.iHeight);
1310
gtk_window_resize (GTK_WINDOW (pDialog->pWidget),
1323
gtk_window_resize (GTK_WINDOW (pDialog->container.pWidget),
1311
1324
pDialog->iBubbleWidth + pDialog->iLeftMargin + pDialog->iRightMargin,
1312
1325
pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin);
1315
if (iPrevPositionX != pDialog->iPositionX || iPrevPositionY != pDialog->iPositionY)
1328
if (iPrevPositionX != pDialog->container.iWindowPositionX || iPrevPositionY != pDialog->container.iWindowPositionY)
1317
//g_print (" => move to (%d;%d) %dx%d\n", pDialog->iPositionX, pDialog->iPositionY, pDialog->iWidth, pDialog->iHeight);
1318
gtk_window_move (GTK_WINDOW (pDialog->pWidget),
1319
pDialog->iPositionX,
1320
pDialog->iPositionY);
1330
//g_print (" => move to (%d;%d) %dx%d\n", pDialog->container.iWindowPositionX, pDialog->container.iWindowPositionY, pDialog->container.iWidth, pDialog->container.iHeight);
1331
gtk_window_move (GTK_WINDOW (pDialog->container.pWidget),
1332
pDialog->container.iWindowPositionX,
1333
pDialog->container.iWindowPositionY);
1361
1374
pDialog = ic->data;
1363
1376
pIcon = pDialog->pIcon;
1364
if (pIcon != NULL && GTK_WIDGET_VISIBLE (pDialog->pWidget)) // on ne replace pas les dialogues en cours de destruction ou caches.
1377
if (pIcon != NULL && GTK_WIDGET_VISIBLE (pDialog->container.pWidget)) // on ne replace pas les dialogues en cours de destruction ou caches.
1366
1379
pContainer = cairo_dock_search_container_from_icon (pIcon);
1367
1380
if (CAIRO_DOCK_IS_DOCK (pContainer))
1369
int iPositionX = pDialog->iPositionX;
1370
int iPositionY = pDialog->iPositionY;
1382
int iPositionX = pDialog->container.iWindowPositionX;
1383
int iPositionY = pDialog->container.iWindowPositionY;
1371
1384
int iAimedX = pDialog->iAimedX;
1372
1385
int iAimedY = pDialog->iAimedY;
1373
1386
cairo_dock_place_dialog (pDialog, pContainer);
1375
if (iPositionX != pDialog->iPositionX || iPositionY != pDialog->iPositionY || iAimedX != pDialog->iAimedX || iAimedY != pDialog->iAimedY)
1376
gtk_widget_queue_draw (pDialog->pWidget); // on redessine meme si la position n'a pas changee, car la pointe, elle, change.
1388
if (iPositionX != pDialog->container.iWindowPositionX || iPositionY != pDialog->container.iWindowPositionY || iAimedX != pDialog->iAimedX || iAimedY != pDialog->iAimedY)
1389
gtk_widget_queue_draw (pDialog->container.pWidget); // on redessine meme si la position n'a pas changee, car la pointe, elle, change.
1383
CairoDialog *cairo_dock_show_dialog_full (const gchar *cText, Icon *pIcon, CairoContainer *pContainer, double fTimeLength, gchar *cIconPath, GtkWidget *pInteractiveWidget, CairoDockActionOnAnswerFunc pActionFunc, gpointer data, GFreeFunc pFreeDataFunc)
1396
CairoDialog *cairo_dock_show_dialog_full (const gchar *cText, Icon *pIcon, CairoContainer *pContainer, double fTimeLength, const gchar *cIconPath, GtkWidget *pInteractiveWidget, CairoDockActionOnAnswerFunc pActionFunc, gpointer data, GFreeFunc pFreeDataFunc)
1385
1398
if (pIcon != NULL && pIcon->fPersonnalScale > 0) // icone en cours de suppression.
1387
g_print ("dialog skipped\n");
1400
g_print ("dialog skipped for %s (%.2f)\n", pIcon->cName, pIcon->fPersonnalScale);
1391
1404
CairoDialogAttribute attr;
1392
1405
memset (&attr, 0, sizeof (CairoDialogAttribute));
1394
attr.cImageFilePath = cIconPath;
1406
attr.cText = (gchar *)cText;
1407
attr.cImageFilePath = (gchar *)cIconPath;
1395
1408
attr.pInteractiveWidget = pInteractiveWidget;
1396
1409
attr.pActionFunc = pActionFunc;
1397
1410
attr.pUserData = data;
1542
1555
//g_print ("fin de boucle bloquante -> %d\n", iAnswer);
1543
1556
if (myAccessibility.bPopUp && CAIRO_DOCK_IS_DOCK (pContainer))
1544
1557
cairo_dock_pop_down (CAIRO_DOCK (pContainer));
1545
if (CAIRO_DOCK_IS_DOCK (pContainer)/* && ! pDock->bInside*/)
1558
if (CAIRO_DOCK_IS_DOCK (pContainer)/* && ! pDock->container.bInside*/)
1547
1560
cd_message ("on force a quitter");
1548
1561
CairoDock *pDock = CAIRO_DOCK (pContainer);
1549
pDock->bInside = TRUE;
1562
pDock->container.bInside = TRUE;
1550
1563
pDock->bAtBottom = FALSE;
1551
cairo_dock_on_leave_notify (pDock->pWidget,
1564
cairo_dock_on_leave_notify (pDock->container.pWidget,
1564
1577
//GtkWidget *pWidget = cairo_dock_build_common_interactive_widget_for_dialog ((cInitialAnswer != NULL ? cInitialAnswer : ""), -1, -1);
1565
1578
GtkWidget *pWidget = _cairo_dock_make_entry_for_dialog (cInitialAnswer);
1566
gchar *cIconPath = g_strdup_printf ("%s/%s", CAIRO_DOCK_SHARE_DATA_DIR, CAIRO_DOCK_ICON);
1579
const gchar *cIconPath = CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_ICON;
1568
1581
int iClickedButton = cairo_dock_show_dialog_and_wait (cMessage, pIcon, pContainer, 0, cIconPath, pWidget);
1571
1583
gchar *cAnswer = (iClickedButton == 0 || iClickedButton == -1 ? g_strdup (gtk_entry_get_text (GTK_ENTRY (pWidget))) : NULL);
1572
1584
cd_message ("cAnswer : %s", cAnswer);
1664
1676
void cairo_dock_hide_dialog (CairoDialog *pDialog)
1666
gtk_widget_hide (pDialog->pWidget);
1667
pDialog->bInside = FALSE;
1678
if (GTK_WIDGET_VISIBLE (pDialog->container.pWidget))
1680
pDialog->bAllowMinimize = TRUE;
1681
gtk_widget_hide (pDialog->container.pWidget);
1682
pDialog->container.bInside = FALSE;
1683
cairo_dock_replace_all_dialogs ();
1684
if (pDialog->pIcon && pDialog->pIcon->cParentDockName != NULL)
1685
cairo_dock_dialog_window_destroyed ();
1670
1689
void cairo_dock_unhide_dialog (CairoDialog *pDialog)
1672
if (! GTK_WIDGET_VISIBLE (pDialog->pWidget))
1691
if (! GTK_WIDGET_VISIBLE (pDialog->container.pWidget))
1674
1693
if (pDialog->pInteractiveWidget != NULL)
1675
1694
gtk_widget_grab_focus (pDialog->pInteractiveWidget);
1679
1698
CairoContainer *pContainer = cairo_dock_search_container_from_icon (pIcon);
1680
1699
cairo_dock_place_dialog (pDialog, pContainer);
1700
if (pIcon->cParentDockName != NULL)
1701
cairo_dock_dialog_window_created ();
1683
gtk_window_present (GTK_WINDOW (pDialog->pWidget));
1704
gtk_window_present (GTK_WINDOW (pDialog->container.pWidget));
1686
1707
void cairo_dock_toggle_dialog_visibility (CairoDialog *pDialog)
1688
if (GTK_WIDGET_VISIBLE (pDialog->pWidget))
1709
if (GTK_WIDGET_VISIBLE (pDialog->container.pWidget))
1689
1710
cairo_dock_hide_dialog (pDialog);
1691
1712
cairo_dock_unhide_dialog (pDialog);
1823
1844
void cairo_dock_damage_icon_dialog (CairoDialog *pDialog)
1825
if (pDialog->fReflectAlpha == 0)
1826
gtk_widget_queue_draw_area (pDialog->pWidget,
1846
if (!pDialog->container.bUseReflect)
1847
gtk_widget_queue_draw_area (pDialog->container.pWidget,
1827
1848
pDialog->iLeftMargin,
1828
(pDialog->bDirectionUp ?
1849
(pDialog->container.bDirectionUp ?
1829
1850
pDialog->iTopMargin :
1830
pDialog->iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight)),
1851
pDialog->container.iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight)),
1831
1852
pDialog->iIconSize,
1832
1853
pDialog->iIconSize);
1834
gtk_widget_queue_draw (pDialog->pWidget);
1855
gtk_widget_queue_draw (pDialog->container.pWidget);
1837
1858
void cairo_dock_damage_text_dialog (CairoDialog *pDialog)
1839
if (pDialog->fReflectAlpha == 0)
1840
gtk_widget_queue_draw_area (pDialog->pWidget,
1860
if (!pDialog->container.bUseReflect)
1861
gtk_widget_queue_draw_area (pDialog->container.pWidget,
1841
1862
pDialog->iLeftMargin + pDialog->iIconSize + CAIRO_DIALOG_TEXT_MARGIN,
1842
(pDialog->bDirectionUp ?
1863
(pDialog->container.bDirectionUp ?
1843
1864
pDialog->iTopMargin :
1844
pDialog->iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight)),
1865
pDialog->container.iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight)),
1845
1866
_drawn_text_width (pDialog),
1846
1867
pDialog->iTextHeight);
1848
gtk_widget_queue_draw (pDialog->pWidget);
1869
gtk_widget_queue_draw (pDialog->container.pWidget);
1851
1872
void cairo_dock_damage_interactive_widget_dialog (CairoDialog *pDialog)
1853
if (pDialog->fReflectAlpha == 0)
1854
gtk_widget_queue_draw_area (pDialog->pWidget,
1874
if (!pDialog->container.bUseReflect)
1875
gtk_widget_queue_draw_area (pDialog->container.pWidget,
1855
1876
pDialog->iLeftMargin,
1856
(pDialog->bDirectionUp ?
1877
(pDialog->container.bDirectionUp ?
1857
1878
pDialog->iTopMargin + pDialog->iMessageHeight :
1858
pDialog->iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight) + pDialog->iMessageHeight),
1879
pDialog->container.iHeight - (pDialog->iTopMargin + pDialog->iBubbleHeight) + pDialog->iMessageHeight),
1859
1880
pDialog->iInteractiveWidth,
1860
1881
pDialog->iInteractiveHeight);
1862
gtk_widget_queue_draw (pDialog->pWidget);
1883
gtk_widget_queue_draw (pDialog->container.pWidget);