Merge lp:~robert-ancell/unity-control-center/screen-sharing into lp:unity-control-center

Proposed by Robert Ancell
Status: Merged
Merge reported by: Jeremy Bícha
Merged at revision: not available
Proposed branch: lp:~robert-ancell/unity-control-center/screen-sharing
Merge into: lp:unity-control-center
Diff against target: 1362 lines (+1271/-1)
13 files modified
configure.ac (+3/-0)
panels/Makefile.am (+2/-1)
panels/screen-sharing/Makefile.am (+39/-0)
panels/screen-sharing/cc-screen-sharing-panel.c (+315/-0)
panels/screen-sharing/cc-screen-sharing-panel.h (+29/-0)
panels/screen-sharing/screen-sharing-module.c (+41/-0)
panels/screen-sharing/screen-sharing-panel.ui (+400/-0)
panels/screen-sharing/unity-screen-sharing-panel.desktop.in.in (+13/-0)
panels/screen-sharing/vino-message-box.c (+156/-0)
panels/screen-sharing/vino-message-box.h (+59/-0)
panels/screen-sharing/vino-radio-button.c (+181/-0)
panels/screen-sharing/vino-radio-button.h (+29/-0)
po/POTFILES.in (+4/-0)
To merge this branch: bzr merge lp:~robert-ancell/unity-control-center/screen-sharing
Reviewer Review Type Date Requested Status
Matthew Paul Thomas (community) design Needs Fixing
Sebastien Bacher Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+226771@code.launchpad.net

Commit message

Add screen sharing panel to replace vino-preferences which is not available in Vino >= 3.10

To post a comment you must log in.
Revision history for this message
Robert Ancell (robert-ancell) wrote :

Matthew - can you review for design? This adds a new panel "Screen Sharing" into the personal category.

Upsides:
- Feature is now more discoverable - previously you'd have to search in the dash for it

Downsides:
- Another panel
- Panel shows even if Vino is uninstalled - does this matter?

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Sebastien Bacher (seb128) wrote :

Thanks Robert, is that code copied from vino or is that the one used in newer g-c-c for their privacy controls?

I've no reviewed the changeset yet, but having it listed even when vino is not installed seems suboptimal. We could make u-c-c depends on vino but it could be that some corporate installations want to uninstall vnc...

Revision history for this message
Robert Ancell (robert-ancell) wrote :

It's the code copied from Vino. The new g-c-c panel combines a number of sharing options that aren't applicable for us as well as the modern g-c-c style that doesn't really fit into u-c-c.

Agreed always showing is suboptimal. If Vino is not installed it just displays "Screen sharing support not installed". I tried to make it hide the panel if Vino is not available but that doesn't seem possible. I also considered adding an install button that would install the packages (first waiting to see if others think this direction is the right one).

The other option is to keep the panel in the Vino package as a big patch, but I think that will be more work over putting it in u-c-c.

Revision history for this message
Sebastien Bacher (seb128) wrote :

The code changes look fine to me, I'm unsure the feature is important enough to justify it's own settings panel like that though ... let's wait for mpt to comment on that before merging it in

review: Approve
Revision history for this message
Matthew Paul Thomas (mpt) wrote :

Is it possible to review this change on Ubuntu 14.04? autogen.sh gives me errors "No package 'gsettings-desktop-schemas' found | No package 'libnotify' found", although "gsettings-desktop-schemas is already the newest version" and "E: Unable to locate package libnotify".

