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ć?
[+] Vala, przyleganie okna
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.
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.
Dziękuję za nakierowanie. Znalazłem odpowiednie funkcje i nakreśliłem coś takiego:
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.
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);
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
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ć?
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ć?
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