forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
aura: A few changes to have aura_demo compile and run on linux.
* Make 'aura' a component, and export Desktop and Window. * Events (Key and Mouse) from X Events. * Rip non-gtk bits out of gfx/gtk_util into gfx/linux_util BUG=93934,93933 TEST=none Review URL: http://codereview.chromium.org/7833016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@99898 0039d316-1c4b-4281-b951-d872f2087c98
- Loading branch information
1 parent
ccb8243
commit 4a6bef3
Showing
21 changed files
with
456 additions
and
133 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// Copyright (c) 2011 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 AURA_AURA_EXPORT_H | ||
#define AURA_AURA_EXPORT_H | ||
#pragma once | ||
|
||
// Defines AURA_EXPORT so that functionality implemented by the aura module | ||
// can be exported to consumers. | ||
|
||
#if defined(COMPONENT_BUILD) | ||
#if defined(WIN32) | ||
|
||
#if defined(AURA_IMPLEMENTATION) | ||
#define AURA_EXPORT __declspec(dllexport) | ||
#else | ||
#define AURA_EXPORT __declspec(dllimport) | ||
#endif // defined(AURA_IMPLEMENTATION) | ||
|
||
#else // defined(WIN32) | ||
#define AURA_EXPORT __attribute__((visibility("default"))) | ||
#endif | ||
|
||
#else // defined(COMPONENT_BUILD) | ||
#define AURA_EXPORT | ||
#endif | ||
|
||
#endif // AURA_AURA_EXPORT_H | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
// Copyright (c) 2011 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 "aura/event.h" | ||
|
||
#include <X11/Xlib.h> | ||
#include <X11/extensions/XInput2.h> | ||
|
||
#include "base/logging.h" | ||
#include "ui/base/keycodes/keyboard_code_conversion_x.h" | ||
|
||
namespace aura { | ||
|
||
namespace { | ||
|
||
int GetEventFlagsFromXState(unsigned int state) { | ||
int flags = 0; | ||
if (state & ControlMask) | ||
flags |= ui::EF_CONTROL_DOWN; | ||
if (state & ShiftMask) | ||
flags |= ui::EF_SHIFT_DOWN; | ||
if (state & Mod1Mask) | ||
flags |= ui::EF_ALT_DOWN; | ||
if (state & LockMask) | ||
flags |= ui::EF_CAPS_LOCK_DOWN; | ||
if (state & Button1Mask) | ||
flags |= ui::EF_LEFT_BUTTON_DOWN; | ||
if (state & Button2Mask) | ||
flags |= ui::EF_MIDDLE_BUTTON_DOWN; | ||
if (state & Button3Mask) | ||
flags |= ui::EF_RIGHT_BUTTON_DOWN; | ||
|
||
return flags; | ||
} | ||
|
||
// Get the event flag for the button in XButtonEvent. During a ButtonPress | ||
// event, |state| in XButtonEvent does not include the button that has just been | ||
// pressed. Instead |state| contains flags for the buttons (if any) that had | ||
// already been pressed before the current button, and |button| stores the most | ||
// current pressed button. So, if you press down left mouse button, and while | ||
// pressing it down, press down the right mouse button, then for the latter | ||
// event, |state| would have Button1Mask set but not Button3Mask, and |button| | ||
// would be 3. | ||
int GetEventFlagsForButton(int button) { | ||
switch (button) { | ||
case 1: | ||
return ui::EF_LEFT_BUTTON_DOWN; | ||
case 2: | ||
return ui::EF_MIDDLE_BUTTON_DOWN; | ||
case 3: | ||
return ui::EF_RIGHT_BUTTON_DOWN; | ||
} | ||
|
||
DLOG(WARNING) << "Unexpected button (" << button << ") received."; | ||
return 0; | ||
} | ||
|
||
int GetButtonMaskForX2Event(XIDeviceEvent* xievent) { | ||
int buttonflags = 0; | ||
|
||
for (int i = 0; i < 8 * xievent->buttons.mask_len; i++) { | ||
if (XIMaskIsSet(xievent->buttons.mask, i)) { | ||
buttonflags |= GetEventFlagsForButton(i); | ||
} | ||
} | ||
|
||
return buttonflags; | ||
} | ||
|
||
ui::EventType EventTypeFromNative(NativeEvent native_event) { | ||
switch (native_event->type) { | ||
case KeyPress: | ||
return ui::ET_KEY_PRESSED; | ||
case KeyRelease: | ||
return ui::ET_KEY_RELEASED; | ||
case ButtonPress: | ||
if (native_event->xbutton.button == 4 || | ||
native_event->xbutton.button == 5) | ||
return ui::ET_MOUSEWHEEL; | ||
return ui::ET_MOUSE_PRESSED; | ||
case ButtonRelease: | ||
if (native_event->xbutton.button == 4 || | ||
native_event->xbutton.button == 5) | ||
return ui::ET_MOUSEWHEEL; | ||
return ui::ET_MOUSE_RELEASED; | ||
case MotionNotify: | ||
if (native_event->xmotion.state & | ||
(Button1Mask | Button2Mask | Button3Mask)) | ||
return ui::ET_MOUSE_DRAGGED; | ||
return ui::ET_MOUSE_MOVED; | ||
case GenericEvent: { | ||
XIDeviceEvent* xievent = | ||
static_cast<XIDeviceEvent*>(native_event->xcookie.data); | ||
// TODO(sad): Determine if sourceid is a touch device. | ||
switch (xievent->evtype) { | ||
case XI_ButtonPress: | ||
return (xievent->detail == 4 || xievent->detail == 5) ? | ||
ui::ET_MOUSEWHEEL : ui::ET_MOUSE_PRESSED; | ||
case XI_ButtonRelease: | ||
return (xievent->detail == 4 || xievent->detail == 5) ? | ||
ui::ET_MOUSEWHEEL : ui::ET_MOUSE_RELEASED; | ||
case XI_Motion: | ||
return GetButtonMaskForX2Event(xievent) ? ui::ET_MOUSE_DRAGGED : | ||
ui::ET_MOUSE_MOVED; | ||
} | ||
} | ||
default: | ||
NOTREACHED(); | ||
break; | ||
} | ||
return ui::ET_UNKNOWN; | ||
} | ||
|
||
gfx::Point GetEventLocation(XEvent* xev) { | ||
switch (xev->type) { | ||
case ButtonPress: | ||
case ButtonRelease: | ||
return gfx::Point(xev->xbutton.x, xev->xbutton.y); | ||
|
||
case MotionNotify: | ||
return gfx::Point(xev->xmotion.x, xev->xmotion.y); | ||
|
||
case GenericEvent: { | ||
XIDeviceEvent* xievent = | ||
static_cast<XIDeviceEvent*>(xev->xcookie.data); | ||
return gfx::Point(static_cast<int>(xievent->event_x), | ||
static_cast<int>(xievent->event_y)); | ||
} | ||
} | ||
|
||
return gfx::Point(); | ||
} | ||
|
||
int GetLocatedEventFlags(XEvent* xev) { | ||
switch (xev->type) { | ||
case ButtonPress: | ||
case ButtonRelease: | ||
return GetEventFlagsFromXState(xev->xbutton.state) | | ||
GetEventFlagsForButton(xev->xbutton.button); | ||
|
||
case MotionNotify: | ||
return GetEventFlagsFromXState(xev->xmotion.state); | ||
|
||
case GenericEvent: { | ||
XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data); | ||
bool touch = false; // TODO(sad): Determine if xievent->sourceid is a | ||
// touch device. | ||
switch (xievent->evtype) { | ||
case XI_ButtonPress: | ||
case XI_ButtonRelease: | ||
return GetButtonMaskForX2Event(xievent) | | ||
GetEventFlagsFromXState(xievent->mods.effective) | | ||
(touch ? 0 : GetEventFlagsForButton(xievent->detail)); | ||
|
||
case XI_Motion: | ||
return GetButtonMaskForX2Event(xievent) | | ||
GetEventFlagsFromXState(xievent->mods.effective); | ||
} | ||
} | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
} // namespace | ||
|
||
void Event::Init() { | ||
memset(&native_event_, 0, sizeof(native_event_)); | ||
} | ||
|
||
void Event::InitWithNativeEvent(NativeEvent native_event) { | ||
native_event_ = native_event; | ||
} | ||
|
||
LocatedEvent::LocatedEvent(NativeEvent native_event) | ||
: Event(native_event, EventTypeFromNative(native_event), | ||
GetLocatedEventFlags(native_event)), | ||
location_(GetEventLocation(native_event)) { | ||
} | ||
|
||
MouseEvent::MouseEvent(NativeEvent native_event) | ||
: LocatedEvent(native_event) { | ||
} | ||
|
||
KeyEvent::KeyEvent(NativeEvent native_event) | ||
: Event(native_event, | ||
EventTypeFromNative(native_event), | ||
GetEventFlagsFromXState(native_event->xbutton.state)), | ||
key_code_(ui::KeyboardCodeFromXKeyEvent(native_event)) { | ||
} | ||
|
||
} // namespace aura |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.