Amiga Dünyası sayı 15, sayfa 42

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 42

geldi. Eğer d4 register'ının içi boşsa, herhangi bir işlem gerçekleştirilmedi demektir ve otomatik olarak EVENTWAIT rutinini başına dönülür. Bu sayede sadece bir işlem gerçekleştiğinde, window kapama ikonu klik edildiğinde programdan çıkabiliriz. Bu arada geçen ay yayınladığımız IDCMP flag'ları tablosunun tamamını ayrıntılı olarak tekrar yayınlıyoruz. Bunlar, her window'da kontrol edilebilecek işlemlerdir. Yanlarındaki değerler de bunların IDCMP kodlarıdır. EVENT rutini çıkışında d4 register'ındaki değer, bu değerlerden biri ya da sıfır olmakta. Değere bakarak bu şekilde window üzerinde ne tip bir işlem yapıldığını belirleyebiliriz.

$0000001 - SIZEVERIFY - Window boyutları değiştirilmeye kalkışılırsa (boyut değiştirme ikonuna klik edildiğinde) bu kod gönderilir.

$0000002 - NEWSIZE - Window boyutları değiştirildiğinde bu kod gönderilir.

$0000004 - REFRESHWINDOW - Window içeriği değişik nedenlerden bozulmuşsa ve yenilenmesine (refresh) gerek varsa bu kod gönderilir. Window içeriği, window'u bir yerden başka bir yere taşırken bozulabilir. Bu gibi durumlarda, eğer window sisteme ait bir window ise Exec ve Intuition otomatik olarak bu window'un içeriğini refresh ederler. Fakat kullanılan window, sizin yarattığınız bir window ise bu işlemi siz gerçekleştirmelisiniz. $0000008 - MOUSEBUTTONS - Mouse tuşuna basıldığında bu kod gönderilir. $0000010 - MOUSEMOVE - Mouse pencere içinde yer değiştirirse, bu kod gönderilir. $0000020 - GADGETDOWN $0000040 - GADGETUP - Bu iki kod, window içindeki bir gadget'a klik edildiğinde gönderilir. İlk kod gadget'a basıldığında; ikincisi ise gadget bırakıldığında gönderilir. $0000080 - REQSET - Requester ile ilgili işlemlerde bu kod gönderilir (daha ilerde bu konuya detaylı ineceğiz). $0000100 - MENUPICK - Bir menü ya da alt-menü fonksiyonu seçildiğinde bu kod gönderilir. $0000200 - CLOSEWINDOW - Window'un kapama ikonu kliklendiğinde bu kod gönderilir. $0000400 - RAWKEY - Klavyeden herhangi bir tuşa basıldığında bu kod gönderilir. $0000800 - REQVERIFY - Yine requester'lar ile alakalı bir kod.

Requester'ın bekleme kodudur. $0001000 - REQCLEAR - Penceredeki son requester kapanınca bu kod gönderilir. $0002000 - MENUVERIFY - Menülerin çizilme işlemi tamamlanıncaya kadar beklenmesi gerektiğini bu kod yardımıyla algılayabiliriz. $0004000 - NEWPREFS - Preferences bilgilerinden biri hafızada değiştirildiğinde bu kod gönderilir. $0008000 - DISKINSERTED - Disket sürücüye disket takıldığında bu kod gönderilir. $0010000 - DISKREMOVED - Disket sürücüsündeki disket çıkartıldığında bu kod gönderilir. $0020000 - WBENCHMESSAGE - WorkBench, kullanıcıya bir mesaj aktarmak isterse (Please insert volume ... in any drive gibi) bu kod gönderilir. Bu durumda program tarafından WorkBench requester'ı ön plana çıkarılmalı ve kullanıcı da bu mesaja cevap vermelidir. Aksi halde program devamlı beklemede kalacaktır. $0040000 - ACTIVEWINDOW - Window, aktif hale geçirildiğinde bu kod gönderilir. $0080000 - INACTIVEWINDOW - Başka bir window'a klik edilerek o an aktif olan window pasif hale geçirilmişse bu kod gönderilir. $0100000 - DELTAMOVE - Mouse, sol tuşa basılarak hareket ettirildiğinde bu mesaj gönderilir.

Evet, IDCMP kodları bu kadar. Tabii geçen ay da öğrendiğimiz gibi bunlardan birini algılayabilmek için window tanımlama structure'ında IDCMP izin koduna istenilen kodların toplamı girilmeli.

Evet, tekrar programımıza dönelim. a6 register'ının içeriği geri verildikten sonra, artık d4 register'ını kontrol ediyoruz. Buradaki değer #$200 olduğunda (IDCMP tablosuna göre window'un kapama ikonu kliklendiğinde) GERCEKMI isimli rutine dallanıyoruz. Değer, #$200'den farklı ise (=0 olabilir, çünkü diğer kodların geçmesine window structure'daki IDCMP filtreleme kodu izin vermez), kontrol rutinimizin başına (EVENTWAIT) dönüyoruz.

