/src/mozilla-central/toolkit/components/remote/nsGTKRemoteService.cpp
Line | Count | Source (jump to first uncovered line) |
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 "nsGTKRemoteService.h" |
9 | | |
10 | | #include <gtk/gtk.h> |
11 | | #include <gdk/gdk.h> |
12 | | #include <gdk/gdkx.h> |
13 | | |
14 | | #include "nsIBaseWindow.h" |
15 | | #include "nsIDocShell.h" |
16 | | #include "nsPIDOMWindow.h" |
17 | | #include "mozilla/ModuleUtils.h" |
18 | | #include "nsIServiceManager.h" |
19 | | #include "nsIWeakReference.h" |
20 | | #include "nsIWidget.h" |
21 | | #include "nsIAppShellService.h" |
22 | | #include "nsAppShellCID.h" |
23 | | |
24 | | #include "nsCOMPtr.h" |
25 | | |
26 | | #include "nsGTKToolkit.h" |
27 | | |
28 | | NS_IMPL_ISUPPORTS(nsGTKRemoteService, |
29 | | nsIRemoteService) |
30 | | |
31 | | NS_IMETHODIMP |
32 | | nsGTKRemoteService::Startup(const char* aAppName, const char* aProfileName) |
33 | 0 | { |
34 | 0 | NS_ASSERTION(aAppName, "Don't pass a null appname!"); |
35 | 0 |
|
36 | 0 | if (mServerWindow) return NS_ERROR_ALREADY_INITIALIZED; |
37 | 0 | |
38 | 0 | XRemoteBaseStartup(aAppName, aProfileName); |
39 | 0 |
|
40 | 0 | mServerWindow = gtk_invisible_new(); |
41 | 0 | gtk_widget_realize(mServerWindow); |
42 | 0 | HandleCommandsFor(mServerWindow, nullptr); |
43 | 0 |
|
44 | 0 | for (auto iter = mWindows.Iter(); !iter.Done(); iter.Next()) { |
45 | 0 | HandleCommandsFor(iter.Key(), iter.UserData()); |
46 | 0 | } |
47 | 0 |
|
48 | 0 | return NS_OK; |
49 | 0 | } |
50 | | |
51 | | static nsIWidget* GetMainWidget(nsPIDOMWindowInner* aWindow) |
52 | 0 | { |
53 | 0 | // get the native window for this instance |
54 | 0 | nsCOMPtr<nsIBaseWindow> baseWindow |
55 | 0 | (do_QueryInterface(aWindow->GetDocShell())); |
56 | 0 | NS_ENSURE_TRUE(baseWindow, nullptr); |
57 | 0 |
|
58 | 0 | nsCOMPtr<nsIWidget> mainWidget; |
59 | 0 | baseWindow->GetMainWidget(getter_AddRefs(mainWidget)); |
60 | 0 | return mainWidget; |
61 | 0 | } |
62 | | |
63 | | NS_IMETHODIMP |
64 | | nsGTKRemoteService::RegisterWindow(mozIDOMWindow* aWindow) |
65 | 0 | { |
66 | 0 | nsIWidget* mainWidget = GetMainWidget(nsPIDOMWindowInner::From(aWindow)); |
67 | 0 | NS_ENSURE_TRUE(mainWidget, NS_ERROR_FAILURE); |
68 | 0 |
|
69 | 0 | GtkWidget* widget = |
70 | 0 | (GtkWidget*) mainWidget->GetNativeData(NS_NATIVE_SHELLWIDGET); |
71 | 0 | NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE); |
72 | 0 |
|
73 | 0 | nsCOMPtr<nsIWeakReference> weak = do_GetWeakReference(aWindow); |
74 | 0 | NS_ENSURE_TRUE(weak, NS_ERROR_FAILURE); |
75 | 0 |
|
76 | 0 | mWindows.Put(widget, weak); |
77 | 0 |
|
78 | 0 | // If Startup() has already been called, immediately register this window. |
79 | 0 | if (mServerWindow) { |
80 | 0 | HandleCommandsFor(widget, weak); |
81 | 0 | } |
82 | 0 |
|
83 | 0 | return NS_OK; |
84 | 0 | } |
85 | | |
86 | | NS_IMETHODIMP |
87 | | nsGTKRemoteService::Shutdown() |
88 | 0 | { |
89 | 0 | if (!mServerWindow) |
90 | 0 | return NS_ERROR_NOT_INITIALIZED; |
91 | 0 | |
92 | 0 | gtk_widget_destroy(mServerWindow); |
93 | 0 | mServerWindow = nullptr; |
94 | 0 |
|
95 | 0 | return NS_OK; |
96 | 0 | } |
97 | | |
98 | | void |
99 | | nsGTKRemoteService::HandleCommandsFor(GtkWidget* widget, |
100 | | nsIWeakReference* aWindow) |
101 | 0 | { |
102 | 0 | g_signal_connect(G_OBJECT(widget), "property_notify_event", |
103 | 0 | G_CALLBACK(HandlePropertyChange), aWindow); |
104 | 0 |
|
105 | 0 | gtk_widget_add_events(widget, GDK_PROPERTY_CHANGE_MASK); |
106 | 0 |
|
107 | 0 | Window window = gdk_x11_window_get_xid(gtk_widget_get_window(widget)); |
108 | 0 | nsXRemoteService::HandleCommandsFor(window); |
109 | 0 | } |
110 | | |
111 | | gboolean |
112 | | nsGTKRemoteService::HandlePropertyChange(GtkWidget *aWidget, |
113 | | GdkEventProperty *pevent, |
114 | | nsIWeakReference *aThis) |
115 | 0 | { |
116 | 0 | if (pevent->state == GDK_PROPERTY_NEW_VALUE) { |
117 | 0 | Atom changedAtom = gdk_x11_atom_to_xatom(pevent->atom); |
118 | 0 |
|
119 | 0 | XID window = gdk_x11_window_get_xid(gtk_widget_get_window(aWidget)); |
120 | 0 | return HandleNewProperty(window, |
121 | 0 | GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), |
122 | 0 | pevent->time, changedAtom, aThis); |
123 | 0 | } |
124 | 0 | return FALSE; |
125 | 0 | } |
126 | | |