mirror of https://github.com/adamdruppe/arsd.git
Move mouse cursor setting to sdpy from minigui
This commit is contained in:
parent
b0a8417ad5
commit
b84ef31391
109
minigui.d
109
minigui.d
|
|
@ -3474,16 +3474,7 @@ class Window : Widget {
|
||||||
event.relatedTarget = mouseLastOver;
|
event.relatedTarget = mouseLastOver;
|
||||||
event.sendDirectly();
|
event.sendDirectly();
|
||||||
|
|
||||||
auto cursor = ele.cursor ? ele.cursor.cursorHandle : cast(typeof(ele.cursor.cursorHandle())) 0;
|
ele.parentWindow.win.cursor = ele.cursor;
|
||||||
if(ele.parentWindow.win.curHidden <= 0) {
|
|
||||||
static if(UsingSimpledisplayX11) {
|
|
||||||
XDefineCursor(XDisplayConnection.get(), ele.parentWindow.win.impl.window, cursor);
|
|
||||||
} else version(Windows) {
|
|
||||||
// FIXME i don't like this
|
|
||||||
if(cursor !is null)
|
|
||||||
SetCursor(cursor);
|
|
||||||
} else static assert(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6234,104 +6225,6 @@ enum GenericIcons : ushort {
|
||||||
Print, ///
|
Print, ///
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents a mouse cursor (aka the mouse pointer, the image seen on screen that indicates where the mouse is pointing).
|
|
||||||
/// See [GenericCursor]
|
|
||||||
class MouseCursor {
|
|
||||||
int osId;
|
|
||||||
bool isStockCursor;
|
|
||||||
private this(int osId) {
|
|
||||||
this.osId = osId;
|
|
||||||
this.isStockCursor = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms648385(v=vs.85).aspx
|
|
||||||
this(int xHotSpot, int yHotSpot, ubyte[] andMask, ubyte[] xorMask) {}
|
|
||||||
|
|
||||||
version(Windows) {
|
|
||||||
HCURSOR cursor_;
|
|
||||||
HCURSOR cursorHandle() {
|
|
||||||
if(cursor_ is null)
|
|
||||||
cursor_ = LoadCursor(null, MAKEINTRESOURCE(osId));
|
|
||||||
return cursor_;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else static if(UsingSimpledisplayX11) {
|
|
||||||
Cursor cursor_ = None;
|
|
||||||
int xDisplaySequence;
|
|
||||||
|
|
||||||
Cursor cursorHandle() {
|
|
||||||
if(this.osId == None)
|
|
||||||
return None;
|
|
||||||
|
|
||||||
// we need to reload if we on a new X connection
|
|
||||||
if(cursor_ == None || XDisplayConnection.connectionSequenceNumber != xDisplaySequence) {
|
|
||||||
cursor_ = XCreateFontCursor(XDisplayConnection.get(), this.osId);
|
|
||||||
xDisplaySequence = XDisplayConnection.connectionSequenceNumber;
|
|
||||||
}
|
|
||||||
return cursor_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
|
|
||||||
// https://tronche.com/gui/x/xlib/appendix/b/
|
|
||||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms648391(v=vs.85).aspx
|
|
||||||
///
|
|
||||||
enum GenericCursorType {
|
|
||||||
Default, /// The default arrow pointer.
|
|
||||||
Wait, /// A cursor indicating something is loading and the user must wait.
|
|
||||||
Hand, /// A pointing finger, like the one used hovering over hyperlinks in a web browser.
|
|
||||||
Help, /// A cursor indicating the user can get help about the pointer location.
|
|
||||||
Cross, /// A crosshair.
|
|
||||||
Text, /// An i-beam shape, typically used to indicate text selection is possible.
|
|
||||||
Move, /// Pointer indicating movement is possible.
|
|
||||||
UpArrow, /// An arrow pointing straight up.
|
|
||||||
}
|
|
||||||
|
|
||||||
/// You get one by `GenericCursor.SomeTime`. See [GenericCursorType] for a list of types.
|
|
||||||
static struct GenericCursor {
|
|
||||||
static:
|
|
||||||
///
|
|
||||||
MouseCursor opDispatch(string str)() if(__traits(hasMember, GenericCursorType, str)) {
|
|
||||||
static MouseCursor mc;
|
|
||||||
|
|
||||||
auto type = __traits(getMember, GenericCursorType, str);
|
|
||||||
|
|
||||||
if(mc is null) {
|
|
||||||
|
|
||||||
version(Windows) {
|
|
||||||
int osId;
|
|
||||||
final switch(type) {
|
|
||||||
case GenericCursorType.Default: osId = IDC_ARROW; break;
|
|
||||||
case GenericCursorType.Wait: osId = IDC_WAIT; break;
|
|
||||||
case GenericCursorType.Hand: osId = IDC_HAND; break;
|
|
||||||
case GenericCursorType.Help: osId = IDC_HELP; break;
|
|
||||||
case GenericCursorType.Cross: osId = IDC_CROSS; break;
|
|
||||||
case GenericCursorType.Text: osId = IDC_IBEAM; break;
|
|
||||||
case GenericCursorType.Move: osId = IDC_SIZEALL; break;
|
|
||||||
case GenericCursorType.UpArrow: osId = IDC_UPARROW; break;
|
|
||||||
}
|
|
||||||
} else static if(UsingSimpledisplayX11) {
|
|
||||||
int osId;
|
|
||||||
final switch(type) {
|
|
||||||
case GenericCursorType.Default: osId = None; break;
|
|
||||||
case GenericCursorType.Wait: osId = 150 /* XC_watch */; break;
|
|
||||||
case GenericCursorType.Hand: osId = 60 /* XC_hand2 */; break;
|
|
||||||
case GenericCursorType.Help: osId = 92 /* XC_question_arrow */; break;
|
|
||||||
case GenericCursorType.Cross: osId = 34 /* XC_crosshair */; break;
|
|
||||||
case GenericCursorType.Text: osId = 152 /* XC_xterm */; break;
|
|
||||||
case GenericCursorType.Move: osId = 52 /* XC_fleur */; break;
|
|
||||||
case GenericCursorType.UpArrow: osId = 22 /* XC_center_ptr */; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else static assert(0);
|
|
||||||
|
|
||||||
mc = new MouseCursor(osId);
|
|
||||||
}
|
|
||||||
return mc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///
|
///
|
||||||
void getOpenFileName(
|
void getOpenFileName(
|
||||||
void delegate(string) onOK,
|
void delegate(string) onOK,
|
||||||
|
|
|
||||||
123
simpledisplay.d
123
simpledisplay.d
|
|
@ -1955,6 +1955,29 @@ class SimpleWindow : CapableOfHandlingNativeEvent, CapableOfBeingDrawnUpon {
|
||||||
} else static assert(0);
|
} else static assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/++
|
||||||
|
Changes the cursor for the window. If the cursor is hidden via [hideCursor], this has no effect.
|
||||||
|
|
||||||
|
---
|
||||||
|
window.cursor = GenericCursor.Help;
|
||||||
|
// now the window mouse cursor is set to a generic help
|
||||||
|
---
|
||||||
|
|
||||||
|
+/
|
||||||
|
@property void cursor(MouseCursor cursor) {
|
||||||
|
auto ch = cursor.cursorHandle;
|
||||||
|
if(this.impl.curHidden <= 0) {
|
||||||
|
static if(UsingSimpledisplayX11) {
|
||||||
|
XDefineCursor(XDisplayConnection.get(), this.impl.window, ch);
|
||||||
|
} else version(Windows) {
|
||||||
|
// FIXME i don't like this
|
||||||
|
if(cursor !is null)
|
||||||
|
SetCursor(ch);
|
||||||
|
} else static assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// What follows are the event handlers. These are set automatically
|
/// What follows are the event handlers. These are set automatically
|
||||||
/// by the eventLoop function, but are still public so you can change
|
/// by the eventLoop function, but are still public so you can change
|
||||||
/// them later. wasPressed == true means key down. false == key up.
|
/// them later. wasPressed == true means key down. false == key up.
|
||||||
|
|
@ -2423,6 +2446,106 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Represents a mouse cursor (aka the mouse pointer, the image seen on screen that indicates where the mouse is pointing).
|
||||||
|
/// See [GenericCursor]
|
||||||
|
class MouseCursor {
|
||||||
|
int osId;
|
||||||
|
bool isStockCursor;
|
||||||
|
private this(int osId) {
|
||||||
|
this.osId = osId;
|
||||||
|
this.isStockCursor = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms648385(v=vs.85).aspx
|
||||||
|
this(int xHotSpot, int yHotSpot, ubyte[] andMask, ubyte[] xorMask) {}
|
||||||
|
|
||||||
|
version(Windows) {
|
||||||
|
HCURSOR cursor_;
|
||||||
|
HCURSOR cursorHandle() {
|
||||||
|
if(cursor_ is null)
|
||||||
|
cursor_ = LoadCursor(null, MAKEINTRESOURCE(osId));
|
||||||
|
return cursor_;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else static if(UsingSimpledisplayX11) {
|
||||||
|
Cursor cursor_ = None;
|
||||||
|
int xDisplaySequence;
|
||||||
|
|
||||||
|
Cursor cursorHandle() {
|
||||||
|
if(this.osId == None)
|
||||||
|
return None;
|
||||||
|
|
||||||
|
// we need to reload if we on a new X connection
|
||||||
|
if(cursor_ == None || XDisplayConnection.connectionSequenceNumber != xDisplaySequence) {
|
||||||
|
cursor_ = XCreateFontCursor(XDisplayConnection.get(), this.osId);
|
||||||
|
xDisplaySequence = XDisplayConnection.connectionSequenceNumber;
|
||||||
|
}
|
||||||
|
return cursor_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
|
||||||
|
// https://tronche.com/gui/x/xlib/appendix/b/
|
||||||
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms648391(v=vs.85).aspx
|
||||||
|
///
|
||||||
|
enum GenericCursorType {
|
||||||
|
Default, /// The default arrow pointer.
|
||||||
|
Wait, /// A cursor indicating something is loading and the user must wait.
|
||||||
|
Hand, /// A pointing finger, like the one used hovering over hyperlinks in a web browser.
|
||||||
|
Help, /// A cursor indicating the user can get help about the pointer location.
|
||||||
|
Cross, /// A crosshair.
|
||||||
|
Text, /// An i-beam shape, typically used to indicate text selection is possible.
|
||||||
|
Move, /// Pointer indicating movement is possible.
|
||||||
|
UpArrow, /// An arrow pointing straight up.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// You get one by `GenericCursor.SomeTime`. See [GenericCursorType] for a list of types.
|
||||||
|
static struct GenericCursor {
|
||||||
|
static:
|
||||||
|
///
|
||||||
|
MouseCursor opDispatch(string str)() if(__traits(hasMember, GenericCursorType, str)) {
|
||||||
|
static MouseCursor mc;
|
||||||
|
|
||||||
|
auto type = __traits(getMember, GenericCursorType, str);
|
||||||
|
|
||||||
|
if(mc is null) {
|
||||||
|
|
||||||
|
version(Windows) {
|
||||||
|
int osId;
|
||||||
|
final switch(type) {
|
||||||
|
case GenericCursorType.Default: osId = IDC_ARROW; break;
|
||||||
|
case GenericCursorType.Wait: osId = IDC_WAIT; break;
|
||||||
|
case GenericCursorType.Hand: osId = IDC_HAND; break;
|
||||||
|
case GenericCursorType.Help: osId = IDC_HELP; break;
|
||||||
|
case GenericCursorType.Cross: osId = IDC_CROSS; break;
|
||||||
|
case GenericCursorType.Text: osId = IDC_IBEAM; break;
|
||||||
|
case GenericCursorType.Move: osId = IDC_SIZEALL; break;
|
||||||
|
case GenericCursorType.UpArrow: osId = IDC_UPARROW; break;
|
||||||
|
}
|
||||||
|
} else static if(UsingSimpledisplayX11) {
|
||||||
|
int osId;
|
||||||
|
final switch(type) {
|
||||||
|
case GenericCursorType.Default: osId = None; break;
|
||||||
|
case GenericCursorType.Wait: osId = 150 /* XC_watch */; break;
|
||||||
|
case GenericCursorType.Hand: osId = 60 /* XC_hand2 */; break;
|
||||||
|
case GenericCursorType.Help: osId = 92 /* XC_question_arrow */; break;
|
||||||
|
case GenericCursorType.Cross: osId = 34 /* XC_crosshair */; break;
|
||||||
|
case GenericCursorType.Text: osId = 152 /* XC_xterm */; break;
|
||||||
|
case GenericCursorType.Move: osId = 52 /* XC_fleur */; break;
|
||||||
|
case GenericCursorType.UpArrow: osId = 22 /* XC_center_ptr */; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else static assert(0);
|
||||||
|
|
||||||
|
mc = new MouseCursor(osId);
|
||||||
|
}
|
||||||
|
return mc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/++
|
/++
|
||||||
If you want to get more control over the event loop, you can use this.
|
If you want to get more control over the event loop, you can use this.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue