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