15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "remoting/base/string_resources.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/continue_window.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gtk/gtk_signal.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ContinueWindowGtk : public ContinueWindow {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ContinueWindowGtk();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContinueWindowGtk();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ContinueWindow overrides.
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ShowUi() OVERRIDE;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void HideUi() OVERRIDE;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateWindow();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHROMEGTK_CALLBACK_1(ContinueWindowGtk, void, OnResponse, int);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GtkWidget* continue_window_;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ContinueWindowGtk);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ContinueWindowGtk::ContinueWindowGtk()
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : continue_window_(NULL) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContinueWindowGtk::~ContinueWindowGtk() {
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (continue_window_) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gtk_widget_destroy(continue_window_);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    continue_window_ = NULL;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ContinueWindowGtk::ShowUi() {
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(CalledOnValidThread());
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!continue_window_);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateWindow();
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gtk_window_set_urgency_hint(GTK_WINDOW(continue_window_), TRUE);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gtk_window_present(GTK_WINDOW(continue_window_));
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ContinueWindowGtk::HideUi() {
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(CalledOnValidThread());
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (continue_window_) {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gtk_widget_destroy(continue_window_);
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    continue_window_ = NULL;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContinueWindowGtk::CreateWindow() {
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(CalledOnValidThread());
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!continue_window_);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  continue_window_ = gtk_dialog_new_with_buttons(
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      l10n_util::GetStringUTF8(IDR_PRODUCT_NAME).c_str(),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<GtkDialogFlags>(GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR),
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      l10n_util::GetStringUTF8(IDR_STOP_SHARING_BUTTON).c_str(),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GTK_RESPONSE_CANCEL,
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      l10n_util::GetStringUTF8(IDR_CONTINUE_BUTTON).c_str(),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GTK_RESPONSE_OK,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_dialog_set_default_response(GTK_DIALOG(continue_window_),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  GTK_RESPONSE_OK);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_window_set_resizable(GTK_WINDOW(continue_window_), FALSE);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set always-on-top, otherwise this window tends to be obscured by the
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DisconnectWindow.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_window_set_keep_above(GTK_WINDOW(continue_window_), TRUE);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_signal_connect(continue_window_, "response",
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   G_CALLBACK(OnResponseThunk), this);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* content_area =
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gtk_dialog_get_content_area(GTK_DIALOG(continue_window_));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* text_label =
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      gtk_label_new(l10n_util::GetStringUTF8(IDR_CONTINUE_PROMPT).c_str());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_label_set_line_wrap(GTK_LABEL(text_label), TRUE);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(lambroslambrou): Fix magic numbers, as in disconnect_window_gtk.cc.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_misc_set_padding(GTK_MISC(text_label), 12, 12);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_container_add(GTK_CONTAINER(content_area), text_label);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_show_all(content_area);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ContinueWindowGtk::OnResponse(GtkWidget* dialog, int response_id) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(CalledOnValidThread());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (response_id == GTK_RESPONSE_OK) {
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ContinueSession();
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DisconnectSession();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HideUi();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<HostWindow> HostWindow::CreateContinueWindow() {
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return scoped_ptr<HostWindow>(new ContinueWindowGtk());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
122