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)
{
dcl width height.
}
class X11.FrameEvent(X11.Event)
{
}
## ---------------------------------------------------------------------------
## Graphics Context
## ---------------------------------------------------------------------------
@ -273,7 +269,7 @@ class X11.Canvas(Component)
class X11.WindowedComponent(Component) from 'x11.win'
{
dcl(#class) geom.
dcl wid.
dcl wid bounds.
method(#primitive) _get_window_dwatom.
method(#primitive) _get_window_id.
@ -284,6 +280,11 @@ class X11.WindowedComponent(Component) from 'x11.win'
method wid { ^self.wid }
method initialize
{
self.bounds := X11.Rectangle new.
}
method(#class) new: parent
{
^(super new) __open_on_window: parent
@ -308,6 +309,8 @@ class X11.WindowedComponent(Component) from 'x11.win'
}.
disp addWindow: self.
self _get_window_geometry (self.bounds).
self windowOpened.
}
@ -330,15 +333,14 @@ class X11.WindowedComponent(Component) from 'x11.win'
method bounds
{
| rect |
rect := X11.Rectangle new.
self _get_window_geometry (rect).
^rect.
self _get_window_geometry (self.bounds).
^self.bounds
}
method bounds: rect
{
self _set_window_geometry (rect).
self _get_window_geometry (self.bounds). ## To update bounds
}
method windowOpened
@ -526,7 +528,7 @@ extend X11
at: X11.LLEvent.ENTER_NOTIFY put: #__handle_notify:;
at: X11.LLEvent.LEAVE_NOTIFY put: #__handle_notify:;
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:.
}
@ -575,7 +577,7 @@ extend X11
ongoing := true.
while (self.windows size > 0)
{
'Waiting for X11 event...' dump.
###'Waiting for X11 event...' dump.
self.event_loop_sem wait.
if (ongoing not) { break }.
@ -793,7 +795,23 @@ extend X11
} 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
@ -872,16 +890,25 @@ extend X11
class MyButton(X11.Button)
{
method windowOpened
{
super windowOpened.
self repaint.
}
method expose: event
{
|gc|
super expose: event.
self repaint.
}
'XXXXXXXXXXXXXXXXXXXXXXXXXXx' dump.
gc := X11.GC new: self.
gc foreground: 16rFF8877.
gc _fillRect(0, 0, 50, 50).
gc close.
method repaint
{
|gc|
gc := X11.GC new: self.
gc foreground: 16rFF8877.
gc _fillRect(0, 0, 50, 50).
gc close.
}
}
@ -893,7 +920,6 @@ class MyFrame(X11.FrameWindow)
method windowOpened
{
super windowOpened.
if (self.gc isNil)
@ -907,6 +933,8 @@ self.gc _drawRect(100, 100, 200, 200).
}.
self.b1 := MyButton new: self.
self windowResized.
}
method windowClosing
@ -919,13 +947,20 @@ self.gc _drawRect(100, 100, 200, 200).
}*)
}
method expose: event
method windowResized
{
| rect |
super expose: event.
super windowResized.
rect := self bounds.
rect x: 0; y: 0; height: ((rect height) quo: 2); width: ((rect width) - 2).
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.
@ -935,15 +970,12 @@ 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 x: 0; y: 0; height: ((rect height) quo: 2); width: ((rect width) - 2).
self.b1 bounds: rect;
}
}
class MyObject(Object)
{
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);
MOO_DEBUG1 (moo, "<x11.disconnect> %p\n", x11->c);
if (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 = (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)
{
@ -179,7 +176,6 @@ static moo_pfrc_t pf_getevent (moo_t* moo, moo_ooi_t nargs)
int e;
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);
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)))
{
/* 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);
}
else
@ -566,8 +562,6 @@ static moo_pfrc_t pf_win_make (moo_t* moo, moo_ooi_t nargs)
xcb_window_t parent;
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);
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_MOTION |*/
XCB_EVENT_MASK_EXPOSURE |
XCB_EVENT_MASK_STRUCTURE_NOTIFY |
/*XCB_EVENT_MASK_POINTER_MOTION |*/
XCB_EVENT_MASK_ENTER_WINDOW |
XCB_EVENT_MASK_LEAVE_WINDOW |
XCB_EVENT_MASK_VISIBILITY_CHANGE;
XCB_EVENT_MASK_LEAVE_WINDOW/* |
XCB_EVENT_MASK_VISIBILITY_CHANGE */;
xcb_create_window (
c,
XCB_COPY_FROM_PARENT, /* depth */