Index: chrome/browser/ui/gtk/gtk_util.h |
diff --git a/chrome/browser/ui/gtk/gtk_util.h b/chrome/browser/ui/gtk/gtk_util.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4b035b74446ecbf47e730bed3016f1e8557dd96a |
--- /dev/null |
+++ b/chrome/browser/ui/gtk/gtk_util.h |
@@ -0,0 +1,380 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_UI_GTK_GTK_UTIL_H_ |
+#define CHROME_BROWSER_UI_GTK_GTK_UTIL_H_ |
+#pragma once |
+ |
+#include <gtk/gtk.h> |
+#include <string> |
+#include <vector> |
+ |
+#include "app/x11_util.h" |
+#include "base/string16.h" |
+#include "gfx/point.h" |
+#include "gfx/rect.h" |
+#include "third_party/WebKit/WebKit/chromium/public/WebDragOperation.h" |
+#include "webkit/glue/window_open_disposition.h" |
+ |
+typedef struct _cairo cairo_t; |
+typedef struct _GdkColor GdkColor; |
+typedef struct _GtkWidget GtkWidget; |
+ |
+class BrowserWindow; |
+class GtkThemeProvider; |
+class GURL; |
+class Profile; |
+struct RendererPreferences; // from common/renderer_preferences.h |
+ |
+const int kSkiaToGDKMultiplier = 257; |
+ |
+// Define a macro for creating GdkColors from RGB values. This is a macro to |
+// allow static construction of literals, etc. Use this like: |
+// GdkColor white = GDK_COLOR_RGB(0xff, 0xff, 0xff); |
+#define GDK_COLOR_RGB(r, g, b) {0, r * kSkiaToGDKMultiplier, \ |
+ g * kSkiaToGDKMultiplier, b * kSkiaToGDKMultiplier} |
+ |
+namespace event_utils { |
+ |
+// Translates event flags into what kind of disposition they represent. |
+// For example, a middle click would mean to open a background tab. |
+// event_flags are the state in the GdkEvent structure. |
+WindowOpenDisposition DispositionFromEventFlags(guint state); |
+ |
+} // namespace event_utils |
+ |
+namespace gtk_util { |
+ |
+extern const GdkColor kGdkWhite; |
+extern const GdkColor kGdkGray; |
+extern const GdkColor kGdkBlack; |
+extern const GdkColor kGdkGreen; |
+ |
+// Constants relating to the layout of dialog windows: |
+// (See http://library.gnome.org/devel/hig-book/stable/design-window.html.en) |
+ |
+// Spacing between controls of the same group. |
+const int kControlSpacing = 6; |
+ |
+// Horizontal spacing between a label and its control. |
+const int kLabelSpacing = 12; |
+ |
+// Indent of the controls within each group. |
+const int kGroupIndent = 12; |
+ |
+// Space around the outside of a dialog's contents. |
+const int kContentAreaBorder = 12; |
+ |
+// Spacing between groups of controls. |
+const int kContentAreaSpacing = 18; |
+ |
+// Horizontal Spacing between controls in a form. |
+const int kFormControlSpacing = 10; |
+ |
+// Create a table of labeled controls, using proper spacing and alignment. |
+// Arguments should be pairs of const char*, GtkWidget*, concluding with a |
+// NULL. The first argument is a vector in which to place all labels |
+// produced. It can be NULL if you don't need to keep track of the label |
+// widgets. The second argument is a color to force the label text to. It can |
+// be NULL to get the system default. |
+// |
+// For example: |
+// controls = CreateLabeledControlsGroup(NULL, |
+// "Name:", title_entry_, |
+// "Folder:", folder_combobox_, |
+// NULL); |
+GtkWidget* CreateLabeledControlsGroup( |
+ std::vector<GtkWidget*>* labels, |
+ const char* text, ...); |
+ |
+// Create a GtkBin with |child| as its child widget. This bin will paint a |
+// border of color |color| with the sizes specified in pixels. |
+GtkWidget* CreateGtkBorderBin(GtkWidget* child, const GdkColor* color, |
+ int top, int bottom, int left, int right); |
+ |
+// Left-align the given GtkMisc and return the same pointer. |
+GtkWidget* LeftAlignMisc(GtkWidget* misc); |
+ |
+// Create a left-aligned label with the given text in bold. |
+GtkWidget* CreateBoldLabel(const std::string& text); |
+ |
+// As above, but uses number of characters/lines directly rather than looking up |
+// a resource. |
+void GetWidgetSizeFromCharacters(GtkWidget* widget, |
+ double width_chars, double height_lines, |
+ int* width, int* height); |
+ |
+// Calculates the size of given widget based on the size specified in number of |
+// characters/lines (in locale specific resource file) and font metrics. |
+// NOTE: Make sure to realize |widget| before using this method, or a default |
+// font size will be used instead of the actual font size. |
+void GetWidgetSizeFromResources(GtkWidget* widget, |
+ int width_chars, int height_lines, |
+ int* width, int* height); |
+ |
+// As above, but a convenience method for configuring dialog size. |
+// |width_id| and |height_id| are resource IDs for the size. If either of these |
+// are set to -1, the respective size will be set to the widget default. |
+// |resizable| also controls whether the dialog will be resizable |
+// (this info is also necessary for getting the width-setting code |
+// right). |
+void SetWindowSizeFromResources(GtkWindow* window, |
+ int width_id, int height_id, bool resizable); |
+ |
+// Places |window| approximately over center of |parent|, it also moves window |
+// to parent's desktop. Use this only for non-modal dialogs, such as the |
+// options window and content settings window; otherwise you should be using |
+// transient_for. |
+void CenterOverWindow(GtkWindow* window, GtkWindow* parent); |
+ |
+// Puts all browser windows in one window group; this will make any dialog |
+// spawned app modal. |
+void MakeAppModalWindowGroup(); |
+ |
+// Called after an app modal dialog that used MakeAppModalWindowGroup() was |
+// dismissed. Returns each browser window to its own window group. |
+void AppModalDismissedUngroupWindows(); |
+ |
+// Remove all children from this container. |
+void RemoveAllChildren(GtkWidget* container); |
+ |
+// Force the font size of the widget to |size_pixels|. |
+void ForceFontSizePixels(GtkWidget* widget, double size_pixels); |
+ |
+// Undoes the effects of a previous ForceFontSizePixels() call. Safe to call |
+// even if ForceFontSizePixels() was never called. |
+void UndoForceFontSize(GtkWidget* widget); |
+ |
+// Gets the position of a gtk widget in screen coordinates. |
+gfx::Point GetWidgetScreenPosition(GtkWidget* widget); |
+ |
+// Returns the bounds of the specified widget in screen coordinates. |
+gfx::Rect GetWidgetScreenBounds(GtkWidget* widget); |
+ |
+// Retuns size of the |widget| without window manager decorations. |
+gfx::Size GetWidgetSize(GtkWidget* widget); |
+ |
+// Converts a point in a widget to screen coordinates. The point |p| is |
+// relative to the widget's top-left origin. |
+void ConvertWidgetPointToScreen(GtkWidget* widget, gfx::Point* p); |
+ |
+// Initialize some GTK settings so that our dialogs are consistent. |
+void InitRCStyles(); |
+ |
+// Stick the widget in the given hbox without expanding vertically. The widget |
+// is packed at the start of the hbox. This is useful for widgets that would |
+// otherwise expand to fill the vertical space of the hbox |
+// (e.g. buttons). Returns the vbox that widget was packed in. |
+GtkWidget* CenterWidgetInHBox(GtkWidget* hbox, GtkWidget* widget, |
+ bool pack_at_end, int padding); |
+ |
+// Returns true if the screen is composited, false otherwise. |
+bool IsScreenComposited(); |
+ |
+// Enumerates the top-level gdk windows of the current display. |
+void EnumerateTopLevelWindows(x11_util::EnumerateWindowsDelegate* delegate); |
+ |
+// Set that clicking the button with the given mouse buttons will cause a click |
+// event. |
+// NOTE: If you need to connect to the button-press-event or |
+// button-release-event signals, do so before calling this function. |
+void SetButtonClickableByMouseButtons(GtkWidget* button, |
+ bool left, bool middle, bool right); |
+ |
+// Set that a button causes a page navigation. In particular, it will accept |
+// middle clicks. Warning: only call this *after* you have connected your |
+// own handlers for button-press and button-release events, or you will not get |
+// those events. |
+void SetButtonTriggersNavigation(GtkWidget* button); |
+ |
+// Returns the mirrored x value for |bounds| if the layout is RTL; otherwise, |
+// the original value is returned unchanged. |
+int MirroredLeftPointForRect(GtkWidget* widget, const gfx::Rect& bounds); |
+ |
+// Returns the mirrored x value for the point |x| if the layout is RTL; |
+// otherwise, the original value is returned unchanged. |
+int MirroredXCoordinate(GtkWidget* widget, int x); |
+ |
+// Returns true if the pointer is currently inside the widget. |
+bool WidgetContainsCursor(GtkWidget* widget); |
+ |
+// Sets the icon of |window| to the product icon (potentially used in window |
+// border or alt-tab list). |
+void SetWindowIcon(GtkWindow* window); |
+ |
+// Sets the default window icon for windows created in this app. |
+void SetDefaultWindowIcon(); |
+ |
+// Adds an action button with the given text to the dialog. Only useful when you |
+// want a stock icon but not the stock text to go with it. Returns the button. |
+GtkWidget* AddButtonToDialog(GtkWidget* dialog, const gchar* text, |
+ const gchar* stock_id, gint response_id); |
+ |
+GtkWidget* BuildDialogButton(GtkWidget* dialog, int ids_id, |
+ const gchar* stock_id); |
+ |
+GtkWidget* CreateEntryImageHBox(GtkWidget* entry, GtkWidget* image); |
+ |
+// Sets all the foreground color states of |label| to |color|. |
+void SetLabelColor(GtkWidget* label, const GdkColor* color); |
+ |
+// Adds the given widget to an alignment identing it by |kGroupIndent|. |
+GtkWidget* IndentWidget(GtkWidget* content); |
+ |
+// Sets (or resets) the font settings in |prefs| (used when creating new |
+// renderers) based on GtkSettings (which itself comes from XSETTINGS). |
+void UpdateGtkFontSettings(RendererPreferences* prefs); |
+ |
+// Get the current location of the mouse cursor relative to the screen. |
+gfx::Point ScreenPoint(GtkWidget* widget); |
+ |
+// Get the current location of the mouse cursor relative to the widget. |
+gfx::Point ClientPoint(GtkWidget* widget); |
+ |
+// Reverses a point in RTL mode. Used in making vectors of GdkPoints for window |
+// shapes. |
+GdkPoint MakeBidiGdkPoint(gint x, gint y, gint width, bool ltr); |
+ |
+// Draws a GTK text entry with the style parameters of GtkEntry |
+// |offscreen_entry| onto |widget_to_draw_on| in the rectangle |rec|. Drawing |
+// is only done in the clip rectangle |dirty_rec|. |
+void DrawTextEntryBackground(GtkWidget* offscreen_entry, |
+ GtkWidget* widget_to_draw_on, |
+ GdkRectangle* dirty_rec, |
+ GdkRectangle* rec); |
+ |
+// Draws the background of the toolbar area subject to the expose rectangle |
+// |event| and starting image tiling from |tabstrip_origin|. |
+void DrawThemedToolbarBackground(GtkWidget* widget, |
+ cairo_t* cr, |
+ GdkEventExpose* event, |
+ const gfx::Point& tabstrip_origin, |
+ GtkThemeProvider* provider); |
+ |
+// Returns the two colors averaged together. |
+GdkColor AverageColors(GdkColor color_one, GdkColor color_two); |
+ |
+// Show the image for the given menu item, even if the user's default is to not |
+// show images. Only to be used for favicons or other menus where the image is |
+// crucial to its functionality. |
+void SetAlwaysShowImage(GtkWidget* image_menu_item); |
+ |
+// Stacks a |popup| window directly on top of a |toplevel| window. |
+void StackPopupWindow(GtkWidget* popup, GtkWidget* toplevel); |
+ |
+// Get a rectangle corresponding to a widget's allocation relative to its |
+// toplevel window's origin. |
+gfx::Rect GetWidgetRectRelativeToToplevel(GtkWidget* widget); |
+ |
+// Don't allow the widget to paint anything, and instead propagate the expose |
+// to its children. This is similar to calling |
+// |
+// gtk_widget_set_app_paintable(container, TRUE); |
+// |
+// except that it will always work, and it should be called after any custom |
+// expose events are connected. |
+void SuppressDefaultPainting(GtkWidget* container); |
+ |
+// Get the window open disposition from the state in gtk_get_current_event(). |
+// This is designed to be called inside a "clicked" event handler. It is an |
+// error to call it when gtk_get_current_event() won't return a GdkEventButton*. |
+WindowOpenDisposition DispositionForCurrentButtonPressEvent(); |
+ |
+// Safely grabs all input (with X grabs and an application grab), returning true |
+// for success. |
+bool GrabAllInput(GtkWidget* widget); |
+ |
+// Returns a rectangle that represents the widget's bounds. The rectangle it |
+// returns is the same as widget->allocation, but anchored at (0, 0). |
+gfx::Rect WidgetBounds(GtkWidget* widget); |
+ |
+// Update the timestamp for the given window. This is usually the time of the |
+// last user event, but on rare occasions we wish to update it despite not |
+// receiving a user event. |
+void SetWMLastUserActionTime(GtkWindow* window); |
+ |
+// The current system time, using the format expected by the X server, but not |
+// retrieved from the X server. NOTE: You should almost never need to use this |
+// function, instead using the timestamp from the latest GDK event. |
+guint32 XTimeNow(); |
+ |
+// Uses the autocomplete controller for |profile| to convert the contents of the |
+// PRIMARY selection to a parsed URL. Returns true and sets |url| on success, |
+// otherwise returns false. |
+bool URLFromPrimarySelection(Profile* profile, GURL* url); |
+ |
+// Set the colormap of the given window to rgba to allow transparency. |
+bool AddWindowAlphaChannel(GtkWidget* window); |
+ |
+// Get the default colors for a text entry. Parameters may be NULL. |
+void GetTextColors(GdkColor* normal_base, |
+ GdkColor* selected_base, |
+ GdkColor* normal_text, |
+ GdkColor* selected_text); |
+ |
+// Wrappers to show a GtkDialog. On Linux, it merely calls gtk_widget_show_all. |
+// On ChromeOs, it calls ShowNativeDialog which hosts the its vbox |
+// in a view based Window. |
+void ShowDialog(GtkWidget* dialog); |
+void ShowDialogWithLocalizedSize(GtkWidget* dialog, |
+ int width_id, |
+ int height_id, |
+ bool resizeable); |
+void ShowModalDialogWithMinLocalizedWidth(GtkWidget* dialog, |
+ int width_id); |
+ |
+// Wrapper to present a window. On Linux, it just calls gtk_window_present or |
+// gtk_window_present_with_time for non-zero timestamp. For ChromeOS, it first |
+// finds the host window of the dialog contents and then present it. |
+void PresentWindow(GtkWidget* window, int timestamp); |
+ |
+// Get real window for given dialog. On ChromeOS, this gives the native dialog |
+// host window. On Linux, it merely returns the passed in dialog. |
+GtkWindow* GetDialogWindow(GtkWidget* dialog); |
+ |
+// Gets dialog window bounds. |
+gfx::Rect GetDialogBounds(GtkWidget* dialog); |
+ |
+// Returns the stock menu item label for the "preferences" item - returns an |
+// empty string if no stock item found. |
+string16 GetStockPreferencesMenuLabel(); |
+ |
+// Checks whether a widget is actually visible, i.e. whether it and all its |
+// ancestors up to its toplevel are visible. |
+bool IsWidgetAncestryVisible(GtkWidget* widget); |
+ |
+// Sets the GTK font from the given font name (ex. "Arial Black, 10"). |
+void SetGtkFont(const std::string& font_name); |
+ |
+// Sets the given label's size request to |pixel_width|. This will cause the |
+// label to wrap if it needs to. The reason for this function is that some |
+// versions of GTK mis-align labels that have a size request and line wrapping, |
+// and this function hides the complexity of the workaround. |
+void SetLabelWidth(GtkWidget* label, int pixel_width); |
+ |
+// Make the |label| shrinkable within a GthChromeShrinkableHBox |
+// It calculates the real size request of a label and set its ellipsize mode to |
+// PANGO_ELLIPSIZE_END. |
+// It must be done when the label is mapped (become visible on the screen), |
+// to make sure the pango can get correct font information for the calculation. |
+void InitLabelSizeRequestAndEllipsizeMode(GtkWidget* label); |
+ |
+// Convenience methods for converting between web drag operations and the GDK |
+// equivalent. |
+GdkDragAction WebDragOpToGdkDragAction(WebKit::WebDragOperationsMask op); |
+WebKit::WebDragOperationsMask GdkDragActionToWebDragOp(GdkDragAction action); |
+ |
+// A helper function for gtk_message_dialog_new() to work around a few KDE 3 |
+// window manager bugs. You should always call it after creating a dialog with |
+// gtk_message_dialog_new. |
+void ApplyMessageDialogQuirks(GtkWidget* dialog); |
+ |
+// Performs Cut/Copy/Paste operation on the |window|. |
+void DoCut(BrowserWindow* window); |
+void DoCopy(BrowserWindow* window); |
+void DoPaste(BrowserWindow* window); |
+ |
+} // namespace gtk_util |
+ |
+#endif // CHROME_BROWSER_UI_GTK_GTK_UTIL_H_ |