LSDynamic 1.6

Donnes vie à ton LiteStep

LSDynamic est un module pour LiteStep qui permet de déplacer les fenêtres de manière fluide en utilisant des scripts basés sur le temps. Les fenêtres sont référencées en fonction de leurs classes et de leurs titres (ou info-bulles), donc vous pouvez très bien déplacer des *Shortcut. Les déplacements peuvent être linéaire ou circulaire, avec de l'accélération, le tout basé sur des intervalles de temps en millisecondes. Les scripts ressemblent à des timeline sous Adobe Premiere.

-= Syl =-



Sommaire


Historique

29/06/2002 - ver 1.6
  • Amélioration de la gestion du timer.
  • Ajout de *DynFile .
  • Ajout du flag R (renversé).
  • Correcion de DynUpdateTimer.
  • Correction d'un petit bug avec la transparence de Layercut.
19/03/2002 - ver 1.5 12/03/2002 - ver 1.4
  • Ajout: * pour la fin des titres des fenêtres.
  • Ajout: flags pour les mouvements circulaires.
  • Correction d'un bug avec Layercut.
03/02/2002 - ver 1.3
  • Ajout:DynLayeredShortcut.
  • La restauration d'un layercut restaure juste son alpha initial.
28/01/2002 - ver 1.2a
  • Ajout: pause et resume en paramètre du bang.
  • Correction: passage de la classe en paramètre de move dans une macro.
  • Correction: passage des arguments pour la macro relay, et du paramètre par défaut.
  • Merci a xnowfall pour la notification des bugs.
22/01/2002 - ver 1.2
  • Mise à jour: pos supporte la position <relative>.
  • Mise à jour: vous pouvez utiliser * pour sélectionner toutes les caption.
  • Ajout: size.
  • Ajout: document en français.
  • Mise à jour: gestion des fenêtres différentes, plus lent mais plus sûr (il ne devrait plus y avoir de débordement de mémoire).
13/12/2001 - ver 1.1
  • Les Shortcuts trasnparents ne peuvent pas restaurés correctement la transparence, vous ne devriez restaurer la transparence que pour les autres fenêtres (comme notepad).
  • Ajout: relay.
12/12/2001 - ver 1.0a
  • Fixe: initialisation des titres des fenêtres.
  • Fixe: "ShorcutClass" en "ShortcutClass" dans les exemples.
  • Fixe: des tables dans la documentation.
11/12/2001 - ver 1.0
  • première version.

démarré le 03/12/2001.

Installation

Copiez LSDynamic.dll dans votre répertoire de module LiteStep et chargez le:

LoadModule "c:\LiteStep\Modules\LSDynamic.dll"

si c:\LiteStep\Modules\ est votre répertoire de module bien sûre...
Ensuite, pour démarrer les exemples, allez dans la section exemples.



Utilisation

LSDynamic vous permet de définire, dans votre step.rc, des mouvements et des macros, avec des mouvements chronométrés à l'intérieur, que vous allez appeler en utilisant des bangs.
Vous devez spécifiez la classe et le titre de la fenêtre que vous voulez déplacer. Pour vous aider, vous pouvez utiliser Winspy, un freeware qui vous donnes ces informations.
Pour les shortcuts, la classe est "ShortcutClass" et le titre est le tooltip que vous avez défini lorsque vous avez crée le shortcut.
Couleur de la syntaxe:

<value>

vous devez spécifier une valeur

<value>

une valeur

<value>

cette valeur est optionnelle

keyword

ceci est un mot-clé

keyword

la ligne avec ce mot-clé est optionnelle

Syntaxe des mouvements

Un mouvement définit comment votre fenêtre va se déplacer. Vous pouvez définir ce mouvement dans une macro, mais c'est plus simple à relire si vous la définissez en dehors.
Quand vous avez défini le mouvement, vous pouvez l'utiliser dans plusieurs macros différentes. Voici la définition d'un mouvement avec toutes les options possible:

