SetFont console.device

5 sujets de 1 à 5 (sur un total de 5)

  • __sam__

      #353795

      Salut!

      Je cherche à modifier dynamiquement la fonte utilisée par un CON: (*) sur amiga.

      J’ai désassemblé et étudié C:SetFont qui permet de le faire et essayé 2/3 trucs. En gros le principe est simple. Il faut changer la font de la fenêtre (SetFont(window->RPort, font)) et aussi mettre la fonte dans la copie window->IFont). Mais cela ne marche qu’à la condition d’envoyer une commande ANSI de “reset” (esc c) à la console juste après, sinon le changement n’est pas pris en compte. La conséquence est que cela a pour effet d’effacer l’écran alors que moi je voulais panacher (**) les différentes fontes ensemble.

      Ce qu’il faudrait j’imagine c’est faire l’équivalent du reset (esc-c) sans effaçage d’écran, possiblement en envoyant le bon dos-packet pour resetter juste le ConUnit qui lui garde aussi une copie du pointeur sur la fonte. Hélas je n’ai rien trouvé dans les docs publiques dispo du web, et comme les codes des KingCON, VincED et autres consoles de remplacement sont jalousement gardés par leurs auteurs 30 ans après, et bien on est bien démuni au final pour progresser quand on tombe sur un tel os.

      Quelqu’un a-t-il joué avec ca et a-t-il réussi çà avoir plusieurs fontes dans une console ? (c’est du super bas niveau de amigaos je pense).

      sam.
      ___
      (*) C’est qui celui-la ?
      (**) La brasse! <accent=alsacien>Oui ché la brasse que je sais pas naché.</accent>(***)
      (***) Bon ben ca doit être moi finalement le CON: de l’histoire avec des blagues aussi pourries.

      Samuel.

      Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
      A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
      A500 Vampire V2+ ^8^ 🙂
      (mais aussi TO8, TO8D, TO9. Groupe PULS.)

      __sam__

        #354467

        Ah au fait j’ai trouvé la solution. A+ 😉

        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        
        .
        

        Hey non! je ne vais pas faire comme sur certains forum, ou le type qui a posé une question pouvant intéresser du monde dit qu’il a trouvé de son coté sans plus de détail ce qui n’est pas cool. Aussi je donne la bonne façon de faire:

        Alors on peut oublier le “\033c” pour resetter. Ca marche, mais ca efface la fenêtre (ca reset). J’ai essayé des tas de choses comme installer une région de clipping “vide” à la fenêtre pour contre carrer l’effacement, cela marche avec les fenêtre venant des flux CON: ou RAW: que le programme ouvre lui-même, mais pas avec ceux hérité de DOS->Input() pour une raison mystérieuse qui semble indiquer que les fenêtres héritées via Input() travailleraient sur une copie du RastPort à leur handler.

        En fait la bonne façon de faire qui marche à 100% sous kick 3.x ou 1.3, c’est ceci:

        1. on récupère le struct ConUnit au passage avec la récupération de la struct window:
          static struct Window* GetWindow(BPTR file, struct ConUnit **unit)
          {
          	if(IsInteractive(file)) {
          		struct MsgPort *port = (struct MsgPort *)
                         (((struct FileHandle *)BADDR(file))->fh_Type);
          		char buf[sizeof(struct InfoData)+3];
          		struct InfoData *data = (struct InfoData*)BADDR(MKBADDR(&buf[3]));
          		if(SendPkt13(port, ACTION_DISK_INFO, MKBADDR(data),0,0,0,0,0,0)) {
          			if(unit) *unit = (struct ConUnit*)(data->id_InUse ? 
          				((struct IOStdReq *) data->id_InUse)->io_Unit : 
          				NULL);
          			return (struct Window*)data->id_VolumeNode;
          		}
          	}
          	return NULL;
          }

          Le SendPkt13 peut être trouvé >>ici<< (c’est du classique dans les bouquins quand on doit envoyer ACTION_DISK_INFO sur une console).

        2. On fait ensuite le SetFont() sur le RPort de la fenêtre, mais on oublie pas de recopier le pointeur sur struct TextFont dans ConUnit->cu_Font aussi car le handler n’utilise que les infos de ConUnit pour dessiner et pas ceux du RastPort. Bien penser à encadrer cela d’un Forbid()/Permit() car il est possible qu’au moment où on change la fonte, le handler soit justement en train de l’utiliser (tout est multitâche sur Amiga: il faut prendre des précaution quand on change des données partagées entre plusieurs tâches, et une console est une tâche séparée du programme qui écrit dedans).
          Forbid();
          SetFont(con_Win->RPort, con_Unit->cu_Font = con_Win->IFont = tf);
          Permit();

          (note je positionne aussi le champ IFont de la fenêtre car c’est ce que fait le programme c:SetFont que j’ai désassemblé et étudié, mais ca n’a pas l’air d’être important dans mon cas (je restaure tout à la sortie)).

        Samuel.

        Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
        A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
        A500 Vampire V2+ ^8^ 🙂
        (mais aussi TO8, TO8D, TO9. Groupe PULS.)

        BatteMan

          #354472

          J’ai tout lu, pas compris grand chose mais ça m’a fait plaisir de le lire 😉 Vraiment !

          Merci __sam__ !


          /me galère avec Inform et son système de scripts, alors ça… /me n’ose même pas y penser 😉

          Only Amiga makes it possible !

          Sethghost

            #354475

            C’est bien de partager tes infos Sam 😉
            Pas si facile que ça à trouver des infos techniques précises sur l’amiga, même en anglais.
            Et la bible de l’amiga (la version bleue, dernière édition 1990) n’est pas du tout ni à jour, ni un manuel pour débutants. (…chercher des infos sur le trackdisk.device par exemple, pff)
            Tu désassembles avec quoi ?

            Vite, un panneau solaire.

            __sam__

              #354476

              Là j’ai utilisé ADIS présent dans la version amiga-gcc. Il ne connait pas les LVO, mais avec l’habitude et google à coté, on les reconnait et on se débrouille. En plus il n’y avait pas bézef à desassembler (vive le kick 1.3 et les exe rikiki).

              Il y a des docs sur amigaos 4 sur le web qui incluent quand même pas mal d’infos pour les OS antérieurs: https://wiki.amigaos.net/wiki/Trackdisk_Device

              Ensuite les messages de Ralph Babel (gurubook) sur EAB contiennent pas mal d’infos, mais il faut savoir décoder ce qu’il raconte (genre savoir que la partie DOS est un vieil OS (tripOS) qui a été porté à la va-vite dans l’amiga sans exec.library, d’où les incongruité de passage de message & signaux différents entre le dos et les autres taches du miga ou les pointeurs BCPL et autres.)

              Samuel.

              Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
              A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
              A500 Vampire V2+ ^8^ 🙂
              (mais aussi TO8, TO8D, TO9. Groupe PULS.)

            5 sujets de 1 à 5 (sur un total de 5)

            • Vous devez être connecté pour répondre à ce sujet.

            Forums AmigaOS, MorphOS et AROS Développement SetFont console.device

            Amiga Impact