Moro!
Olis tarkoitus tehdä linuxille terminaalissa toimiva ohjelma, joka näyttää hiiren liikkettä millimetreinä. Oon ajatellu, että Gpm vois olla hyvä kirjasto tähän hommaan ja kielenä C++. Minun käsittääkseni ohjelmani ei pitäisi olla kauheen monimutkainen, mutta ohjemointitaitoni ovat vielä aika nollassa:) Olisko vikkejä miten tää homma alkais ja mistä löytys infoa aiheesta?
Mittaa vaikka miten monta pikseliä hiiri liikkuu sentin liikutusmatkalla, ja sitten jaat ja kerrot kaiken sopivasti.
Juu vaan miten saan nuo pikselit siitä hiirestä irti?
Tarkistat hiiren sijainnin, lasket vanhan ja uuden paikan eron ja saat vastaukseksi kuinka monta pikseliä hiiri liikkui. Lisäät tuloksen kokonaistulokseen, jonka sitten muutat tulostuksen aikana millimetreiksi.
Vinkki: getcursorpos()
Huomaa että tuo tulos toimii vain omalla näytölläsi. En tiedä saako näyttöruudun fyysistä kokoa ulos millään käyttöjärjestelmä-komennolla.
User137 kirjoitti:
Huomaa että tuo tulos toimii vain omalla näytölläsi. En tiedä saako näyttöruudun fyysistä kokoa ulos millään käyttöjärjestelmä-komennolla.
Tarkoitat kai että vain omalla hiirelläsi ja omilla hiiriasetuksilla. Kannattaa sitten laittaa hiiren kiihdytys pois asetuksista, jos haluaa että mitat ei ihan täysin kuse.
Grez kirjoitti:
Tarkoitat kai että vain omalla hiirelläsi ja omilla hiiriasetuksilla.
Tämä nyt taas riippuu siitä, tarkoitettiinko hiiren liikettä millimetreinä pöydällä vai ruudulla. Itse ainakin käsitin, että kyse olisi ruudusta ja että ehdotettu ratkaisu oli vain katsoa, miten leveä yksi pikseli fyysisesti on.
No itse tietenkin oletin, että jos kysytään hiiren liikkeestä, niin ei tarkoiteta esim. hiiren kursorin liikettä.
Mielestäni suurin haaste alkuperäisessä kysymyksessä on selvitä tilanteista kun näyttötila loppuu "kesken", eli kursori töksähtää laitaan mutta hiiri yhä liikkuu. Ongelmaa voisi lähestyä joko tutkimalla saako hiiren todellisen liikkeen selville jostain alemmalta tasolta tai sitten määrittämällä että hiiri menee "reunan yli" ja ottamalla sen huomioon etäisyyksiä laskevassa ohjelmassa.
User137 kirjoitti:
En tiedä saako näyttöruudun fyysistä kokoa ulos millään käyttöjärjestelmä-komennolla.
Saa. Windowsissa GetDeviceCapsilla saa haettua näytön fyysiset mitat millimetreinä sekä näytön resoluution pikseleinä. Unixeissa vastaavat saa selville Xlibin funktioilla XDisplayWidthMM ja XDisplayWidth (ja height erikseen)
Jos sen vielä selittää tarkemmin, niin otetaan vaikka resoluutio 1280x768 ja oletetaan että näyttö on laajakuva. Mitataan mittanauhalla millimetri-suhde... Sitten kokeillaan ohjelmaa 19" tai 21" kokoisella laajakuva tai 4:3 näytöllä. Kummallakaan ei millimetrit enää olisi kohdillaan ellei mittauskoneessa ollut tarkalleen sama koko.
Jos olettaa että pikseli on yhtä leveä ja korkea (mikä ei välttämättä pidä paikkaansa) niin tuumista voi laskea leveyden millimetreinäkin. Se koko tarkottaa mittaa yläkulmasta vastakkaiseen alakulmaan.
Deffi kirjoitti:
Saa. Windowsissa GetDeviceCapsilla saa haettua näytön fyysiset mitat millimetreinä
Ei saa. Sillä saa haettua ne mitä käyttis kuvittelee näytön olevan. Ja oletuksilla käyttis kuvittelee, että kaikki näytöt on 72 dpi. Esimerkiksi omasta näytöstä käyttis väittää sen olevan 903mm leveä, kun todellisuudessa se on noin 664 mm leveä.
Peml voisi nyt selventää tarkoittiko hän todella hiiren liikettä vai kursorin.
Ja jos kyse on kursorista, niin onko aivan välttämätöntä, että liike lasketaan millimetreinä eikä vaan pikseleinä?
Juu tarkoitus on tosiaan mitata hiiren, ei kursorin, liikettä millimetreinä. Kuulahiiri puretaan ja pistetään sorviin niin et se näkys tietokoneella missä terä liikkuu, ja tosiaan olis se helpompi tulkita millimetreinä.
Gpm systeemin mukana tuli mev.c testi/esimerkki ohjelma joka näyttää hiiren koordinantit (80,25) ja paljonko koordinantteihin tuli lisää tai vähennystä riippumatta törmäsikö kursori näytön laitaan. Lähdekoodia oon tässä yrittänyt tutkiskella :) Tosin huonolla menestyksellä...
Ohjelma ei toimi xtermissä jos aiotte kokeilla.
OK onko ohjelman tarkoitus toimia muilla koneilla/näytöillä?
Eikös tämä onnistu niin että siirretään osoitin näytön keskelle, odotetaan hetki, luetaan hiiren sijainti ja siirretään se takaisin keskelle. Sitten lasketaan näytön keskikohdan ja luetun sijainnin ero ja kerrotaan se aopivalla kertoimella että saadaan tulos millimetreiksi.
En tiedä miten tuo käytännös onnistuu linuxissa. SDL:llä varmaan onnistuu edes jotenkin.
Ei ole tarkoitus toimia muilla koneilla. En tiedä toimiiko SDL terminaalissa vai pitääkö olla X päällä? X:ää en mielellään käytä, koska kyseessä on vanha kone.
Kenellään ei sattuisi olemaan kokemusta Gpm:stä ? :)
Jos tarvitset vain sovelluksen, joka tulostaa hiiren paikan, kuten tuo GPM:n mev.c
-esimerkkiohjelma paitsi muunnettuna "millimetreiksi", niin voit kovakoodata tarvittavat kalibroinnit ko. tiedostossa olevaan funktioon user_handler
, joka näyttäisi olevan vastuussa hiiren koordinaattien (event->x
ja event->y
) tulostamisesta.
Mikäli mitään tämän kummallisempaa vaaditaan ja ohjelmointitaidot eivät ole parhaassa terässä, niin suosittelen käynnistämään X:n ja käyttämään jotakin helpompaa kirjastoa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.