(If you link screenshots, please show the variations for when Vino both is and isn't installed.)

review: Needs Information (design)
Revision history for this message
Robert Ancell (robert-ancell) wrote :

Currently the system settings does not show any desktop sharing options [1]. Instead, you need to run the settings application [2] from the dash [3].

The proposal is to add a new panel to the system settings [4] [5]. If vino is no installed then this panel describes that [6].

[1] https://launchpadlibrarian.net/181103095/u-c-c-original.png
[2] https://launchpadlibrarian.net/181103152/vino-preferences.png
[3] https://launchpadlibrarian.net/181103119/dash-original.png
[4] https://launchpadlibrarian.net/181103180/u-c-c-sharing.png
[5] https://launchpadlibrarian.net/181103194/u-c-c-sharing-panel.png
[6] https://launchpadlibrarian.net/181103203/u-c-c-sharing-panel-uninstalled.png

Revision history for this message
Robert Ancell (robert-ancell) wrote :

We really should land this to unblock the vino update.

Revision history for this message
Sebastien Bacher (seb128) wrote :

is there anything in the vino update that makes us want to update? when I looked previously it was basically bringing nothing more that the simplifcation

Revision history for this message
Robert Ancell (robert-ancell) wrote :

It's a version that's supported upstream.
It has build fixes and removes old API usages which are likely to get harder to build against in the future.
It means we can drop a lot of patches we are carrying.
It means we are in sync with Debian.
It means it is easier to update when newer versions come out.
It means we're not blocking other users of Vino (e.g. Ubuntu GNOME).

What reason do we have not to update?

Revision history for this message
Iain Lane (laney) wrote :

The work's done, this MP is approved - why don't you get it in?

Revision history for this message
Sebastien Bacher (seb128) wrote :

Well, the main motivation to not update is that we don't need to atm, the current version builds&works fine and there is no much work/cool new features we/GNOME remix are missing, and that the panel feels like a regression compared to the standalone preferences

I guess we could decide the advantages you listed outweight the cost of the user experience regression though, if that's how you feel I can you can go ahead and land the changes

I would still appreciate a review from mpt there before we land it, having a "sharing" panel the way GNOME has it would be ok since it wouldn't be as specific, having a panel only for "screen sharing" feels like putting that feature a bit much in front to me...

Revision history for this message
Matthew Paul Thomas (mpt) wrote :

The Gnome System Settings designers seem to be in a period of confusion about whether to copy OS X or to copy iOS. The "Sharing" settings panel is the worst of both: combining settings for sharing wildly unrelated things in a single panel apparently because OS X does, and presenting them using a needlessly modal navigation list apparently because iOS does. I think it would be an extremely poor design to introduce to Ubuntu.

Sebastien is right that having a "Desktop Sharing" panel would be making that feature unusually prominent. Ideally I think it would be a tab of the "Displays" panel. But if the choice is between "Desktop Sharing" and the Gnome "Sharing" panel, I would strongly prefer the "Desktop Sharing" panel, renamed to "Screen Sharing" since it will eventually work on phones and tablets too.

"Desktop sharing support not installed" is an unhelpful message. I suggest instead something like "You need to install extra software to share your screen.", followed by a centered "Install Software…" button that invokes SessionInstaller to actually install it.

review: Needs Fixing (design)
12787. By Robert Ancell

Merge with trunk

Revision history for this message
Amr Ibrahim (amribrahim1987) wrote :

Is this done for xenial?

Revision history for this message
Jeremy Bícha (jbicha) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'configure.ac'
2--- configure.ac 2015-02-12 14:09:23 +0000
3+++ configure.ac 2015-07-05 22:39:29 +0000
4@@ -160,6 +160,7 @@
5 $FCITX_MODULE
6 x11)
7 PKG_CHECK_MODULES(SCREEN_PANEL, $COMMON_MODULES)
8+PKG_CHECK_MODULES(SCREEN_SHARING_PANEL, $COMMON_MODULES)
9 PKG_CHECK_MODULES(SOUND_PANEL, $COMMON_MODULES libxml-2.0
10 libcanberra-gtk3 >= $CANBERRA_REQUIRED_VERSION
11 libpulse >= $PA_REQUIRED_VERSION
12@@ -460,6 +461,8 @@
13 panels/sound/data/icons/scalable/devices/Makefile
14 panels/screen/Makefile
15 panels/screen/unity-screen-panel.desktop.in
16+panels/screen-sharing/Makefile
17+panels/screen-sharing/unity-screen-sharing-panel.desktop.in
18 panels/info/Makefile
19 panels/info/unity-info-panel.desktop.in
20 panels/power/Makefile
21
22=== modified file 'panels/Makefile.am'
23--- panels/Makefile.am 2014-02-10 22:19:33 +0000
24+++ panels/Makefile.am 2015-07-05 22:39:29 +0000
25@@ -12,7 +12,8 @@
26 sound \
27 keyboard \
28 universal-access \
29- user-accounts
30+ user-accounts \
31+ screen-sharing
32
33 if BUILD_WACOM
34 SUBDIRS += wacom
35
36=== added directory 'panels/screen-sharing'
37=== added file 'panels/screen-sharing/Makefile.am'
38--- panels/screen-sharing/Makefile.am 1970-01-01 00:00:00 +0000
39+++ panels/screen-sharing/Makefile.am 2015-07-05 22:39:29 +0000
40@@ -0,0 +1,39 @@
41+# This is used in PANEL_CFLAGS
42+cappletname = screen-sharing
43+
44+uidir = $(pkgdatadir)/ui/screen-sharing
45+dist_ui_DATA = \
46+ screen-sharing-panel.ui
47+
48+INCLUDES = \
49+ $(PANEL_CFLAGS) \
50+ $(SCREEN_SHARING_PANEL_CFLAGS) \
51+ -DG_LOG_DOMAIN="\"$(PACKAGE)\"" \
52+ -DGNOMECC_UI_DIR="\"$(uidir)\"" \
53+ -DGNOMELOCALEDIR="\"$(datadir)/locale\"" \
54+ $(NULL)
55+
56+ccpanelsdir = $(PANELS_DIR)
57+ccpanels_LTLIBRARIES = libscreen-sharing.la
58+
59+libscreen_sharing_la_SOURCES = \
60+ screen-sharing-module.c \
61+ vino-message-box.c \
62+ vino-message-box.h \
63+ cc-screen-sharing-panel.c \
64+ cc-screen-sharing-panel.h \
65+ vino-radio-button.c \
66+ vino-radio-button.h
67+
68+libscreen_sharing_la_LIBADD = $(PANEL_LIBS) $(SCREEN_SHARING_PANEL_LIBS)
69+libscreen_sharing_la_LDFLAGS = $(PANEL_LDFLAGS)
70+
71+@INTLTOOL_DESKTOP_RULE@
72+
73+desktopdir = $(datadir)/applications
74+desktop_in_files = unity-screen-sharing-panel.desktop.in
75+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
76+
77+CLEANFILES = $(desktop_in_files) $(desktop_DATA)
78+
79+-include $(top_srcdir)/git.mk
80
81=== added file 'panels/screen-sharing/cc-screen-sharing-panel.c'
82--- panels/screen-sharing/cc-screen-sharing-panel.c 1970-01-01 00:00:00 +0000
83+++ panels/screen-sharing/cc-screen-sharing-panel.c 2015-07-05 22:39:29 +0000
84@@ -0,0 +1,315 @@
85+/*
86+ * Copyright (C) 2003 Sun Microsystems, Inc.
87+ * Copyright (C) 2006 Jonh Wendell <wendell@bani.com.br>
88+ * Copyright © 2010 Codethink Limited
89+ *
90+ * This program is free software; you can redistribute it and/or
91+ * modify it under the terms of the GNU General Public License as
92+ * published by the Free Software Foundation; either version 2 of the
93+ * License, or (at your option) any later version.
94+ *
95+ * This program is distributed in the hope that it will be useful, but
96+ * WITHOUT ANY WARRANTY; without even the implied warranty of
97+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
98+ * General Public License for more details.
99+ *
100+ * You should have received a copy of the GNU General Public License
101+ * along with this program; if not, write to the Free Software
102+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
103+ * 02111-1307, USA.
104+ *
105+ * Authors:
106+ * Mark McLoughlin <mark@skynet.ie>
107+ * Jonh Wendell <wendell@bani.com.br>
108+ * Ryan Lortie <desrt@desrt.ca>
109+ */
110+
111+#include "config.h"
112+
113+#include "cc-screen-sharing-panel.h"
114+#include "vino-radio-button.h"
115+#include "vino-message-box.h"
116+
117+#include <glib/gi18n.h>
118+#include <gtk/gtk.h>
119+#include <shell/cc-panel.h>
120+
121+typedef struct
122+{
123+ CcPanel parent;
124+} CcScreenSharingPanel;
125+
126+typedef struct
127+{
128+ CcPanelClass parent_class;
129+} CcScreenSharingPanelClass;
130+
131+static GType cc_screen_sharing_panel_get_type (void);
132+
133+CC_PANEL_REGISTER (CcScreenSharingPanel, cc_screen_sharing_panel)
134+
135+#define VINO_SCHEMA_ID "org.gnome.Vino"
136+
137+/* We define three GSettings mappings here:
138+ *
139+ * First, a relatively boring boolean inversion mapping.
140+ */
141+static gboolean
142+get_inverted (GValue *value,
143+ GVariant *variant,
144+ gpointer user_data)
145+{
146+ g_value_set_boolean (value, !g_variant_get_boolean (variant));
147+ return TRUE;
148+}
149+
150+static GVariant *
151+set_inverted (const GValue *value,
152+ const GVariantType *type,
153+ gpointer user_data)
154+{
155+ return g_variant_new_boolean (!g_value_get_boolean (value));
156+}
157+
158+/* Next, one that maps between the array-of-strings list of
159+ * authentication mechanisms and a boolean that is FALSE if the 'none'
160+ * and TRUE otherwise (ie: for 'vnc' in the list).
161+ */
162+static gboolean
163+get_authtype (GValue *value,
164+ GVariant *variant,
165+ gpointer user_data)
166+{
167+ GVariantIter iter;
168+ const gchar *type;
169+
170+ g_variant_iter_init (&iter, variant);
171+ g_value_set_boolean (value, TRUE);
172+
173+ while (g_variant_iter_next (&iter, "s", &type))
174+ if (strcmp (type, "none") == 0)
175+ g_value_set_boolean (value, FALSE);
176+
177+ return TRUE;
178+}
179+
180+static GVariant *
181+set_authtype (const GValue *value,
182+ const GVariantType *type,
183+ gpointer user_data)
184+{
185+ const gchar *authtype;
186+
187+ if (g_value_get_boolean (value))
188+ authtype = "vnc";
189+ else
190+ authtype = "none";
191+
192+ return g_variant_new_strv (&authtype, 1);
193+}
194+
195+
196+/* Finally, a somewhat evil mapping for the password setting:
197+ *
198+ * If the setting is 'keyring' then we load the password from the
199+ * keyring. Else, it is assumed to be a base64-encoded string which is
200+ * the actual password.
201+ *
202+ * On setting the password, we always first try to use the keyring. If
203+ * that is successful we write 'keyring' to the settings. If it fails
204+ * then we base64-encode the password and write it to the settings.
205+ *
206+ * Doing it this way ensures that there is no ambiguity about what the
207+ * password is in the event that gnome-keyring becomes available then
208+ * unavailable again.
209+ */
210+static gboolean
211+get_password (GValue *value,
212+ GVariant *variant,
213+ gpointer user_data)
214+{
215+ const gchar *setting;
216+
217+ setting = g_variant_get_string (variant, NULL);
218+
219+ if (strcmp (setting, "keyring") == 0)
220+ {
221+ /* "keyring" is the default value, even though vino doesn't support it at the moment */
222+ g_value_set_static_string (value, "");
223+ return TRUE;
224+ }
225+ else
226+ {
227+ gchar *decoded;
228+ gsize length;
229+ gboolean ok;
230+
231+ decoded = (gchar *) g_base64_decode (setting, &length);
232+
233+ if ((ok = g_utf8_validate (decoded, length, NULL)))
234+ g_value_take_string (value, g_strndup (decoded, length));
235+
236+ return ok;
237+ }
238+}
239+
240+static GVariant *
241+set_password (const GValue *value,
242+ const GVariantType *type,
243+ gpointer user_data)
244+{
245+ const gchar *string;
246+ gchar *base64;
247+
248+ string = g_value_get_string (value);
249+
250+ /* if that failed, store it in GSettings, base64 */
251+ base64 = g_base64_encode ((guchar *) string, strlen (string));
252+ return g_variant_new_from_data (G_VARIANT_TYPE_STRING,
253+ base64, strlen (base64) + 1,
254+ TRUE, g_free, base64);
255+}
256+
257+typedef enum
258+{
259+ VINO_ICON_VISIBILITY_NEVER,
260+ VINO_ICON_VISIBILITY_ALWAYS,
261+ VINO_ICON_VISIBILITY_CLIENT
262+} VinoIconVisibility;
263+
264+static gboolean
265+get_icon_visibility (GValue *value,
266+ GVariant *variant,
267+ gpointer user_data)
268+{
269+ const char *setting;
270+ char *name;
271+
272+ setting = g_variant_get_string (variant, NULL);
273+
274+ g_object_get (user_data, "name", &name, NULL);
275+
276+ /* If the button name matches the setting, it should be active. */
277+ if (g_strcmp0 (name, setting) == 0)
278+ g_value_set_boolean (value, TRUE);
279+
280+ g_free (name);
281+
282+ return TRUE;
283+}
284+
285+static GVariant *
286+set_icon_visibility (const GValue *value,
287+ const GVariantType *type,
288+ gpointer user_data)
289+{
290+ GVariant *variant = NULL;
291+ char *name;
292+
293+ /* Don't act unless the button has been activated (turned ON). */
294+ if (!g_value_get_boolean (value))
295+ return NULL;
296+
297+ /* GtkToggleButton *button = GTK_TOGGLE_BUTTON(user_data); */
298+ g_object_get (user_data, "name", &name, NULL);
299+ variant = g_variant_new_string (name);
300+
301+ g_free (name);
302+
303+ return variant;
304+}
305+
306+static void
307+cc_screen_sharing_panel_init (CcScreenSharingPanel *panel)
308+{
309+ struct {
310+ const gchar *setting;
311+ const gchar *name;
312+ const gchar *property;
313+ GSettingsBindFlags flags;
314+ GSettingsBindGetMapping get_mapping;
315+ GSettingsBindSetMapping set_mapping;
316+ } bindings[] = {
317+ { "enabled", "allowed_toggle", "active", G_SETTINGS_BIND_DEFAULT, NULL, NULL },
318+
319+ { "enabled", "control_settings", "sensitive", G_SETTINGS_BIND_GET, NULL, NULL },
320+ { "view-only", "view_only_toggle", "active", G_SETTINGS_BIND_DEFAULT, get_inverted, set_inverted },
321+
322+ { "enabled", "security_settings", "sensitive", G_SETTINGS_BIND_GET, NULL, NULL },
323+ { "prompt-enabled", "prompt_enabled_toggle", "active", G_SETTINGS_BIND_DEFAULT, NULL, NULL },
324+ { "authentication-methods", "password_toggle", "active", G_SETTINGS_BIND_DEFAULT, get_authtype, set_authtype },
325+ { "authentication-methods", "password_box", "sensitive", G_SETTINGS_BIND_GET, get_authtype, NULL },
326+ { "vnc-password", "password_entry", "text", G_SETTINGS_BIND_DEFAULT, get_password, set_password },
327+ { "use-upnp", "use_upnp_toggle", "active", G_SETTINGS_BIND_DEFAULT, NULL, NULL },
328+
329+ { "enabled", "notification_settings", "sensitive", G_SETTINGS_BIND_GET, NULL, NULL },
330+
331+ { "icon-visibility", "icon_always_radio", "active", G_SETTINGS_BIND_DEFAULT, get_icon_visibility, set_icon_visibility },
332+ { "icon-visibility", "icon_client_radio", "active", G_SETTINGS_BIND_DEFAULT, get_icon_visibility, set_icon_visibility },
333+ { "icon-visibility", "icon_never_radio", "active", G_SETTINGS_BIND_DEFAULT, get_icon_visibility, set_icon_visibility }
334+ };
335+ GSettingsSchemaSource *source;
336+
337+ source = g_settings_schema_source_get_default ();
338+ if (source && g_settings_schema_source_lookup (source, VINO_SCHEMA_ID, TRUE))
339+ {
340+ GError *error = NULL;
341+ GtkBuilder *builder;
342+ GSettings *settings;
343+ gint i;
344+
345+ vino_radio_button_get_type ();
346+ vino_message_box_get_type ();
347+
348+ builder = gtk_builder_new ();
349+ if (!gtk_builder_add_from_file (builder, GNOMECC_UI_DIR "/screen-sharing-panel.ui", &error))
350+ {
351+ g_warning ("Unable to load interface file: %s", error->message);
352+ g_error_free (error);
353+ }
354+ gtk_widget_reparent (GTK_WIDGET (gtk_builder_get_object (builder, "screen_sharing_vbox")), GTK_WIDGET (panel));
355+
356+ settings = g_settings_new (VINO_SCHEMA_ID);
357+
358+ for (i = 0; i < G_N_ELEMENTS (bindings); i++)
359+ {
360+ GObject *object = gtk_builder_get_object (builder, bindings[i].name);
361+ g_settings_bind_with_mapping (settings, bindings[i].setting,
362+ object,
363+ bindings[i].property,
364+ bindings[i].flags,
365+ bindings[i].get_mapping,
366+ bindings[i].set_mapping,
367+ object, NULL);
368+ }
369+
370+ g_object_unref (settings);
371+ g_object_unref (builder);
372+ }
373+ else
374+ {
375+ GtkWidget *label;
376+ gchar *text;
377+
378+ label = gtk_label_new (NULL);
379+ text = g_strdup_printf ("<big>%s</big>", _("Desktop sharing support not installed"));
380+ gtk_label_set_markup (GTK_LABEL (label), text);
381+ g_free (text);
382+ gtk_widget_show (label);
383+ gtk_container_add (GTK_CONTAINER (panel), label);
384+ }
385+}
386+
387+static void
388+cc_screen_sharing_panel_class_init (CcScreenSharingPanelClass *class)
389+{
390+}
391+
392+void
393+cc_screen_sharing_panel_register (GIOModule *module)
394+{
395+ cc_screen_sharing_panel_register_type (G_TYPE_MODULE (module));
396+ g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
397+ cc_screen_sharing_panel_get_type (),
398+ "screen-sharing", 0);
399+}
400
401=== added file 'panels/screen-sharing/cc-screen-sharing-panel.h'
402--- panels/screen-sharing/cc-screen-sharing-panel.h 1970-01-01 00:00:00 +0000
403+++ panels/screen-sharing/cc-screen-sharing-panel.h 2015-07-05 22:39:29 +0000
404@@ -0,0 +1,29 @@
405+/*
406+ * Copyright © 2010 Codethink Limited
407+ *
408+ * This program is free software; you can redistribute it and/or
409+ * modify it under the terms of the GNU General Public License as
410+ * published by the Free Software Foundation; either version 2 of the
411+ * License, or (at your option) any later version.
412+ *
413+ * This program is distributed in the hope that it will be useful, but
414+ * WITHOUT ANY WARRANTY; without even the implied warranty of
415+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
416+ * General Public License for more details.
417+ *
418+ * You should have received a copy of the GNU General Public License
419+ * along with this program; if not, write to the Free Software
420+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
421+ * 02111-1307, USA.
422+ *
423+ * Author: Ryan Lortie <desrt@desrt.ca>
424+ */
425+
426+#ifndef __vino_preferences_h__
427+#define __vino_preferences_h__
428+
429+#include <shell/cc-panel.h>
430+
431+void cc_screen_sharing_panel_register (GIOModule *module);
432+
433+#endif /* __vino_preferences_h__ */
434
435=== added file 'panels/screen-sharing/screen-sharing-module.c'
436--- panels/screen-sharing/screen-sharing-module.c 1970-01-01 00:00:00 +0000
437+++ panels/screen-sharing/screen-sharing-module.c 2015-07-05 22:39:29 +0000
438@@ -0,0 +1,41 @@
439+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
440+ *
441+ * Copyright (C) 2010 Red Hat, Inc
442+ *
443+ * This program is free software; you can redistribute it and/or modify
444+ * it under the terms of the GNU General Public License as published by
445+ * the Free Software Foundation; either version 2 of the License, or
446+ * (at your option) any later version.
447+ *
448+ * This program is distributed in the hope that it will be useful,
449+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
450+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
451+ * GNU General Public License for more details.
452+ *
453+ * You should have received a copy of the GNU General Public License
454+ * along with this program; if not, write to the Free Software
455+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
456+ *
457+ *
458+ */
459+
460+#include <config.h>
461+
462+#include "cc-screen-sharing-panel.h"
463+
464+#include <glib/gi18n-lib.h>
465+
466+void
467+g_io_module_load (GIOModule *module)
468+{
469+ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
470+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
471+
472+ /* register the panel */
473+ cc_screen_sharing_panel_register (module);
474+}
475+
476+void
477+g_io_module_unload (GIOModule *module)
478+{
479+}
480
481=== added file 'panels/screen-sharing/screen-sharing-panel.ui'
482--- panels/screen-sharing/screen-sharing-panel.ui 1970-01-01 00:00:00 +0000
483+++ panels/screen-sharing/screen-sharing-panel.ui 2015-07-05 22:39:29 +0000
484@@ -0,0 +1,400 @@
485+<?xml version="1.0"?>
486+<interface>
487+ <requires lib="gtk+" version="2.16"/>
488+ <!-- interface-naming-policy toplevel-contextual -->
489+ <object class="GtkWindow" id="window1">
490+ <child>
491+ <object class="GtkBox" id="screen_sharing_vbox">
492+ <property name="visible">True</property>
493+ <property name="orientation">vertical</property>
494+ <property name="spacing">6</property>
495+ <child>
496+ <object class="GtkBox" id="vbox1">
497+ <property name="visible">True</property>
498+ <property name="orientation">vertical</property>
499+ <property name="border_width">6</property>
500+ <property name="spacing">18</property>
501+ <child>
502+ <object class="GtkBox" id="sharing_box">
503+ <property name="visible">True</property>
504+ <property name="orientation">vertical</property>
505+ <property name="spacing">6</property>
506+ <child>
507+ <object class="GtkLabel" id="label1">
508+ <property name="visible">True</property>
509+ <property name="xalign">0</property>
510+ <property name="label" translatable="yes">Sharing</property>
511+ <attributes>
512+ <attribute name="weight" value="bold"/>
513+ </attributes>
514+ </object>
515+ <packing>
516+ <property name="position">0</property>
517+ </packing>
518+ </child>
519+ <child>
520+ <object class="GtkBox" id="writability_warning">
521+ <property name="orientation">horizontal</property>
522+ <property name="no_show_all">True</property>
523+ <property name="border_width">3</property>
524+ <property name="spacing">6</property>
525+ <child>
526+ <object class="GtkLabel" id="label6">
527+ <property name="visible">True</property>
528+ <property name="label"> </property>
529+ </object>
530+ <packing>
531+ <property name="expand">False</property>
532+ <property name="fill">False</property>
533+ <property name="position">0</property>
534+ </packing>
535+ </child>
536+ <child>
537+ <object class="GtkImage" id="image1">
538+ <property name="visible">True</property>
539+ <property name="stock">gtk-dialog-warning</property>
540+ </object>
541+ <packing>
542+ <property name="expand">False</property>
543+ <property name="position">1</property>
544+ </packing>
545+ </child>
546+ <child>
547+ <object class="GtkLabel" id="label8">
548+ <property name="visible">True</property>
549+ <property name="label" translatable="yes">Some of these preferences are locked down</property>
550+ <attributes>
551+ <attribute name="style" value="italic"/>
552+ </attributes>
553+ </object>
554+ <packing>
555+ <property name="expand">False</property>
556+ <property name="fill">False</property>
557+ <property name="position">2</property>
558+ </packing>
559+ </child>
560+ </object>
561+ <packing>
562+ <property name="position">1</property>
563+ </packing>
564+ </child>
565+ <child>
566+ <object class="GtkBox" id="hbox1">
567+ <property name="visible">True</property>
568+ <property name="orientation">horizontal</property>
569+ <child>
570+ <object class="GtkLabel" id="label2">
571+ <property name="visible">True</property>
572+ <property name="label"> </property>
573+ </object>
574+ <packing>
575+ <property name="expand">False</property>
576+ <property name="fill">False</property>
577+ <property name="position">0</property>
578+ </packing>
579+ </child>
580+ <child>
581+ <object class="GtkCheckButton" id="allowed_toggle">
582+ <property name="label" translatable="yes">Allow other users to _view your desktop</property>
583+ <property name="visible">True</property>
584+ <property name="can_focus">True</property>
585+ <property name="receives_default">False</property>
586+ <property name="has_tooltip">True</property>
587+ <property name="tooltip_text" translatable="yes">Your desktop will be shared</property>
588+ <property name="use_underline">True</property>
589+ <property name="draw_indicator">True</property>
590+ </object>
591+ <packing>
592+ <property name="position">1</property>
593+ </packing>
594+ </child>
595+ </object>
596+ <packing>
597+ <property name="position">2</property>
598+ </packing>
599+ </child>
600+ <child>
601+ <object class="GtkBox" id="control_settings">
602+ <property name="visible">True</property>
603+ <property name="orientation">horizontal</property>
604+ <child>
605+ <object class="GtkLabel" id="label3">
606+ <property name="visible">True</property>
607+ <property name="label"> </property>
608+ </object>
609+ <packing>
610+ <property name="expand">False</property>
611+ <property name="fill">False</property>
612+ <property name="position">0</property>
613+ </packing>
614+ </child>
615+ <child>
616+ <object class="GtkCheckButton" id="view_only_toggle">
617+ <property name="label" translatable="yes">_Allow other users to control your desktop</property>
618+ <property name="visible">True</property>
619+ <property name="can_focus">True</property>
620+ <property name="receives_default">False</property>
621+ <property name="has_tooltip">True</property>
622+ <property name="tooltip_text" translatable="yes">Remote users are able to control your mouse and keyboard</property>
623+ <property name="use_underline">True</property>
624+ <property name="draw_indicator">True</property>
625+ </object>
626+ <packing>
627+ <property name="position">1</property>
628+ </packing>
629+ </child>
630+ </object>
631+ <packing>
632+ <property name="position">3</property>
633+ </packing>
634+ </child>
635+ <!--
636+ <child>
637+ <object class="GtkBox" id="message_box">
638+ <property name="visible">True</property>
639+ <property name="orientation">horizontal</property>
640+ <child>
641+ <object class="GtkLabel" id="label14">
642+ <property name="visible">True</property>
643+ <property name="label"> </property>
644+ </object>
645+ <packing>
646+ <property name="expand">False</property>
647+ <property name="fill">False</property>
648+ <property name="position">0</property>
649+ </packing>
650+ </child>
651+ <child>
652+ <object class="VinoMessageBox" id="message">
653+ <property name="visible">True</property>
654+ </object>
655+ <packing>
656+ <property name="position">1</property>
657+ </packing>
658+ </child>
659+ </object>
660+ <packing>
661+ <property name="position">4</property>
662+ </packing>
663+ </child>
664+ -->
665+ </object>
666+ <packing>
667+ <property name="position">0</property>
668+ </packing>
669+ </child>
670+ <child>
671+ <object class="GtkBox" id="security_box">
672+ <property name="visible">True</property>
673+ <property name="orientation">vertical</property>
674+ <property name="spacing">6</property>
675+ <child>
676+ <object class="GtkLabel" id="label4">
677+ <property name="visible">True</property>
678+ <property name="xalign">0</property>
679+ <property name="label" translatable="yes">Security</property>
680+ <attributes>
681+ <attribute name="weight" value="bold"/>
682+ </attributes>
683+ </object>
684+ <packing>
685+ <property name="position">0</property>
686+ </packing>
687+ </child>
688+ <child>
689+ <object class="GtkBox" id="hbox3">
690+ <property name="visible">True</property>
691+ <property name="orientation">horizontal</property>
692+ <child>
693+ <object class="GtkBox" id="security_settings">
694+ <property name="visible">True</property>
695+ <property name="orientation">vertical</property>
696+ <property name="spacing">6</property>
697+ <child>
698+ <object class="GtkCheckButton" id="prompt_enabled_toggle">
699+ <property name="label" translatable="yes">_You must confirm each access to this machine</property>
700+ <property name="visible">True</property>
701+ <property name="can_focus">True</property>
702+ <property name="receives_default">False</property>
703+ <property name="use_underline">True</property>
704+ <property name="draw_indicator">True</property>
705+ </object>
706+ <packing>
707+ <property name="position">0</property>
708+ </packing>
709+ </child>
710+ <child>
711+ <object class="GtkBox" id="hbox4">
712+ <property name="visible">True</property>
713+ <property name="orientation">horizontal</property>
714+ <property name="spacing">12</property>
715+ <child>
716+ <object class="GtkCheckButton" id="password_toggle">
717+ <property name="label" translatable="yes">_Require the user to enter this password:</property>
718+ <property name="visible">True</property>
719+ <property name="can_focus">True</property>
720+ <property name="receives_default">False</property>
721+ <property name="use_underline">True</property>
722+ <property name="draw_indicator">True</property>
723+ </object>
724+ <packing>
725+ <property name="expand">False</property>
726+ <property name="position">0</property>
727+ </packing>
728+ </child>
729+ <child>
730+ <object class="GtkBox" id="password_box">
731+ <property name="visible">True</property>
732+ <property name="orientation">horizontal</property>
733+ <child>
734+ <object class="GtkEntry" id="password_entry">
735+ <property name="visible">True</property>
736+ <property name="can_focus">True</property>
737+ <property name="max_length">8</property>
738+ <property name="visibility">False</property>
739+ <property name="invisible_char">&#x25CF;</property>
740+ </object>
741+ <packing>
742+ <property name="position">1</property>
743+ </packing>
744+ </child>
745+ </object>
746+ <packing>
747+ <property name="position">1</property>
748+ </packing>
749+ </child>
750+ </object>
751+ <packing>
752+ <property name="position">1</property>
753+ </packing>
754+ </child>
755+ <child>
756+ <object class="GtkCheckButton" id="use_upnp_toggle">
757+ <property name="label" translatable="yes">Automatically _configure UPnP router to open and forward ports</property>
758+ <property name="visible">True</property>
759+ <property name="can_focus">True</property>
760+ <property name="receives_default">False</property>
761+ <property name="has_tooltip">True</property>
762+ <property name="tooltip_text" translatable="yes">The router must have the UPnP feature enabled</property>
763+ <property name="use_underline">True</property>
764+ <property name="draw_indicator">True</property>
765+ </object>
766+ <packing>
767+ <property name="position">2</property>
768+ </packing>
769+ </child>
770+ </object>
771+ <packing>
772+ <property name="padding">12</property>
773+ <property name="position">0</property>
774+ </packing>
775+ </child>
776+ </object>
777+ <packing>
778+ <property name="position">1</property>
779+ </packing>
780+ </child>
781+ </object>
782+ <packing>
783+ <property name="position">1</property>
784+ </packing>
785+ </child>
786+ <child>
787+ <object class="GtkBox" id="notification_box">
788+ <property name="visible">True</property>
789+ <property name="orientation">vertical</property>
790+ <property name="spacing">6</property>
791+ <child>
792+ <object class="GtkLabel" id="label12">
793+ <property name="visible">True</property>
794+ <property name="xalign">0</property>
795+ <property name="label" translatable="yes">Show Notification Area Icon</property>
796+ <attributes>
797+ <attribute name="weight" value="bold"/>
798+ </attributes>
799+ </object>
800+ <packing>
801+ <property name="position">0</property>
802+ </packing>
803+ </child>
804+ <child>
805+ <object class="GtkBox" id="hbox8">
806+ <property name="visible">True</property>
807+ <property name="orientation">horizontal</property>
808+ <child>
809+ <object class="GtkBox" id="notification_settings">
810+ <property name="visible">True</property>
811+ <property name="orientation">vertical</property>
812+ <property name="spacing">3</property>
813+ <child>
814+ <object class="VinoRadioButton" id="icon_always_radio">
815+ <property name='name'>always</property>
816+ <property name="label" translatable="yes">Al_ways</property>
817+ <property name="visible">True</property>
818+ <property name="can_focus">True</property>
819+ <property name="receives_default">False</property>
820+ <property name="use_underline">True</property>
821+ <property name="active">True</property>
822+ <property name="draw_indicator">True</property>
823+ </object>
824+ <packing>
825+ <property name="position">0</property>
826+ </packing>
827+ </child>
828+ <child>
829+ <object class="VinoRadioButton" id="icon_client_radio">
830+ <property name='name'>client</property>
831+ <property name="label" translatable="yes">_Only when someone is connected</property>
832+ <property name="visible">True</property>
833+ <property name="can_focus">True</property>
834+ <property name="receives_default">False</property>
835+ <property name="use_underline">True</property>
836+ <property name="active">True</property>
837+ <property name="draw_indicator">True</property>
838+ <property name="group">icon_always_radio</property>
839+ </object>
840+ <packing>
841+ <property name="position">1</property>
842+ </packing>
843+ </child>
844+ <child>
845+ <object class="VinoRadioButton" id="icon_never_radio">
846+ <property name='name'>never</property>
847+ <property name="label" translatable="yes">_Never</property>
848+ <property name="visible">True</property>
849+ <property name="can_focus">True</property>
850+ <property name="receives_default">False</property>
851+ <property name="use_underline">True</property>
852+ <property name="active">True</property>
853+ <property name="draw_indicator">True</property>
854+ <property name="group">icon_always_radio</property>
855+ </object>
856+ <packing>
857+ <property name="position">2</property>
858+ </packing>
859+ </child>
860+ </object>
861+ <packing>
862+ <property name="padding">12</property>
863+ <property name="position">0</property>
864+ </packing>
865+ </child>
866+ </object>
867+ <packing>
868+ <property name="position">1</property>
869+ </packing>
870+ </child>
871+ </object>
872+ <packing>
873+ <property name="position">2</property>
874+ </packing>
875+ </child>
876+ </object>
877+ <packing>
878+ <property name="position">1</property>
879+ </packing>
880+ </child>
881+ </object>
882+ </child>
883+ </object>
884+</interface>
885
886=== added file 'panels/screen-sharing/unity-screen-sharing-panel.desktop.in.in'
887--- panels/screen-sharing/unity-screen-sharing-panel.desktop.in.in 1970-01-01 00:00:00 +0000
888+++ panels/screen-sharing/unity-screen-sharing-panel.desktop.in.in 2015-07-05 22:39:29 +0000
889@@ -0,0 +1,13 @@
890+[Desktop Entry]
891+_Name=Desktop Sharing
892+_Comment=Choose how other users can remotely view your desktop
893+Exec=unity-control-center screen-sharing
894+Icon=preferences-desktop-remote-desktop
895+Terminal=false
896+Type=Application
897+StartupNotify=true
898+Categories=GNOME;GTK;Settings;DesktopSettings;X-Unity-Settings-Panel;X-GNOME-PersonalSettings
899+OnlyShowIn=Unity;
900+X-Unity-Settings-Panel=screen-sharing
901+# Translators: those are keywords for the screen sharing control-center panel
902+_Keywords=Screen;Sharing;Remote;Desktop;VNC
903
904=== added file 'panels/screen-sharing/vino-message-box.c'
905--- panels/screen-sharing/vino-message-box.c 1970-01-01 00:00:00 +0000
906+++ panels/screen-sharing/vino-message-box.c 2015-07-05 22:39:29 +0000
907@@ -0,0 +1,156 @@
908+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
909+/*
910+ * vino-message-box.c
911+ * Copyright (C) Jonh Wendell 2009 <wendell@bani.com.br>
912+ *
913+ * vino-message-box.c is free software: you can redistribute it and/or modify it
914+ * under the terms of the GNU General Public License as published by the
915+ * Free Software Foundation, either version 2 of the License, or
916+ * (at your option) any later version.
917+ *
918+ * vino-message-box.c is distributed in the hope that it will be useful, but
919+ * WITHOUT ANY WARRANTY; without even the implied warranty of
920+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
921+ * See the GNU General Public License for more details.
922+ *
923+ * You should have received a copy of the GNU General Public License along
924+ * with this program. If not, see <http://www.gnu.org/licenses/>.
925+ */
926+
927+#include <config.h>
928+#include <glib/gi18n.h>
929+#include "vino-message-box.h"
930+
931+struct _VinoMessageBoxPrivate
932+{
933+ GtkWidget *main_hbox;
934+ GtkWidget *label;
935+ GtkWidget *image;
936+};
937+
938+G_DEFINE_TYPE (VinoMessageBox, vino_message_box, GTK_TYPE_INFO_BAR);
939+
940+static void
941+url_activated_cb(GtkWidget *url_label, const gchar *url)
942+{
943+ GError *error;
944+ GdkScreen *screen;
945+ gchar *mailto;
946+
947+ error = NULL;
948+ screen = gtk_widget_get_screen (url_label);
949+ mailto = g_strdup_printf ("mailto:?Body=%s", url);
950+
951+ if (!gtk_show_uri (screen, mailto, GDK_CURRENT_TIME, &error))
952+ {
953+ GtkWidget *message_dialog, *parent;
954+
955+ parent = gtk_widget_get_toplevel (GTK_WIDGET (url_label));
956+ if (!GTK_IS_WINDOW (parent))
957+ parent = NULL;
958+ message_dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
959+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
960+ GTK_MESSAGE_ERROR,
961+ GTK_BUTTONS_CLOSE,
962+ _("There was an error showing the URL \"%s\""),
963+ url);
964+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
965+ "%s",
966+ error->message);
967+
968+ gtk_window_set_resizable (GTK_WINDOW (message_dialog), FALSE);
969+
970+ g_signal_connect (message_dialog, "response",
971+ G_CALLBACK (gtk_widget_destroy),
972+ NULL);
973+
974+ gtk_widget_show (message_dialog);
975+ g_error_free (error);
976+ }
977+
978+ g_free (mailto);
979+}
980+
981+static void
982+vino_message_box_init (VinoMessageBox *box)
983+{
984+ box->priv = G_TYPE_INSTANCE_GET_PRIVATE (box, VINO_TYPE_MESSAGE_BOX, VinoMessageBoxPrivate);
985+
986+ box->priv->main_hbox = gtk_info_bar_get_content_area (GTK_INFO_BAR (box));
987+ box->priv->image = NULL;
988+
989+ box->priv->label = gtk_label_new (NULL);
990+ gtk_misc_set_alignment (GTK_MISC (box->priv->label), 0.0, 0.0);
991+ gtk_label_set_line_wrap (GTK_LABEL (box->priv->label), TRUE);
992+ gtk_label_set_selectable (GTK_LABEL (box->priv->label), TRUE);
993+ g_signal_connect (box->priv->label,
994+ "activate-link",
995+ G_CALLBACK (url_activated_cb),
996+ NULL);
997+
998+ gtk_widget_show (box->priv->label);
999+ gtk_info_bar_set_message_type (GTK_INFO_BAR (box), GTK_MESSAGE_INFO);
1000+ gtk_container_add (GTK_CONTAINER (box->priv->main_hbox), box->priv->label);
1001+}
1002+
1003+static void
1004+vino_message_box_finalize (GObject *object)
1005+{
1006+ /* TODO: Add deinitalization code here */
1007+
1008+ G_OBJECT_CLASS (vino_message_box_parent_class)->finalize (object);
1009+}
1010+
1011+static void
1012+vino_message_box_class_init (VinoMessageBoxClass *klass)
1013+{
1014+ GObjectClass* object_class = G_OBJECT_CLASS (klass);
1015+
1016+ object_class->finalize = vino_message_box_finalize;
1017+ g_type_class_add_private (object_class, sizeof(VinoMessageBoxPrivate));
1018+}
1019+
1020+GtkWidget *
1021+vino_message_box_new (void)
1022+{
1023+ return GTK_WIDGET (g_object_new (VINO_TYPE_MESSAGE_BOX, NULL));
1024+}
1025+
1026+void
1027+vino_message_box_set_label (VinoMessageBox *box, const gchar *label)
1028+{
1029+ g_return_if_fail (VINO_IS_MESSAGE_BOX (box));
1030+
1031+ gtk_label_set_markup (GTK_LABEL (box->priv->label), label);
1032+}
1033+
1034+void
1035+vino_message_box_show_image (VinoMessageBox *box)
1036+{
1037+ g_return_if_fail (VINO_IS_MESSAGE_BOX (box));
1038+
1039+ if (box->priv->image)
1040+ {
1041+ gtk_widget_destroy (box->priv->image);
1042+ box->priv->image = NULL;
1043+ }
1044+
1045+
1046+ box->priv->image = gtk_spinner_new ();
1047+ gtk_spinner_start (GTK_SPINNER (box->priv->image));
1048+
1049+ gtk_box_pack_start (GTK_BOX (box->priv->main_hbox), box->priv->image, FALSE, FALSE, 2);
1050+ gtk_box_reorder_child (GTK_BOX (box->priv->main_hbox), box->priv->image, 0);
1051+ gtk_widget_show (box->priv->image);
1052+}
1053+
1054+void
1055+vino_message_box_hide_image (VinoMessageBox *box)
1056+{
1057+ g_return_if_fail (VINO_IS_MESSAGE_BOX (box));
1058+
1059+ if (box->priv->image)
1060+ gtk_widget_destroy (box->priv->image);
1061+ box->priv->image = NULL;
1062+}
1063+
1064
1065=== added file 'panels/screen-sharing/vino-message-box.h'
1066--- panels/screen-sharing/vino-message-box.h 1970-01-01 00:00:00 +0000
1067+++ panels/screen-sharing/vino-message-box.h 2015-07-05 22:39:29 +0000
1068@@ -0,0 +1,59 @@
1069+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
1070+/*
1071+ * vino-message-box.c
1072+ * Copyright (C) Jonh Wendell 2009 <wendell@bani.com.br>
1073+ *
1074+ * vino-message-box.c is free software: you can redistribute it and/or modify it
1075+ * under the terms of the GNU General Public License as published by the
1076+ * Free Software Foundation, either version 2 of the License, or
1077+ * (at your option) any later version.
1078+ *
1079+ * vino-message-box.c is distributed in the hope that it will be useful, but
1080+ * WITHOUT ANY WARRANTY; without even the implied warranty of
1081+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1082+ * See the GNU General Public License for more details.
1083+ *
1084+ * You should have received a copy of the GNU General Public License along
1085+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1086+ */
1087+
1088+#ifndef _VINO_MESSAGE_BOX_H_
1089+#define _VINO_MESSAGE_BOX_H_
1090+
1091+#include <gtk/gtk.h>
1092+
1093+G_BEGIN_DECLS
1094+
1095+#define VINO_TYPE_MESSAGE_BOX (vino_message_box_get_type ())
1096+#define VINO_MESSAGE_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VINO_TYPE_MESSAGE_BOX, VinoMessageBox))
1097+#define VINO_MESSAGE_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VINO_TYPE_MESSAGE_BOX, VinoMessageBoxClass))
1098+#define VINO_IS_MESSAGE_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VINO_TYPE_MESSAGE_BOX))
1099+#define VINO_IS_MESSAGE_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VINO_TYPE_MESSAGE_BOX))
1100+#define VINO_MESSAGE_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VINO_TYPE_MESSAGE_BOX, VinoMessageBoxClass))
1101+
1102+typedef struct _VinoMessageBoxClass VinoMessageBoxClass;
1103+typedef struct _VinoMessageBox VinoMessageBox;
1104+typedef struct _VinoMessageBoxPrivate VinoMessageBoxPrivate;
1105+
1106+struct _VinoMessageBoxClass
1107+{
1108+ GtkInfoBarClass parent_class;
1109+};
1110+
1111+struct _VinoMessageBox
1112+{
1113+ GtkInfoBar parent_instance;
1114+ VinoMessageBoxPrivate *priv;
1115+};
1116+
1117+GType vino_message_box_get_type (void);
1118+
1119+GtkWidget *vino_message_box_new (void);
1120+
1121+void vino_message_box_set_label (VinoMessageBox *box, const gchar *label);
1122+void vino_message_box_show_image (VinoMessageBox *box);
1123+void vino_message_box_hide_image (VinoMessageBox *box);
1124+
1125+G_END_DECLS
1126+
1127+#endif /* _VINO_MESSAGE_BOX_H_ */
1128
1129=== added file 'panels/screen-sharing/vino-radio-button.c'
1130--- panels/screen-sharing/vino-radio-button.c 1970-01-01 00:00:00 +0000
1131+++ panels/screen-sharing/vino-radio-button.c 2015-07-05 22:39:29 +0000
1132@@ -0,0 +1,181 @@
1133+/*
1134+ * Copyright © 2010 Codethink Limited
1135+ *
1136+ * This program is free software; you can redistribute it and/or
1137+ * modify it under the terms of the GNU General Public License as
1138+ * published by the Free Software Foundation; either version 2 of the
1139+ * License, or (at your option) any later version.
1140+ *
1141+ * This program is distributed in the hope that it will be useful, but
1142+ * WITHOUT ANY WARRANTY; without even the implied warranty of
1143+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1144+ * General Public License for more details.
1145+ *
1146+ * You should have received a copy of the GNU General Public License
1147+ * along with this program; if not, write to the Free Software
1148+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1149+ * 02111-1307, USA.
1150+ *
1151+ * Author: Ryan Lortie <desrt@desrt.ca>
1152+ */
1153+
1154+#include "vino-radio-button.h"
1155+
1156+#include <gtk/gtk.h>
1157+
1158+typedef struct
1159+{
1160+ GtkRadioButton parent_instance;
1161+ gchar *name;
1162+} VinoRadioButton;
1163+
1164+typedef GtkRadioButtonClass VinoRadioButtonClass;
1165+
1166+G_DEFINE_TYPE (VinoRadioButton, vino_radio_button, GTK_TYPE_RADIO_BUTTON)
1167+
1168+enum
1169+{
1170+ PROP_0,
1171+ PROP_SETTINGS_NAME,
1172+ PROP_SETTINGS_ACTIVE
1173+};
1174+
1175+static void
1176+vino_radio_button_get_property (GObject *object, guint prop_id,
1177+ GValue *value, GParamSpec *pspec)
1178+{
1179+ VinoRadioButton *vrb = (VinoRadioButton *) object;
1180+
1181+ switch (prop_id)
1182+ {
1183+ case PROP_SETTINGS_ACTIVE:
1184+ {
1185+ const GSList *list;
1186+
1187+ list = gtk_radio_button_get_group (&vrb->parent_instance);
1188+ while (list)
1189+ {
1190+ VinoRadioButton *this = list->data;
1191+
1192+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (this)))
1193+ {
1194+ g_value_set_string (value, this->name);
1195+ return;
1196+ }
1197+
1198+ list = list->next;
1199+ }
1200+ }
1201+
1202+ g_warning ("No active radio buttons");
1203+ g_value_set_string (value, "");
1204+ return;
1205+
1206+ default:
1207+ g_assert_not_reached ();
1208+ }
1209+}
1210+
1211+static void
1212+vino_radio_button_set_property (GObject *object, guint prop_id,
1213+ const GValue *value, GParamSpec *pspec)
1214+{
1215+ VinoRadioButton *vrb = (VinoRadioButton *) object;
1216+
1217+ switch (prop_id)
1218+ {
1219+ case PROP_SETTINGS_NAME:
1220+ g_assert (vrb->name == NULL);
1221+ vrb->name = g_value_dup_string (value);
1222+ return;
1223+
1224+ case PROP_SETTINGS_ACTIVE:
1225+ {
1226+ const GSList *list;
1227+ const gchar *name;
1228+
1229+ list = gtk_radio_button_get_group (&vrb->parent_instance);
1230+ name = g_value_get_string (value);
1231+
1232+ while (list)
1233+ {
1234+ VinoRadioButton *this = list->data;
1235+
1236+ if (g_strcmp0 (this->name, name))
1237+ {
1238+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (this),
1239+ TRUE);
1240+ return;
1241+ }
1242+
1243+ list = list->next;
1244+ }
1245+
1246+ g_warning ("No such radio button named `%s'", name);
1247+ }
1248+ return;
1249+
1250+ default:
1251+ g_assert_not_reached ();
1252+ }
1253+}
1254+
1255+static void
1256+vino_radio_button_toggled (GtkToggleButton *button)
1257+{
1258+ VinoRadioButton *vrb = (VinoRadioButton *) button;
1259+
1260+ /* As it is, we get the notification of the old button becoming inactivity
1261+ * followed by the notification of the new button becoming active. Only run
1262+ * when the new button becomes active in order to avoid unnecessary
1263+ * notifications.
1264+ */
1265+ if (gtk_toggle_button_get_active (button))
1266+ {
1267+ const GSList *list;
1268+
1269+ list = gtk_radio_button_get_group (&vrb->parent_instance);
1270+ while (list)
1271+ {
1272+ g_object_notify (list->data, "settings-active");
1273+ list = list->next;
1274+ }
1275+ }
1276+}
1277+
1278+static void
1279+vino_radio_button_finalize (GObject *object)
1280+{
1281+ VinoRadioButton *vrb = (VinoRadioButton *) object;
1282+
1283+ g_free (vrb->name);
1284+
1285+ G_OBJECT_CLASS (vino_radio_button_parent_class)
1286+ ->finalize (object);
1287+}
1288+
1289+static void
1290+vino_radio_button_init (VinoRadioButton *button)
1291+{
1292+}
1293+
1294+static void
1295+vino_radio_button_class_init (GtkRadioButtonClass *class)
1296+{
1297+ GtkToggleButtonClass *tb_class = GTK_TOGGLE_BUTTON_CLASS (class);
1298+ GObjectClass *object_class = G_OBJECT_CLASS (class);
1299+
1300+ tb_class->toggled = vino_radio_button_toggled;
1301+ object_class->get_property = vino_radio_button_get_property;
1302+ object_class->set_property = vino_radio_button_set_property;
1303+ object_class->finalize = vino_radio_button_finalize;
1304+
1305+ g_object_class_install_property (object_class, PROP_SETTINGS_NAME,
1306+ g_param_spec_string ("settings-name", "name", "name", NULL,
1307+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE |
1308+ G_PARAM_STATIC_STRINGS));
1309+
1310+ g_object_class_install_property (object_class, PROP_SETTINGS_ACTIVE,
1311+ g_param_spec_string ("settings-active", "active", "active", NULL,
1312+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1313+}
1314
1315=== added file 'panels/screen-sharing/vino-radio-button.h'
1316--- panels/screen-sharing/vino-radio-button.h 1970-01-01 00:00:00 +0000
1317+++ panels/screen-sharing/vino-radio-button.h 2015-07-05 22:39:29 +0000
1318@@ -0,0 +1,29 @@
1319+/*
1320+ * Copyright © 2010 Codethink Limited
1321+ *
1322+ * This program is free software; you can redistribute it and/or
1323+ * modify it under the terms of the GNU General Public License as
1324+ * published by the Free Software Foundation; either version 2 of the
1325+ * License, or (at your option) any later version.
1326+ *
1327+ * This program is distributed in the hope that it will be useful, but
1328+ * WITHOUT ANY WARRANTY; without even the implied warranty of
1329+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1330+ * General Public License for more details.
1331+ *
1332+ * You should have received a copy of the GNU General Public License
1333+ * along with this program; if not, write to the Free Software
1334+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1335+ * 02111-1307, USA.
1336+ *
1337+ * Author: Ryan Lortie <desrt@desrt.ca>
1338+ */
1339+
1340+#ifndef __vino_radio_button_h__
1341+#define __vino_radio_button_h__
1342+
1343+#include <glib-object.h>
1344+
1345+GType vino_radio_button_get_type (void);
1346+
1347+#endif /* __vino_radio_button_h__ */
1348
1349=== modified file 'po/POTFILES.in'
1350--- po/POTFILES.in 2014-09-15 21:09:13 +0000
1351+++ po/POTFILES.in 2015-07-05 22:39:29 +0000
1352@@ -84,6 +84,10 @@
1353 panels/region/gtkentryaccel.c
1354 panels/screen/unity-screen-panel.desktop.in.in
1355 [type: gettext/glade]panels/screen/screen.ui
1356+panels/screen-sharing/vino-message-box.c
1357+panels/screen-sharing/cc-screen-sharing-panel.c
1358+panels/screen-sharing/unity-screen-sharing-panel.desktop.in.in
1359+[type: gettext/glade]panels/screen-sharing/cc-screen-sharing-panel.ui
1360 panels/sound/cc-sound-panel.c
1361 panels/sound/gvc-balance-bar.c
1362 panels/sound/gvc-channel-bar.c

Subscribers

People subscribed via source and target branches