Improvements to Linux Disconnect/Continue windows.

* Use GtkDialog instead of GtkWindow - makes the code a lot simpler.
* Improve window layout (add some padding).
* Make ContinueWindow always-on-top, to stop it getting obscured.  Not sure if
this is really necessary.
* Set urgency hint on ContinueWindow - makes it throb in the taskbar.
* Modify Hide() methods to destroy the window, to avoid unnecessary
memory-leaking for tests.
* Hide the window when user clicks buttons, for instant feedback.  Partially
fixes crbug.com/87467 but not completely (the other window stays around if both
were visible).
* Add virtual destructors (coding-style fix).


BUG=87467
TEST=Manual


Review URL: http://codereview.chromium.org/7273077

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91614 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/remoting/host/disconnect_window_linux.cc b/remoting/host/disconnect_window_linux.cc
index 4e9a010..f8a27d3 100644
--- a/remoting/host/disconnect_window_linux.cc
+++ b/remoting/host/disconnect_window_linux.cc
@@ -16,16 +16,14 @@
 class DisconnectWindowLinux : public DisconnectWindow {
  public:
   DisconnectWindowLinux();
+  virtual ~DisconnectWindowLinux();
 
   virtual void Show(ChromotingHost* host,
                     const std::string& username) OVERRIDE;
   virtual void Hide() OVERRIDE;
 
  private:
-  CHROMEGTK_CALLBACK_1(DisconnectWindowLinux, gboolean, OnWindowDelete,
-                       GdkEvent*);
-  CHROMEG_CALLBACK_0(DisconnectWindowLinux, void, OnDisconnectClicked,
-                     GtkButton*);
+  CHROMEGTK_CALLBACK_1(DisconnectWindowLinux, void, OnResponse, int);
 
   void CreateWindow();
 
@@ -41,12 +39,20 @@
       disconnect_window_(NULL) {
 }
 
+DisconnectWindowLinux::~DisconnectWindowLinux() {
+}
+
 void DisconnectWindowLinux::CreateWindow() {
   if (disconnect_window_) return;
 
-  disconnect_window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  disconnect_window_ = gtk_dialog_new_with_buttons(
+      kTitle,
+      NULL,
+      GTK_DIALOG_NO_SEPARATOR,
+      kDisconnectButton, GTK_RESPONSE_OK,
+      NULL);
+
   GtkWindow* window = GTK_WINDOW(disconnect_window_);
-  gtk_window_set_title(window, kTitle);
   gtk_window_set_resizable(window, FALSE);
   // Try to keep the window always visible.
   gtk_window_stick(window);
@@ -55,14 +61,17 @@
   gtk_window_set_type_hint(window, GDK_WINDOW_TYPE_HINT_UTILITY);
   gtk_window_set_deletable(window, FALSE);
 
-  g_signal_connect(disconnect_window_, "delete-event",
-                   G_CALLBACK(OnWindowDeleteThunk), this);
+  g_signal_connect(disconnect_window_, "response",
+                   G_CALLBACK(OnResponseThunk), this);
 
-  GtkWidget* main_area = gtk_vbox_new(FALSE, 0);
-  gtk_container_add(GTK_CONTAINER(disconnect_window_), main_area);
+  GtkWidget* content_area = GTK_DIALOG(disconnect_window_)->vbox;
 
   GtkWidget* username_row = gtk_hbox_new(FALSE, 0);
-  gtk_container_add(GTK_CONTAINER(main_area), username_row);
+  // TODO(lambroslambrou): Replace the magic number with an appropriate
+  // constant from a header file (such as chrome/browser/ui/gtk/gtk_util.h
+  // but check_deps disallows its #inclusion here).
+  gtk_container_set_border_width(GTK_CONTAINER(username_row), 12);
+  gtk_container_add(GTK_CONTAINER(content_area), username_row);
 
   GtkWidget* share_label = gtk_label_new(kSharingWith);
   gtk_container_add(GTK_CONTAINER(username_row), share_label);
@@ -70,17 +79,7 @@
   user_label_ = gtk_label_new(NULL);
   gtk_container_add(GTK_CONTAINER(username_row), user_label_);
 
-  GtkWidget* disconnect_box = gtk_hbox_new(FALSE, 0);
-  gtk_container_add(GTK_CONTAINER(main_area), disconnect_box);
-
-  GtkWidget* disconnect_button = gtk_button_new_with_label(kDisconnectButton);
-  gtk_box_pack_start(GTK_BOX(disconnect_box), disconnect_button,
-                     TRUE, FALSE, 0);
-
-  g_signal_connect(disconnect_button, "clicked",
-                   G_CALLBACK(OnDisconnectClickedThunk), this);
-
-  gtk_widget_show_all(main_area);
+  gtk_widget_show_all(content_area);
 }
 
 void DisconnectWindowLinux::Show(ChromotingHost* host,
@@ -92,20 +91,20 @@
 }
 
 void DisconnectWindowLinux::Hide() {
-  DCHECK(disconnect_window_);
-
-  gtk_widget_hide(disconnect_window_);
+  if (disconnect_window_) {
+    gtk_widget_destroy(disconnect_window_);
+    disconnect_window_ = NULL;
+  }
 }
 
-gboolean DisconnectWindowLinux::OnWindowDelete(GtkWidget* widget,
-                                               GdkEvent* event) {
-  // Don't allow the window to be closed.
-  return TRUE;
-}
+void DisconnectWindowLinux::OnResponse(GtkWidget* dialog, int response_id) {
+  // |response_id| is ignored, because there is only one button, and pressing
+  // it should have the same effect as closing the window (if the window Close
+  // button were visible).
+  CHECK(host_);
 
-void DisconnectWindowLinux::OnDisconnectClicked(GtkButton* sender) {
-  DCHECK(host_);
   host_->Shutdown(NULL);
+  Hide();
 }
 
 DisconnectWindow* DisconnectWindow::Create() {