Strona 1 z 1

[+] Vala, przyleganie okna

: 23 czerwca 2013, 21:33
autor: mojnik
Tworzę okno GTK, jako DOCK, aby zachowywało się jak panel podobnie do gnome-panel, jednak nie wiem jakiej funkcji użyć aby inne okna po maksymalizacji przylegały do niego będąc pod spodem, a nie go zakrywały.

Przykładowo mam czysty openbox, uruchamiam gnome-panel i maksymalizuję okno edytora gedit, okno gedit jest pod panelem, jak taki efekt uzyskać?

: 23 czerwca 2013, 22:48
autor: Rafal_F
Zdaje się, że musisz użyć: _NET_WM_STRUT_PARTIAL: http://standards.freedesktop.org/wm-spe ... NETWMSTRUT
Nie znam vali, ale tutaj przykład C/C++: https://mail.gnome.org/archives/gtk-app ... 00057.html wykorzystaj nazwy funkcji (przejście z Gtk do X). W internecie są też przykłady z pythonem.

: 24 czerwca 2013, 09:44
autor: mojnik
Dziękuję za nakierowanie. Znalazłem odpowiednie funkcje i nakreśliłem coś takiego:

Kod: Zaznacz cały

private int panel_height = 0;
    private int panel_x;
    private int panel_y;
    private int panel_width;


private enum Struts {
        LEFT,
        RIGHT,
        TOP,
        BOTTOM,
        LEFT_START,
        LEFT_END,
        RIGHT_START,
        RIGHT_END,
        TOP_START,
        TOP_END,
        BOTTOM_START,
        BOTTOM_END,
        N_VALUES
    }




int main (string[] args)
{
    Gtk.init (ref args);




    var panel = new Window();

//var struts = new ulong[Struts.N_VALUES];
     
        var struts = new ulong[Struts.TOP];

        struts[Struts.TOP] = panel_height + panel_y;
        struts[Struts.TOP_START] = panel_x;
        struts[Struts.TOP_END] = panel_x + panel_width;

        var first_struts = new ulong[Struts.BOTTOM + 1];
        for (var i = 0; i < first_struts.length; i++)
            first_struts[i] = struts[i];

        unowned X.Display display = Gdk.X11Display.get_xdisplay (Gdk.Display.get_default());
        var xid = Gdk.X11Window.get_xid (panel.get_window());

        display.change_property (xid, display.intern_atom ("_NET_WM_STRUT_PARTIAL", false), X.XA_CARDINAL,
                                 32, X.PropMode.Replace, (uchar[]) struts, struts.length);
        display.change_property (xid, display.intern_atom ("_NET_WM_STRUT", false), X.XA_CARDINAL,
                                 32, X.PropMode.Replace, (uchar[]) first_struts, first_struts.length);
Wszystko się kompiluje, ale program kończy się komunikatem "naruszenie ochrony pamięci".

Edycja:

Już sobie poradziłem, okazuje się, że zmiany w GDK trzeba wprowadzić po wyświetleniu okna a nie przed.

Vala, GTK - okno zawsze pod spodem

: 30 czerwca 2013, 11:35
autor: mojnik
Vala, GTK - okno zawsze pod spodem.

Czy jest możliwość ustawienia okna tak, że przy uruchomieniu znajduje się ono zawsze pod spodem np. gdy uruchomione są inne okna, to chciałbym aby nowo otwarte okno nie było pierwsze, a znalazło się pod nimi jako ostatnie.

Jeśli jest to możliwe to pod jaką frazą szukać?

: 30 czerwca 2013, 12:54
autor: Rafal_F

Kod: Zaznacz cały

void                gtk_window_set_keep_below           (GtkWindow *window, gboolean setting);
Asks to keep window below, so that it stays in bottom. Note that you shouldn't assume the window is definitely below afterward, because other entities (e.g. the user or window manager) could not keep it below, and not all window managers support putting windows below. But normally the window will be kept below. Just don't write code that crashes if not.

It's permitted to call this function before showing a window, in which case the window will be kept below when it appears onscreen initially.

You can track the below state via the "window-state-event" signal on GtkWidget.

Note that, according to the Extended Window Manager Hints specification, the above state is mainly meant for user preferences and should not be used by applications e.g. for drawing attention to their dialogs.

window : a GtkWindow
setting : whether to keep window below other windows