rainbow: Gtk

git-svn-id: svn://ultimatepp.org/upp/trunk@5622 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2012-12-04 19:36:41 +00:00
parent 69f55fedff
commit df5f5ff2db
6 changed files with 152 additions and 55 deletions

View file

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

View file

@ -113,7 +113,11 @@ void DrawDragRect(SystemDraw& w, const Rect& rect1, const Rect& rect2, const Rec
#define GUIPLATFORM_KEYCODES_INCLUDE <Gtk/Keys.h>
#define GUIPLATFORM_CTRL_TOP_DECLS
//$ struct Ctrl::Top {
#define GUIPLATFORM_CTRL_TOP_DECLS \
GtkWidget *window; \
GtkWidget *client; \
//$ }
#define GUIPLATFORM_CTRL_DECLS_INCLUDE <Gtk/Ctrl.h>

View file

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

View file

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

View file

@ -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 *> Ctrl::GetTopCtrls()
{
Vector<Ctrl *> 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<Ctrl> 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 __;

View file

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