| OLD | NEW |
| 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/aura/root_window_host_linux.h" | 5 #include "ui/aura/root_window_host_linux.h" |
| 6 | 6 |
| 7 #include <X11/cursorfont.h> | 7 #include <X11/cursorfont.h> |
| 8 #include <X11/extensions/XInput2.h> | 8 #include <X11/extensions/XInput2.h> |
| 9 #include <X11/extensions/Xfixes.h> | 9 #include <X11/extensions/Xfixes.h> |
| 10 #include <X11/extensions/Xrandr.h> | 10 #include <X11/extensions/Xrandr.h> |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 UnConfineCursor(); | 350 UnConfineCursor(); |
| 351 | 351 |
| 352 XDestroyWindow(xdisplay_, xwindow_); | 352 XDestroyWindow(xdisplay_, xwindow_); |
| 353 | 353 |
| 354 // Clears XCursorCache. | 354 // Clears XCursorCache. |
| 355 ui::GetXCursor(ui::kCursorClearXCursorCache); | 355 ui::GetXCursor(ui::kCursorClearXCursorCache); |
| 356 | 356 |
| 357 XFreeCursor(xdisplay_, invisible_cursor_); | 357 XFreeCursor(xdisplay_, invisible_cursor_); |
| 358 } | 358 } |
| 359 | 359 |
| 360 base::MessagePumpDispatcher::DispatchStatus RootWindowHostLinux::Dispatch( | 360 bool RootWindowHostLinux::Dispatch(const base::NativeEvent& event) { |
| 361 XEvent* xev) { | 361 XEvent* xev = event; |
| 362 bool handled = false; | |
| 363 | 362 |
| 364 // See crbug.com/109884. | 363 // See crbug.com/109884. |
| 365 // CheckXEventForConsistency(xev); | 364 // CheckXEventForConsistency(xev); |
| 366 | 365 |
| 367 switch (xev->type) { | 366 switch (xev->type) { |
| 368 case Expose: | 367 case Expose: |
| 369 root_window_->ScheduleFullDraw(); | 368 root_window_->ScheduleFullDraw(); |
| 370 handled = true; | |
| 371 break; | 369 break; |
| 372 case KeyPress: { | 370 case KeyPress: { |
| 373 KeyEvent keydown_event(xev, false); | 371 KeyEvent keydown_event(xev, false); |
| 374 handled = root_window_->DispatchKeyEvent(&keydown_event); | 372 root_window_->DispatchKeyEvent(&keydown_event); |
| 375 break; | 373 break; |
| 376 } | 374 } |
| 377 case KeyRelease: { | 375 case KeyRelease: { |
| 378 KeyEvent keyup_event(xev, false); | 376 KeyEvent keyup_event(xev, false); |
| 379 handled = root_window_->DispatchKeyEvent(&keyup_event); | 377 root_window_->DispatchKeyEvent(&keyup_event); |
| 380 break; | 378 break; |
| 381 } | 379 } |
| 382 case ButtonPress: | 380 case ButtonPress: |
| 383 case ButtonRelease: { | 381 case ButtonRelease: { |
| 384 MouseEvent mouseev(xev); | 382 MouseEvent mouseev(xev); |
| 385 handled = root_window_->DispatchMouseEvent(&mouseev); | 383 root_window_->DispatchMouseEvent(&mouseev); |
| 386 break; | 384 break; |
| 387 } | 385 } |
| 388 case FocusOut: | 386 case FocusOut: |
| 389 if (xev->xfocus.mode != NotifyGrab) | 387 if (xev->xfocus.mode != NotifyGrab) |
| 390 root_window_->SetCapture(NULL); | 388 root_window_->SetCapture(NULL); |
| 391 break; | 389 break; |
| 392 case ConfigureNotify: { | 390 case ConfigureNotify: { |
| 393 DCHECK_EQ(xwindow_, xev->xconfigure.window); | 391 DCHECK_EQ(xwindow_, xev->xconfigure.window); |
| 394 DCHECK_EQ(xwindow_, xev->xconfigure.event); | 392 DCHECK_EQ(xwindow_, xev->xconfigure.event); |
| 395 // Update barrier and mouse location when the root window has | 393 // Update barrier and mouse location when the root window has |
| 396 // moved/resized. | 394 // moved/resized. |
| 397 if (pointer_barriers_.get()) { | 395 if (pointer_barriers_.get()) { |
| 398 UnConfineCursor(); | 396 UnConfineCursor(); |
| 399 gfx::Point p = root_window_->last_mouse_location(); | 397 gfx::Point p = root_window_->last_mouse_location(); |
| 400 XWarpPointer(xdisplay_, None, xwindow_, 0, 0, 0, 0, p.x(), p.y()); | 398 XWarpPointer(xdisplay_, None, xwindow_, 0, 0, 0, 0, p.x(), p.y()); |
| 401 ConfineCursorToRootWindow(); | 399 ConfineCursorToRootWindow(); |
| 402 } | 400 } |
| 403 // It's possible that the X window may be resized by some other means than | 401 // It's possible that the X window may be resized by some other means than |
| 404 // from within aura (e.g. the X window manager can change the size). Make | 402 // from within aura (e.g. the X window manager can change the size). Make |
| 405 // sure the root window size is maintained properly. | 403 // sure the root window size is maintained properly. |
| 406 gfx::Rect bounds(xev->xconfigure.x, xev->xconfigure.y, | 404 gfx::Rect bounds(xev->xconfigure.x, xev->xconfigure.y, |
| 407 xev->xconfigure.width, xev->xconfigure.height); | 405 xev->xconfigure.width, xev->xconfigure.height); |
| 408 bool size_changed = bounds_.size() != bounds.size(); | 406 bool size_changed = bounds_.size() != bounds.size(); |
| 409 bounds_ = bounds; | 407 bounds_ = bounds; |
| 410 if (size_changed) | 408 if (size_changed) |
| 411 root_window_->OnHostResized(bounds.size()); | 409 root_window_->OnHostResized(bounds.size()); |
| 412 handled = true; | |
| 413 break; | 410 break; |
| 414 } | 411 } |
| 415 case GenericEvent: { | 412 case GenericEvent: { |
| 416 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); | 413 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
| 417 if (!factory->ShouldProcessXI2Event(xev)) | 414 if (!factory->ShouldProcessXI2Event(xev)) |
| 418 break; | 415 break; |
| 419 | 416 |
| 420 ui::EventType type = ui::EventTypeFromNative(xev); | 417 ui::EventType type = ui::EventTypeFromNative(xev); |
| 421 // If this is a motion event we want to coalesce all pending motion | 418 // If this is a motion event we want to coalesce all pending motion |
| 422 // events that are at the top of the queue. | 419 // events that are at the top of the queue. |
| 423 XEvent last_event; | 420 XEvent last_event; |
| 424 int num_coalesced = 0; | 421 int num_coalesced = 0; |
| 425 | 422 |
| 426 switch (type) { | 423 switch (type) { |
| 427 case ui::ET_TOUCH_PRESSED: | 424 case ui::ET_TOUCH_PRESSED: |
| 428 case ui::ET_TOUCH_RELEASED: | 425 case ui::ET_TOUCH_RELEASED: |
| 429 case ui::ET_TOUCH_MOVED: { | 426 case ui::ET_TOUCH_MOVED: { |
| 430 TouchEvent touchev(xev); | 427 TouchEvent touchev(xev); |
| 431 handled = root_window_->DispatchTouchEvent(&touchev); | 428 root_window_->DispatchTouchEvent(&touchev); |
| 432 break; | 429 break; |
| 433 } | 430 } |
| 434 case ui::ET_MOUSE_MOVED: | 431 case ui::ET_MOUSE_MOVED: |
| 435 case ui::ET_MOUSE_DRAGGED: { | 432 case ui::ET_MOUSE_DRAGGED: { |
| 436 // If this is a motion event we want to coalesce all pending motion | 433 // If this is a motion event we want to coalesce all pending motion |
| 437 // events that are at the top of the queue. | 434 // events that are at the top of the queue. |
| 438 num_coalesced = CoalescePendingXIMotionEvents(xev, &last_event); | 435 num_coalesced = CoalescePendingXIMotionEvents(xev, &last_event); |
| 439 if (num_coalesced > 0) | 436 if (num_coalesced > 0) |
| 440 xev = &last_event; | 437 xev = &last_event; |
| 441 } | 438 } |
| 442 case ui::ET_MOUSE_PRESSED: | 439 case ui::ET_MOUSE_PRESSED: |
| 443 case ui::ET_MOUSE_RELEASED: | 440 case ui::ET_MOUSE_RELEASED: |
| 444 case ui::ET_MOUSEWHEEL: | 441 case ui::ET_MOUSEWHEEL: |
| 445 case ui::ET_MOUSE_ENTERED: | 442 case ui::ET_MOUSE_ENTERED: |
| 446 case ui::ET_MOUSE_EXITED: { | 443 case ui::ET_MOUSE_EXITED: { |
| 447 MouseEvent mouseev(xev); | 444 MouseEvent mouseev(xev); |
| 448 handled = root_window_->DispatchMouseEvent(&mouseev); | 445 root_window_->DispatchMouseEvent(&mouseev); |
| 449 break; | 446 break; |
| 450 } | 447 } |
| 451 case ui::ET_SCROLL_FLING_START: | 448 case ui::ET_SCROLL_FLING_START: |
| 452 case ui::ET_SCROLL_FLING_CANCEL: | 449 case ui::ET_SCROLL_FLING_CANCEL: |
| 453 case ui::ET_SCROLL: { | 450 case ui::ET_SCROLL: { |
| 454 ScrollEvent scrollev(xev); | 451 ScrollEvent scrollev(xev); |
| 455 handled = root_window_->DispatchScrollEvent(&scrollev); | 452 root_window_->DispatchScrollEvent(&scrollev); |
| 456 break; | 453 break; |
| 457 } | 454 } |
| 458 case ui::ET_UNKNOWN: | 455 case ui::ET_UNKNOWN: |
| 459 handled = false; | |
| 460 break; | 456 break; |
| 461 default: | 457 default: |
| 462 NOTREACHED(); | 458 NOTREACHED(); |
| 463 } | 459 } |
| 464 | 460 |
| 465 // If we coalesced an event we need to free its cookie. | 461 // If we coalesced an event we need to free its cookie. |
| 466 if (num_coalesced > 0) | 462 if (num_coalesced > 0) |
| 467 XFreeEventData(xev->xgeneric.display, &last_event.xcookie); | 463 XFreeEventData(xev->xgeneric.display, &last_event.xcookie); |
| 468 break; | 464 break; |
| 469 } | 465 } |
| 470 case MapNotify: { | 466 case MapNotify: { |
| 471 // If there's no window manager running, we need to assign the X input | 467 // If there's no window manager running, we need to assign the X input |
| 472 // focus to our host window. | 468 // focus to our host window. |
| 473 if (!IsWindowManagerPresent() && focus_when_shown_) | 469 if (!IsWindowManagerPresent() && focus_when_shown_) |
| 474 XSetInputFocus(xdisplay_, xwindow_, RevertToNone, CurrentTime); | 470 XSetInputFocus(xdisplay_, xwindow_, RevertToNone, CurrentTime); |
| 475 handled = true; | |
| 476 break; | 471 break; |
| 477 } | 472 } |
| 478 case ClientMessage: { | 473 case ClientMessage: { |
| 479 Atom message_type = static_cast<Atom>(xev->xclient.data.l[0]); | 474 Atom message_type = static_cast<Atom>(xev->xclient.data.l[0]); |
| 480 if (message_type == wm_delete_window_atom_) { | 475 if (message_type == wm_delete_window_atom_) { |
| 481 // We have received a close message from the window manager. | 476 // We have received a close message from the window manager. |
| 482 root_window_->OnRootWindowHostClosed(); | 477 root_window_->OnRootWindowHostClosed(); |
| 483 handled = true; | |
| 484 } | 478 } |
| 485 break; | 479 break; |
| 486 } | 480 } |
| 487 case MappingNotify: { | 481 case MappingNotify: { |
| 488 switch (xev->xmapping.request) { | 482 switch (xev->xmapping.request) { |
| 489 case MappingModifier: | 483 case MappingModifier: |
| 490 case MappingKeyboard: | 484 case MappingKeyboard: |
| 491 XRefreshKeyboardMapping(&xev->xmapping); | 485 XRefreshKeyboardMapping(&xev->xmapping); |
| 492 root_window_->OnKeyboardMappingChanged(); | 486 root_window_->OnKeyboardMappingChanged(); |
| 493 break; | 487 break; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 512 next_event.xmotion.subwindow == xev->xmotion.subwindow && | 506 next_event.xmotion.subwindow == xev->xmotion.subwindow && |
| 513 next_event.xmotion.state == xev->xmotion.state) { | 507 next_event.xmotion.state == xev->xmotion.state) { |
| 514 XNextEvent(xev->xany.display, &last_event); | 508 XNextEvent(xev->xany.display, &last_event); |
| 515 xev = &last_event; | 509 xev = &last_event; |
| 516 } else { | 510 } else { |
| 517 break; | 511 break; |
| 518 } | 512 } |
| 519 } | 513 } |
| 520 | 514 |
| 521 MouseEvent mouseev(xev); | 515 MouseEvent mouseev(xev); |
| 522 handled = root_window_->DispatchMouseEvent(&mouseev); | 516 root_window_->DispatchMouseEvent(&mouseev); |
| 523 break; | 517 break; |
| 524 } | 518 } |
| 525 } | 519 } |
| 526 return handled ? base::MessagePumpDispatcher::EVENT_PROCESSED : | 520 return true; |
| 527 base::MessagePumpDispatcher::EVENT_IGNORED; | |
| 528 } | 521 } |
| 529 | 522 |
| 530 void RootWindowHostLinux::SetRootWindow(RootWindow* root_window) { | 523 void RootWindowHostLinux::SetRootWindow(RootWindow* root_window) { |
| 531 root_window_ = root_window; | 524 root_window_ = root_window; |
| 532 } | 525 } |
| 533 | 526 |
| 534 gfx::AcceleratedWidget RootWindowHostLinux::GetAcceleratedWidget() { | 527 gfx::AcceleratedWidget RootWindowHostLinux::GetAcceleratedWidget() { |
| 535 return xwindow_; | 528 return xwindow_; |
| 536 } | 529 } |
| 537 | 530 |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 return new RootWindowHostLinux(bounds); | 720 return new RootWindowHostLinux(bounds); |
| 728 } | 721 } |
| 729 | 722 |
| 730 // static | 723 // static |
| 731 gfx::Size RootWindowHost::GetNativeScreenSize() { | 724 gfx::Size RootWindowHost::GetNativeScreenSize() { |
| 732 ::Display* xdisplay = base::MessagePumpX::GetDefaultXDisplay(); | 725 ::Display* xdisplay = base::MessagePumpX::GetDefaultXDisplay(); |
| 733 return gfx::Size(DisplayWidth(xdisplay, 0), DisplayHeight(xdisplay, 0)); | 726 return gfx::Size(DisplayWidth(xdisplay, 0), DisplayHeight(xdisplay, 0)); |
| 734 } | 727 } |
| 735 | 728 |
| 736 } // namespace aura | 729 } // namespace aura |
| OLD | NEW |