Openbox üzerinde şeffaf Rize çayı uygulaması
Daha önce Vala ile şeffaf Rize çayı uygulaması geliştirmiştik.
Bu derste bu uygulamayı Openbox üzerinde çalıştırmayı deneyeceğiz.
Öncelikle git kullanarak uygulamanın kaynak kodunu indirelim.
git clone https://codeberg.org/erdem/rizeden.git --branch Ders8
Uygulamayı bilgisayara indirdik. Dizinin içine girelim.
cd rizeden
Derleme dizinini oluşturalım.
meson setup oluştur
Dizinin içine girelim
cd oluştur
Uygulamayı derleyelim.
ninja install
Burada yetki olmadığını söyleyen bir hata veriyor. Önemli değil. İsterseniz sudo ninja install şeklinde de kurulum yapabilirsiniz.
kaynak/rize
şeklinde uygulamayı çalıştıralım.

Amanın o da ne.
Uygulamamız siyah beyaz olmuş.
Bunun nedeni Openbox'ta opaklık özelliği yok.
Diğer taraftan X sunucunda opaklık özelliği sağlayan xcompmgr isimli bir yazılım var.
sudo pacman -S xcompmgr
komutu ile uygulamayı kurabilirsiniz.
Uygulamanın şeffaf olabilmesi için ~/.config/openbox/autostart kütüğüne bir ekleme yapalım.
xcompmgr &
Oturumu tekrar başlatınız.
kaynak/rize
şeklinde uygulamayı çalıştıralım.

Görülebileceği üzere artık uygulama şeffaf oldu.
Uygulamayı sonlandırmak için Ctrl-C tuşlarına basabilirsiniz.
Önceki uygulamayı t tuşuna basarak istediğimiz konuma taşıyabiliyorduk.
Eğer sınama yaparsanız hâl-i hazırda taşıyamadığımızı görebilirsiniz.
Taşıma yapabilmek için kaynak kodda bazı değişiklikler yapmamız gerekiyor.
Bunun için uygulamanın kaynak kodunda bazı değişiklikler yapalım.
rize.vala kütüğünü aşağıdaki gibi değiştirelim.
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");
this.configure_event.connect(hareketEt);
// şeffaflık ayarı
this.set_app_paintable(true);
var gorsel = ekran.get_rgba_visual();
this.set_visual(gorsel);
if (tasinabilir)
{
this.set_decorated(true);
this.set_type_hint(Gdk.WindowTypeHint.NORMAL);
}
else
{
this.set_decorated(false);
this.set_type_hint(Gdk.WindowTypeHint.DESKTOP);
}
// pencere eski konumdan ortaya çıksın
this.move(x, y);
GLib.Timeout.add(1000, saatiAzalt);
show_all();
}
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 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;
if (tasinabilir)
{
GLib.stdout.printf(" - Saat taşınabilir - \n");
this.set_decorated(true);
this.set_type_hint(Gdk.WindowTypeHint.NORMAL);
}
else
{
GLib.stdout.printf(" - Saat taşınamaz - \n");
this.set_decorated(false);
this.set_type_hint(Gdk.WindowTypeHint.DESKTOP);
}
}
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;
}
oluştur isimli dizinde iken ninja install komutu ile uygulamayı tekrar derleyelim.
Uygulama üzerinde iken t tuşuna bastığınızda saati taşıma açık ya da kapalı hale geliyor.
Uygulamayı taşıyalım.

Artık uygulamayı başlık çubuğundan sürükleyerek istediğiniz yere taşıyabilirsiniz.
Diyelim ki ocağa çay koydunuz. Isınmasını bekliyorsunuz.
Eğer unutursanız çok kaynayıp acılaşabilir.
Bunun için geliştirdiğimiz ufak yazılımı kullanıyoruz.
Süre bittiğinde fare bir aşağı bir yukarı hareket ediyor. Böylece çayın kaynadığını anlayabiliyorsunuz.
Eğer yönetici yetkileri yoksa uygulamayı ~/bin dizinine de kopyalayabiliriz.
cp kaynak/rize ~/bin/
Bu komutu oluştur dizininde veriyoruz.
Geliştirdiğimiz uygulama için bir kısayol oluşturmak için ~/.config/openbox/rc.xml kütüğüne aşağıdaki gibi bir ekleme yapalım.
Bu kısayolu bir
Bu kısayol bize Ctrl-Alt-R tuşlarına basıldığı zaman çaycı uygulamasının çalışacağını söylüyor.
Artık uygulamayı Ctrl-Alt-R tuşlarına basarak çalıştırabiliriz. T tuşu ile istediğimiz yere taşıyabiliriz.
Süre bittiğinde ise fare dönmeye başlıyor.
Yorumlar