added experimental code to handle xcb window resizing
This commit is contained in:
parent
536a66fbbf
commit
a768bd8803
@ -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
|
||||||
|
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user