diff options
author | Alex Merry <dev@randomguy3.me.uk> | 2013-04-02 14:08:57 +0100 |
---|---|---|
committer | Alex Merry <dev@randomguy3.me.uk> | 2013-04-02 14:08:57 +0100 |
commit | a707ec228ff39d0df26d78f715561952d2f8c0b9 (patch) | |
tree | 6797bd9e90bc29082604a92d1242b978f8f3ad05 /tikzit/src/gtk/gtkhelpers.m | |
parent | 5254cf1689c5fffe917609224f173c827fbf419d (diff) |
Prevent toolbox getting lost when minimising windows
On X, window managers don't like WM_TRANSIENT_FOR being altered while a
window is visible; this meant that if you opened TikZiT and opened a
second main window and minimised the main window that had focus, the
toolbox and properties window would both disappear, with no way to get
them back (well, almost - the properties window could be retreived with
the menu item that shows/hides it).
Tested with KWin, Metacity (Gnome 2's WM), Mutter (Gnome 3) and xfwm4
(XFCE 4). Metacity and Mutter still behave a little oddly - you have to
click one of the main windows *twice* to get it to focus. KWin and
xfwm4 work fine.
Diffstat (limited to 'tikzit/src/gtk/gtkhelpers.m')
-rw-r--r-- | tikzit/src/gtk/gtkhelpers.m | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/tikzit/src/gtk/gtkhelpers.m b/tikzit/src/gtk/gtkhelpers.m index e6b1aef..9d26af5 100644 --- a/tikzit/src/gtk/gtkhelpers.m +++ b/tikzit/src/gtk/gtkhelpers.m @@ -251,4 +251,25 @@ void text_buffer_clear_tag (GtkTextBuffer *buffer, GtkTextTag *tag) { gtk_text_buffer_remove_tag (buffer, tag, &start, &end); } +void utility_window_attach (GtkWindow *util_win, GtkWindow *parent_win) { + if (parent_win == gtk_window_get_transient_for (util_win)) + return; + + // HACK: X window managers tend to move windows around when they are + // unmapped and mapped again, so we save the position + gint x, y; + gtk_window_get_position (util_win, &x, &y); + + // HACK: Altering WM_TRANSIENT_FOR on a non-hidden but unmapped window + // (eg: when you have minimised the original parent window) can + // cause the window to be lost forever, so we hide it first + gtk_widget_hide (GTK_WIDGET (util_win)); + gtk_window_set_focus_on_map (util_win, FALSE); + gtk_window_set_transient_for (util_win, parent_win); + gtk_widget_show (GTK_WIDGET (util_win)); + + // HACK: see above + gtk_window_move (util_win, x, y); +} + // vim:ft=objc:ts=8:et:sts=4:sw=4 |