mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
.rainbow: gtk CursorImage
git-svn-id: svn://ultimatepp.org/upp/trunk@5646 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
d5382107bb
commit
e29001fa28
4 changed files with 62 additions and 17 deletions
|
|
@ -166,23 +166,25 @@ void BackDraw::Destroy()
|
|||
{
|
||||
}
|
||||
|
||||
#define FCURSOR_(x) { static Image h; ONCELOCK { h = CreateImage(Size(1, 1), Black); h.SetAuxData(x + 1); } return h; }
|
||||
|
||||
Image Image::Arrow() { return Null; }
|
||||
Image Image::Hand() { return Null; }
|
||||
Image Image::Wait() { return Null; }
|
||||
Image Image::IBeam() { return Null; }
|
||||
Image Image::No() { return Null; }
|
||||
Image Image::SizeAll() { return Null; }
|
||||
Image Image::SizeHorz() { return Null; }
|
||||
Image Image::SizeVert() { return Null; }
|
||||
Image Image::SizeTopLeft() { return Null; }
|
||||
Image Image::SizeTop() { return Null; }
|
||||
Image Image::SizeTopRight() { return Null; }
|
||||
Image Image::SizeLeft() { return Null; }
|
||||
Image Image::SizeRight() { return Null; }
|
||||
Image Image::SizeBottomLeft() { return Null; }
|
||||
Image Image::SizeBottom() { return Null; }
|
||||
Image Image::SizeBottomRight() { return Null; }
|
||||
Image Image::Arrow() FCURSOR_(GDK_LEFT_PTR)
|
||||
Image Image::Wait() FCURSOR_(GDK_WATCH)
|
||||
Image Image::IBeam() FCURSOR_(GDK_XTERM)
|
||||
Image Image::No() FCURSOR_(GDK_CIRCLE)
|
||||
Image Image::SizeAll() FCURSOR_(GDK_FLEUR)
|
||||
Image Image::SizeHorz() FCURSOR_(GDK_SB_H_DOUBLE_ARROW)
|
||||
Image Image::SizeVert() FCURSOR_(GDK_DOUBLE_ARROW)
|
||||
Image Image::SizeTopLeft() FCURSOR_(GDK_TOP_LEFT_CORNER)
|
||||
Image Image::SizeTop() FCURSOR_(GDK_TOP_SIDE)
|
||||
Image Image::SizeTopRight() FCURSOR_(GDK_TOP_RIGHT_CORNER)
|
||||
Image Image::SizeLeft() FCURSOR_(GDK_LEFT_SIDE)
|
||||
Image Image::SizeRight() FCURSOR_(GDK_RIGHT_SIDE)
|
||||
Image Image::SizeBottomLeft() FCURSOR_(GDK_BOTTOM_LEFT_CORNER)
|
||||
Image Image::SizeBottom() FCURSOR_(GDK_BOTTOM_SIDE)
|
||||
Image Image::SizeBottomRight() FCURSOR_(GDK_BOTTOM_RIGHT_CORNER)
|
||||
Image Image::Cross() FCURSOR_(GDK_CROSSHAIR)
|
||||
Image Image::Hand() FCURSOR_(GDK_HAND1)
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ void DrawDragRect(SystemDraw& w, const Rect& rect1, const Rect& rect2, const Rec
|
|||
#define GUIPLATFORM_CTRL_TOP_DECLS \
|
||||
GtkWidget *window; \
|
||||
GtkIMContext *im_context; \
|
||||
int64 cursor_id;
|
||||
//$ }
|
||||
|
||||
#define GUIPLATFORM_CTRL_DECLS_INCLUDE <Gtk/Ctrl.h>
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ void Ctrl::Create(Ctrl *owner, bool popup)
|
|||
|
||||
top = new Top;
|
||||
top->window = gtk_window_new(popup ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL);
|
||||
top->cursor_id = -1;
|
||||
gtk_widget_set_events(top->window, 0xffffffff);
|
||||
g_signal_connect(top->window, "event", G_CALLBACK(GtkProc), this);
|
||||
if(owner && owner->top)
|
||||
|
|
@ -117,6 +118,35 @@ Vector<Ctrl *> Ctrl::GetTopCtrls()
|
|||
void Ctrl::SetMouseCursor(const Image& image)
|
||||
{
|
||||
GuiLock __;
|
||||
int64 id = image.GetSerialId();
|
||||
Ctrl *topctrl;
|
||||
Top *top;
|
||||
if(mouseCtrl)
|
||||
topctrl = mouseCtrl->GetTopCtrl();
|
||||
if(topctrl)
|
||||
top = topctrl->top;
|
||||
if(top && id != top->cursor_id) {
|
||||
top->cursor_id = id;
|
||||
int64 aux = image.GetAuxData();
|
||||
GdkCursor *c = NULL;
|
||||
if(aux)
|
||||
c = gdk_cursor_new((GdkCursorType)(aux - 1));
|
||||
else
|
||||
if(IsNull(image))
|
||||
c = gdk_cursor_new(GDK_BLANK_CURSOR);
|
||||
else {
|
||||
Point p = image.GetHotSpot();
|
||||
ImageGdk m;
|
||||
m.Set(image);
|
||||
GdkPixbuf *pb = m;
|
||||
if(pb)
|
||||
c = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pb, p.x, p.y);
|
||||
}
|
||||
if(c) {
|
||||
gdk_window_set_cursor(topctrl->gdk(), c);
|
||||
gdk_cursor_unref(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ctrl *Ctrl::GetOwner()
|
||||
|
|
|
|||
|
|
@ -75,7 +75,19 @@ struct MyApp : TopWindow {
|
|||
pos = p;
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
virtual Image CursorImage(Point p, dword keyflags)
|
||||
{
|
||||
Size sz = GetSize();
|
||||
if(p.x < sz.cx / 4)
|
||||
return Image::Arrow();
|
||||
if(p.x < 2 * sz.cx / 4)
|
||||
return Image::Hand();
|
||||
if(p.x < 3 * sz.cx / 4)
|
||||
return CtrlImg::ibeam0();
|
||||
return CtrlImg::HelpCursor0();
|
||||
}
|
||||
|
||||
virtual void Paint(Draw& w) {
|
||||
int fcy = GetStdFontCy();
|
||||
w.DrawRect(GetSize(), White());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue