15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/process_singleton_dialog_linux.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string> 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/gtk_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/gtk/gtk_signal.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ProcessSingletonDialog { 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProcessSingletonDialog(const std::string& message, 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& relaunch_text); 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int GetResponseId() const { return response_id_; } 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHROMEGTK_CALLBACK_1(ProcessSingletonDialog, void, OnResponse, int); 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GtkWidget* dialog_; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int response_id_; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProcessSingletonDialog); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ProcessSingletonDialog::ProcessSingletonDialog( 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& message, 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& relaunch_text) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_ = gtk_message_dialog_new( 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<GtkDialogFlags>(0), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_MESSAGE_ERROR, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_BUTTONS_NONE, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s", 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.c_str()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_util::ApplyMessageDialogQuirks(dialog_); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_window_set_title(GTK_WINDOW(dialog_), 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF8(IDS_PRODUCT_NAME).c_str()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_dialog_add_button(GTK_DIALOG(dialog_), GTK_STOCK_QUIT, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_RESPONSE_REJECT); 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gtk_dialog_add_button(GTK_DIALOG(dialog_), relaunch_text.c_str(), 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GTK_RESPONSE_ACCEPT); 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_signal_connect(dialog_, "response", G_CALLBACK(OnResponseThunk), this); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_show_all(dialog_); 59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Run(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProcessSingletonDialog::OnResponse(GtkWidget* dialog, int response_id) { 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) response_id_ = response_id; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(dialog_); 65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool ShowProcessSingletonDialog(const base::string16& message, 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& relaunch_text) { 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProcessSingletonDialog dialog(base::UTF16ToUTF8(message), 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::UTF16ToUTF8(relaunch_text)); 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return dialog.GetResponseId() == GTK_RESPONSE_ACCEPT; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 76