X-Git-Url: https://www.irasnyder.com/gitweb/?p=tilda-gobject.git;a=blobdiff_plain;f=tilda-window.c;h=44a04e8e2fd3bea7b7dfef00bd047900601aca5a;hp=f4be2d8b68fe6183f6d9aee290f2d0e944788806;hb=HEAD;hpb=fae4409d3de153e2d5ce493304fcd7e0bccb2ad9 diff --git a/tilda-window.c b/tilda-window.c index f4be2d8..44a04e8 100644 --- a/tilda-window.c +++ b/tilda-window.c @@ -122,7 +122,7 @@ tilda_window_add_terminal (TildaWindow *self) g_ptr_array_add (self->terms, tt); label = gtk_label_new ("Tilda"); - notebook_index = gtk_notebook_prepend_page (GTK_NOTEBOOK(self->notebook), tt->hbox, label); + notebook_index = gtk_notebook_append_page (GTK_NOTEBOOK(self->notebook), tt->hbox, label); gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK(self->notebook), tt->hbox, self->full_width_tabs, TRUE, GTK_PACK_START); gtk_notebook_set_current_page (GTK_NOTEBOOK(self->notebook), notebook_index); @@ -246,6 +246,65 @@ tilda_window_center_vertically (TildaWindow *self) g_object_set (G_OBJECT(self), "y-position", center_coord, NULL); } +/* Shamelessly adapted (read: ripped off) from gdk_window_focus() and + * http://code.google.com/p/ttm/ trunk/src/window.c set_active() + * + * Also, more thanks to halfline and marnanel from irc.gnome.org #gnome + * for their help in figuring this out. + * + * Thank you. + */ + +/* This function will make sure that tilda window becomes active (gains + * the focus) when it is called. + * + * This has to be the worst possible way of making this work, but it was the + * only way to get metacity to play nicely. All the other WM's are so nice, + * why oh why does metacity hate us so? + */ +static void +tilda_window_set_active (TildaWindow *self) +{ + debug_enter (); + debug_assert (TILDA_IS_WINDOW(self)); + + Display *x11_display = GDK_WINDOW_XDISPLAY( self->window->window ); + Window *x11_window = GDK_WINDOW_XWINDOW( self->window->window ); + Window *x11_root_window = GDK_WINDOW_XWINDOW( gtk_widget_get_root_window (self->window) ); + GdkScreen *screen = gtk_widget_get_screen (self->window); + + XEvent event; + long mask = SubstructureRedirectMask | SubstructureNotifyMask; + + if (gdk_x11_screen_supports_net_wm_hint (screen, + gdk_atom_intern_static_string ("_NET_ACTIVE_WINDOW"))) + { + event.xclient.type = ClientMessage; + event.xclient.serial = 0; + event.xclient.send_event = True; + event.xclient.display = x11_display; + event.xclient.window = x11_window; + event.xclient.message_type = gdk_x11_get_xatom_by_name ("_NET_ACTIVE_WINDOW"); + + event.xclient.format = 32; + event.xclient.data.l[0] = 2; /* pager */ + event.xclient.data.l[1] = tomboy_keybinder_get_current_event_time(); /* timestamp */ + event.xclient.data.l[2] = 0; + event.xclient.data.l[3] = 0; + event.xclient.data.l[4] = 0; + + XSendEvent (x11_display, x11_root_window, False, mask, &event); + } + else + { + /* The WM doesn't support the EWMH standards. We'll print a warning and + * try this, though it probably won't work... */ + g_printerr (_("WARNING: Window manager (%s) does not support EWMH hints\n"), + gdk_x11_screen_get_window_manager_name (screen)); + XRaiseWindow (x11_display, x11_window); + } +} + static void tilda_window_keybinding_cb (const gchar *keystr, gpointer data) { @@ -281,6 +340,9 @@ tilda_window_keybinding_cb (const gchar *keystr, gpointer data) NULL); gtk_widget_show (GTK_WIDGET(self->window)); + /* Bugfix: this code fixes metacity-2.22 */ + tilda_window_set_active (self); + /* Focusing the term here works perfectly, near as I can tell */ tt = tilda_window_find_current_terminal (self); gtk_widget_grab_focus (GTK_WIDGET(tt->vte_term)); @@ -1280,15 +1342,13 @@ tilda_window_constructor (GType type, for (i=0; iinitial_terminals; ++i) tilda_window_add_terminal (self); - /* Show us if we're ready. If not, just remain hidden. All sub-widgets must - * be gtk_widget_show()n by this point. */ + /* Realize the window (only sets up X resources), and set its current state */ + gtk_widget_realize (self->window); + self->state = WINDOW_UP; + + /* If we should be shown now, do a mock call of the global callback */ if (!self->hidden_at_start) - { - gtk_widget_show (self->window); - self->state = WINDOW_DOWN; - } - else - self->state = WINDOW_UP; + tilda_window_keybinding_cb (NULL, self); /* Register this object with DBus */ tilda_window_dbus_register_object (self);