From df5f5ff2db2924af49a0a2f18b155f988e7dfb55 Mon Sep 17 00:00:00 2001 From: cxl Date: Tue, 4 Dec 2012 19:36:41 +0000 Subject: [PATCH] rainbow: Gtk git-svn-id: svn://ultimatepp.org/upp/trunk@5622 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- rainbow/Gtk/Ctrl.h | 4 ++ rainbow/Gtk/Gtk.h | 6 ++- rainbow/Gtk/Proc.cpp | 29 +++++++++++ rainbow/Gtk/Top.cpp | 6 +++ rainbow/Gtk/Wnd.cpp | 109 ++++++++++++++++++++++----------------- rainbow/GtkMain/main.cpp | 53 ++++++++++++++++--- 6 files changed, 152 insertions(+), 55 deletions(-) diff --git a/rainbow/Gtk/Ctrl.h b/rainbow/Gtk/Ctrl.h index 38d87eb7f..452b80c10 100644 --- a/rainbow/Gtk/Ctrl.h +++ b/rainbow/Gtk/Ctrl.h @@ -1,4 +1,8 @@ //$ class Ctrl { + void Create(bool popup); + static gboolean GtkProc(GtkWidget *widget, GdkEvent *event, gpointer user_data); + bool Proc(GdkEvent *event); + public: static void EndSession() {} static bool IsEndSession() { return false; } diff --git a/rainbow/Gtk/Gtk.h b/rainbow/Gtk/Gtk.h index ea1ca8f36..ad56914f9 100644 --- a/rainbow/Gtk/Gtk.h +++ b/rainbow/Gtk/Gtk.h @@ -113,7 +113,11 @@ void DrawDragRect(SystemDraw& w, const Rect& rect1, const Rect& rect2, const Rec #define GUIPLATFORM_KEYCODES_INCLUDE -#define GUIPLATFORM_CTRL_TOP_DECLS +//$ struct Ctrl::Top { +#define GUIPLATFORM_CTRL_TOP_DECLS \ + GtkWidget *window; \ + GtkWidget *client; \ +//$ } #define GUIPLATFORM_CTRL_DECLS_INCLUDE diff --git a/rainbow/Gtk/Proc.cpp b/rainbow/Gtk/Proc.cpp index b48922d6b..2cde2b698 100644 --- a/rainbow/Gtk/Proc.cpp +++ b/rainbow/Gtk/Proc.cpp @@ -19,6 +19,35 @@ bool GetMouseRight() { return false; } bool GetMouseMiddle() { return false; } Point GetMousePos() { return Point(0, 0); } +bool Ctrl::Proc(GdkEvent *event) +{ + DDUMP((int)event->type); + switch(event->type) { + case GDK_EXPOSE: + case GDK_DAMAGE: { + GdkEventExpose *e = (GdkEventExpose *)event; + SystemDraw w(gdk_cairo_create(top->client->window)); + UpdateArea(w, RectC(e->area.x, e->area.y, e->area.width, e->area.height)); + cairo_destroy(w); + return FALSE; + } + case GDK_MOTION_NOTIFY: { + GdkEventMotion *e = (GdkEventMotion *)event; + DLOG("Motion"); + DDUMP(e->x); + DDUMP(e->y); + DDUMP(e->state); + return true; + } + case GDK_BUTTON_PRESS: + DLOG("EndLoop!"); + EndLoop(); + return true; + default:; + } + return false; +} + END_UPP_NAMESPACE #endif diff --git a/rainbow/Gtk/Top.cpp b/rainbow/Gtk/Top.cpp index c79ee0670..ef4a0a107 100644 --- a/rainbow/Gtk/Top.cpp +++ b/rainbow/Gtk/Top.cpp @@ -21,14 +21,20 @@ void TopWindow::SyncCaption0() void TopWindow::Open(Ctrl *owner) { GuiLock __; + DDUMP(GetRect()); + if(GetSize().cx == 0) + SetRect(10, 10, 400, 400); + Create(false); } void TopWindow::Open() { + Open(NULL); //TODO! } void TopWindow::OpenMain() { + Open(NULL); } void TopWindow::Minimize(bool effect) diff --git a/rainbow/Gtk/Wnd.cpp b/rainbow/Gtk/Wnd.cpp index 96a24a1dd..c78ddbef9 100644 --- a/rainbow/Gtk/Wnd.cpp +++ b/rainbow/Gtk/Wnd.cpp @@ -4,7 +4,7 @@ NAMESPACE_UPP -#define LLOG(x) // LOG(x) +#define LLOG(x) DLOG(x) #define LOGTIMING 0 #ifdef _DEBUG @@ -24,6 +24,35 @@ bool Ctrl::IsCompositedGui() return false; } +gboolean Ctrl::GtkProc(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + Ctrl *q = (Ctrl *)user_data; + return q->Proc(event); +} + +void Ctrl::Create(bool popup) +{ + GuiLock __; + ASSERT(IsMainThread()); + LLOG("Create " << Name() << " " << GetRect()); + ASSERT(!IsChild() && !IsOpen()); + LLOG("Ungrab1"); + + top = new Top; + top->window = gtk_window_new(popup ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); + top->client = gtk_drawing_area_new(); + gtk_container_add(GTK_CONTAINER(top->window), top->client); + gtk_widget_set_events(top->client, 0xffffffff); + g_signal_connect(top->client, "event", G_CALLBACK(GtkProc), this); + gtk_widget_show_all(top->window); +} + +void Ctrl::WndDestroy0() +{ + gtk_widget_destroy(top->client); + gtk_widget_destroy(top->window); +} + Vector Ctrl::GetTopCtrls() { Vector h; @@ -81,12 +110,18 @@ void Ctrl::UnregisterSystemHotKey(int id) bool Ctrl::IsWaitingEvent() { - return false; + return gtk_events_pending(); } bool Ctrl::ProcessEvent(bool *quit) { ASSERT(IsMainThread()); + if(IsWaitingEvent()) { + gtk_main_iteration(); + if(quit) + *quit = IsEndSession(); + return true; + } return false; } @@ -94,25 +129,24 @@ void SweepMkImageCache(); bool Ctrl::ProcessEvents(bool *quit) { -/* if(ProcessEvent(quit)) { - while(ProcessEvent(quit) && (!LoopCtrl || LoopCtrl->InLoop())); // LoopCtrl-MF 071008 - TimerProc(GetTickCount()); - SweepMkImageCache(); - return true; - } - SweepMkImageCache(); - TimerProc(GetTickCount());*/ - return false; + bool r = false; + while(IsWaitingEvent() && (!LoopCtrl || LoopCtrl->InLoop())) + r = ProcessEvent(quit) || r; + return r; } +void Ctrl::SysEndLoop() +{ + gtk_main_quit(); +} void Ctrl::EventLoop0(Ctrl *ctrl) { GuiLock __; -/* ASSERT(IsMainThread()); + ASSERT(IsMainThread()); ASSERT(LoopLevel == 0 || ctrl); LoopLevel++; - LLOG("Entering event loop at level " << LoopLevel << BeginIndent); + LLOG("Entering event loop at level " << LoopLevel << LOG_BEGIN); Ptr ploop; if(ctrl) { ploop = LoopCtrl; @@ -120,49 +154,34 @@ void Ctrl::EventLoop0(Ctrl *ctrl) ctrl->inloop = true; } - bool quit = false; - ProcessEvents(&quit); - while(!EndSession() && !quit && ctrl ? ctrl->IsOpen() && ctrl->InLoop() : GetTopCtrls().GetCount()) + DDUMP(IsEndSession()); + DDUMP(ctrl->InLoop()); + while(!IsEndSession() && (ctrl ? true/* ctrl->IsOpen()*/ && ctrl->InLoop() : true /*GetTopCtrls().GetCount()*/)) // Fix this { // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / GuiSleep"); SyncCaret(); - GuiSleep(1000); - if(EndSession()) break; + if(IsEndSession()) break; // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / ProcessEvents"); - ProcessEvents(&quit); -// LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / after ProcessEvents"); + DLOG("Before gtk_main"); + + gtk_main(); + + DLOG("After gtk_main"); + if(ctrl) { + DDUMP(ctrl->IsOpen()); + DDUMP(ctrl->InLoop()); + } } if(ctrl) LoopCtrl = ploop; LoopLevel--; - LLOG(EndIndent << "Leaving event loop ");*/ + LLOG(LOG_END << "Leaving event loop "); } void Ctrl::GuiSleep0(int ms) { GuiLock __; -/* ASSERT(IsMainThread()); - ELOG("GuiSleep"); - if(EndSession()) - return; - ELOG("GuiSleep 2"); - int level = LeaveGMutexAll(); -#if !defined(flagDLL) && !defined(PLATFORM_WINCE) - if(!OverwatchThread) { - DWORD dummy; - OverwatchThread = CreateThread(NULL, 0x100000, Win32OverwatchThread, NULL, 0, &dummy); - ELOG("ExitLoopEventWait 1"); - ExitLoopEvent.Wait(); - } - HANDLE h[1]; - *h = ExitLoopEvent.GetHandle(); - ELOG("ExitLoopEventWait 2 " << (void *)*h); - MsgWaitForMultipleObjects(1, h, FALSE, ms, QS_ALLINPUT); -#else - MsgWaitForMultipleObjects(0, NULL, FALSE, ms, QS_ALLINPUT); -#endif - EnterGMutex(level);*/ } Rect Ctrl::GetWndScreenRect() const @@ -184,7 +203,7 @@ void Ctrl::WndUpdate0() bool Ctrl::IsWndOpen() const { GuiLock __; - return false; + return true; } void Ctrl::SetAlpha(byte alpha) @@ -252,10 +271,6 @@ int Ctrl::GetKbdSpeed() return 1000 / 32; } -void Ctrl::WndDestroy0() -{ -} - void Ctrl::SetWndForeground0() { GuiLock __; diff --git a/rainbow/GtkMain/main.cpp b/rainbow/GtkMain/main.cpp index c9ea52f16..d1bd0a856 100644 --- a/rainbow/GtkMain/main.cpp +++ b/rainbow/GtkMain/main.cpp @@ -60,8 +60,38 @@ static gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpoint return FALSE; } -int main( int argc, char *argv[]) +gboolean CtrlEvent(GtkWidget *widget, GdkEvent *event, gpointer user_data) { + Ctrl *ctrl = (Ctrl *)user_data; + DDUMP((int)event->type); + switch(event->type) { + case GDK_MOTION_NOTIFY: { + GdkEventMotion *e = (GdkEventMotion *)event; + DLOG("Motion"); + DDUMP(e->x); + DDUMP(e->y); + DDUMP(e->state); + return true; + } + case GDK_BUTTON_PRESS: + DLOG("EndLoop!"); + ctrl->EndLoop(); + return true; + default:; + } + return false; +} + +struct MyApp : TopWindow { + virtual void Paint(Draw& w) { + TestDraw(w); + } +}; + +CONSOLE_APP_MAIN +{ + Ctrl myapp; + { ImageDraw w(1000, 1000); TestDraw(w); @@ -76,10 +106,15 @@ int main( int argc, char *argv[]) PNGEncoder().SaveFile("/home/cxl/test_alpha.png", w); } +// gtk_init(&argc, &argv); + gtk_init(0, NULL); + +#if 1 + MyApp().Run(); +#else GtkWidget *window; - gtk_init(&argc, &argv); - +// window = gtk_window_new(GTK_WINDOW_POPUP); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size((GtkWindow *)window, 1000, 600); @@ -87,12 +122,16 @@ int main( int argc, char *argv[]) GtkWidget *darea = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER (window), darea); - g_signal_connect(darea, "expose-event", G_CALLBACK(on_expose_event), NULL); + + gtk_widget_set_events(darea, 0xffffffff); + g_signal_connect(darea, "expose-event", G_CALLBACK(on_expose_event), &myapp); + g_signal_connect(darea, "event", G_CALLBACK(CtrlEvent), &myapp); +// g_signal_connect(window, "expose-event", G_CALLBACK(on_expose_event), NULL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); - - gtk_main(); - return 0; + Ctrl::EventLoop(&myapp); +// gtk_main(); +#endif }