| // 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_GTK_GTK_UTIL_H_ |
| #define CHROME_BROWSER_GTK_GTK_UTIL_H_ |
| |
| #include <gtk/gtk.h> |
| #include <string> |
| #include <vector> |
| |
| #include "app/x11_util.h" |
| #include "gfx/point.h" |
| #include "gfx/rect.h" |
| #include "webkit/glue/window_open_disposition.h" |
| |
| typedef struct _GtkWidget GtkWidget; |
| |
| class GtkThemeProvider; |
| struct RendererPreferences; // from common/renderer_preferences.h |
| |
| 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 { |
| |
| // 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 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); |
| |
| // 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); |
| |
| // Change windows accelerator style to GTK style. (GTK uses _ for |
| // accelerators. Windows uses & with && as an escape for &.) |
| std::string ConvertAcceleratorsFromWindowsStyle(const std::string& label); |
| |
| // 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); |
| |
| // 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); |
| |
| // Returns a static instance of a GdkCursor* object, sharable across the |
| // process. Returns a GdkCursor with a +1 refcount, as if it was just created |
| // with gdk_cursor_new(); owner must gdk_cursor_unref() it when done with it. |
| GdkCursor* GetCursor(GdkCursorType type); |
| |
| // 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); |
| |
| // Set the label to use a request size equal to the allocation size. This |
| // causes the label to wrap at the width of the container it is in, instead of |
| // at the default width. |
| // This is called a hack because the gtk docs state that it is logically |
| // inconsistent for a widget to make its size request depend on its allocation. |
| // It does, however, have the intended effect of wrapping the label at the |
| // proper width. |
| void WrapLabelAtAllocationHack(GtkWidget* label); |
| |
| // 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(); |
| |
| } // namespace gtk_util |
| |
| #endif // CHROME_BROWSER_GTK_GTK_UTIL_H_ |