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