*dyn <move-type> "move-name"
*dyn hwnd <window-class>
*dyn caption <window-caption>
*dyn range <start-time> <end-time>
*dyn pos <x-pos> <y-pos> <relative>
*dyn dest <x-pos> <y-pos> <relative>
*dyn acc <position-acceleration>
*dyn center <x-pos> <y-pos> <relative>
*dyn c-dest <x-pos> <y-pos> <relative>
*dyn c-acc <center-acceleration>
*dyn r-dest <ray-length>
*dyn r-acc <ray-acceleration>
*dyn angle <angle-in-degree>
*dyn a-acc <angle-acceleration>
*dyn alpha <start-alpha> <end-alpha>
*dyn alpha-acc <alpha-acceleration>
*dyn size <width> <height>
*dyn ~<move-type>

Definition

<move-type>:
Il y a 2 type de mouvements, linéaire et circulaire. un mouvement linéaire est une ligne droite de la position initiale à la position finale. Un mouvement circulaire fait suivre la fenêtre un chemin circulaire.
Le "move-name" est comment le mouvement sera appelé dans la macro.
Voici les définitions correspondant au 2 types:

*dyn linear "move-name"
*dyn hwnd <window-class>
*dyn caption <window-caption>
*dyn range <start-time> <end-time>
*dyn pos <x-pos> <y-pos> <relative>
*dyn dest <x-pos> <y-pos> <relative>
*dyn acc <position-acceleration>
*dyn alpha <start-alpha> <end-alpha>
*dyn alpha-acc <alpha-acceleration>
*dyn size <width> <height>
*dyn ~linear

*dyn circular "move-name"
*dyn hwnd <window-class>
*dyn caption <window-caption>
*dyn range <start-time> <end-time>
*dyn pos <x-pos> <y-pos> <relative>
*dyn center <x-pos> <y-pos> <relative>
*dyn c-dest <x-pos> <y-pos> <relative>
*dyn c-acc <center-acceleration>
*dyn r-dest <ray-length>
*dyn r-acc <ray-acceleration>
*dyn angle <angle-in-degree>
*dyn a-acc <angle-acceleration>
*dyn alpha <start-alpha> <end-alpha>
*dyn alpha-acc <alpha-acceleration>
*dyn size <width> <height>
*dyn flags <flags>
*dyn ~circular

hwnd:
Spécifie la classe de la fenêtre que vous voulez déplacer. Par exemple, la <window-class> d'un shortcut est ShortcutClass.
Si vous ne spécifiez pas de hwnd pour le mouvement, la classe sera celle que vous aurez défini sur la ligne du mouvement dans la macro, ou dans la macro elle-même.
Si vous ne spécifiez pas de hwnd pour la macro, la classe sera celle que vous aurez passé en paramètre en appelant le bang.
Si vous ne spécifiez pas de <window-class>, la classe par défaut est ShortcutClass.

caption:
Spécifie le titre de la fenêtre que vous voulez déplacer. Par exemple, la <window-caption> d'un shortcut est son tooltip.
Vous pouvez spécifiez plusieurs titres en même temps comme ceci:
*dyn caption "caption1" "caption2" "caption3" "..."
Cette syntaxe fonctionne pour tous les endroits où vous devez spécifiez les titres.
Si vous ne spécifiez pas de caption pour le mouvement, le titre sera celui que vous aurez défini sur la ligne move dans la macro, ou pour la macro elle-même.
Si vous ne spécifiez pas de caption pour la macro, le titre sera celui que vous aurez passé en paramètre en appelant le bang.
Vous devez spécifier au moins un titre quelque part.
Vous pouvez utiliser * pour sélectionner toutes les fenêtres de classe <window-class>.
Ou juste specifier une * à la fin du nom si vous voulez selectionner plusieurs fenêtres commançant par le même nom (par exemple "caption *" selectionnera "caption 1", "caption 2", "caption 3"...). Vous devez mettre les noms avec * avant les autres ("caption *" "name *" "test 1" "test 2").

