mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
rainbow: Gtk
git-svn-id: svn://ultimatepp.org/upp/trunk@5622 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
69f55fedff
commit
df5f5ff2db
6 changed files with 152 additions and 55 deletions
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 __;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue