Vala ile şeffaf Rize çayı masa üstü uygulaması
Daha önce Vala ile Rize çayı uygulaması geliştirmiştik.
Bu derste nasıl bir uygulama geliştireceğimizi görmek için aşağıdaki resme bakınız.
Üstte Budgie masaüstü ortamının saat uygulaması görülüyor.
İlk bakışta saat iki kere yazılmış zannedebilirsiniz.
Ancak alttaki Rize uygulamasının yeni sürümüdür.
Artık Rize uygulaması şeffaflığı destekliyor ve bir masaüstü uygulamasıdır.
Masa üstü uygulaması olunca diyelim ki birinci masaüstünden ikinciye geçiş yaptınız.
İkinci masa üstünde de aynı yerinde duruyor.
Tüm masaüstlerinde gözüküyor. Kaybolmuyor.
Rize uygulamasını ekranın istediğiniz yerine taşıyabilme özelliği ekledik.
T
tuşuna basarak taşıma özelliğini açık hale getirin .
Daha sonra sol Ctrl tuşunun hemen yanında bulunan işletim sistemi ya da pencere tuşuna basılı tutup fare ile masa üstünün istediğiniz bölümüne taşıyabilirsiniz.
Uygulamayı depodan yükleyip sınayabilirsiniz.
Öncelikle rize.vala
kütüğüne bakalım.
using Gtk;
using Gdk;
using GLib;
using Posix;
using Cairo;
[GtkTemplate (ui = "/bir/cay/koy/rize.glade")]
class Pencere : Gtk.Window
{
private GLib.Settings ayarlar;
private bool saatiAyarla;
private string uygulama;
private int x;
private int y;
private bool tasinabilir;
Gdk.Screen ekran;
[GtkChild]
private unowned Label saat;
public Pencere ()
{
ekran = this.get_screen();
ayarlar = new GLib.Settings("bir.cay.koy");
saat.set_label(ayarlar.get_string("saat"));
saatiAyarla = ayarlar.get_boolean("ayarla");
uygulama = ayarlar.get_string("uygulama");
tasinabilir = ayarlar.get_boolean("tasinabilir");
x = ayarlar.get_int("x");
y = ayarlar.get_int("y");
if (tasinabilir)
this.set_type_hint(Gdk.WindowTypeHint.NORMAL);
else
this.set_type_hint(Gdk.WindowTypeHint.DESKTOP);
this.configure_event.connect(hareketEt);
this.set_decorated(false);
// şeffaflık ayarı
this.set_app_paintable(true);
var gorsel = ekran.get_rgba_visual();
this.set_visual(gorsel);
this.draw.connect(tekrarCizildiginde);
// hareket et
this.move(x, y);
GLib.Timeout.add(1000, saatiAzalt);
show_all();
}
bool tekrarCizildiginde (Widget pencere, Context tuval)
{
tuval.set_source_rgba(0, 0, 0, 0);
tuval.set_operator(Cairo.Operator.SOURCE);
tuval.paint();
tuval.set_operator(Cairo.Operator.OVER);
return false;
}
private bool hareketEt (Widget gonderen, Gdk.EventConfigure olay)
{
x = olay.configure.x;
y = olay.configure.y;
ayarlar.set_int("x", x);
ayarlar.set_int("y", y);
return true;
}
private int saniyeyeCevir(string sure)
{
int dakika = sure.split(":")[0].to_int();
int saniye = sure.split(":")[1].to_int();
return dakika * 60 + saniye;
}
private string metneCevir(int sureDakika)
{
int dakika = sureDakika / 60;
int saniye = sureDakika - dakika * 60;
if (dakika > 9)
if (saniye > 9)
return (dakika.to_string() + ":" + saniye.to_string());
else
return (dakika.to_string() + ":" + "0" + saniye.to_string());
else
if (saniye > 9)
return ("0" + dakika.to_string() + ":" + saniye.to_string());
else
return ("0" + dakika.to_string() + ":" + "0" + saniye.to_string());
}
private bool saatiAzalt()
{
int simdikiSaat = saniyeyeCevir(saat.get_label());
// 10 saniye kala saati gizle
if (simdikiSaat < 10)
this.visible = false;
if (simdikiSaat != 0)
simdikiSaat = simdikiSaat - 1;
else
{
Posix.system(uygulama);
return false;
}
saat.set_label(metneCevir(simdikiSaat));
if (saatiAyarla)
{
ayarlar.set_string("saat", metneCevir(simdikiSaat));
return false;
}
return true;
}
private void tasi ()
{
if (tasinabilir)
this.set_type_hint(Gdk.WindowTypeHint.NORMAL);
else
this.set_type_hint(Gdk.WindowTypeHint.DESKTOP);
}
private void saatiArttir()
{
int simdikiSaat = saniyeyeCevir(saat.get_label());
simdikiSaat = simdikiSaat + 1;
saat.set_label(metneCevir(simdikiSaat));
if (saatiAyarla)
ayarlar.set_string("saat", metneCevir(simdikiSaat));
}
[GtkCallback]
private bool tusaBasildi(EventKey tus )
{
string tusIsmi = Gdk.keyval_name(tus.keyval);
if (tusIsmi == "a" || tusIsmi == "A")
{
saatiAyarla = !saatiAyarla;
if (saatiAyarla)
GLib.stdout.printf(" - Saati ayarlama açık - \n");
else
{
GLib.stdout.printf(" - Saati ayarlama kapalı - \n");
GLib.Timeout.add(1000, saatiAzalt);
}
}
if (tusIsmi == "t" || tusIsmi == "T")
{
tasinabilir = !tasinabilir;
tasi();
}
if (tusIsmi == "minus" || tusIsmi == "KP_Subtract")
saatiAzalt();
if (tusIsmi == "plus" || tusIsmi == "KP_Add")
saatiArttir();
return true;
}
}
int main (string[] secenekler)
{
Gtk.init (ref secenekler);
var pencere = new Pencere();
pencere.destroy.connect(Gtk.main_quit);
Gtk.main();
return 0;
}
private int x;
private int y;
private bool tasinabilir;
Gdk.Screen ekran;
Kaynak kodu incelediğimizde bir tane ekran nesnesi oluşturduk.
Bu kullanıcının ekran özelliklerini getirebiliyor.
Pencere konumunu tutan x
ve y
değişkenleri var.
Konum bilgisi için bu derste anlatıldığı üzere yeni anahtarlar oluşturduk.
Uygulama her zaman taşınabilir değildir. Taşınabilir yapmak için kullanıcının T
tuşuna basması gerekiyor.
if (tusIsmi == "t" || tusIsmi == "T")
{
tasinabilir = !tasinabilir;
tasi();
}
Burada sadece taşınabilir bayrağını açık ya da kapalı yapıyoruz ve tasi
isimli işlevi çağırıyoruz.
private void tasi ()
{
if (tasinabilir)
this.set_type_hint(Gdk.WindowTypeHint.NORMAL);
else
this.set_type_hint(Gdk.WindowTypeHint.DESKTOP);
}
Bu işleve baktığımızda eğer bayrak taşınabilirse uygulama türünü normal uygulama yapıyor.
Kullanıcı zaten normal bir pencereyeyi Süper tuşu basılı iken fare ile sürükleyerek taşıyabiliyor.
Eğer taşınamaz ise uygulama türünü masa üstü uygulaması yapıyoruz.
Masa üstü uygulamaları taşınamıyor. Ama tüm masaüstlerinde görünüyor.
Ancak kullanıcı pencereyi taşımaya başladığında şu olay tetikleniyor.
this.configure_event.connect(hareketEt);
Bu işleve bakalım.
private bool hareketEt (Widget gonderen, Gdk.EventConfigure olay)
{
x = olay.configure.x;
y = olay.configure.y;
ayarlar.set_int("x", x);
ayarlar.set_int("y", y);
return true;
}
Burada x ve y koordinatlarını alıp ayar kütüğüne yazıyoruz.
Pencerenin kurucu işlevinde ise uygulama ilk başladığı zaman tekrar bu konuma taşıyoruz.
// hareket et
this.move(x, y);
Böylelikle uygulama konumunu hatırlamış oluyor.
this.set_decorated(false);
Bu işlev pencere başlığını kaldırıyor.
// şeffaflık ayarı
this.set_app_paintable(true);
var gorsel = ekran.get_rgba_visual();
this.set_visual(gorsel);
Bu kısım ise pencereyi şeffaf yapıyor.
Glade yazılımı ile pencere tasarımında bazı değişiklikler yaptık.
Uygulamanın kaynağını buradan indirebilirsiniz.
Eğer git kullanarak indirmek indirmek isterseniz
git clone https://codeberg.org/erdem/rizeden.git --branch Ders8
komutu ile bu dersi indirebilirsiniz.
rizeden
dizinin içine giriniz.
cd rizeden
Öncelikle derleme yapacağımız dizini oluşturuyoruz.
meson setup oluştur
Sonra bu oluşturduğumuz dizine girelim.
cd oluştur/
Burada uygulamayı derleyip kurmak için
sudo ninja install
komutunu verebilirsiniz.
Artık uygulamaya rize
yazarak erişebilirsiniz.
Uygulamayı kaldırmak için aynı dizinin içinde
sudo ninja uninstall
komutu vermek yeterlidir.
Yorumlar