range:
Le mouvement est actif lorsque le temps est entre <start-time> et <end-time>. L'intervalle va être ajouter à l'intervalle de la macro sur la ligne move. Si vous ne spécifiez pas de range pour le mouvement, l'intervalle sera celui spécifiez sur la ligne du mouvement dans la macro.

dest:
Definie la destination de la fenêtre. Vous devriez définir une destination pour créer un mouvement linéaire.
Le flag <relative> vous permet de définir les coordonnées relative à la position de la fenêtre.
Si ce flag n'est pas spécifié, les coordonnées négatives sont relatives au bord opposé de l'écran (comme pour les shortcuts). Si le flag est spécifié ("1", "true", "quelque chose" sont acceptés) et s'il y a un signe devant les coordonées (+ ou -), les coordonnées sont relative à la position de la fenêtre (s'il n'y a pas de signe, les coordonnées sont relative à l'écran).

pos:
Ce mot-clé déplace la fenêtre à la position lorsque le mouvement commence, où <x-pos> et <y-pos> sont les coordonnées. Les coordonnées négatives sont relatives aux bords opposés de l'écran (comme pour les shortcuts). Si vous ne spécifiez pas de pos, la position par défaut est celle de la fenêtre. La position <relative> permet de déplacer la fenêtre en fonction de sa position initiale.

size:
Vous pouvez changer la taille de la fenêtre en spécifiant <width> et <height> qui sont la largeur et la hauteur finale de la fenêtre.

acc, r-acc, c-acc, a-acc, alpha-acc:
Définie l'accélération pour atteindre la destination. La valeur par défaut est 100.
Comment cela fonctionne ?

acc < 100: o      o    o   o  oo ooo

acc = 100: o  o  o  o  o  o  o  o  o

acc > 100: ooo oo  o   o    o      o

L'accélération n'est pas limité entre 0 et 200 car vous pouvez faire des éffets très intéréssant en fonction de la valeur que vous donnez.

alpha:
Rend la fenêtre transparente, de <start-alpha> à <end-alpha>. Ces valeurs sont entre 0 et 255.

center:
Spécifiez le centre du cercle. La fenêtre bougera autour du centre.

c-dest:
Spécifiez la destination du centre du cercle.

r-dest:
Spécifiez le rayon final. Le rayon initial est calculé avec le centre du cercle et la position du cercle.

angle:
La fenêtre se déplacera autour du centre de la position de la fenêtre, où l'angle est égal à zero, jusqu'à la position final du chemin circulaire, obtenu avec l'angle en degré.

flags:
Pour le moment, il n'y a qu'un seul flag pour les mouvements circulaires:
C: quand le rayon est calculé, LSDynamic déplacera la fenêtre à partir du coin supérieur/gauche (si DynNoCircularRelativeToWindowCenter n'est pas spécifié) ou à partir du center de la fenêtre (si DynNoCircularRelativeToWindowCenter est spécifié). Par défaut, le rayon est calculé à partir du centre de la fenêtre.


Macro syntax

La macro est la manière dont vous allez utiliser les mouvements que vous avez définis.
*dyn macro "macro-name"
*dyn flags <flags>
*dyn hwnd <window-class>
*dyn caption <window-caption>
*dyn move <start-time> <end-time> <move-name>
*dyn move <start-time> <end-time> <move-name> <window-class> <window-caption>
*dyn move <start-time> <end-time> <move-name> caption <window-caption>
*dyn exec <start-time> <end-time> <command>
*dyn pause <start-time> <end-time> <move-name>
*dyn resume <start-time> <end-time> <move-name>
*dyn win-stats <start-time> <end-time> <flags> <window-class> <window-caption>
*dyn win-stats <start-time> <end-time> <flags> caption <window-caption>
*dyn restore <window-caption>
*dyn relay <relay-mode> <macro-name>

Definition

macro:
Vous pouvez exécuter la macro avec un bang du même nom que "macro-name".

flags:
Les <flags> possible sont:
L: la macro cycle.
O: une command ne peut être executée qu'une fois. R: la liste des éléments est parcourant dans le sens inverse de chargement (pratique pour les déplacements de shortcuts trop proche).

move:
Cette commande déplacera la fenêtre avec le script <move-name> pendant le temps <start-time> et <end-time>. Vous pouvez aussi spécifier <window-class> et <window-caption>. Si vous ne voulez pas spécifier la <window-class>, utilisez le mot-clé caption.

exec:
Exécute la command entre le temps <start-time> et <end-time>.

pause:
Pause la macro <macro-name> quand le temps est entre <start-time> et <end-time>.
Résume la macro <macro-name> quand le temps est entre <start-time> et <end-time>.

win-stats:
Cela cache ou afiche la fenêtre lorsque le temps est entre <start-time> et <end-time>. Les <flags> disponible sont hide et show (cache, affiche).

restore:
Restore la position de la fenêtre dont le titre est <window-caption> quand la macro se finie.

relay:
La macro, si elle est stoppé, donnera le relais à la macro <macro-name> en utilisant <relay-mode> qui sont:

  • default: stop la macro et execute la macro relais.


  • Configuration

    *DynFile fichier
    Permet de charger les *dyn movement et *dyn macro dans un fichier externe. Vous pouvez spécifier plusieurs *DynFile. Si vous mettez vos *dyn dans un fichier externe, le step.rc ne sera pas lu sauf pour les variables si dessous. Les variables doivent être OBLIGATOIREMENT dans le step.rc et non dans un fichier externe.
    DynTimerUpdate <delay-in-ms>
    La macro sera rafraichi toutes les <delay-in-ms>.
    La valeur par défaut est 10 ms.

    DynNoCircularRelativeToWindowCenter
    Par défaut, quand vous faites un mouvement circulaire, les coordonnées sont relative au centre de la fenêtre. Mais vous pouvez forcer LSDynamic à prendre le coin supérieur gauche de la fenêre pour faire le mouvement circulaire.

    DynNoHandleStorage
    Par défaut, les fenêtres sont stockées dans une liste pour accélérer la detection des fenêtre, mais si vous voulez déplacer d'autre fenêtre que des shortcuts, et que les fenêtres peuvent être fermées, vous devriez spécfier cette option.

    DynStoreBadHandle
    Si vous utilisez LSDynamic uniquement avec des shortcuts, vous pouvez utiliser cette option pour encore accélerer la détection en lui disant de stocker aussi les mauvaises détections de fenêtre.

    DynForceLayerRestoration
    Cette option force la restauration de la transparence de la fenêtre pour libérer de la mémoire. Cela peut accélérer si c'est pour restaurer des fenêtres autre que des shortcuts.

    DynLayeredShortcut
    Si vous utilisez Layercut, utilisez ça pour faire de la transparence rapide.

    DynInternalAlpha <window-class> <window-class> <window-class> ...
    Permet à LSDynamic de changer l'alpha d'un module qui supporte la gestion en interne (comme Layercut). Vous devez spécifiez quelle est la classe de la fenêtre dont le module s'occupe (pour Layercut, la classe est ShortcutClass). Ce système n'est utile que si le module gère en interne le changement d'alpha.

    Comment ça marche:
    Définissez la variable WM_ALPHA:

    #define WM_ALPHA (WM_USER + 0x42)

    Dans votre module, préparez vous à recevoir le méssage WM_ALPHA dans le dispatcher:

    MESSAGE(onUpdateAlpha, WM_ALPHA)

    Et enfin mettez à jour l'alpha de votre fenêtre:

    void onUpdateAlpha(Message& message)
    {
      if (message.lParam < 0)
        updateAlpha(alpha_initial);
      else
        updateAlpha(message.lParam);
    }


    Bien sure le reste dépend de vous et de comment vous gérez l'alpha.

    Bangs

    !macro-name default
    Exécute une macro.

    !macro-name stop
    Stop la macro et donne le relais à la macro relais, s'il en existe une.

    !macro-name pause
    Pause l'execution de la macro.

    !macro-name resume
    Resume l'execution de la macro.

    !macro-name caption <window-caption>
    !macro-name <window-class> <window-caption>
    Execute la macro avec <window-class> et <window-caption>

    !DynRunning
    Affiche quelles sont les macros en cours d'execution.

    !DynChangeMoveType <move-name> <move-type>
    Change le type du mouvement.

    !DynPauseAll
    !DynResumeAll
    Pour mettre en pause ou résumer toutes les macros.


    LsBox

    Pour que LSDynamic fonctionne avec LsBox, spécifiez cette ligne dans votre box:

    *ModuleHook !DynModuleHook

    Et lorsque vous définissez une macro, pour la classe mettez LsBoxClass, et pour la caption mettez le nom de votre box.



    Exemples

    Pour executer les exemples, copiez les images dans le répertoire des images et les fichiers rc dans le répertoire LiteStep. Ensuite incluez dyn.rc dans le step.rc:
    include "c:\litestep\dyn.rc"
    Vous devez charger mzscript juste pour charger le premier bang !init_dyn avec:
    *mzscript start !init_dyn default
    (cette ligne est dans dyn.rc, si cela ne marche pas, éssayez de mettre cette ligne dans votre fichier de script par défaut, ou executez le avec une hotkey).
    J'ai éssayez de vous montrer avec cette exemple comme fonctionne LSDynamic, j'utilise donc mzscript que pour iitialiser l'exemple. je ne gère pas le fait qu'une macro puisse être executez plusieurs fois.



    Astuces

    Vous devriez utiliser Winspy pour voir <window-class> et <window-caption>.

    Si vous définissez un movement dans une macro, vous pouvez aussi l'utiliser dans d'autres macros.

    Vous devriez passer <window-class> et <window-caption> avec le bang plutôt que de les définir dans le movement ou dans la macro.

    LSDynamic se moque dans quel groupe se trouve un shortcut, donc pour que les shortcut fonctionne, vous devriez les afficher avant avec !ShortcutGroupShow et ensuite changer l'état avec win-stats. De cette manière, un shortcut peut être dans un groupe et peut être caché pendant que les autres ne le sont pas, les groups ne sont pas altérés.

    <start-time> et <end-time> peuvent chevauché un autre mouvement, vous pouvez faire plusieurs mouvement en même temps.

    Changer la taille d'une fenêtre transparente n'est pas recommandée, cela peut occasionné de gros ralentissements



    Résolution de problèmes

    Si un shortcut change son état entre normal et over, ou si vous ne pouvez pas avoir le titre du shortcut, utilisez ma modification du shortcut2.dll.

    Il y a un problème avec la trasnparence quand le shortcut n'est pas ontop (au dessus). La modification que j'ai apporté à shortcut2.dll permet de faire de la transparence pour les shortcuts ontop.

    Des choses étranges peuvent arriver si vous utilisez plusieurs macro en même temps sur une même fenêtre...

    Si votre shortcut est caché quand LiteStep démarre, il n'existe pas encore, vous devriez changer l'état avant de l'utiliser.

    Un petit ralentissement devrait arriver lorsque l'info-bulle d'un shortcut apparait.

    Un bug peut survenir lorsqu'une macro est executé à l'intérieur d'une macro (avec le mot-clé exec).



    Greetings

    J'ai été inspiré par Lain (le manga) et mzscript (le module).
    Merci à la LSDev Team pour avoir fait le meilleur shell.
    Merci à Nekoi, SeRIAL, NecroBorg, Terro, Kaze, Stafkiel, Krag, Nox, Fredo, Jule, Vince, et tout ceux qui m'ont supporté   =)
    Merci à xnowfall pour m'avoir aidé à débugger la version 1.2.



    Contact

    Si vous avez un problème, que vous voulez une nouvelle option, que vous trouvez un bug, mailez moi.


    -= Syl =-
    Web: http://www.epita.fr:8000/~rouque_s/
    Mail: rouque_s@epita.fr
    ICQ: 84198930