Vala ile şeffaf Rize çayı masa üstü uygulaması

Vala ile şeffaf Rize çayı masa üstü uygulaması

Giriş

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.

Rize çayı masaüstü uygulaması

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

Şeffaf Rize çayı masa üstü uygulaması

Ö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;
}

Uygulamanın açıklaması

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 kaynak kodu

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.

Dersi derlemek

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

yorum yaz

Yorum yaz

Henüz yorum yok.