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

Side by Side Diff: ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc

Issue 751063008: Fix mouse cursor during drag and drop after HTML 5 pointer lock on Desktop Linux (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h" 5 #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h"
6 6
7 #include <X11/Xatom.h> 7 #include <X11/Xatom.h>
8 8
9 #include "base/event_types.h" 9 #include "base/event_types.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 } 398 }
399 399
400 /////////////////////////////////////////////////////////////////////////////// 400 ///////////////////////////////////////////////////////////////////////////////
401 401
402 DesktopDragDropClientAuraX11::DesktopDragDropClientAuraX11( 402 DesktopDragDropClientAuraX11::DesktopDragDropClientAuraX11(
403 aura::Window* root_window, 403 aura::Window* root_window,
404 views::DesktopNativeCursorManager* cursor_manager, 404 views::DesktopNativeCursorManager* cursor_manager,
405 Display* xdisplay, 405 Display* xdisplay,
406 ::Window xwindow) 406 ::Window xwindow)
407 : root_window_(root_window), 407 : root_window_(root_window),
408 cursor_manager_(cursor_manager),
408 xdisplay_(xdisplay), 409 xdisplay_(xdisplay),
409 xwindow_(xwindow), 410 xwindow_(xwindow),
410 atom_cache_(xdisplay_, kAtomsToCache), 411 atom_cache_(xdisplay_, kAtomsToCache),
411 current_modifier_state_(ui::EF_NONE), 412 current_modifier_state_(ui::EF_NONE),
412 target_window_(NULL), 413 target_window_(NULL),
413 waiting_on_status_(false), 414 waiting_on_status_(false),
414 status_received_since_enter_(false), 415 status_received_since_enter_(false),
415 source_provider_(NULL), 416 source_provider_(NULL),
416 source_current_window_(None), 417 source_current_window_(None),
417 source_state_(SOURCE_STATE_OTHER), 418 source_state_(SOURCE_STATE_OTHER),
418 drag_operation_(0), 419 drag_operation_(0),
419 negotiated_operation_(ui::DragDropTypes::DRAG_NONE), 420 negotiated_operation_(ui::DragDropTypes::DRAG_NONE),
420 grab_cursor_(cursor_manager->GetInitializedCursor(ui::kCursorGrabbing)),
421 copy_grab_cursor_(cursor_manager->GetInitializedCursor(ui::kCursorCopy)),
422 move_grab_cursor_(cursor_manager->GetInitializedCursor(ui::kCursorMove)),
423 weak_ptr_factory_(this) { 421 weak_ptr_factory_(this) {
424 // Some tests change the DesktopDragDropClientAuraX11 associated with an 422 // Some tests change the DesktopDragDropClientAuraX11 associated with an
425 // |xwindow|. 423 // |xwindow|.
426 g_live_client_map.Get()[xwindow] = this; 424 g_live_client_map.Get()[xwindow] = this;
427 425
428 // Mark that we are aware of drag and drop concepts. 426 // Mark that we are aware of drag and drop concepts.
429 unsigned long xdnd_version = kMinXdndVersion; 427 unsigned long xdnd_version = kMinXdndVersion;
430 XChangeProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndAware"), 428 XChangeProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndAware"),
431 XA_ATOM, 32, PropModeReplace, 429 XA_ATOM, 32, PropModeReplace,
432 reinterpret_cast<unsigned char*>(&xdnd_version), 1); 430 reinterpret_cast<unsigned char*>(&xdnd_version), 1);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 // We were waiting on the status message so we could send the XdndDrop. 529 // We were waiting on the status message so we could send the XdndDrop.
532 if (negotiated_operation_ == ui::DragDropTypes::DRAG_NONE) { 530 if (negotiated_operation_ == ui::DragDropTypes::DRAG_NONE) {
533 move_loop_->EndMoveLoop(); 531 move_loop_->EndMoveLoop();
534 return; 532 return;
535 } 533 }
536 source_state_ = SOURCE_STATE_DROPPED; 534 source_state_ = SOURCE_STATE_DROPPED;
537 SendXdndDrop(source_window); 535 SendXdndDrop(source_window);
538 return; 536 return;
539 } 537 }
540 538
539 int cursor_type = ui::kCursorNull;
541 switch (negotiated_operation_) { 540 switch (negotiated_operation_) {
542 case ui::DragDropTypes::DRAG_COPY: 541 case ui::DragDropTypes::DRAG_COPY:
543 move_loop_->UpdateCursor(copy_grab_cursor_); 542 cursor_type = ui::kCursorCopy;
544 break; 543 break;
545 case ui::DragDropTypes::DRAG_MOVE: 544 case ui::DragDropTypes::DRAG_MOVE:
546 move_loop_->UpdateCursor(move_grab_cursor_); 545 cursor_type = ui::kCursorMove;
547 break; 546 break;
548 default: 547 default:
549 move_loop_->UpdateCursor(grab_cursor_); 548 cursor_type = ui::kCursorGrabbing;
550 break; 549 break;
551 } 550 }
551 move_loop_->UpdateCursor(cursor_manager_->GetInitializedCursor(cursor_type));
552 552
553 // Note: event.data.[2,3] specify a rectangle. It is a request by the other 553 // Note: event.data.[2,3] specify a rectangle. It is a request by the other
554 // window to not send further XdndPosition messages while the cursor is 554 // window to not send further XdndPosition messages while the cursor is
555 // within it. However, it is considered advisory and (at least according to 555 // within it. However, it is considered advisory and (at least according to
556 // the spec) the other side must handle further position messages within 556 // the spec) the other side must handle further position messages within
557 // it. GTK+ doesn't bother with this, so neither should we. 557 // it. GTK+ doesn't bother with this, so neither should we.
558 558
559 if (next_position_message_.get()) { 559 if (next_position_message_.get()) {
560 // We were waiting on the status message so we could send off the next 560 // We were waiting on the status message so we could send off the next
561 // position message we queued up. 561 // position message we queued up.
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 686
687 // It is possible for the DesktopWindowTreeHostX11 to be destroyed during the 687 // It is possible for the DesktopWindowTreeHostX11 to be destroyed during the
688 // move loop, which would also destroy this drag-client. So keep track of 688 // move loop, which would also destroy this drag-client. So keep track of
689 // whether it is alive after the drag ends. 689 // whether it is alive after the drag ends.
690 base::WeakPtr<DesktopDragDropClientAuraX11> alive( 690 base::WeakPtr<DesktopDragDropClientAuraX11> alive(
691 weak_ptr_factory_.GetWeakPtr()); 691 weak_ptr_factory_.GetWeakPtr());
692 692
693 // Windows has a specific method, DoDragDrop(), which performs the entire 693 // Windows has a specific method, DoDragDrop(), which performs the entire
694 // drag. We have to emulate this, so we spin off a nested runloop which will 694 // drag. We have to emulate this, so we spin off a nested runloop which will
695 // track all cursor movement and reroute events to a specific handler. 695 // track all cursor movement and reroute events to a specific handler.
696 move_loop_->RunMoveLoop(source_window, grab_cursor_); 696 move_loop_->RunMoveLoop(
697 source_window,
698 cursor_manager_->GetInitializedCursor(ui::kCursorGrabbing));
697 699
698 if (alive) { 700 if (alive) {
699 drag_widget_.reset(); 701 drag_widget_.reset();
700 702
701 source_provider_ = NULL; 703 source_provider_ = NULL;
702 g_current_drag_drop_client = NULL; 704 g_current_drag_drop_client = NULL;
703 drag_operation_ = 0; 705 drag_operation_ = 0;
704 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndActionList")); 706 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndActionList"));
705 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom(kXdndDirectSave0)); 707 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom(kXdndDirectSave0));
706 708
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 for (int x = 0; x < in_bitmap->width(); ++x) { 1191 for (int x = 0; x < in_bitmap->width(); ++x) {
1190 if (SkColorGetA(in_row[x]) > kMinAlpha) 1192 if (SkColorGetA(in_row[x]) > kMinAlpha)
1191 return true; 1193 return true;
1192 } 1194 }
1193 } 1195 }
1194 1196
1195 return false; 1197 return false;
1196 } 1198 }
1197 1199
1198 } // namespace views 1200 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698