--- brackets-shell/appshell/client_handler_gtk.cpp +++ brackets-shell/appshell/client_handler_gtk.cpp @@ -5,12 +5,17 @@ #include #include #include +#include +#include #include "client_handler.h" #include "include/cef_browser.h" #include "include/cef_frame.h" +#include "include/cef_app.h" // The global ClientHandler reference. extern CefRefPtr g_handler; + +extern bool isReallyClosing; void ClientHandler::OnAddressChange(CefRefPtr browser, CefRefPtr frame, @@ -29,12 +34,42 @@ void ClientHandler::OnTitleChange(CefRefPtr browser, const CefString& title) { REQUIRE_UI_THREAD(); + std::string titleStr(title); - GtkWidget* window = gtk_widget_get_ancestor( - GTK_WIDGET(browser->GetHost()->GetWindowHandle()), - GTK_TYPE_WINDOW); - std::string titleStr(title); - gtk_window_set_title(GTK_WINDOW(window), titleStr.c_str()); + // Retrieve the X11 display shared with Chromium. + ::Display* display = cef_get_xdisplay(); + DCHECK(display); + + // Retrieve the X11 window handle for the browser. + ::Window window = browser->GetHost()->GetWindowHandle(); + DCHECK(window != kNullWindowHandle); + + // Retrieve the atoms required by the below XChangeProperty call. + const char* kAtoms[] = { + "_NET_WM_NAME", + "UTF8_STRING" + }; + Atom atoms[2]; + int result = XInternAtoms(display, const_cast(kAtoms), 2, false, + atoms); + if (!result) + NOTREACHED(); + + // Set the window title. + XChangeProperty(display, + window, + atoms[0], + atoms[1], + 8, + PropModeReplace, + reinterpret_cast(titleStr.c_str()), + titleStr.size()); + + // TODO(erg): This is technically wrong. So XStoreName and friends expect + // this in Host Portable Character Encoding instead of UTF-8, which I believe + // is Compound Text. This shouldn't matter 90% of the time since this is the + // fallback to the UTF8 property above. + XStoreName(display, browser->GetHost()->GetWindowHandle(), titleStr.c_str()); } void ClientHandler::SendNotification(NotificationType type) { @@ -62,11 +97,6 @@ else gtk_widget_set_sensitive(GTK_WIDGET(m_ForwardHwnd), false); #endif // SHOW_TOOLBAR_UI -} - -void ClientHandler::CloseMainWindow() { - // TODO(port): Check if this is enough - gtk_main_quit(); } void ClientHandler::ComputePopupPlacement(CefWindowInfo& windowInfo) @@ -101,3 +131,4 @@ // TODO return false; } +