Buradan sonraki kısımda, programın çıkış rutinleri bulunmakta. Bunlar, window ve screen'i kapadıktan sonra library'leri de kapar ve programdan çıkmamızı sağlar.

GERCEKMI rutini bir window açarak gerçekten programdan çıkmak isteyip istemediğimizi sorar ve duruma göre değişik yerlere dallanır. Tabii burada da yine hata kontrol rutinleri eklenmiş durumda. Burada yeni bir şeyle daha karşılaşıyoruz: Gadget'lar.

Rutine baktığımızda, bir pencerenin açıldığını ve graphics library'deki TEXT rutini (jsr -60(a6)) yardımıyla, sorunun pencereye basıldığını görüyoruz. Bundan sonraki kısımda (WATTREALLY label'ı) açılan window'un pointer'ı a0 register'ına konularak EVENT kontrol rutini çağrılmakta. Gördüğünüz gibi, bu kontrol rutini programın iki yerinde birden aynı şekilde kullanılmakta. Bu rutini dilerseniz aynen alıp kendi yazdığınız programlara da ekleyebilirsiniz.

Bu sefer kontrol ettiğimiz IDCMP kodu #$80000. Bunun anlamı INACTIVEWINDOW'dur. Eğer mouse ile window dışında bir yere klik ederseniz, doğrudan CLOSEREALLYWINDOW'a gidilir. Değerimiz #$80000 değilse diye hemen ardından bir kontrol daha yapıyoruz. Burada da #$40 değerini kontrol ediyoruz. Bu sayede mevcut iki gadget'tan birine basılıp basılmadığını algılayabiliriz. Eğer window dışına klik edilmemişse ve bir gadget'a basılmamışsa hiçbir işlem yapılmadı demektir. Bu da programın WAITREALLY label'ına geri dönmemizi sağlar.

Gadget'a klik edildiğinde bunun hangi gadget olduğunu nasıl anlayacağız? Bunun için dilerseniz gadget structure'ına bir göz atalım. Bu structure'ı bulmak için, window structure'ındaki 22. byte'dan itibaren bulunan longword'a bakınız. Bu longword, ilk gadget'ımızı gösteren bir pointer'dır. Burada gadget yoksa, 0 değeri olmalıdır. Gadget varsa, ilk gadget'ın adresi (bu durumda label'ı) burada yazılı olmalıdır. Ancak bu şekilde bir zincirleme ile sistem window'da bir gadget olup olmadığını anlayabilir.

Hemen programımızdaki ilk gadget structure'ına bakıyoruz: REALLYGADGETS: REALLYGADGET2: dc.w 21,35,68,17,0,$201,1 dc.l REALLYGADGET1 IMAGE,0,REALLYITEXT1,0,0 dc.w 1 dc.l 0 Burada hemen duruyoruz. İlk longword'de bir adres değişkeni var. Bu değer yardımıyla window'daki diğer gadget'lar da sisteme tanıtılır. Bu zincirleme bir şekilde olur. Her gadget, kendisinden bir sonraki gadget'ı gösterir. En son gadget ise hiçbir gadget'ı gösteremediğinden, bu longword 0 (sıfır) değerini alır. Bu durumda structure'ımıza göre birden fazla gadget var.

Bundan sonraki iki word'daki değerler (21 ve 35) bize o gadget'ın x ve y aksislerindeki koordinatını gösterir. Bu koordinat, gadget'ın sol üst köşesidir. Bundan sonraki iki word (68, 17) ise o gadget'ın değme bölgesinin boyutunu belirler. Gadget'ı kliklemek için, o bölgeye klik etmek gereklidir. Buradan gadget'ın boyutunun değme bölgesi boyutundan farklı olabileceğini görebiliriz. Fakat bunlar da işin detay kısımları ve bunları daha ilerde detaylı olarak göreceğiz. Değme bölgemizi gadget'ın boyutu kadar alıyoruz.

Karşımıza yine bir word olan 0 değeri geliyor. Bu, gadget özelliklerini belirleyen bir değerdir. Değerimiz sıfır olduğu için gadget'ımızın fazladan bir özelliği yok. Fakat merak edenler için aşağıda bu değer yerine koyabileceğimiz dört değer ve bunların anlamları mevcut: 0 - GADGHCOMP - Değme bölgesine klik edildiğinde bu bölge içeriği negatif görünüm alır. 1 - GADGHBOX - Değme bölgesi kliklendiğinde, bu bölge çerçeve içine alınır. 2 - GADGHIMAGE - Değme bölgesi kliklendiğinde, buradaki görüntü değişir. 3 - GADGHNONE - Değme bölgesi kliklendiğinde, hiçbir reaksiyon alınamaz.

İşte yine bu ayki köşemde yer kalmadı. Oysa daha gadget'ların structure'ını bitirmem gerekiyordu. Artık programın devamının açıklaması için, ne yazık ki bir sonraki ayı beklemek zorundasınız. Gelecek sayıda görüşmek üzere hoşçakalın.

Klavyeyle gezinmek için ← ve → tuşları.