diff --git a/rainbow/Gtk/DrawOp.cpp b/rainbow/Gtk/DrawOp.cpp index 241c95a7c..daf503d91 100644 --- a/rainbow/Gtk/DrawOp.cpp +++ b/rainbow/Gtk/DrawOp.cpp @@ -53,7 +53,7 @@ void SystemDraw::OffsetOp(Point p) void SystemDraw::RectPath(const Rect& r) { - cairo_rectangle(cr, r.left, r.top, r.GetWidth(), r.GetHeight()); + cairo_rectangle(cr, r.left, r.top, r.GetWidth() - 1, r.GetHeight() - 1); } bool SystemDraw::ClipOp(const Rect& r) diff --git a/rainbow/Gtk/Gtk.h b/rainbow/Gtk/Gtk.h index 2c93c2bb2..4b0093ecb 100644 --- a/rainbow/Gtk/Gtk.h +++ b/rainbow/Gtk/Gtk.h @@ -38,7 +38,6 @@ class SystemDraw : public Draw { private: - void SetColor(Color c); void RectPath(const Rect& r); void Push(); void Pop(); @@ -52,6 +51,7 @@ private: friend class ViewDraw; public: + void SetColor(Color c); operator cairo_t*() { return cr; } Point GetOffset() const; diff --git a/rainbow/Gtk/Proc.cpp b/rainbow/Gtk/Proc.cpp index 119cd2818..27aa37931 100644 --- a/rainbow/Gtk/Proc.cpp +++ b/rainbow/Gtk/Proc.cpp @@ -129,18 +129,17 @@ bool Ctrl::Proc(GdkEvent *event) } break; case GDK_EXPOSE: - case GDK_DAMAGE: { - TimeStop tm; - fullrefresh = false; - GdkEventExpose *e = (GdkEventExpose *)event; - SystemDraw w(gdk_cairo_create(top->window->window)); - painting = true; - UpdateArea(w, RectC(e->area.x, e->area.y, e->area.width, e->area.height)); - cairo_destroy(w); - painting = false; - DDUMP(tm); + case GDK_DAMAGE: + if(top) { + fullrefresh = false; + GdkEventExpose *e = (GdkEventExpose *)event; + SystemDraw w(gdk_cairo_create(gdk())); + painting = true; + UpdateArea(w, RectC(e->area.x, e->area.y, e->area.width, e->area.height)); + cairo_destroy(w); + painting = false; + } break; - } case GDK_MOTION_NOTIFY: { GdkEventMotion *e = (GdkEventMotion *)event; DispatchMouse(MOUSEMOVE, Point((int)e->x, (int)e->y)); @@ -197,7 +196,7 @@ bool Ctrl::Proc(GdkEvent *event) GdkEventConfigure *e = (GdkEventConfigure *)event; Rect rect = RectC(e->x, e->y, e->width, e->height); LLOG("ConfigureNotify " << rect << ", GetRect() " << GetRect()); -// if(GetRect() != rect) + if(GetRect() != rect) SetWndRect(rect); // TODO: Add DHCtrl support } diff --git a/rainbow/Gtk/Util.cpp b/rainbow/Gtk/Util.cpp index 40c8bf0ce..c58a90ef9 100644 --- a/rainbow/Gtk/Util.cpp +++ b/rainbow/Gtk/Util.cpp @@ -19,24 +19,25 @@ Size GetScreenSize() } */ -static uint64 sGetAniPat(uint64 src, int pos) -{ - uint64 out = 0; - pos &= 7; - for(int i = 8; --i >= 0;) { - byte sr = (byte)(src >> (8 * ((7 - i - pos) & 7))); - out = (out << 8) | (byte)((sr | (sr << 8)) >> pos); - } - return out; -} - void DrawDragRect(Ctrl& q, const Rect& rect1, const Rect& rect2, const Rect& clip, int n, Color color, int type, int animation) { ViewDraw w(&q); - uint64 pattern = type == DRAWDRAGRECT_DASHED ? I64(0xf0783c1e0f87c3e1) : + w.Clip(clip); + cairo_t *cr = w; + double dashes[] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + w.SetColor(color); + cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE); + cairo_set_dash(cr, dashes, 8, 0); + cairo_set_line_width(cr, 1); + cairo_rectangle(cr, rect1.left + 0.5, rect1.top + 0.5, rect1.GetWidth() + 0.5, rect1.GetHeight() + 0.5); + cairo_stroke(cr); + cairo_rectangle(cr, rect2.left + 0.5, rect2.top + 0.5, rect2.GetWidth() + 0.5, rect2.GetHeight() + 0.5); + cairo_stroke(cr); + w.End(); +/* uint64 pattern = type == DRAWDRAGRECT_DASHED ? I64(0xf0783c1e0f87c3e1) : type == DRAWDRAGRECT_NORMAL ? I64(0x55aa55aa55aa55aa) : 0; - DrawDragRect(w, rect1, rect2, clip, n, color, sGetAniPat(pattern, animation)); + DrawDragRect(w, rect1, rect2, clip, n, color, sGetAniPat(pattern, animation));*/ } GdkRect::GdkRect(const Rect& r) diff --git a/rainbow/Gtk/Wnd.cpp b/rainbow/Gtk/Wnd.cpp index 716b548c8..79ed3c8e7 100644 --- a/rainbow/Gtk/Wnd.cpp +++ b/rainbow/Gtk/Wnd.cpp @@ -533,17 +533,22 @@ void Ctrl::WndScrollView0(const Rect& r, int dx, int dy) gdk_window_invalidate_rect(gdk(), GdkRect(r), true); } -Rect Ctrl::GetDefaultWindowRect() { +Rect Ctrl::GetDefaultWindowRect() // ToDo! +{ return Rect(0, 0, 100, 100); } ViewDraw::ViewDraw(Ctrl *ctrl) { EnterGuiMutex(); + Ctrl *top = ctrl->GetTopCtrl(); + cr = gdk_cairo_create(top->gdk()); + Clipoff(ctrl->GetScreenView() - top->GetScreenRect().TopLeft()); } ViewDraw::~ViewDraw() { + cairo_destroy(cr); LeaveGuiMutex(); } diff --git a/rainbow/GtkMain/main.cpp b/rainbow/GtkMain/main.cpp index a3c424471..581224cde 100644 --- a/rainbow/GtkMain/main.cpp +++ b/rainbow/GtkMain/main.cpp @@ -157,6 +157,32 @@ struct MyApp2 : TopWindow { } }; +struct MyApp3 : TopWindow { + Rect rect; + + typedef MyApp3 CLASSNAME; + + virtual void Paint(Draw& w) + { + Size sz = GetSize(); + w.DrawRect(sz, SColorPaper()); + DrawFrame(w, rect, Black()); + } + + virtual void LeftDown(Point p, dword keyflags) { + RectTracker tr(*this); + Size sz = GetSize(); + tr.Normal(); + rect = tr.Track(rect, ALIGN_RIGHT, ALIGN_BOTTOM); + Refresh(); + } + + MyApp3() { + rect = RectC(100, 100, 100, 100); + } +}; + + GUI_APP_MAIN { #if 0 @@ -166,8 +192,8 @@ GUI_APP_MAIN return; #endif -#if 0 - MyApp2().Run(); +#if 1 + MyApp3().Run(); return; #endif