.rainbow: gtk CursorImage

git-svn-id: svn://ultimatepp.org/upp/trunk@5646 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2012-12-12 19:36:10 +00:00
parent d5382107bb
commit e29001fa28
4 changed files with 62 additions and 17 deletions

View file

@ -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

View file

@ -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>

View file

@ -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()

View file

@ -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());