diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-23 00:55:28 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-23 00:55:28 +0000 |
commit | f0b6b4881e24a1e7cd9524c4e381382c14bde1f1 (patch) | |
tree | a003cdb87339224ae24f3dd39f8d3fc9a8f1c8fc /gfx/gtk_util.cc | |
parent | 1edd9e76f6dac6bcdbdebf51eceb7b6665fe52fa (diff) | |
download | chromium_src-f0b6b4881e24a1e7cd9524c4e381382c14bde1f1.zip chromium_src-f0b6b4881e24a1e7cd9524c4e381382c14bde1f1.tar.gz chromium_src-f0b6b4881e24a1e7cd9524c4e381382c14bde1f1.tar.bz2 |
Refactoring of cursor usage (primarily for linux).
Add API to WebCursor to return a native-cursor, and implementation for windows,
linux and mac.
For linux: Move gtk_util::GetCursor into gfx:: namespace. Also, get rid of
ref/unref'ing the cursors from everywhere. Instead, do almost all of it in one
place (in gfx). Also, show proper cursors for web-pages with touchui=1 (i.e. add
support for updating cursor in RenderWidgetHostViewViews).
Review URL: http://codereview.chromium.org/5110010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67034 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gfx/gtk_util.cc')
-rw-r--r-- | gfx/gtk_util.cc | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/gfx/gtk_util.cc b/gfx/gtk_util.cc index b30b827..96195fe 100644 --- a/gfx/gtk_util.cc +++ b/gfx/gtk_util.cc @@ -17,6 +17,40 @@ namespace { +// A process wide singleton that manages our usage of gdk +// cursors. gdk_cursor_new() hits the disk in several places and GdkCursor +// instances can be reused throughout the process. +class GdkCursorCache { + public: + GdkCursorCache() {} + ~GdkCursorCache() { + for (std::map<GdkCursorType, GdkCursor*>::iterator it = + cursor_cache_.begin(); it != cursor_cache_.end(); ++it) { + gdk_cursor_unref(it->second); + } + cursor_cache_.clear(); + } + + GdkCursor* GetCursorImpl(GdkCursorType type) { + std::map<GdkCursorType, GdkCursor*>::iterator it = cursor_cache_.find(type); + GdkCursor* cursor = NULL; + if (it == cursor_cache_.end()) { + cursor = gdk_cursor_new(type); + cursor_cache_.insert(std::make_pair(type, cursor)); + } else { + cursor = it->second; + } + + // It is not necessary to add a reference here. The callers can ref the + // cursor if they need it for something. + return cursor; + } + + std::map<GdkCursorType, GdkCursor*> cursor_cache_; + + DISALLOW_COPY_AND_ASSIGN(GdkCursorCache); +}; + void FreePixels(guchar* pixels, gpointer data) { free(data); } @@ -146,6 +180,11 @@ double GetPangoResolution() { return resolution; } +GdkCursor* GetCursor(int type) { + static GdkCursorCache impl; + return impl.GetCursorImpl(static_cast<GdkCursorType>(type)); +} + std::string ConvertAcceleratorsFromWindowsStyle(const std::string& label) { return ConvertAmperstandsTo(label, "_"); } |