38
38
//\_____________ On calcule le nombre de groupes et la place qu'ils occupent.
39
39
int iNbGroups = 1, iCurrentOrder = -1;
40
double fCurrentGroupWidth = - myIcons.iIconGap, fGroupsWidth = 0.;
40
double fCurrentGroupWidth = - myIconsParam.iIconGap, fGroupsWidth = 0.;
43
43
for (ic = pDock->icons; ic != NULL; ic = ic->next)
46
if (CAIRO_DOCK_IS_SEPARATOR (pIcon))
46
if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
48
48
if (CAIRO_DOCK_IS_USER_SEPARATOR (pIcon)) // si c'est un separateur automatique, le changement de groupe incrementera le compteur a l'icone suivante.
65
65
fGroupsWidth += MAX (0, fCurrentGroupWidth);
66
66
//g_print ("fGroupsWidth += %.2f\n", fCurrentGroupWidth);
67
fCurrentGroupWidth = - myIcons.iIconGap;
67
fCurrentGroupWidth = - myIconsParam.iIconGap;
70
70
iCurrentOrder = cairo_dock_get_icon_order (pIcon);
71
fCurrentGroupWidth += pIcon->fWidth * my_fPanelRatio + myIcons.iIconGap;
71
fCurrentGroupWidth += pIcon->fWidth * my_fPanelRatio + myIconsParam.iIconGap;
72
72
//g_print ("fCurrentGroupWidth <- %.2f\n", fCurrentGroupWidth);
74
74
if (fCurrentGroupWidth > 0) // le groupe courant est non vide, sinon c'est juste un separateur a la fin.
82
82
//\_____________ On en deduit l'ecart entre les groupes d'icones.
83
83
double W = cairo_dock_get_max_authorized_dock_width (pDock);
84
double fScreenBorderGap = myBackground.iDockRadius + myBackground.iDockLineWidth; // on laisse un ecart avec le bord de l'ecran.
84
double fScreenBorderGap = myDocksParam.iDockRadius + myDocksParam.iDockLineWidth; // on laisse un ecart avec le bord de l'ecran.
85
85
double fGroupGap = (iNbGroups > 1 ? (W - 2*fScreenBorderGap - fGroupsWidth) / (iNbGroups - 1) : W - fScreenBorderGap - fGroupsWidth);
86
if (fGroupGap < myIcons.iIconGap) // les icones depassent en largeur.
87
fGroupGap = myIcons.iIconGap;
86
if (fGroupGap < myIconsParam.iIconGap) // les icones depassent en largeur.
87
fGroupGap = myIconsParam.iIconGap;
88
88
//g_print (" -> %d groups, %d/%d\nfGroupGap = %.2f\n", iNbGroups, (int)fGroupsWidth, (int)W, fGroupGap);
90
90
//\_____________ On calcule la position au repos des icones et la taille du dock.
91
91
double xg = fScreenBorderGap; // abscisse de l'icone courante, et abscisse du debut du groupe courant.
93
fCurrentGroupWidth = - myIcons.iIconGap;
93
fCurrentGroupWidth = - myIconsParam.iIconGap;
94
94
iCurrentOrder = -1;
95
95
for (ic = pDock->icons; ic != NULL; ic = ic->next)
98
if (CAIRO_DOCK_IS_SEPARATOR (pIcon))
98
if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
100
100
if (CAIRO_DOCK_IS_USER_SEPARATOR (pIcon)) // si c'est un separateur automatique, le changement de groupe incrementera le compteur a l'icone suivante.
116
116
xg += fCurrentGroupWidth + fGroupGap;
118
118
//g_print ("jump to %.2f\n", x);
119
fCurrentGroupWidth = - myIcons.iIconGap;
119
fCurrentGroupWidth = - myIconsParam.iIconGap;
122
122
iCurrentOrder = cairo_dock_get_icon_order (pIcon);
123
fCurrentGroupWidth += pIcon->fWidth * my_fPanelRatio + myIcons.iIconGap;
123
fCurrentGroupWidth += pIcon->fWidth * my_fPanelRatio + myIconsParam.iIconGap;
125
125
//g_print ("icon at %.2f\n", x);
126
126
pIcon->fXAtRest = x;
127
x += pIcon->fWidth * my_fPanelRatio + myIcons.iIconGap;
127
x += pIcon->fWidth * my_fPanelRatio + myIconsParam.iIconGap;
130
130
pDock->fMagnitudeMax = 0.; // pas de vague.
132
132
pDock->pFirstDrawnElement = pDock->icons;
134
134
double hicon = pDock->iMaxIconHeight * my_fPanelRatio;
135
pDock->iDecorationsHeight = hicon * pDock->container.fRatio + 2 * myBackground.iFrameMargin;
135
pDock->iDecorationsHeight = hicon * pDock->container.fRatio + 2 * myDocksParam.iFrameMargin;
137
137
pDock->iMaxDockWidth = pDock->fFlatDockWidth = pDock->iMinDockWidth = MAX (W, x);
138
138
//g_print ("iMaxDockWidth : %d (%.2f)\n", pDock->iMaxDockWidth, pDock->container.fRatio);
140
pDock->iMaxDockHeight = myBackground.iDockLineWidth + myBackground.iFrameMargin + hicon * pDock->container.fRatio + myBackground.iFrameMargin + myBackground.iDockLineWidth + myLabels.iLabelSize;
140
pDock->iMaxDockHeight = myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin + hicon * pDock->container.fRatio + myDocksParam.iFrameMargin + myDocksParam.iDockLineWidth + myIconsParam.iLabelSize;
142
pDock->iMaxDockHeight = MAX (pDock->iMaxDockHeight, hicon * (1 + myIcons.fAmplitude)); // au moins la taille du FBO.
142
pDock->iMaxDockHeight = MAX (pDock->iMaxDockHeight, pDock->iMaxIconHeight * (1 + myIconsParam.fAmplitude)); // au moins la taille du FBO.
143
//g_print ("panel view: pDock->iMaxIconHeight = %d\n", pDock->iMaxIconHeight);
144
145
pDock->iDecorationsWidth = pDock->iMaxDockWidth;
145
pDock->iMinDockHeight = 2 * (myBackground.iDockLineWidth + myBackground.iFrameMargin) + hicon * pDock->container.fRatio;
146
pDock->iMinDockHeight = 2 * (myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin) + hicon * pDock->container.fRatio; /// TODO: make the height constant, to avoid moving all windows when space is reserved and ratio changes.
149
150
static void cd_render (cairo_t *pCairoContext, CairoDock *pDock)
151
152
//\____________________ On trace le cadre.
152
double fLineWidth = myBackground.iDockLineWidth;
153
double fMargin = myBackground.iFrameMargin;
154
double fRadius = (pDock->iDecorationsHeight + fLineWidth - 2 * myBackground.iDockRadius > 0 ? myBackground.iDockRadius : (pDock->iDecorationsHeight + fLineWidth) / 2 - 1);
153
double fLineWidth = myDocksParam.iDockLineWidth;
154
double fMargin = myDocksParam.iFrameMargin;
155
double fRadius = (pDock->iDecorationsHeight + fLineWidth - 2 * myDocksParam.iDockRadius > 0 ? myDocksParam.iDockRadius : (pDock->iDecorationsHeight + fLineWidth) / 2 - 1);
155
156
double fExtraWidth = 2 * fRadius + fLineWidth;
156
157
double fDockWidth;
185
186
cairo_save (pCairoContext);
186
double fDeltaXTrapeze = cairo_dock_draw_frame (pCairoContext, fRadius, fLineWidth, fDockWidth, pDock->iDecorationsHeight, fDockOffsetX, fDockOffsetY, sens, 0., pDock->container.bIsHorizontal, myBackground.bRoundedBottomCorner);
187
double fDeltaXTrapeze = cairo_dock_draw_frame (pCairoContext, fRadius, fLineWidth, fDockWidth, pDock->iDecorationsHeight, fDockOffsetX, fDockOffsetY, sens, 0., pDock->container.bIsHorizontal, myDocksParam.bRoundedBottomCorner);
188
189
//\____________________ On dessine les decorations dedans.
189
190
fDockOffsetY = (pDock->container.bDirectionUp ? pDock->container.iHeight - pDock->iDecorationsHeight - fLineWidth : fLineWidth);
193
194
if (fLineWidth > 0)
195
196
cairo_set_line_width (pCairoContext, fLineWidth);
196
cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
197
cairo_set_source_rgba (pCairoContext, myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
197
198
cairo_stroke (pCairoContext);
283
284
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_OVER);
284
285
cairo_set_line_width (pCairoContext, fLineWidth);
285
cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
286
cairo_set_source_rgba (pCairoContext, myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
286
287
cairo_stroke (pCairoContext);
290
291
cairo_restore (pCairoContext);
292
293
//\____________________ On dessine la ficelle qui les joint.
293
if (myIcons.iStringLineWidth > 0)
294
cairo_dock_draw_string (pCairoContext, pDock, myIcons.iStringLineWidth, FALSE, FALSE);
294
if (myIconsParam.iStringLineWidth > 0)
295
cairo_dock_draw_string (pCairoContext, pDock, myIconsParam.iStringLineWidth, FALSE, FALSE);
296
297
//\____________________ On dessine les icones et les etiquettes, en tenant compte de l'ordre pour dessiner celles en arriere-plan avant celles en avant-plan.
297
298
GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pDock->icons);
319
320
static void cd_render_optimized (cairo_t *pCairoContext, CairoDock *pDock, GdkRectangle *pArea)
321
322
//g_print ("%s ((%d;%d) x (%d;%d) / (%dx%d))\n", __func__, pArea->x, pArea->y, pArea->width, pArea->height, pDock->container.iWidth, pDock->container.iHeight);
322
double fLineWidth = myBackground.iDockLineWidth;
323
double fMargin = myBackground.iFrameMargin;
323
double fLineWidth = myDocksParam.iDockLineWidth;
324
double fMargin = myDocksParam.iFrameMargin;
324
325
int iWidth = pDock->container.iWidth;
325
326
int iHeight = pDock->container.iHeight;
369
370
cairo_move_to (pCairoContext, fDockOffsetX, fDockOffsetY - fLineWidth / 2);
370
371
cairo_rel_line_to (pCairoContext, pArea->width, 0);
371
372
cairo_set_line_width (pCairoContext, fLineWidth);
372
cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
373
cairo_set_source_rgba (pCairoContext, myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
373
374
cairo_stroke (pCairoContext);
375
376
cairo_new_path (pCairoContext);
376
377
cairo_move_to (pCairoContext, fDockOffsetX, (pDock->container.bDirectionUp ? iHeight - fLineWidth / 2 : pDock->iDecorationsHeight + 1.5 * fLineWidth));
377
378
cairo_rel_line_to (pCairoContext, pArea->width, 0);
378
379
cairo_set_line_width (pCairoContext, fLineWidth);
379
cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
380
cairo_set_source_rgba (pCairoContext, myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
383
384
cairo_move_to (pCairoContext, fDockOffsetX - fLineWidth / 2, fDockOffsetY);
384
385
cairo_rel_line_to (pCairoContext, 0, pArea->height);
385
386
cairo_set_line_width (pCairoContext, fLineWidth);
386
cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
387
cairo_set_source_rgba (pCairoContext, myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
387
388
cairo_stroke (pCairoContext);
389
390
cairo_new_path (pCairoContext);
390
391
cairo_move_to (pCairoContext, (pDock->container.bDirectionUp ? iHeight - fLineWidth / 2 : pDock->iDecorationsHeight + 1.5 * fLineWidth), fDockOffsetY);
391
392
cairo_rel_line_to (pCairoContext, 0, pArea->height);
392
393
cairo_set_line_width (pCairoContext, fLineWidth);
393
cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
394
cairo_set_source_rgba (pCairoContext, myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
395
396
cairo_stroke (pCairoContext);
441
442
static void cd_render_opengl (CairoDock *pDock)
443
444
//\_____________ On definit notre rectangle.
444
double fLineWidth = myBackground.iDockLineWidth;
445
double fMargin = myBackground.iFrameMargin;
446
double fRadius = (pDock->iDecorationsHeight + fLineWidth - 2 * myBackground.iDockRadius > 0 ? myBackground.iDockRadius : (pDock->iDecorationsHeight + fLineWidth) / 2 - 1);
445
double fLineWidth = myDocksParam.iDockLineWidth;
446
double fMargin = myDocksParam.iFrameMargin;
447
double fRadius = (pDock->iDecorationsHeight + fLineWidth - 2 * myDocksParam.iDockRadius > 0 ? myDocksParam.iDockRadius : (pDock->iDecorationsHeight + fLineWidth) / 2 - 1);
447
448
double fExtraWidth = 2 * fRadius + fLineWidth;
448
449
double fDockWidth;
449
450
double fFrameHeight = pDock->iDecorationsHeight + fLineWidth;
473
474
double fDockMagnitude = cairo_dock_calculate_magnitude (pDock->iMagnitudeIndex);
475
476
//\_____________ On genere les coordonnees du contour.
476
const CairoDockGLPath *pFramePath = cairo_dock_generate_rectangle_path (fDockWidth, fFrameHeight, fRadius, myBackground.bRoundedBottomCorner);
477
const CairoDockGLPath *pFramePath = cairo_dock_generate_rectangle_path (fDockWidth, fFrameHeight, fRadius, myDocksParam.bRoundedBottomCorner);
478
479
//\_____________ On remplit avec le fond.
489
490
if (fLineWidth != 0)
491
492
glLineWidth (fLineWidth);
492
glColor4f (myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
493
glColor4f (myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
493
494
cairo_dock_stroke_gl_path (pFramePath, TRUE);
565
566
glLineWidth (fLineWidth);
566
glColor4f (myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]);
567
glColor4f (myDocksParam.fLineColor[0], myDocksParam.fLineColor[1], myDocksParam.fLineColor[2], myDocksParam.fLineColor[3]);
567
568
cairo_dock_stroke_gl_path (pPath, FALSE);
576
577
//\_____________ On dessine la ficelle.
577
if (myIcons.iStringLineWidth > 0)
578
cairo_dock_draw_string_opengl (pDock, myIcons.iStringLineWidth, FALSE, FALSE);
578
if (myIconsParam.iStringLineWidth > 0)
579
cairo_dock_draw_string_opengl (pDock, myIconsParam.iStringLineWidth, FALSE, FALSE);
581
582
//\_____________ On dessine les icones.
603
604
//\_____________ On calcule le nombre de groupes et la place qu'ils occupent.
604
605
int iNbGroups = 1, iCurrentOrder = -1;
605
double fCurrentGroupWidth = - myIcons.iIconGap, fGroupsWidth = 0.;
606
double fCurrentGroupWidth = - myIconsParam.iIconGap, fGroupsWidth = 0.;
606
607
double fSeparatorsPonderation = 0;
609
610
for (ic = pDock->icons; ic != NULL; ic = ic->next)
611
612
pIcon = ic->data;
612
if (CAIRO_DOCK_IS_SEPARATOR (pIcon))
613
if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
614
615
pIcon->fScale = 1.;
615
616
if (pIcon->fInsertRemoveFactor != 0)
680
681
double xm = pDock->container.iMouseX;
681
682
double xg = fScreenBorderGap; // abscisse de l'icone courante, et abscisse du debut du groupe courant.
683
fCurrentGroupWidth = - myIcons.iIconGap;
684
fCurrentGroupWidth = - myIconsParam.iIconGap;
684
685
iCurrentOrder = -1;
685
686
for (ic = pDock->icons; ic != NULL; ic = ic->next)
687
688
pIcon = ic->data;
688
if (CAIRO_DOCK_IS_SEPARATOR (pIcon))
689
if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
691
692
pIcon->fDrawX = pIcon->fX;
714
715
xg += fCurrentGroupWidth + fGroupGap;
716
fCurrentGroupWidth = - myIcons.iIconGap;
717
fCurrentGroupWidth = - myIconsParam.iIconGap;
719
720
iCurrentOrder = cairo_dock_get_icon_order (pIcon);
720
fCurrentGroupWidth += pIcon->fWidth * pIcon->fScale + myIcons.iIconGap;
721
fCurrentGroupWidth += pIcon->fWidth * pIcon->fScale + myIconsParam.iIconGap;
723
if (pPointedIcon == NULL && xm > pIcon->fX - .5*myIcons.iIconGap && xm <= pIcon->fX + pIcon->fWidth * pIcon->fScale + .5*myIcons.iIconGap)
724
if (pPointedIcon == NULL && xm > pIcon->fX - .5*myIconsParam.iIconGap && xm <= pIcon->fX + pIcon->fWidth * pIcon->fScale + .5*myIconsParam.iIconGap)
725
726
pIcon->bPointed = TRUE;
726
727
pPointedIcon = pIcon;
730
731
pIcon->fDrawX = pIcon->fX;
732
733
if (pDock->container.bDirectionUp)
733
pIcon->fY = pDock->iMaxDockHeight - (myBackground.iDockLineWidth + myBackground.iFrameMargin + pIcon->fHeight * my_fPanelRatio);
734
pIcon->fY = pDock->iMaxDockHeight - (myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin + pIcon->fHeight * my_fPanelRatio);
735
pIcon->fY = myBackground.iDockLineWidth + myBackground.iFrameMargin;
736
pIcon->fY = myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin;
736
737
pIcon->fDrawY = pIcon->fY;
738
739
pIcon->fWidthFactor = 1.;
765
766
pRenderer->bUseReflect = FALSE;
766
767
pRenderer->cDisplayedName = D_ (cRendererName);
767
768
pRenderer->cReadmeFilePath = g_strdup (MY_APPLET_SHARE_DATA_DIR"/readme-panel-view");
768
pRenderer->cPreviewFilePath = g_strdup (MY_APPLET_SHARE_DATA_DIR"/preview-panel.png");
769
pRenderer->cPreviewFilePath = g_strdup (MY_APPLET_SHARE_DATA_DIR"/preview-panel.jpg");
770
771
cairo_dock_register_renderer (cRendererName, pRenderer);