Openbox üzerinde şeffaf Rize çayı uygulaması

Openbox üzerinde şeffaf Rize çayı uygulaması

Giriş

Daha önce Vala ile şeffaf Rize çayı uygulaması geliştirmiştik.

Bu derste bu uygulamayı Openbox üzerinde çalıştırmayı deneyeceğiz.

Kaynak kodu indirelim

Ö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.

Siyah beyaz uygulama

Şeffaf rize çayı

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.

Şeffaf rize uygulaması

Görülebileceği üzere artık uygulama şeffaf oldu.

Uygulamayı sonlandırmak için Ctrl-C tuşlarına basabilirsiniz.

Kaynak kodda değişiklikler

Ö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.

Şeffaf rize çayı uygulaması

Artık uygulamayı başlık çubuğundan sürükleyerek istediğiniz yere taşıyabilirsiniz.

Uygulama nasıl çalışır

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.

çaycı

Bu kısayolu bir bloğunun içine eklemek gerekiyor.

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

yorum yaz

Yorum yaz

Henüz yorum yok.