From d10461ceabf38659893e5bdc3d4060536188564d Mon Sep 17 00:00:00 2001 From: cxl Date: Sun, 30 Dec 2012 12:05:48 +0000 Subject: [PATCH] rainbow: Gtk backend skinning git-svn-id: svn://ultimatepp.org/upp/trunk@5681 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- rainbow/Gtk/After.h | 2 +- rainbow/Gtk/App.cpp | 11 ++++++++-- rainbow/Gtk/ChSysInit.cpp | 16 -------------- rainbow/Gtk/Clip.cpp | 23 +++++++++++++++++--- rainbow/Gtk/Create.cpp | 4 ++-- rainbow/Gtk/Ctrl.cpp | 4 ---- rainbow/Gtk/Ctrl.h | 1 + rainbow/Gtk/DnD.cpp | 2 -- rainbow/Gtk/DrawImage.cpp | 45 +++++++++++++++++++++++++++------------ rainbow/Gtk/DrawText.cpp | 5 +++++ rainbow/Gtk/Event.cpp | 2 +- rainbow/Gtk/Gtk.h | 28 +++++------------------- rainbow/Gtk/Gtk.upp | 3 +-- 13 files changed, 76 insertions(+), 70 deletions(-) delete mode 100644 rainbow/Gtk/ChSysInit.cpp diff --git a/rainbow/Gtk/After.h b/rainbow/Gtk/After.h index 2fb8cf7ba..8b374b892 100644 --- a/rainbow/Gtk/After.h +++ b/rainbow/Gtk/After.h @@ -14,7 +14,7 @@ void InitGtkApp(int argc, char **argv, const char **envptr); void GuiMainFn_(); \ \ int main(int argc, char **argv, const char **envptr) { \ - UPP::AppInit__(argc, argv, envptr); \ + UPP::AppInit__(argc, (const char **)argv, envptr); \ UPP::InitGtkApp(argc, argv, envptr); \ GuiMainFn_(); \ UPP::Ctrl::CloseTopCtrls(); \ diff --git a/rainbow/Gtk/App.cpp b/rainbow/Gtk/App.cpp index a0a74ce8a..bbec799fc 100644 --- a/rainbow/Gtk/App.cpp +++ b/rainbow/Gtk/App.cpp @@ -26,11 +26,18 @@ void InitGtkApp(int argc, char **argv, const char **envptr) { gtk_init(&argc, &argv); // TODO? Ctrl::GlobalBackBuffer(); - SetStdFont(Arial(12)); + Ctrl::ReSkin(); g_timeout_add(20, (GSourceFunc) Ctrl::TimeHandler, NULL); InstallPanicMessageBox(Ctrl::PanicMsgBox); } - +/* +void ChSysInit() +{ + CtrlImg::Reset(); + CtrlsImg::Reset(); + ChReset(); +} +*/ END_UPP_NAMESPACE #endif diff --git a/rainbow/Gtk/ChSysInit.cpp b/rainbow/Gtk/ChSysInit.cpp deleted file mode 100644 index e5bf204c3..000000000 --- a/rainbow/Gtk/ChSysInit.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#ifdef GUI_GTK - -NAMESPACE_UPP - -void ChSysInit() -{ - CtrlImg::Reset(); - CtrlsImg::Reset(); - ChReset(); -} - -END_UPP_NAMESPACE - -#endif diff --git a/rainbow/Gtk/Clip.cpp b/rainbow/Gtk/Clip.cpp index 0d27c016f..d49d0af3d 100644 --- a/rainbow/Gtk/Clip.cpp +++ b/rainbow/Gtk/Clip.cpp @@ -21,7 +21,7 @@ void GtkGetClipData(GtkClipboard *clipboard, GtkSelectionData *selection_data, ArrayMap& target = *(ArrayMap *)user_data; LLOG("GtkGetClipData for " << target.GetKey(info)); String fmt = target.GetKey(info); - Value data = target[info].data; + String data = target[info].Render(); if(fmt == "text") { String s = data; gtk_selection_data_set_text(selection_data, (const gchar*)~s, s.GetCount()); @@ -37,7 +37,7 @@ void GtkGetClipData(GtkClipboard *clipboard, GtkSelectionData *selection_data, } } else { - String s = target[info].Render(); + String s = data; gtk_selection_data_set(selection_data, GAtom(fmt), 8, (const guchar*)~s, s.GetCount()); } } @@ -168,6 +168,13 @@ Ctrl::Gclipboard& Ctrl::gclipboard() return c; } +Ctrl::Gclipboard& Ctrl::gselection() +{ + GuiLock __; + static Gclipboard c(GDK_SELECTION_PRIMARY); + return c; +} + void AppendClipboard(const char *format, const Value& data, String (*render)(const Value& data)) { GuiLock __; @@ -342,7 +349,6 @@ bool IsAvailableFiles(PasteClip& clip) return clip.IsAvailable("files"); } - // TODO: Vector GetFiles(PasteClip& clip) { @@ -354,6 +360,17 @@ Vector GetFiles(PasteClip& clip) void PasteClip::GuiPlatformConstruct() { } +/* +Ptr Ctrl::sel_ctrl; +*/ +void Ctrl::SetSelectionSource(const char *fmts) +{ + GuiLock __; +/* LLOG("SetSelectionSource " << UPP::Name(this) << ": " << fmts); + sel_formats = Split(fmts, ';'); + sel_ctrl = this; + XSetSelectionOwner(Xdisplay, XAtom("PRIMARY"), xclipboard().win, CurrentTime);*/ +} END_UPP_NAMESPACE diff --git a/rainbow/Gtk/Create.cpp b/rainbow/Gtk/Create.cpp index 86a609120..ad85cf5fc 100644 --- a/rainbow/Gtk/Create.cpp +++ b/rainbow/Gtk/Create.cpp @@ -41,8 +41,8 @@ void Ctrl::Create(Ctrl *owner, bool popup) gtk_widget_realize(top->window); Rect r = GetRect(); - gtk_window_move(gtk(), rect.left, rect.top); - gtk_window_resize(gtk(), rect.GetWidth(), rect.GetHeight()); + gtk_window_move(gtk(), r.left, r.top); + gtk_window_resize(gtk(), r.GetWidth(), r.GetHeight()); if(owner && owner->top) gtk_window_set_transient_for(gtk(), owner->gtk()); diff --git a/rainbow/Gtk/Ctrl.cpp b/rainbow/Gtk/Ctrl.cpp index d4d92a96c..9b70dfdbf 100644 --- a/rainbow/Gtk/Ctrl.cpp +++ b/rainbow/Gtk/Ctrl.cpp @@ -6,10 +6,6 @@ NAMESPACE_UPP -void ChHostSkin(void) -{ -} - void Ctrl::GuiPlatformConstruct() { } diff --git a/rainbow/Gtk/Ctrl.h b/rainbow/Gtk/Ctrl.h index 4ccd2b50e..03fc69825 100644 --- a/rainbow/Gtk/Ctrl.h +++ b/rainbow/Gtk/Ctrl.h @@ -90,6 +90,7 @@ public: }; static Gclipboard& gclipboard(); + static Gclipboard& gselection(); public: static void EndSession() {} diff --git a/rainbow/Gtk/DnD.cpp b/rainbow/Gtk/DnD.cpp index e1aaf7cdf..548bfb8a2 100644 --- a/rainbow/Gtk/DnD.cpp +++ b/rainbow/Gtk/DnD.cpp @@ -33,8 +33,6 @@ int Ctrl::DoDragAndDrop(const char *fmts, const Image& sample, dword actions, return DND_NONE; } -void Ctrl::SetSelectionSource(const char *fmts) {} - END_UPP_NAMESPACE #endif diff --git a/rainbow/Gtk/DrawImage.cpp b/rainbow/Gtk/DrawImage.cpp index f124e63e2..5434519b1 100644 --- a/rainbow/Gtk/DrawImage.cpp +++ b/rainbow/Gtk/DrawImage.cpp @@ -71,14 +71,6 @@ void SystemDraw::SysDrawImageOp(int x, int y, const Image& img, Color color) cache.Shrink(4 * 1024 * 768, 1000); // Cache must be after Paint because of PaintOnly! } -void ImageDraw::Init(Size sz) -{ - isz = sz; - surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, isz.cx, isz.cy); - cr = cairo_create(surface); - alpha_surface = NULL; -} - Draw& ImageDraw::Alpha() { if(!alpha_surface) { @@ -88,7 +80,7 @@ Draw& ImageDraw::Alpha() return alpha; } -void ImageDraw::FetchStraight(ImageBuffer& b) const +void CairoGet(ImageBuffer& b, Size isz, cairo_surface_t *surface, cairo_surface_t *alpha_surface) { cairo_surface_flush(surface); byte *a = (byte *)cairo_image_surface_get_data(surface); @@ -119,6 +111,11 @@ void ImageDraw::FetchStraight(ImageBuffer& b) const } } +void ImageDraw::FetchStraight(ImageBuffer& b) const +{ + CairoGet(b, isz, surface, alpha_surface); +} + ImageDraw::operator Image() const { ImageBuffer img(isz); @@ -134,6 +131,15 @@ Image ImageDraw::GetStraight() const return img; } +void ImageDraw::Init(Size sz) +{ + isz = sz; + surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, isz.cx, isz.cy); + cr = cairo_create(surface); + alpha_surface = NULL; + del = true; +} + ImageDraw::ImageDraw(Size sz) { Init(sz); @@ -144,13 +150,24 @@ ImageDraw::ImageDraw(int cx, int cy) Init(Size(cx, cy)); } +ImageDraw::ImageDraw(cairo_t *cr_, Size sz) +{ + isz = sz; + cr = cr_; + surface = cairo_get_target(cr); + alpha_surface = NULL; + del = false; +} + ImageDraw::~ImageDraw() { - cairo_destroy(cr); - cairo_surface_destroy(surface); - if(alpha_surface) { - cairo_destroy(alpha.cr); - cairo_surface_destroy(alpha_surface); + if(del) { + cairo_destroy(cr); + cairo_surface_destroy(surface); + if(alpha_surface) { + cairo_destroy(alpha.cr); + cairo_surface_destroy(alpha_surface); + } } } diff --git a/rainbow/Gtk/DrawText.cpp b/rainbow/Gtk/DrawText.cpp index 99c913713..1406f6911 100644 --- a/rainbow/Gtk/DrawText.cpp +++ b/rainbow/Gtk/DrawText.cpp @@ -45,6 +45,11 @@ struct FontDataSysMaker : LRUCache >::Maker { virtual int Make(FontSysData& object) const { object.Init(font, angle); return 1; } }; +int gtk_antialias = -1; +int gtk_hinting = -1; +String gtk_hintstyle; +String gtk_rgba; + void SystemDraw::DrawTextOp(int x, int y, int angle, const wchar *text, Font font, Color ink, int n, const int *dx) { GuiLock __; diff --git a/rainbow/Gtk/Event.cpp b/rainbow/Gtk/Event.cpp index 039005b21..58b0645cc 100644 --- a/rainbow/Gtk/Event.cpp +++ b/rainbow/Gtk/Event.cpp @@ -391,7 +391,7 @@ void Ctrl::Proc() if(GetAlt()) kv |= K_ALT; LLOG(GetKeyDesc(kv) << ", pressed: " << pressed << ", count: " << CurrentEvent.count); - DispatchKey(!pressed * K_KEYUP + kv, CurrentEvent.count); // TODO: Add compression + DispatchKey(!pressed * K_KEYUP + kv, CurrentEvent.count); } break; case EVENT_TEXT: { diff --git a/rainbow/Gtk/Gtk.h b/rainbow/Gtk/Gtk.h index cdabc46a3..db6dcec5a 100644 --- a/rainbow/Gtk/Gtk.h +++ b/rainbow/Gtk/Gtk.h @@ -1,5 +1,7 @@ #define GUI_GTK +#define PLATFORM_X11 // To keep legacy code happy + #include #include @@ -67,6 +69,7 @@ class ImageDraw : public SystemDraw { SystemDraw alpha; cairo_surface_t *alpha_surface; + bool del; void Init(Size sz); void FetchStraight(ImageBuffer& b) const; @@ -81,6 +84,8 @@ public: ImageDraw(Size sz); ImageDraw(int cx, int cy); ~ImageDraw(); + + ImageDraw(cairo_t *cr, Size sz); // Special variant for chameleon skinning }; class BackDraw : public SystemDraw { @@ -157,29 +162,6 @@ struct DrawDragRectInfo { #define GUIPLATFORM_NOSCROLL -class PrinterJob { - NilDraw nil; - Vector pages; - -public: - Draw& GetDraw() { return nil; } - operator Draw&() { return GetDraw(); } - const Vector& GetPages() const { return pages; } - int operator[](int i) const { return 0; } - int GetPageCount() const { return 0; } - - bool Execute() { return false; } - - PrinterJob& Landscape(bool b = true) { return *this; } - PrinterJob& MinMaxPage(int minpage, int maxpage) { return *this; } - PrinterJob& PageCount(int n) { return *this; } - PrinterJob& CurrentPage(int currentpage) { return *this; } - PrinterJob& Name(const char *_name) { return *this; } - - PrinterJob(const char *name = NULL) {} - ~PrinterJob() {} -}; - int rmsecs(); END_UPP_NAMESPACE diff --git a/rainbow/Gtk/Gtk.upp b/rainbow/Gtk/Gtk.upp index 9cb1ca1da..f7a05f540 100644 --- a/rainbow/Gtk/Gtk.upp +++ b/rainbow/Gtk/Gtk.upp @@ -19,6 +19,5 @@ file Top.h, Top.cpp, Clip.cpp, - DnD.cpp, - ChSysInit.cpp; + DnD.cpp;