Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: webkit/glue/webcursor_win.cc

Issue 15088: Add support for custom cursors set by windowless plugins. Windowless plugins... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/glue/webcursor_mac.mm ('k') | webkit/glue/webplugin_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this
2 // source code is governed by a BSD-style license that can be found in the 2 // source code is governed by a BSD-style license that can be found in the
3 // LICENSE file. 3 // LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "NativeImageSkia.h" 6 #include "NativeImageSkia.h"
7 #include "PlatformCursor.h" 7 #include "PlatformCursor.h"
8 8
9 #undef LOG 9 #undef LOG
10 #include "base/gfx/gdi_util.h" 10 #include "base/gfx/gdi_util.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/pickle.h"
12 #include "skia/include/SkBitmap.h" 13 #include "skia/include/SkBitmap.h"
13 #include "webkit/glue/webcursor.h" 14 #include "webkit/glue/webcursor.h"
14 #include "webkit/glue/webkit_resources.h" 15 #include "webkit/glue/webkit_resources.h"
15 16
16 using WebCore::PlatformCursor; 17 using WebCore::PlatformCursor;
17 18
18 static LPCWSTR ToCursorID(PlatformCursor::Type type) { 19 static LPCWSTR ToCursorID(PlatformCursor::Type type) {
19 switch (type) { 20 switch (type) {
20 case PlatformCursor::typePointer: 21 case PlatformCursor::typePointer:
21 return IDC_ARROW; 22 return IDC_ARROW;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 { LoadCursor(NULL, IDC_SIZEALL), PlatformCursor::typeMove }, 125 { LoadCursor(NULL, IDC_SIZEALL), PlatformCursor::typeMove },
125 { LoadCursor(NULL, IDC_NO), PlatformCursor::typeNotAllowed }, 126 { LoadCursor(NULL, IDC_NO), PlatformCursor::typeNotAllowed },
126 { LoadCursor(NULL, IDC_HAND), PlatformCursor::typeHand }, 127 { LoadCursor(NULL, IDC_HAND), PlatformCursor::typeHand },
127 { LoadCursor(NULL, IDC_APPSTARTING), PlatformCursor::typeProgress }, 128 { LoadCursor(NULL, IDC_APPSTARTING), PlatformCursor::typeProgress },
128 { LoadCursor(NULL, IDC_HELP), PlatformCursor::typeHelp }, 129 { LoadCursor(NULL, IDC_HELP), PlatformCursor::typeHelp },
129 }; 130 };
130 for (int i = 0; i < arraysize(kStandardCursors); i++) { 131 for (int i = 0; i < arraysize(kStandardCursors); i++) {
131 if (cursor == kStandardCursors[i].cursor) 132 if (cursor == kStandardCursors[i].cursor)
132 return kStandardCursors[i].type; 133 return kStandardCursors[i].type;
133 } 134 }
134 return PlatformCursor::typePointer; 135 return PlatformCursor::typeCustom;
135 } 136 }
136 137
137 HCURSOR WebCursor::GetCursor(HINSTANCE module_handle) const { 138 HCURSOR WebCursor::GetCursor(HINSTANCE module_handle){
138 if (IsCustom()) 139 if (!IsCustom()) {
139 return NULL; 140 const wchar_t* cursor_id =
141 ToCursorID(static_cast<PlatformCursor::Type>(type_));
140 142
141 LPCWSTR cursor_id = ToCursorID(static_cast<PlatformCursor::Type>(type_)); 143 if (IsSystemCursorID(cursor_id))
144 module_handle = NULL;
142 145
143 if (IsSystemCursorID(cursor_id)) 146 return LoadCursor(module_handle, cursor_id);
144 module_handle = NULL; 147 }
145 148
146 return LoadCursor(module_handle, cursor_id); 149 if (custom_cursor_) {
147 } 150 DCHECK(external_cursor_ == NULL);
151 return custom_cursor_;
152 }
148 153
149 HCURSOR WebCursor::GetCustomCursor() const { 154 if (external_cursor_)
150 if (!IsCustom()) 155 return external_cursor_;
151 return NULL;
152 156
153 BITMAPINFO cursor_bitmap_info = {0}; 157 BITMAPINFO cursor_bitmap_info = {0};
154 gfx::CreateBitmapHeader( 158 gfx::CreateBitmapHeader(
155 custom_size_.width(), custom_size_.height(), 159 custom_size_.width(), custom_size_.height(),
156 reinterpret_cast<BITMAPINFOHEADER*>(&cursor_bitmap_info)); 160 reinterpret_cast<BITMAPINFOHEADER*>(&cursor_bitmap_info));
157 HDC dc = GetDC(0); 161 HDC dc = GetDC(0);
158 HDC workingDC = CreateCompatibleDC(dc); 162 HDC workingDC = CreateCompatibleDC(dc);
159 HBITMAP bitmap_handle = CreateDIBSection( 163 HBITMAP bitmap_handle = CreateDIBSection(
160 dc, &cursor_bitmap_info, DIB_RGB_COLORS, 0, 0, 0); 164 dc, &cursor_bitmap_info, DIB_RGB_COLORS, 0, 0, 0);
161 SetDIBits( 165 SetDIBits(
162 0, bitmap_handle, 0, custom_size_.height(), &custom_data_[0], 166 0, bitmap_handle, 0, custom_size_.height(), &custom_data_[0],
163 &cursor_bitmap_info, DIB_RGB_COLORS); 167 &cursor_bitmap_info, DIB_RGB_COLORS);
164 168
165 HBITMAP old_bitmap = reinterpret_cast<HBITMAP>( 169 HBITMAP old_bitmap = reinterpret_cast<HBITMAP>(
166 SelectObject(workingDC, bitmap_handle)); 170 SelectObject(workingDC, bitmap_handle));
167 SetBkMode(workingDC, TRANSPARENT); 171 SetBkMode(workingDC, TRANSPARENT);
168 SelectObject(workingDC, old_bitmap); 172 SelectObject(workingDC, old_bitmap);
169 173
170 HBITMAP mask = CreateBitmap( 174 HBITMAP mask = CreateBitmap(
171 custom_size_.width(), custom_size_.height(), 1, 1, NULL); 175 custom_size_.width(), custom_size_.height(), 1, 1, NULL);
172 ICONINFO ii = {0}; 176 ICONINFO ii = {0};
173 ii.fIcon = FALSE; 177 ii.fIcon = FALSE;
174 ii.xHotspot = hotspot_.x(); 178 ii.xHotspot = hotspot_.x();
175 ii.yHotspot = hotspot_.y(); 179 ii.yHotspot = hotspot_.y();
176 ii.hbmMask = mask; 180 ii.hbmMask = mask;
177 ii.hbmColor = bitmap_handle; 181 ii.hbmColor = bitmap_handle;
178 182
179 HCURSOR cursor_handle = CreateIconIndirect(&ii); 183 custom_cursor_ = CreateIconIndirect(&ii);
180 184
181 DeleteObject(mask); 185 DeleteObject(mask);
182 DeleteObject(bitmap_handle); 186 DeleteObject(bitmap_handle);
183 DeleteDC(workingDC); 187 DeleteDC(workingDC);
184 ReleaseDC(0, dc); 188 ReleaseDC(0, dc);
185 return cursor_handle; 189 return custom_cursor_;
186 } 190 }
187 191
188 void WebCursor::InitFromCursor(HCURSOR cursor) { 192 void WebCursor::InitFromExternalCursor(HCURSOR cursor) {
189 // TODO(iyengar) Add support for custom cursors. 193 WebCore::PlatformCursor::Type cursor_type = ToPlatformCursorType(cursor);
190 *this = WebCursor(ToPlatformCursorType(cursor)); 194
195 *this = WebCursor(cursor_type);
196
197 if (cursor_type == WebCore::PlatformCursor::typeCustom) {
198 external_cursor_ = cursor;
199 }
191 } 200 }
201
202 void WebCursor::InitPlatformData() {
203 external_cursor_ = NULL;
204 custom_cursor_ = NULL;
205 }
206
207 bool WebCursor::SerializePlatformData(Pickle* pickle) const {
208 // There are some issues with converting certain HCURSORS to bitmaps. The
209 // HCURSOR being a user object can be marshaled as is.
210 return pickle->WriteIntPtr(reinterpret_cast<intptr_t>(external_cursor_));
211 }
212
213 bool WebCursor::DeserializePlatformData(const Pickle* pickle, void** iter) {
214 return pickle->ReadIntPtr(iter,
215 reinterpret_cast<intptr_t*>(&external_cursor_));
216 }
217
218 bool WebCursor::IsPlatformDataEqual(const WebCursor& other) const {
219 if (!IsCustom())
220 return true;
221
222 return (external_cursor_ == other.external_cursor_);
223 }
224
225 void WebCursor::CopyPlatformData(const WebCursor& other) {
226 external_cursor_ = other.external_cursor_;
227 // The custom_cursor_ member will be initialized to a HCURSOR the next time
228 // the GetCursor member function is invoked on this WebCursor instance. The
229 // cursor is created using the data in the custom_data_ vector.
230 custom_cursor_ = NULL;
231 }
232
233 void WebCursor::CleanupPlatformData() {
234 external_cursor_ = NULL;
235
236 if (custom_cursor_) {
237 DestroyIcon(custom_cursor_);
238 custom_cursor_ = NULL;
239 }
240 }
OLDNEW
« no previous file with comments | « webkit/glue/webcursor_mac.mm ('k') | webkit/glue/webplugin_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698