1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:expandtab:shiftwidth=2:tabstop=8:
3 */
4 /* This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8 #include "nsGTKRemoteServer.h"
9
10 #include <gtk/gtk.h>
11 #include <gdk/gdk.h>
12 #include <gdk/gdkx.h>
13
14 #include "mozilla/ModuleUtils.h"
15 #include "nsAppShellCID.h"
16
17 #include "nsCOMPtr.h"
18
19 #include "nsGTKToolkit.h"
20
Startup(const char * aAppName,const char * aProfileName)21 nsresult nsGTKRemoteServer::Startup(const char* aAppName,
22 const char* aProfileName) {
23 NS_ASSERTION(aAppName, "Don't pass a null appname!");
24
25 if (mServerWindow) {
26 return NS_ERROR_ALREADY_INITIALIZED;
27 }
28
29 XRemoteBaseStartup(aAppName, aProfileName);
30
31 mServerWindow = gtk_invisible_new();
32 gtk_widget_realize(mServerWindow);
33 HandleCommandsFor(mServerWindow);
34
35 return NS_OK;
36 }
37
Shutdown()38 void nsGTKRemoteServer::Shutdown() {
39 if (!mServerWindow) {
40 return;
41 }
42
43 gtk_widget_destroy(mServerWindow);
44 mServerWindow = nullptr;
45 }
46
HandleCommandsFor(GtkWidget * widget)47 void nsGTKRemoteServer::HandleCommandsFor(GtkWidget* widget) {
48 g_signal_connect(G_OBJECT(widget), "property_notify_event",
49 G_CALLBACK(HandlePropertyChange), this);
50
51 gtk_widget_add_events(widget, GDK_PROPERTY_CHANGE_MASK);
52
53 Window window = gdk_x11_window_get_xid(gtk_widget_get_window(widget));
54 nsXRemoteServer::HandleCommandsFor(window);
55 }
56
HandlePropertyChange(GtkWidget * aWidget,GdkEventProperty * pevent,nsGTKRemoteServer * aThis)57 gboolean nsGTKRemoteServer::HandlePropertyChange(GtkWidget* aWidget,
58 GdkEventProperty* pevent,
59 nsGTKRemoteServer* aThis) {
60 if (pevent->state == GDK_PROPERTY_NEW_VALUE) {
61 Atom changedAtom = gdk_x11_atom_to_xatom(pevent->atom);
62
63 XID window = gdk_x11_window_get_xid(gtk_widget_get_window(aWidget));
64 return aThis->HandleNewProperty(
65 window, GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), pevent->time,
66 changedAtom);
67 }
68 return FALSE;
69 }
70