added experimental code to handle xcb window resizing

This commit is contained in:
hyunghwan.chung 2017-04-08 14:11:01 +00:00
parent 536a66fbbf
commit a768bd8803
2 changed files with 72 additions and 45 deletions

View File

@ -145,13 +145,9 @@ class X11.ExposeEvent(X11.Event)
class X11.WindowEvent(X11.Event) class X11.WindowEvent(X11.Event)
{ {
dcl width height.
} }
class X11.FrameEvent(X11.Event)
{
}
## --------------------------------------------------------------------------- ## ---------------------------------------------------------------------------
## Graphics Context ## Graphics Context
## --------------------------------------------------------------------------- ## ---------------------------------------------------------------------------
@ -273,7 +269,7 @@ class X11.Canvas(Component)
class X11.WindowedComponent(Component) from 'x11.win' class X11.WindowedComponent(Component) from 'x11.win'
{ {
dcl(#class) geom. dcl(#class) geom.
dcl wid. dcl wid bounds.
method(#primitive) _get_window_dwatom. method(#primitive) _get_window_dwatom.
method(#primitive) _get_window_id. method(#primitive) _get_window_id.
@ -284,6 +280,11 @@ class X11.WindowedComponent(Component) from 'x11.win'
method wid { ^self.wid } method wid { ^self.wid }
method initialize
{
self.bounds := X11.Rectangle new.
}
method(#class) new: parent method(#class) new: parent
{ {
^(super new) __open_on_window: parent ^(super new) __open_on_window: parent
@ -292,7 +293,7 @@ class X11.WindowedComponent(Component) from 'x11.win'
method __open_on_window: parent method __open_on_window: parent
{ {
| id disp | | id disp |
disp := parent display. disp := parent display.
wid := self _make_window (disp cid, 5, 5, 300, 300, parent wid). wid := self _make_window (disp cid, 5, 5, 300, 300, parent wid).
@ -308,6 +309,8 @@ class X11.WindowedComponent(Component) from 'x11.win'
}. }.
disp addWindow: self. disp addWindow: self.
self _get_window_geometry (self.bounds).
self windowOpened. self windowOpened.
} }
@ -330,15 +333,14 @@ class X11.WindowedComponent(Component) from 'x11.win'
method bounds method bounds
{ {
| rect | self _get_window_geometry (self.bounds).
rect := X11.Rectangle new. ^self.bounds
self _get_window_geometry (rect).
^rect.
} }
method bounds: rect method bounds: rect
{ {
self _set_window_geometry (rect). self _set_window_geometry (rect).
self _get_window_geometry (self.bounds). ## To update bounds
} }
method windowOpened method windowOpened
@ -526,7 +528,7 @@ extend X11
at: X11.LLEvent.ENTER_NOTIFY put: #__handle_notify:; at: X11.LLEvent.ENTER_NOTIFY put: #__handle_notify:;
at: X11.LLEvent.LEAVE_NOTIFY put: #__handle_notify:; at: X11.LLEvent.LEAVE_NOTIFY put: #__handle_notify:;
at: X11.LLEvent.EXPOSE put: #__handle_expose:; at: X11.LLEvent.EXPOSE put: #__handle_expose:;
at: X11.LLEvent.CONFIGURE_NOTIFY put: #__handle_configure_notify; at: X11.LLEvent.CONFIGURE_NOTIFY put: #__handle_configure_notify:;
at: X11.LLEvent.CLIENT_MESSAGE put: #__handle_client_message:. at: X11.LLEvent.CLIENT_MESSAGE put: #__handle_client_message:.
} }
@ -575,7 +577,7 @@ extend X11
ongoing := true. ongoing := true.
while (self.windows size > 0) while (self.windows size > 0)
{ {
'Waiting for X11 event...' dump. ###'Waiting for X11 event...' dump.
self.event_loop_sem wait. self.event_loop_sem wait.
if (ongoing not) { break }. if (ongoing not) { break }.
@ -793,7 +795,23 @@ extend X11
} xcb_configure_notify_event_t; } xcb_configure_notify_event_t;
*) *)
| wid window bounds width height |
## type := System _getUint8(event, 0) bitAnd: 16r7F. ## lower 7 bits of response_type
wid := System _getUint32(event, 4). ## event
window := self.windows at: wid.
if (window notError)
{
width := System _getUint16(event, 20).
height := System _getUint16(event, 22).
bounds := window bounds.
if (bounds width ~= width or: [bounds height ~= height]) { window windowResized }.
}
else
{
System logNl: ('Configure notify event on unknown window - ' & wid asString).
}
} }
method __handle_client_message: event method __handle_client_message: event
@ -872,16 +890,25 @@ extend X11
class MyButton(X11.Button) class MyButton(X11.Button)
{ {
method windowOpened
{
super windowOpened.
self repaint.
}
method expose: event method expose: event
{ {
|gc|
super expose: event. super expose: event.
self repaint.
}
'XXXXXXXXXXXXXXXXXXXXXXXXXXx' dump. method repaint
gc := X11.GC new: self. {
gc foreground: 16rFF8877. |gc|
gc _fillRect(0, 0, 50, 50). gc := X11.GC new: self.
gc close. gc foreground: 16rFF8877.
gc _fillRect(0, 0, 50, 50).
gc close.
} }
} }
@ -893,9 +920,8 @@ class MyFrame(X11.FrameWindow)
method windowOpened method windowOpened
{ {
super windowOpened. super windowOpened.
if (self.gc isNil) if (self.gc isNil)
{ {
self.gc := X11.GC new: self. self.gc := X11.GC new: self.
@ -907,6 +933,8 @@ self.gc _drawRect(100, 100, 200, 200).
}. }.
self.b1 := MyButton new: self. self.b1 := MyButton new: self.
self windowResized.
} }
method windowClosing method windowClosing
@ -919,31 +947,35 @@ self.gc _drawRect(100, 100, 200, 200).
}*) }*)
} }
method expose: event method windowResized
{ {
| rect |
| rect | super windowResized.
super expose: event.
(*
('EXPOSE....' & (self.id asString) & ' ' & (event x asString) & ' ' & (event y asString) & ' ' & (event width asString) & ' ' & (event height asString)) dump.
self.gc foreground: 2.
##self.gc drawLine: (10@20) to: (30@40).
self.gc _drawLine(10, 20, 300, 400).
self.gc _drawRect(10, 20, 30, 40).
self.gc foreground: 20.
self.gc _drawRect(100, 100, 200, 200).*)
rect := self bounds. rect := self bounds.
rect x: 0; y: 0; height: ((rect height) quo: 2); width: ((rect width) - 2). rect x: 0; y: 0; height: ((rect height) quo: 2); width: ((rect width) - 2).
self.b1 bounds: rect; self.b1 bounds: rect;
} }
method expose: event
{
super expose: event.
(*
('EXPOSE....' & (self.id asString) & ' ' & (event x asString) & ' ' & (event y asString) & ' ' & (event width asString) & ' ' & (event height asString)) dump.
self.gc foreground: 2.
##self.gc drawLine: (10@20) to: (30@40).
self.gc _drawLine(10, 20, 300, 400).
self.gc _drawRect(10, 20, 30, 40).
self.gc foreground: 20.
self.gc _drawRect(100, 100, 200, 200).*)
}
} }
class MyObject(Object) class MyObject(Object)
{ {
method(#class) abc method(#class) abc

View File

@ -131,8 +131,6 @@ static moo_pfrc_t pf_disconnect (moo_t* moo, moo_ooi_t nargs)
x11 = (x11_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL); x11 = (x11_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL);
MOO_DEBUG1 (moo, "<x11.disconnect> %p\n", x11->c);
if (x11->curevt) if (x11->curevt)
{ {
free (x11->curevt); free (x11->curevt);
@ -153,7 +151,6 @@ static moo_pfrc_t pf_get_fd (moo_t* moo, moo_ooi_t nargs)
x11_t* x11; x11_t* x11;
x11 = (x11_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL); x11 = (x11_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL);
MOO_DEBUG1 (moo, "<x11.get_fd> %p\n", x11->c);
if (x11->c) if (x11->c)
{ {
@ -179,7 +176,6 @@ static moo_pfrc_t pf_getevent (moo_t* moo, moo_ooi_t nargs)
int e; int e;
x11 = (x11_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL); x11 = (x11_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL);
MOO_DEBUG1 (moo, "<x11.getevent> %p\n", x11->c);
evt = xcb_poll_for_event(x11->c); evt = xcb_poll_for_event(x11->c);
if (x11->curevt) free (x11->curevt); if (x11->curevt) free (x11->curevt);
@ -210,7 +206,7 @@ static moo_pfrc_t pf_getevent (moo_t* moo, moo_ooi_t nargs)
else if ((e = xcb_connection_has_error(x11->c))) else if ((e = xcb_connection_has_error(x11->c)))
{ {
/* TODO: to be specific about the error */ /* TODO: to be specific about the error */
MOO_DEBUG1 (moo, "XCB CONNECTION ERROR %d\n", e); MOO_DEBUG1 (moo, "<x11.getevent> Error detected while getting an event - %d\n", e);
MOO_STACK_SETRETTOERRNUM (moo, nargs); MOO_STACK_SETRETTOERRNUM (moo, nargs);
} }
else else
@ -566,8 +562,6 @@ static moo_pfrc_t pf_win_make (moo_t* moo, moo_ooi_t nargs)
xcb_window_t parent; xcb_window_t parent;
xcb_screen_t* screen; xcb_screen_t* screen;
MOO_DEBUG0 (moo, "<x11.win._make> %p\n");
win = (x11_win_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL); win = (x11_win_t*)moo_getobjtrailer(moo, MOO_STACK_GETRCV(moo, nargs), MOO_NULL);
a0 = MOO_STACK_GETARG(moo, nargs, 0); /* connection - SmallPointer (xcb_connection_t*) */ a0 = MOO_STACK_GETARG(moo, nargs, 0); /* connection - SmallPointer (xcb_connection_t*) */
@ -617,10 +611,11 @@ MOO_DEBUG0 (moo, "<x11.win._make> %p\n");
XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_RELEASE |
/*XCB_EVENT_MASK_BUTTON_MOTION |*/ /*XCB_EVENT_MASK_BUTTON_MOTION |*/
XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_EXPOSURE |
XCB_EVENT_MASK_STRUCTURE_NOTIFY |
/*XCB_EVENT_MASK_POINTER_MOTION |*/ /*XCB_EVENT_MASK_POINTER_MOTION |*/
XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_ENTER_WINDOW |
XCB_EVENT_MASK_LEAVE_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW/* |
XCB_EVENT_MASK_VISIBILITY_CHANGE; XCB_EVENT_MASK_VISIBILITY_CHANGE */;
xcb_create_window ( xcb_create_window (
c, c,
XCB_COPY_FROM_PARENT, /* depth */ XCB_COPY_FROM_PARENT, /* depth */