[gnome-boxes] Always show topbar when mouse can be grabbed
- From: Marc-Andre Lureau <malureau src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-boxes] Always show topbar when mouse can be grabbed
- Date: Wed, 23 May 2012 23:01:31 +0000 (UTC)
commit bc0c8379c33b76c05cb73367c3840ecbc9f46071
Author: Marc-Andrà Lureau <marcandre lureau gmail com>
Date: Tue May 22 18:55:04 2012 +0200
Always show topbar when mouse can be grabbed
https://bugzilla.gnome.org/show_bug.cgi?id=676307
src/display-page.vala | 73 ++++++++++++++++++++++++++++++++++++-----------
src/display.vala | 6 ++-
src/machine.vala | 4 +-
src/spice-display.vala | 13 +++++++-
4 files changed, 73 insertions(+), 23 deletions(-)
---
diff --git a/src/display-page.vala b/src/display-page.vala
index 987e2c3..dd1460c 100644
--- a/src/display-page.vala
+++ b/src/display-page.vala
@@ -75,6 +75,12 @@ private class Boxes.DisplayPage: GLib.Object {
private ulong display_id;
private ulong cursor_id;
+ private Boxes.Display display;
+ private bool can_grab_mouse { get { return display.can_grab_mouse; } }
+ private bool grabbed { get { return display.mouse_grabbed; } }
+ private ulong display_can_grab_id;
+ private ulong display_grabbed_id;
+
public DisplayPage (Boxes.App app) {
this.app = app;
@@ -112,8 +118,8 @@ private class Boxes.DisplayPage: GLib.Object {
overlay = new Overlay ();
app.window.window_state_event.connect ((event) => {
- toolbar.visible = !app.fullscreen;
- set_overlay_toolbar_visible (false);
+ update_toolbar_visible ();
+
return false;
});
overlay.margin = 0;
@@ -137,7 +143,21 @@ private class Boxes.DisplayPage: GLib.Object {
}
}
- void set_overlay_toolbar_visible(bool visible) {
+ private void update_toolbar_visible() {
+ if (app.fullscreen && !can_grab_mouse)
+ toolbar.visible = false;
+ else
+ toolbar.visible = true;
+
+ set_overlay_toolbar_visible (false);
+ }
+
+ private void set_overlay_toolbar_visible(bool visible) {
+ if (visible && toolbar.visible) {
+ debug ("toolbar is visible, don't show overlay toolbar");
+ return;
+ }
+
overlay_toolbar.visible = visible;
}
@@ -155,15 +175,24 @@ private class Boxes.DisplayPage: GLib.Object {
app.notebook.page = Boxes.AppPage.DISPLAY;
}
- public void show_display (Boxes.Machine machine, Widget display) {
+ public void show_display (Boxes.Display display, Widget widget) {
remove_display ();
+
+ this.display = display;
+ display_grabbed_id = display.notify["mouse-grabbed"].connect(() => {
+ update_title();
+ });
+ display_can_grab_id = display.notify["can-grab-mouse"].connect(() => {
+ update_toolbar_visible();
+ });
+
set_overlay_toolbar_visible (false);
overlay_toolbar.title = toolbar.title = machine.name;
- display.set_events (display.get_events () & ~Gdk.EventMask.POINTER_MOTION_MASK);
- event_box.add (display);
+ widget.set_events (widget.get_events () & ~Gdk.EventMask.POINTER_MOTION_MASK);
+ event_box.add (widget);
event_box.show_all ();
- display_id = display.event.connect ((event) => {
+ display_id = widget.event.connect ((event) => {
switch (event.type) {
case EventType.LEAVE_NOTIFY:
toolbar_event_stop ();
@@ -176,11 +205,11 @@ private class Boxes.DisplayPage: GLib.Object {
});
ulong draw_id = 0;
- draw_id = display.draw.connect (() => {
- display.disconnect (draw_id);
+ draw_id = widget.draw.connect (() => {
+ widget.disconnect (draw_id);
- cursor_id = display.get_window ().notify["cursor"].connect (() => {
- event_box.get_window ().set_cursor (display.get_window ().cursor);
+ cursor_id = widget.get_window ().notify["cursor"].connect (() => {
+ event_box.get_window ().set_cursor (widget.get_window ().cursor);
});
return false;
@@ -190,21 +219,31 @@ private class Boxes.DisplayPage: GLib.Object {
}
public Widget? remove_display () {
- var display = event_box.get_child ();
+ if (display_grabbed_id != 0) {
+ display.disconnect (display_grabbed_id);
+ display_grabbed_id = 0;
+ }
+
+ if (display_can_grab_id != 0) {
+ display.disconnect (display_can_grab_id);
+ display_can_grab_id = 0;
+ }
+
+ var widget = event_box.get_child ();
if (display_id != 0) {
- display.disconnect (display_id);
+ widget.disconnect (display_id);
display_id = 0;
}
if (cursor_id != 0) {
- display.get_window ().disconnect (cursor_id);
+ widget.get_window ().disconnect (cursor_id);
cursor_id = 0;
}
- if (display != null)
- event_box.remove (display);
+ if (widget != null)
+ event_box.remove (widget);
- return display;
+ return widget;
}
}
diff --git a/src/display.vala b/src/display.vala
index 8581475..e24396a 100644
--- a/src/display.vala
+++ b/src/display.vala
@@ -10,8 +10,10 @@ private abstract class Boxes.Display: GLib.Object, Boxes.IPropertiesProvider {
public abstract string protocol { get; }
public abstract string uri { owned get; }
- public bool need_password { get; set; }
- public bool need_username { get; set; }
+ public bool can_grab_mouse { get; protected set; }
+ public bool mouse_grabbed { get; protected set; }
+ public bool need_password { get; protected set; }
+ public bool need_username { get; protected set; }
public string? password { get; set; }
public string? username { get; set; }
diff --git a/src/machine.vala b/src/machine.vala
index fe2f0ce..c84c3d2 100644
--- a/src/machine.vala
+++ b/src/machine.vala
@@ -62,7 +62,7 @@ private abstract class Boxes.Machine: Boxes.CollectionItem, Boxes.IPropertiesPro
Timeout.add (app.duration, () => {
try {
var widget = display.get_display (0);
- app.display_page.show_display (this, widget);
+ app.display_page.show_display (display, widget);
widget.grab_focus ();
} catch (Boxes.Error error) {
warning (error.message);
@@ -404,7 +404,7 @@ private class Boxes.MachineActor: Boxes.UI {
display = null;
// FIXME: enable grabs
machine.display.set_enable_inputs (widget, true);
- machine.app.display_page.show_display (machine, widget);
+ machine.app.display_page.show_display (machine.display, widget);
});
} else
machine.app.display_page.show ();
diff --git a/src/spice-display.vala b/src/spice-display.vala
index 7a64e74..87a70bd 100644
--- a/src/spice-display.vala
+++ b/src/spice-display.vala
@@ -56,6 +56,9 @@ private class Boxes.SpiceDisplay: Boxes.Display, Boxes.IPropertiesProvider {
if (display == null)
throw new Boxes.Error.INVALID ("invalid display");
+ display.mouse_grab.connect((status) => {
+ mouse_grabbed = status != 0;
+ });
sync_config_with_display (display, display_saved_properties);
display.scaling = true;
@@ -78,8 +81,14 @@ private class Boxes.SpiceDisplay: Boxes.Display, Boxes.IPropertiesProvider {
// FIXME: vala does't want to put this in ctor..
if (channel_new_id == 0)
channel_new_id = session.channel_new.connect ((channel) => {
- if (channel is Spice.MainChannel)
- channel.channel_event.connect (main_event);
+ if (channel is Spice.MainChannel) {
+ var main = channel as Spice.MainChannel;
+ main.channel_event.connect (main_event);
+ main.notify["mouse-mode"].connect(() => {
+ can_grab_mouse = main.mouse_mode != 2;
+ });
+ can_grab_mouse = main.mouse_mode != 2;
+ }
if (channel is Spice.DisplayChannel) {
var display = channel as DisplayChannel;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]