/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:expandtab:shiftwidth=2:tabstop=8: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsGTKRemoteService.h" #include #include #include #include "nsIBaseWindow.h" #include "nsIDocShell.h" #include "nsPIDOMWindow.h" #include "mozilla/ModuleUtils.h" #include "nsIServiceManager.h" #include "nsIAppShellService.h" #include "nsAppShellCID.h" #include "nsCOMPtr.h" #include "nsGTKToolkit.h" NS_IMPL_ISUPPORTS(nsGTKRemoteService, nsIRemoteService) NS_IMETHODIMP nsGTKRemoteService::Startup(const char* aAppName, const char* aProfileName) { NS_ASSERTION(aAppName, "Don't pass a null appname!"); if (mServerWindow) return NS_ERROR_ALREADY_INITIALIZED; XRemoteBaseStartup(aAppName, aProfileName); mServerWindow = gtk_invisible_new(); gtk_widget_realize(mServerWindow); HandleCommandsFor(mServerWindow); return NS_OK; } NS_IMETHODIMP nsGTKRemoteService::Shutdown() { if (!mServerWindow) return NS_ERROR_NOT_INITIALIZED; gtk_widget_destroy(mServerWindow); mServerWindow = nullptr; return NS_OK; } void nsGTKRemoteService::HandleCommandsFor(GtkWidget* widget) { g_signal_connect(G_OBJECT(widget), "property_notify_event", G_CALLBACK(HandlePropertyChange), nullptr); gtk_widget_add_events(widget, GDK_PROPERTY_CHANGE_MASK); Window window = gdk_x11_window_get_xid(gtk_widget_get_window(widget)); nsXRemoteService::HandleCommandsFor(window); } gboolean nsGTKRemoteService::HandlePropertyChange(GtkWidget* aWidget, GdkEventProperty* pevent, void* aData) { if (pevent->state == GDK_PROPERTY_NEW_VALUE) { Atom changedAtom = gdk_x11_atom_to_xatom(pevent->atom); XID window = gdk_x11_window_get_xid(gtk_widget_get_window(aWidget)); return HandleNewProperty(window, GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), pevent->time, changedAtom); } return FALSE; }