summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/aura/aura.gyp35
-rw-r--r--ui/aura/root_window_host_linux.cc55
-rw-r--r--ui/aura/root_window_host_linux.h3
-rw-r--r--ui/aura/test/test_aura_initializer.cc31
-rw-r--r--ui/aura/test/test_aura_initializer.h28
-rw-r--r--ui/base/x/x11_util.cc21
-rw-r--r--ui/base/x/x11_util.h7
-rw-r--r--ui/gfx/codec/png_codec.cc21
-rw-r--r--ui/gfx/skia_util.cc25
-rw-r--r--ui/gfx/skia_util.h7
-rw-r--r--ui/resources/ui_resources_2x.grd2
-rw-r--r--ui/resources/ui_resources_standard.grd2
-rw-r--r--ui/resources/ui_resources_touch.grd2
-rw-r--r--ui/ui.gyp1
14 files changed, 219 insertions, 21 deletions
diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp
index 00e8054..2edd11c 100644
--- a/ui/aura/aura.gyp
+++ b/ui/aura/aura.gyp
@@ -19,6 +19,8 @@
'../ui.gyp:gfx_resources',
'../ui.gyp:ui',
'../ui.gyp:ui_resources',
+ '../ui.gyp:ui_resources_2x',
+ '../ui.gyp:ui_resources_standard',
],
'defines': [
'AURA_IMPLEMENTATION',
@@ -130,6 +132,7 @@
'../../testing/gtest.gyp:gtest',
'../ui.gyp:ui',
'aura',
+ 'test_support_aura_pak',
],
'include_dirs': [
'..',
@@ -143,6 +146,8 @@
'test/event_generator.h',
'test/test_activation_client.cc',
'test/test_activation_client.h',
+ 'test/test_aura_initializer.cc',
+ 'test/test_aura_initializer.h',
'test/test_event_filter.cc',
'test/test_event_filter.h',
'test/test_screen.cc',
@@ -156,6 +161,36 @@
],
},
{
+ # We build a minimal set of resources required for test_support_aura.
+ 'target_name': 'test_support_aura_pak',
+ 'type': 'none',
+ 'dependencies': [
+ '<(DEPTH)/ui/ui.gyp:ui_resources_standard',
+ ],
+ 'variables': {
+ 'repack_path': '<(DEPTH)/tools/grit/grit/format/repack.py',
+ },
+ 'actions': [
+ {
+ 'action_name': 'repack_test_support_aura_pack',
+ 'variables': {
+ 'pak_inputs': [
+ '<(SHARED_INTERMEDIATE_DIR)/ui/ui_resources_standard/ui_resources_standard.pak',
+ ],
+ },
+ 'inputs': [
+ '<(repack_path)',
+ '<@(pak_inputs)',
+ ],
+ 'outputs': [
+ '<(PRODUCT_DIR)/test_support_aura_resources.pak',
+ ],
+ 'action': ['python', '<(repack_path)', '<@(_outputs)',
+ '<@(pak_inputs)'],
+ },
+ ],
+ },
+ {
'target_name': 'aura_demo',
'type': 'executable',
'dependencies': [
diff --git a/ui/aura/root_window_host_linux.cc b/ui/aura/root_window_host_linux.cc
index 83ca3ee..d9b9cd3 100644
--- a/ui/aura/root_window_host_linux.cc
+++ b/ui/aura/root_window_host_linux.cc
@@ -5,6 +5,7 @@
#include "ui/aura/root_window_host_linux.h"
#include <X11/Xatom.h>
+#include <X11/Xcursor/Xcursor.h>
#include <X11/cursorfont.h>
#include <X11/extensions/XInput2.h>
#include <X11/extensions/Xfixes.h>
@@ -14,6 +15,8 @@
#include "base/message_pump_x.h"
#include "base/stl_util.h"
#include "base/stringprintf.h"
+#include "grit/ui_resources_standard.h"
+#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/aura/client/user_gesture_client.h"
#include "ui/aura/dispatcher_linux.h"
#include "ui/aura/env.h"
@@ -21,10 +24,12 @@
#include "ui/aura/root_window.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/keycodes/keyboard_codes.h"
+#include "ui/base/resource/resource_bundle.h"
#include "ui/base/touch/touch_factory.h"
#include "ui/base/view_prop.h"
#include "ui/base/x/x11_util.h"
#include "ui/compositor/layer.h"
+#include "ui/gfx/image/image.h"
using std::max;
using std::min;
@@ -292,6 +297,51 @@ const char* kAtomList[] = {
} // namespace
+// A utility class that provides X Cursor for NativeCursors for which we have
+// image resources.
+class RootWindowHostLinux::ImageCursors {
+ public:
+ ImageCursors() {
+ LoadImageCursor(ui::kCursorNoDrop, IDR_AURA_CURSOR_NO_DROP);
+ LoadImageCursor(ui::kCursorCopy, IDR_AURA_CURSOR_COPY);
+ // TODO (varunjain): add more cursors once we have assets.
+ }
+
+ ~ImageCursors() {
+ std::map<int, Cursor>::const_iterator it;
+ for (it = cursors_.begin(); it != cursors_.end(); ++it)
+ ui::UnrefCustomXCursor(it->second);
+ }
+
+ // Returns true if we have an image resource loaded for the |native_cursor|.
+ bool IsImageCursor(gfx::NativeCursor native_cursor) {
+ return cursors_.find(native_cursor.native_type()) != cursors_.end();
+ }
+
+ // Gets the X Cursor corresponding to the |native_cursor|.
+ ::Cursor ImageCursorFromNative(gfx::NativeCursor native_cursor) {
+ DCHECK(cursors_.find(native_cursor.native_type()) != cursors_.end());
+ return cursors_[native_cursor.native_type()];
+ }
+
+ private:
+ // Creates an X Cursor from an image resource and puts it in the cursor map.
+ void LoadImageCursor(int id, int resource_id) {
+ const SkBitmap* bitmap =
+ ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+ resource_id).ToSkBitmap();
+
+ XcursorImage* image = ui::SkBitmapToXcursorImage(bitmap, gfx::Point(0, 0));
+ cursors_[id] = ui::CreateReffedCustomXCursor(image);
+ // |bitmap| is owned by the resource bundle. So we do not need to free it.
+ }
+
+ // A map to hold all image cursors. It maps the cursor ID to the X Cursor.
+ std::map<int, Cursor> cursors_;
+
+ DISALLOW_COPY_AND_ASSIGN(ImageCursors);
+};
+
RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds)
: root_window_(NULL),
xdisplay_(base::MessagePumpX::GetDefaultXDisplay()),
@@ -301,7 +351,8 @@ RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds)
cursor_shown_(true),
bounds_(bounds),
focus_when_shown_(false),
- pointer_barriers_(NULL) {
+ pointer_barriers_(NULL),
+ image_cursors_(new ImageCursors) {
XSetWindowAttributes swa;
memset(&swa, 0, sizeof(swa));
swa.background_pixmap = None;
@@ -794,6 +845,8 @@ bool RootWindowHostLinux::IsWindowManagerPresent() {
void RootWindowHostLinux::SetCursorInternal(gfx::NativeCursor cursor) {
::Cursor xcursor =
+ image_cursors_->IsImageCursor(cursor) ?
+ image_cursors_->ImageCursorFromNative(cursor) :
cursor == ui::kCursorNone ?
invisible_cursor_ :
cursor == ui::kCursorCustom ?
diff --git a/ui/aura/root_window_host_linux.h b/ui/aura/root_window_host_linux.h
index ae435e9..34484e4 100644
--- a/ui/aura/root_window_host_linux.h
+++ b/ui/aura/root_window_host_linux.h
@@ -101,6 +101,9 @@ class RootWindowHostLinux : public RootWindowHost,
scoped_ptr<ui::ViewProp> prop_;
+ class ImageCursors;
+ scoped_ptr<ImageCursors> image_cursors_;
+
DISALLOW_COPY_AND_ASSIGN(RootWindowHostLinux);
};
diff --git a/ui/aura/test/test_aura_initializer.cc b/ui/aura/test/test_aura_initializer.cc
new file mode 100644
index 0000000..f586d65
--- /dev/null
+++ b/ui/aura/test/test_aura_initializer.cc
@@ -0,0 +1,31 @@
+// Copyright (c) 2012 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.
+
+#include "ui/aura/test/test_aura_initializer.h"
+
+#include "base/base_paths.h"
+#include "base/path_service.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace aura {
+namespace test {
+
+TestAuraInitializer::TestAuraInitializer() {
+#if defined(OS_LINUX)
+ FilePath pak_file;
+ PathService::Get(base::DIR_MODULE, &pak_file);
+ pak_file = pak_file.Append(FILE_PATH_LITERAL(
+ "test_support_aura_resources.pak"));
+ ui::ResourceBundle::InitSharedInstanceWithPakFile(pak_file);
+#endif
+}
+
+TestAuraInitializer::~TestAuraInitializer() {
+#if defined(OS_LINUX)
+ ui::ResourceBundle::CleanupSharedInstance();
+#endif
+}
+
+} // namespace test
+} // namespace aura
diff --git a/ui/aura/test/test_aura_initializer.h b/ui/aura/test/test_aura_initializer.h
new file mode 100644
index 0000000..cb276ce
--- /dev/null
+++ b/ui/aura/test/test_aura_initializer.h
@@ -0,0 +1,28 @@
+// Copyright (c) 2012 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 UI_AURA_TEST_TEST_AURA_INITIALIZER_H_
+#define UI_AURA_TEST_TEST_AURA_INITIALIZER_H_
+#pragma once
+
+#include "base/basictypes.h"
+
+namespace aura {
+namespace test {
+
+// Initializes various objects needed to run unit tests that use aura::*
+// objects.
+class TestAuraInitializer {
+ public:
+ TestAuraInitializer();
+ virtual ~TestAuraInitializer();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestAuraInitializer);
+};
+
+} // namespace test
+} // namespace aura
+
+#endif // UI_AURA_TEST_TEST_AURA_INITIALIZER_H_
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc
index 5df42c0..a7b1bc3 100644
--- a/ui/base/x/x11_util.cc
+++ b/ui/base/x/x11_util.cc
@@ -37,6 +37,8 @@
#if defined(USE_AURA)
#include <X11/Xcursor/Xcursor.h>
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/skia_util.h"
#endif
#if defined(TOOLKIT_GTK)
@@ -411,6 +413,25 @@ void RefCustomXCursor(::Cursor cursor) {
void UnrefCustomXCursor(::Cursor cursor) {
XCustomCursorCache::GetInstance()->Unref(cursor);
}
+
+XcursorImage* SkBitmapToXcursorImage(const SkBitmap* bitmap,
+ const gfx::Point& hotspot) {
+ DCHECK(bitmap->config() == SkBitmap::kARGB_8888_Config);
+ XcursorImage* image = XcursorImageCreate(bitmap->width(), bitmap->height());
+ image->xhot = hotspot.x();
+ image->yhot = hotspot.y();
+
+ if (bitmap->width() && bitmap->height()) {
+ bitmap->lockPixels();
+ gfx::ConvertSkiaToRGBA(
+ static_cast<const unsigned char*>(bitmap->getPixels()),
+ bitmap->width() * bitmap->height(),
+ reinterpret_cast<unsigned char*>(image->pixels));
+ bitmap->unlockPixels();
+ }
+
+ return image;
+}
#endif
XID GetX11RootWindow() {
diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h
index 771e8ef..bf89c3b 100644
--- a/ui/base/x/x11_util.h
+++ b/ui/base/x/x11_util.h
@@ -18,6 +18,7 @@
#include "base/basictypes.h"
#include "ui/base/events.h"
#include "ui/base/ui_export.h"
+#include "ui/gfx/point.h"
typedef unsigned long Atom;
typedef unsigned long XID;
@@ -35,6 +36,7 @@ typedef struct _GtkWindow GtkWindow;
namespace gfx {
class Rect;
}
+class SkBitmap;
namespace ui {
@@ -89,6 +91,11 @@ UI_EXPORT void RefCustomXCursor(::Cursor cursor);
// Decreases the refcount of the custom cursor, and destroys it if it reaches 0.
UI_EXPORT void UnrefCustomXCursor(::Cursor cursor);
+
+// Creates a XcursorImage and copies the SkBitmap |bitmap| on it. |bitmap|
+// should be non-null. Caller owns the returned object.
+UI_EXPORT XcursorImage* SkBitmapToXcursorImage(const SkBitmap* bitmap,
+ const gfx::Point& hotspot);
#endif
// These functions do not cache their results --------------------------
diff --git a/ui/gfx/codec/png_codec.cc b/ui/gfx/codec/png_codec.cc
index 1ca139d..da73928 100644
--- a/ui/gfx/codec/png_codec.cc
+++ b/ui/gfx/codec/png_codec.cc
@@ -8,6 +8,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/string_util.h"
#include "ui/gfx/size.h"
+#include "ui/gfx/skia_util.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkUnPreMultiply.h"
#include "third_party/skia/include/core/SkColorPriv.h"
@@ -76,25 +77,7 @@ void ConvertSkiatoRGB(const unsigned char* skia, int pixel_width,
void ConvertSkiatoRGBA(const unsigned char* skia, int pixel_width,
unsigned char* rgba, bool* is_opaque) {
- int total_length = pixel_width * 4;
- for (int i = 0; i < total_length; i += 4) {
- const uint32_t pixel_in = *reinterpret_cast<const uint32_t*>(&skia[i]);
-
- // Pack the components here.
- int alpha = SkGetPackedA32(pixel_in);
- if (alpha != 0 && alpha != 255) {
- SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(pixel_in);
- rgba[i + 0] = SkColorGetR(unmultiplied);
- rgba[i + 1] = SkColorGetG(unmultiplied);
- rgba[i + 2] = SkColorGetB(unmultiplied);
- rgba[i + 3] = alpha;
- } else {
- rgba[i + 0] = SkGetPackedR32(pixel_in);
- rgba[i + 1] = SkGetPackedG32(pixel_in);
- rgba[i + 2] = SkGetPackedB32(pixel_in);
- rgba[i + 3] = alpha;
- }
- }
+ gfx::ConvertSkiaToRGBA(skia, pixel_width, rgba);
}
} // namespace
diff --git a/ui/gfx/skia_util.cc b/ui/gfx/skia_util.cc
index bfee378..a459cdd 100644
--- a/ui/gfx/skia_util.cc
+++ b/ui/gfx/skia_util.cc
@@ -8,6 +8,7 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColorPriv.h"
#include "third_party/skia/include/core/SkShader.h"
+#include "third_party/skia/include/core/SkUnPreMultiply.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
#include "ui/gfx/rect.h"
@@ -101,4 +102,28 @@ string16 RemoveAcceleratorChar(const string16& s,
return accelerator_removed;
}
+void ConvertSkiaToRGBA(const unsigned char* skia,
+ int pixel_width,
+ unsigned char* rgba) {
+ int total_length = pixel_width * 4;
+ for (int i = 0; i < total_length; i += 4) {
+ const uint32_t pixel_in = *reinterpret_cast<const uint32_t*>(&skia[i]);
+
+ // Pack the components here.
+ int alpha = SkGetPackedA32(pixel_in);
+ if (alpha != 0 && alpha != 255) {
+ SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(pixel_in);
+ rgba[i + 0] = SkColorGetR(unmultiplied);
+ rgba[i + 1] = SkColorGetG(unmultiplied);
+ rgba[i + 2] = SkColorGetB(unmultiplied);
+ rgba[i + 3] = alpha;
+ } else {
+ rgba[i + 0] = SkGetPackedR32(pixel_in);
+ rgba[i + 1] = SkGetPackedG32(pixel_in);
+ rgba[i + 2] = SkGetPackedB32(pixel_in);
+ rgba[i + 3] = alpha;
+ }
+ }
+}
+
} // namespace gfx
diff --git a/ui/gfx/skia_util.h b/ui/gfx/skia_util.h
index de7b8f4..152b731 100644
--- a/ui/gfx/skia_util.h
+++ b/ui/gfx/skia_util.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -50,6 +50,11 @@ UI_EXPORT string16 RemoveAcceleratorChar(const string16& s,
int* accelerated_char_pos,
int* accelerated_char_span);
+// Converts Skia ARGB format pixels in |skia| to RGBA.
+UI_EXPORT void ConvertSkiaToRGBA(const unsigned char* skia,
+ int pixel_width,
+ unsigned char* rgba);
+
} // namespace gfx
#endif // UI_GFX_SKIA_UTIL_H_
diff --git a/ui/resources/ui_resources_2x.grd b/ui/resources/ui_resources_2x.grd
index fc13cd6..f5674d8 100644
--- a/ui/resources/ui_resources_2x.grd
+++ b/ui/resources/ui_resources_2x.grd
@@ -78,6 +78,8 @@
<include name="IDR_AURA_WINDOW_SNAP_MINIMIZE_P" file="aura/window_snap_minimize_p.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_SNAP_P" file="aura/window_snap_p.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_SNAP_RIGHT_P" file="aura/window_snap_right_p.png" type="BINDATA" />
+ <include name="IDR_AURA_CURSOR_NO_DROP" file="aura/left_ptr_nodrop_2x.png" type="BINDATA" />
+ <include name="IDR_AURA_CURSOR_COPY" file="aura/left_ptr_copy_2x.png" type="BINDATA" />
</if>
</includes>
</release>
diff --git a/ui/resources/ui_resources_standard.grd b/ui/resources/ui_resources_standard.grd
index 926779e..d63dc98 100644
--- a/ui/resources/ui_resources_standard.grd
+++ b/ui/resources/ui_resources_standard.grd
@@ -75,6 +75,8 @@
<include name="IDR_AURA_WINDOW_SNAP_MINIMIZE_P" file="aura/window_snap_minimize_p.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_SNAP_P" file="aura/window_snap_p.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_SNAP_RIGHT_P" file="aura/window_snap_right_p.png" type="BINDATA" />
+ <include name="IDR_AURA_CURSOR_NO_DROP" file="aura/left_ptr_nodrop.png" type="BINDATA" />
+ <include name="IDR_AURA_CURSOR_COPY" file="aura/left_ptr_copy.png" type="BINDATA" />
</if>
</includes>
</release>
diff --git a/ui/resources/ui_resources_touch.grd b/ui/resources/ui_resources_touch.grd
index 59eb2a2c..a21b0ce 100644
--- a/ui/resources/ui_resources_touch.grd
+++ b/ui/resources/ui_resources_touch.grd
@@ -75,6 +75,8 @@
<include name="IDR_AURA_WINDOW_SNAP_MINIMIZE_P" file="aura/window_snap_minimize_touch_p.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_SNAP_P" file="aura/window_snap_touch_p.png" type="BINDATA" />
<include name="IDR_AURA_WINDOW_SNAP_RIGHT_P" file="aura/window_snap_right_touch_p.png" type="BINDATA" />
+ <include name="IDR_AURA_CURSOR_NO_DROP" file="aura/left_ptr_nodrop.png" type="BINDATA" />
+ <include name="IDR_AURA_CURSOR_COPY" file="aura/left_ptr_copy.png" type="BINDATA" />
</if>
</includes>
</release>
diff --git a/ui/ui.gyp b/ui/ui.gyp
index 4f19641..5eca3fa 100644
--- a/ui/ui.gyp
+++ b/ui/ui.gyp
@@ -493,6 +493,7 @@
],
'link_settings': {
'libraries': [
+ '-lXcursor', # For XCursor* function calls in x11_util.cc.
'-lXrender', # For XRender* function calls in x11_util.cc.
],
},