void cd_do_select_prev_next_entry_in_listing (gboolean bNext) { CDEntry *pEntry; myData.pListing->fPreviousOffset = myData.pListing->fCurrentOffset; GList *e = myData.pListing->pCurrentEntry; if (bNext) { do { e = cairo_dock_get_next_element (e, myData.pListing->pEntries); pEntry = e->data; } while (e != myData.pListing->pCurrentEntry && pEntry->bHidden); } else { do { e = cairo_dock_get_previous_element (e, myData.pListing->pEntries); pEntry = e->data; } while (e != myData.pListing->pCurrentEntry && pEntry->bHidden); } myData.pListing->pCurrentEntry = e; myData.pListing->fAimedOffset += (bNext ? 1:-1) * (myDialogs.dialogTextDescription.iSize + 2); myData.pListing->iCurrentEntryAnimationCount = NB_STEPS_FOR_CURRENT_ENTRY; myData.pListing->iScrollAnimationCount = NB_STEPS_FOR_SCROLL; myData.pListing->iTitleOffset = 0; myData.pListing->sens = 1; cairo_dock_launch_animation (CAIRO_CONTAINER (myData.pListing)); cairo_dock_redraw_container (CAIRO_CONTAINER (myData.pListing)); }
void cd_do_select_previous_next_matching_icon (gboolean bNext) { GList *pMatchingElement = myData.pCurrentMatchingElement; do { if (!bNext) myData.pCurrentMatchingElement = cairo_dock_get_previous_element (myData.pCurrentMatchingElement, myData.pMatchingIcons); else myData.pCurrentMatchingElement = cairo_dock_get_next_element (myData.pCurrentMatchingElement, myData.pMatchingIcons); } while (myData.pCurrentMatchingElement != pMatchingElement && ((Icon*)myData.pCurrentMatchingElement->data)->image.pSurface == NULL); if (myData.pCurrentMatchingElement != pMatchingElement) // on complete le texte et on redessine. { Icon *pIcon = myData.pCurrentMatchingElement->data; if (pIcon->cCommand && *pIcon->cCommand != *myData.sCurrentText->str) // cas d'une commande avec un tiret. myData.iNbValidCaracters = 0; cd_do_delete_invalid_caracters (); if (pIcon->cBaseURI != NULL) { gchar *cFile = g_path_get_basename (pIcon->cCommand); g_string_assign (myData.sCurrentText, cFile); g_free (cFile); } else g_string_assign (myData.sCurrentText, pIcon->cCommand); cd_do_load_pending_caracters (); // on arme l'animation de decalage. myData.iMatchingGlideCount = 10; // on rembobine l'animation. myData.iPreviousMatchingOffset = myData.iCurrentMatchingOffset; // on part du point courant. int iWidth, iHeight; cairo_dock_get_icon_extent (pIcon, &iWidth, &iHeight); if (iHeight != 0) { double fZoom = (double) g_pMainDock->container.iHeight/2 / iHeight; myData.iMatchingAimPoint += (bNext ? 1 : -1) * iWidth * fZoom; // on cherche a atteindre le nouveau point. } // on repositionne les caracteres et on anime tout ca. cd_do_launch_appearance_animation (); cairo_dock_redraw_container (CAIRO_CONTAINER (g_pMainDock)); } }