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