Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/platform_util.h"
      6 
      7 #include <gtk/gtk.h>
      8 
      9 #include "base/file_util.h"
     10 #include "base/message_loop.h"
     11 #include "base/process_util.h"
     12 #include "base/string_util.h"
     13 #include "base/utf_string_conversions.h"
     14 #include "chrome/browser/ui/gtk/gtk_util.h"
     15 #include "content/common/process_watcher.h"
     16 #include "googleurl/src/gurl.h"
     17 #include "ui/gfx/native_widget_types.h"
     18 
     19 namespace {
     20 
     21 void SetDialogTitle(GtkWidget* dialog, const string16& title) {
     22   gtk_window_set_title(GTK_WINDOW(dialog), UTF16ToUTF8(title).c_str());
     23 
     24 #if !defined(OS_CHROMEOS)
     25   // The following code requires the dialog to be realized. However, we host
     26   // dialog's content in a Chrome window without really realize the dialog
     27   // on ChromeOS. Thus, skip the following code for ChromeOS.
     28   gtk_widget_realize(dialog);
     29 
     30   // Make sure it's big enough to show the title.
     31   GtkRequisition req;
     32   gtk_widget_size_request(dialog, &req);
     33   int width;
     34   gtk_util::GetWidgetSizeFromCharacters(dialog, title.length(), 0,
     35                                         &width, NULL);
     36   // The fudge factor accounts for extra space needed by the frame
     37   // decorations as well as width differences between average text and the
     38   // actual title text.
     39   width = width * 1.2 + 50;
     40 
     41   if (width > req.width)
     42     gtk_widget_set_size_request(dialog, width, -1);
     43 #endif  // !defined(OS_CHROMEOS)
     44 }
     45 
     46 int g_dialog_response;
     47 
     48 void HandleOnResponseDialog(GtkWidget* widget,
     49                             int response,
     50                             void* user_data) {
     51   g_dialog_response = response;
     52   gtk_widget_destroy(widget);
     53   MessageLoop::current()->QuitNow();
     54 }
     55 
     56 }  // namespace
     57 
     58 namespace platform_util {
     59 
     60 gfx::NativeWindow GetTopLevel(gfx::NativeView view) {
     61   // A detached widget won't have a toplevel window as an ancestor, so we can't
     62   // assume that the query for toplevel will return a window.
     63   GtkWidget* toplevel = gtk_widget_get_ancestor(view, GTK_TYPE_WINDOW);
     64   return GTK_IS_WINDOW(toplevel) ? GTK_WINDOW(toplevel) : NULL;
     65 }
     66 
     67 gfx::NativeView GetParent(gfx::NativeView view) {
     68   return gtk_widget_get_parent(view);
     69 }
     70 
     71 bool IsWindowActive(gfx::NativeWindow window) {
     72   return gtk_window_is_active(window);
     73 }
     74 
     75 void ActivateWindow(gfx::NativeWindow window) {
     76   gtk_window_present(window);
     77 }
     78 
     79 bool IsVisible(gfx::NativeView view) {
     80   return GTK_WIDGET_VISIBLE(view);
     81 }
     82 
     83 void SimpleErrorBox(gfx::NativeWindow parent,
     84                     const string16& title,
     85                     const string16& message) {
     86   GtkWidget* dialog = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL,
     87       GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", UTF16ToUTF8(message).c_str());
     88   gtk_util::ApplyMessageDialogQuirks(dialog);
     89   SetDialogTitle(dialog, title);
     90 
     91   g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL);
     92   gtk_util::ShowDialog(dialog);
     93 }
     94 
     95 bool SimpleYesNoBox(gfx::NativeWindow parent,
     96                     const string16& title,
     97                     const string16& message) {
     98   GtkWidget* dialog = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL,
     99       GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s",
    100       UTF16ToUTF8(message).c_str());
    101   gtk_util::ApplyMessageDialogQuirks(dialog);
    102   SetDialogTitle(dialog, title);
    103 
    104   g_signal_connect(dialog,
    105                    "response",
    106                    G_CALLBACK(HandleOnResponseDialog),
    107                    NULL);
    108   gtk_util::ShowDialog(dialog);
    109   // Not gtk_dialog_run as it prevents timers from running in the unit tests.
    110   MessageLoop::current()->Run();
    111   return g_dialog_response == GTK_RESPONSE_YES;
    112 }
    113 
    114 // Warning: this may be either Linux or ChromeOS.
    115 std::string GetVersionStringModifier() {
    116   char* env = getenv("CHROME_VERSION_EXTRA");
    117   if (!env)
    118     return std::string();
    119   std::string modifier(env);
    120 
    121 #if defined(GOOGLE_CHROME_BUILD)
    122   // Only ever return "", "unknown", "dev" or "beta" in a branded build.
    123   if (modifier == "unstable")  // linux version of "dev"
    124     modifier = "dev";
    125   if (modifier == "stable") {
    126     modifier = "";
    127   } else if ((modifier == "dev") || (modifier == "beta")) {
    128     // do nothing.
    129   } else {
    130     modifier = "unknown";
    131   }
    132 #endif
    133 
    134   return modifier;
    135 }
    136 
    137 bool CanSetAsDefaultBrowser() {
    138   return true;
    139 }
    140 
    141 }  // namespace platform_util
    142