summaryrefslogtreecommitdiffstats
path: root/gfx/gtk_util.cc
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-23 00:55:28 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-23 00:55:28 +0000
commitf0b6b4881e24a1e7cd9524c4e381382c14bde1f1 (patch)
treea003cdb87339224ae24f3dd39f8d3fc9a8f1c8fc /gfx/gtk_util.cc
parent1edd9e76f6dac6bcdbdebf51eceb7b6665fe52fa (diff)
downloadchromium_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.cc39
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, "_");
}