Τρίτη 2 Μαΐου 2017

Αναθεώρηση 17 (Έκδοση 8,7) - Wine Linux

Σε αυτήν την αναθεώρηση έκανα μερικές βελτιώσεις για να τρέχει καλύτερα σε Linux Wine ο διερμηνευτής.


Ένα βασικό πρόβλημα στο Ubuntu Studio με το Wine και το XFCE για τα παράθυρα είναι ότι δεν μετακινεί φόρμες με αλλαγή μεγέθους,όπως θα έπρεπε αν έτρεχε σε Windows. Οι φόρμες χρήστη δεν είχαν πρόβλημα αλλά είχε πρόβλημα η κονσόλα. Και η κονσόλα μπορεί να αλλάξει μέγεθος και να γίνει ένα μικρότερο παράθυρο από πλήρη οθόνη. Μετά από δυο μέρες πειραματισμό βρήκα ότι το πρόβλημα ήταν στην ενημέρωση της φόρμας, για τις αλλαγές μεγεθών. Δεν γίνονταν γρήγορα, και έτσι όταν ζήταγε εσωτερικά τιμές το περιβάλλον του διερμηνευτή έπαιρνε παλαιότερες τιμές! Η λύση που βρήκα ήταν να δίνω εντολή για απόκρυψη και μετά για επανεμφάνιση (ιδιότητα visible). Όταν συμβαίνει αυτό τότε μπορεί να μετακινηθεί η βασική φόρμα μαζί με αλλαγή μεγέθους.
Μπορούμε να ορίσουμε ένα παράθυρο (σε twips οι μονάδες), και να μας το κεντράρει άμεσα (εκεί είχε πρόβλημα, ενώ στην πλήρη οθόνη δεν υπήρχε).
Ακολουθεί ένα πρόγραμμα που δείχνει μερικές εντολές.
Η Παράθυρο έχει παραλλαγές
πχ.
Παράθυρο 10   
Κάνει το τρέχον παράθυρο να δείχνει 10άρια γράμματα (10pt, 1pt=1/72 ίντσας, στην οθόνη λέγεται λογική ίντσα και ισοδυναμούν 1440twips σε μια λογική ίντσα, στον εκτυπωτή μια λογική ίντσα είναι πάντα ίση με τη φυσική ίντσα).
Υπολογίζει βάσει του διάστιχου που έχουμε ορίσει (ορίζεται με την εντολή Διάστιχο 30 ή άλλο νούμερο, ανά 2 pixels, σε twips, αν 1 pixel = 15twips τότε δίνουμε ανά 30) την ανάλυση σε χαρακτήρες μη αναλογικούς (οι θέσεις χαρακτήρων υπολογίζονται να φθάνουν για χαρακτήρες με την τρέχουσα γραμματοσειρά και αν είναι πλάγιοι, και αν είναι φαρδιοί και ή και τα δύο). Κατά μια έννοια δημιουργεί μια εσωτερική κάνναβο οι οποία όχι μόνο δέχεται γράμματα αλλά έχει θέσεις για γραμμές οριζόντιες και κάθετες για να φτιάχνονται περιγράμματα. Η Τύπωσε χρησιμοποιεί την κάνναβο αυτή με στήλες για να εμφανίζει αλφαριθμητικά και αριθμούς και εικόνες. Στις ίδιες στήλες μπορούμε να εμφανίζουμε και αναλογική γραφή (οπότε γράφονται περισσότεροι χαρακτήρες). Επίσης εξ ορισμού η Τύπωσε δεν πειράζει το φόντο (εκτός και αν το ζητήσουμε με εντολές που δέχεται στη λίστα των ορισμάτων που δίνουμε μαζί)
Παράθυρο 10; 
ότι και η προηγούμενη αλλά κεντράρει τη σελίδα.
Παράθυρο 10,0 
Πλήρης οθόνη με δεκάρια γράμματα και αν χρειαστεί βάζει περιθώριο (το περιθώριο είναι ένα επίπεδο πίσω από τη φόρμα που βλέπουμε και μπορούμε να γράψουμε και εκεί, και επιπλέον η οθόνη μας (η φόρμα της κονσόλας) μπορεί να μετακινηθεί μέσα στο περιθώριο.
Παράθυρο 10,12000
Παράθυρο 10,12000, 80000
Δίνουμε πλάτος ή πλάτος και ύψος (όταν πάρει πλάτος τότε υπολογίζει το ύψος από την αναλογία της συσκευής της οθόνης -monitor.
Παράθυρο 10,12000;
Παράθυρο 10, 12000, 8000;
Κεντράρει το παράθυρο

Μια άλλη εντολή η Φόρμα κάνει τρεις δουλειές
Υπολογίζει το μέγεθος από αυτό που ζητάμε:
Φόρμα 60, 40 
Δημιουργεί μια οθόνη (κονσόλα) μέσα στο παράθυρο όπως το έχουμε φτιάξει, αν είναι σε πλήρη οθόνη ή αν είναι σε μικρότερο παράθυρο. Υπολογίζει το διάστιχο, και βρίσκει το μέγεθος των γραμμάτων και δίνει όσο του ζητάμε. Έχει κάποια όρια φυσικά. Το μέγεθος των γραμμάτων το λέμε Τύπος στη Μ2000.
Φόρμα 60
Μπορούμε να δώσουμε μόνο το πλάτος και θα βάλει όσες γραμμές χρειάζεται με το τρέχον διάστιχο .
Οι δυο αυτές παραλλαγές αλλάζουν το περιθώριο, αλλά όχι το παράθυρο. Δηλαδή πάντα η φόρμα θα είναι εντός του παραθύρου

Επειδή η φόρμα δουλεύει βάσει του παραθύρου, μπορούμε να πειράξουμε αυτόματα το παράθυρο:
Φόρμα
Εξαφανίζει το περιθώριο. Έτσι τώρα εκεί που είχαμε 60Χ40 με περιθώριο θα έχουμε χωρίς. (θα δούμε παράδειγμα για τη χρήση του παρακάτω)
Φόρμα;
Αυτή η εντολή βάζει το περιθώριο για να καλύψει όλη την οθόνη και κεντράρει τη κονσόλα στο κέντρο.
Φόρμα 60,4;
Εδώ έχουμε μια φόρμα με 60 χαρακτήρες των 4 γραμμών με το τρέχον διάστιχο (οπότε δεν καλύπτεται όλο το ύψος).
Το παρακάτω εξομοιώνει τη λειτουργία της Φόρμα 60,4; και δείχνει τον υπολογισμό (εδώ όμως κρατάει το διάστιχο που όρισε η Φόρμα 60, 40)

Παράθυρο 8,0
Φορμα 60,40
Φορμα
παράθυρο τυπος, χ.σημεία, υ.σημεία/υψος*4;
Φορμα;
Κίνηση ,0
Περιθώριο 48 {
      Φόντο 1, 5
      Δρομέας 0,Ύψος/2
      Αναφορά 2, "Κεντραρισμένο Κείμενο στο Περιθώριο"
}

Η Κίνηση μετακινεί την κονσόλα εντός, ενώ η Κίνηση.Π μετακινεί το παράθυρο (και ότι έχει μέσα, αλλά όχι τυχόν φόρμες χρήστη, άλλα δηλαδή παράθυρα που μπορεί να φτιάξει)
Τα Κίνηση.Χ , Κίνηση.Υ και Κίνηση.ΧΠ και Κίνηση.ΥΠ δίνουν το σημείο της άνω αριστερή γωνίας, αλλά εδώ τα πρώτα σε σχέση με το παράθυρο και τα δεύτερα με την πλήρη οθόνη (όπου 0,0 είναι η πάνω αριστερή γωνία).

Στις πρώτες εκδόσεις το περιβάλλον της γλώσσας χρησιμοποιούσε την Τύπος (μετά μπήκε η Παράθυρο και μετά η Φόρμα).

Τύπος 14
Κάνει 14άρια τα γράμματα και μειώνει την κονσόλα (πάντα κεντραρισμένη) για να μην υπάρχουν άχρηστα σημεία. Το παράθυρο δεν αλλάζει
Τύπος 14, 10000
Τύπος 14, 10000, 8000
Εδώ οι διαστάσεις είναι ενδεικτικές, γιατί θα μειωθούν για να μην υπάρχουν μη διαθέσιμα σημεία (δεν γράφουμε μισούς χαρακτήρες.
Η εντολή Περιθώριο 22 { } κάνει το Περιθώριο (πίσω από την κονσόλα) να έχει Τύπο 22, αλλά εδώ μπορούν να υπάρχουν σημεία που δεν χρησιμοποιεί η τύπωσε, γιατί δεν πειράζει το μέγεθος του παραθύρου. Μπορούμε να ορίσουμε άλλη γραμματοσειρά με την εντολή Γραμματοσειρά, και γενικά μπορούμε να έχουμε ένα νήμα που να γράφει πίσω, επειδή το περιθώριο είναι ένα επίπεδο με δικό του δρομέα, και μεταβλητές για χρώμα φόντου και πένας.
Η εντολή Οθόνη που καθαρίζει το επίπεδο όπου την εκτελούμε (εξ ορισμού στην κονσόλα, ορίζει με την δεύτερη παράμετρο και το κάτω μέρος που μπορεί να ολισθαίνει. Αυτό το κάνει για το Περιθώριο, το Επίπεδο (χωρίς νούμερο είναι η βασική οθόνη ή κονσόλα) και για άλλα 32 επίπεδα. Τα 32 επίπεδα μπορούν να έχουν γραφικά και κείμενο και σε αυτά λειτουργούν οι εντολές Παράθυρο, Φόρμα, Τύπος με ελάχιστες διαφοροποιήσεις στο αποτέλεσμα.
Εδώ να σημειώσω ότι υπάρχουν δυο επίπεδα ακόμα, ένα που λέγεται Επιφάνεια και σε αυτό δεν γράφουμε και βρίσκεται στο βάθος, και παίρνει ή ένα χρώμα ή ένα αντίγραφο της επιφάνειας εργασίας ή μια εικόνα. Χρησιμοποιείται και σαν "Στοπ" όταν βάζουμε διαφάνεια 100% σε ορισμένα Pixels, γιατί αλλιώς θα κάναμε κλικ στα στοιχεία από πίσω!
Το τελευταίο επίπεδο είναι εκτός οθόνης, είναι η σελίδα του εκτυπωτή. Οι εντολές σχεδίασης, η Τύπωσε, η Αναφορά (που βγάζει φορμαρισμένο κείμενο μιας ή περισσότερων γραμμών, ή ακόμα και μιας ομάδας γραμμών κάνοντας υπολογισμό της αναδίπλωσης λέξεων) λειτουργούν στη σελίδα του εκτυπωτή.

Δοκιμάστε το παρακάτω
Σε Wine με Tahoma που δεν ήταν Unicode γραμματοσειρά χρειάστηκε να δηλώσω με την Χαρακτήρες το 161 (για να φορτωθεί το κατάλληλο αρχείο γραμματοσειράς). Δείχνω μερικούς τρόπους εμφάνισης
Εικόνα από την έξοδο του προγράμματος, σε Ubuntu Studio, με γραμματοσειρά Tahoma Ansi (η Μ2000 χρησιμοποιεί Unicode γραμματοσειρές και Ansi).

Σε κάθε επίπεδο μπορούμε να έχουμε διπλού ύψους/πλάτους γράμματα. Η Αναφορά λειτουργεί εδώ λογαριάζοντας όλο το πλάτος, αλλά μπορεί να λογαριάζει από ένα αριστερό περιθώριο ως ένα πλάτος ή σε χαρακτήρες ή σε σημεία, και να κάνει ανάλογα στοίχιση (έχει και πλήρη στοίχιση). Δείτε επίσης ότι χρησιμοποιεί σωστά το Kerning (πχ στα πλάγια γράμματα φαίνεται περισσότερο, στο Τίτλος στα τλ φαίνεται το ταυ να πέφτει πάνω από το λάμδα.(και ο διορθωτής μπορεί να δουλέψει σωστά με πλάγια γράμματα, το γράφω γιατί και σε αυτόν έχω γράψει το κώδικα)
Δείτε στο κέντρο τρεις γραμμές, η μία δεν αλλάζει το φόντο, η άλλη το έχει αλλάξει με το ματζέντα το χρώμα του φόντου, και η τρίτη έχει φτιάξει ασύμμετρη στήλη (διαφορετικού πάχους από τη πρώτη αριστερά), και έχει βάλει πλαίσιο και φόντο, και κεντραρισμένο κείμενο.
Στο κάτω μέρος φαίνεται η μη αναλογική γραφή που έχει αυτόματη αναδίπλωση ανά χαρακτήρα.
Η τελευταία γραμμή δείχνει την χρήση στηλών με αναλογική γραφή και αλλαγές στο φόντο ανά στήλη (ανά γραμμή).




\\ Πλήρης οθόνη με 14άρια γράμματα, βάζει περιθώριο όσο χρειάζεται
\\ υπολογίζει σε ζυγό νούμερο του χαρακτήρες στη γραμμή
\\ και αν βρει υπόλοιπο το μοιράζει
\\ το διάστοιχο αλλάζει ανά 30 twips (2 pixels στα 15 twips per pixel)
Διάστιχο 60
Παλιά$=Γραμματοσειρά$
Γραμματοσειρά "Tahoma"
\\ η IsWine δίνει -1 αν τρέχει ο διερμηνευτής σε Wine σε Linux
'Αν IsWine Τότε Ελληνικά ' σε Wine μπορεί η γραμματοσειρά Tahoma να μην είναι Unicode
Χαρακτήρες 161
Παράθυρο 14, 18000, 14000;
Οθόνη 5 \\Ματζέντα
Πένα 14 \\ Κίτρινο
Πάχος 4 { \\ πάχος γραμμής σε pixels
      Θέση Χ.Σημεία/2,Υ.Σημεία/2
      Κύκλος Μικρό.Σειράς(Χ.Σημεία, Υ.Σημεία)*.3, 1.2, 1
      Κύκλος Γέμισμα #FF5522, Μικρό.Σειράς(Χ.Σημεία, Υ.Σημεία)*.3*.5,1,#FF5522
}
Αναφορά 2, "Κεντραρισμένος Τίτλος Με Αναλογική Γραφή"
Δρομέας 0,1
Διπλά
Πλάγια 1 \\ ή Πλάγια   για αναστροφή σημαίας
Πένα 15 {
      Αναφορά 2, "Κεντραρισμένος Τίτλος (διπλού ύψους/πλάτους)"
}
Πλάγια 0 \\ ή Πλάγια   για αναστροφή σημαίας
Κανονικά
\\ εκτύπωση με αναλογική γραφή με αλλαγή με τη συνάρτηση $()
Τύπωσε $(4),"Εκτύπωσε σε στήλες",1,2,"οκ",$(0)
\\ εντολή που κόβει το περιθώριο
Φόρμα
\\ αν χρειαστεί κόβει το ύψος (σε Wine)
\\ αυτό γίνεται αν υπάρχει γραμμή εντολών που δεν επιτρέπει
\\  αν δεν βάζαμε το $(0); θα βάζαμε το "";
\\  το ; κολλάει ότι έχει στο προηγούμενο (δεν ακλουθεί τις στήλες), και παράλληλα δεν αλλάζει γραμμή
\\ χωρίς το "" το Ύψος θα κολήσει με το Πλάτος
Πένα 15 {
      Τύπωσε @(0,Ύψος-1),$(4),"οκ", Στήλη, ~(12,7),Πλάτος,~(12,8),Ύψος,$(0);
}
\\ Στην έξοδο του μπλοκ Πένα επανέρχεται το χρώμα πένας σε αυτό που ήταν πριν
\\ Εμφάνιση με μορφή αλφαριθμητικού και ένθεση τιμών
\\ Από Χ.σημεία έχουμε μονάδες σε twips
\\  τα τελευταία μας δίνουν  τα twips ανά pixel σε πλάτος και ύψος (στους εκτυπωτές μπορεί να διαφέρει)
ολο$= Μορφη$("στήλη {0}, οθόνη {1}Χ{2}, φόρμα {3}Χ{4}, ανάλυση {5}Χ{6}, σημείο {7}Χ{8}", Στήλη, Πλάτος, Ύψος, Χ.Σημεία, Υ.σημεία, Ανάλυση.Χ/Πλάτος.Σημείου, Ανάλυση.Υ/Ύψος.Σημείου, Πλάτος.Σημείου, Ύψος.Σημείου)
Τύπωσε @(0,Ύψος-3), ολο$
Δρομέας 0, Ύψος/2-1
Πένα 15 { Αναφορά 1, ολο$ }
\\ απευθείας αναλογική γραφή σε μια στήλη  όλη  η  γραμμή, το $(7) σημαίνει δεξιά στοίχηση σε αναλογική γραφή
\\ οι Τύπωσε Πάνω/Μέρος/Υπό δεν αλλάζουν γραμμή, και μπορούν να αλλάζουν τοπικά το πλάτος στήλης
\\ Η τύπωσε Πάνω ξεκινάει με στήλη όσο το πλάτος, και πρώτα καθαρίζει το φόντο με το χρώμα φόντου
\\ εκτός από μια γραμμή την οποία τη βάζει η Τύπωσε Υπό (και κάνει και αλλαγή γραμμής)
\\ Η Τύπωσε Μέρος και Τύπωσε Υπό κατά τα άλλα μοιάζουν, δεν αλλάζουν άμεσα το φόντο
\\ και έχουν αρχικά το μέγεθος στήλης που δίνει το Στήλη (μόνο διαβάζεται αυτή η μεταβλητή)
Τύπωσε Πάνω $(7), ολο$
\\Τύπωσε Υπό     \\ τυπώνει υπογράμιση σε όλη τη γραμμή
Τύπωσε
\\ αφήνω στήλη 4 μη αναλογικών χαρακτήρων, και θέτω στήλη πλάτος-8, με στοίχιση κέντρο (6)
\\ βάζω χρώμα γραμμάτων φόντου στήλης και περίγραμμα
\\ η στήλη αλλάζει με τη δεύτερη παράμετρο αν είναι αριθμός.
Τύπωσε Πάνω $( ,4),"", $(6 ,Πλάτος-8), ~(3, 7, 15), Κεφ$(ολο$)
\\ αναμονή πλήκτρου
Α$=Κομ$
\\ εντολή που κεντράρει τη φόρμα και βάζει περιθώριο για να καλύψει όλη την οθόνη
\\ και τη σβήνει
Φόρμα ;
Γραμματοσειρά παλιά$
Διάστιχο 0
Φόρμα 60,40 \\ υπολογίζει αυτόματα το μέγεθος χαρακτήρων ανά .25pt (1pt=1/72 inch)
\\ ο Τύπος είναι το μέγεθος χαρακτήρων
\\ Η Χαρακτήρες επιστρέφει την Ansi σελίδα χαρακτήρων
Τύπωσε Χαρακτήρες, Διάστιχο, Τύπος
Τύπωσε Γραμματοσειρά$
Επίλεξε.Γραμματοσειρά
Αν Αριθμός>0 Τότε {
Διάβασε όνομα$, τυποςγρ, χαρ, πλαγιαστά, έντονα
Τύπωσε όνομα$, τυποςγρ, χαρ, πλαγιαστά, έντονα
}




Απλός το αναφέρω και θα το δούμε κάποια στιγμή. Πριν φτιάξω τις φόρμες χρήστη (GUI) είχα (και παραμένουν) τους στόχους σε κάθε επίπεδο, όπου μπορούσαν έπειτα από Σάρωση (μια εντολή δηλαδή) να διαβαστεί αν έχουμε πατημένο το δείκτη του ποντικού και να εκτελέσουν ένα γενικό τμήμα (πριν κατανοήσω πως φτιάχνουμε τα γεγονότα, και έτσι έφτιαξα τις φόρμες χρήστη, με στοιχεία ελέγχου). Μπορεί λοιπόν με τη βασική φόρμα να φτιάξει διάφορες οθόνες και να παρουσιάζει εικόνες, ήχους, κινούμενες εικόνες (τα 32 επίπεδα δουλεύουν και ως sprites, με δυνατότητα μεγέθυνσης και περιστροφής), βίντεο και html σελίδες, και να έχει στόχους για να αλλάζει οθόνες ή να κάνει επιλογές γενικότερα. Στόχος ήταν να έχει κανείς την δυνατότητα να στήσει multimedia εφαρμογές. Αν βάλουμε ότι η γλώσσα φτιάχνει και συνδέεται με βάσεις δεδομένων, παίζει μουσική (από wav αρχεία), μιλάει με τη χρήση του συνθεσάιζερ φωνής (όχι σε Wine), παίζει μουσική με νότες, με νήμα, κατά την εκτέλεση άλλων εντολών δηλαδή (στο Wine δεν βρήκα πως να το κάνω να ακούγεται, κάτι λείπει, μάλλον τα sound fonts αλλά δεν έχω γνώση επί του θέματος, ακόμα), τότε λοιπόν αυξάνονται κατά πολύ οι επιλογές και οι χρήσεις της γλώσσας.
(Οι εντολές για ήχο είναι η Μουσική, Φωνή, Παίξε,  Λόγος, Τόνος, Περιθώριο Μουσική όπου με αλφαριθμητικό παίζει αρχείο μουσικής στο περιθώριο)

Ωραίο παράδειγμα (τρέχει σε Wine) παίζει μουσική στο περιθώριο, παίζουμε πάνω σε αυτήν ένα δεύτερο κομμάτι, και στο τέλος παίζουμε μουσική που σταματάει τις εντολές αλλά όχι το νήμα Κ. Χρειάζεται ένα αρχείο ήχου (το tada.wav από windows)








Περιθώριο Μουσική "tada.wav"
Για ι=1 Έως 200 {
      Τύπωσε ι,
      Ζ=Διάρκεια
      Αν Ζ<>0 Τότε Τύπωσε Μουσική, Στρογγ((Ζ-Μουσική.Μετρητής)/Ζ*100,2), Ζ,
      Τύπωσε
      Αν ι=30 Τότε Μουσική "tada.wav"      
}
Περιθώριο Μουσική \\ κόβει άμεσα τη Μουσική περιθωρίου
\\ Μουσική \\κόβει τη Μουσική
Ενώ Μουσική {
ι++
Τύπωσε ι,
      Ζ=Διάρκεια
      Αν Ζ<>0 Τότε Τύπωσε Μουσική, Στρογγ((Ζ-Μουσική.Μετρητής)/Ζ*100,2), Ζ,
      Τύπωσε
}
Τύπωσε ι, Μουσική
Νήμα {
Τύπωσε ι
ι++
Ανανέωση
} Ως Κ Κάθε 30
\\ το παρακάτω...δεν σταματάει το νήμα Κ
Μουσική "tada.wav";  \\ παίζει Μουσική και μετά συνεχίζει στην επόμενη εντολή
Τύπωσε "οκ"







 




Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.