Skip to content
Snippets Groups Projects
Commit e1a0bf31 authored by Per Hedbor's avatar Per Hedbor
Browse files

Added Free() function to XResource class, used automatically for all allocated...

Added Free() function to XResource class, used automatically for all allocated objects when they are destructed.

Rev: lib/modules/Protocols.pmod/X.pmod/Extensions.pmod:1.4
Rev: lib/modules/Protocols.pmod/X.pmod/Requests.pmod:1.22
Rev: lib/modules/Protocols.pmod/X.pmod/Types.pmod:1.24
Rev: lib/modules/Protocols.pmod/X.pmod/XImage.pmod:1.6
Rev: lib/modules/Protocols.pmod/X.pmod/Xlib.pmod:1.25
parent 8f72df1c
No related branches found
No related tags found
No related merge requests found
......@@ -46,7 +46,6 @@ class Shape
void post_init()
{
werror("Shape extension initiated!\n");
}
void ShapeRectangles( object window, int xo, int yo,
......
......@@ -53,6 +53,65 @@ class request
}
}
class FreeRequest
{
inherit request;
int id;
string to_string()
{
return build_request(sprintf("%4c", id));
}
}
class CloseFont
{
inherit FreeRequest;
constant reqType=46;
}
class FreePixmap
{
inherit FreeRequest;
constant reqType=54;
}
class FreeGC
{
inherit FreeRequest;
constant reqType=60;
}
class FreeColormap
{
inherit FreeRequest;
constant reqType=79;
}
class FreeCursor
{
inherit FreeRequest;
constant reqType=95;
}
class FreeColors
{
inherit request;
constant reqType=79;
array colors;
int colormap;
int plane_mask;
string to_string()
{
return sprintf("%4c%4c%{%4c%}", colormap,plane_mask,colors);
}
}
class ResourceReq
{
inherit request;
......@@ -489,12 +548,6 @@ class OpenFont
}
}
class CloseFont
{
inherit ResourceReq;
constant reqType = 46;
}
class QueryTextExtents
{
inherit request;
......
......@@ -8,6 +8,7 @@ class XResource
{
object display;
int id;
int autofree = 1;
void create(object d, int i)
{
......@@ -16,6 +17,20 @@ class XResource
display->remember_id(id, this_object());
}
void Free()
{
object req = this_object()->FreeRequest();
werror("free "+id+"\n");
req->id = id;
display->send_request( req );
}
void destroy()
{
if(autofree) Free();
}
}
class Font
......@@ -66,6 +81,7 @@ class Font
class Cursor
{
inherit XResource;
constant FreeRequest = Requests.FreeCursor;
}
class Visual
......@@ -80,11 +96,18 @@ class Visual
int redMask;
int greenMask;
int blueMask;
void create(mixed ... args)
{
::create(@args);
autofree=0;
}
}
class GC
{
inherit XResource;
constant FreeRequest = Requests.FreeGC;
mapping(string:mixed) values;
......@@ -139,7 +162,7 @@ class Rectangle
error("Types.Rectangle(): To many arguments.\n");
}
}
string to_string()
{
return sprintf("%2c%2c%2c%2c", x, y, width, height);
......@@ -176,8 +199,31 @@ class Colormap
{
inherit XResource;
object visual;
constant FreeRequest = Requests.FreeColormap;
mapping alloced = ([]);
object FreeColors_req(int pixel)
{
object req = Requests.FreeColors();
req->colormap = id;
req->plane_mask=0;
req->colors = ({ pixel });
return req;
}
void FreeColor( int pixel )
{
display->send_request( FreeColors_req( pixel ) );
}
void Free()
{
foreach(values(alloced), mapping f) FreeColor( f->pixel );
::Free();
}
int AllocColor(int r, int g, int b)
{
if(alloced[sprintf("%2c%2c%2c", r, g, b)])
......@@ -205,8 +251,8 @@ class Colormap
class Drawable
{
inherit XResource;
object colormap;
int depth;
object colormap, parent, visual;
object CreateGC_req()
{
......@@ -243,9 +289,10 @@ class Drawable
object CreatePixmap(int width, int height, int depth)
{
object req = CreatePixmap_req(width, height, depth);
display->send_request(req);
return Pixmap(display, req->pid, this_object(),colormap);
display->send_request( req );
object p = Pixmap(display, req->pid, this_object(), colormap );
p->depth = depth;
return p;
}
object FillPoly_req(int gc, int shape, int coordMode, array(object) p)
......@@ -362,8 +409,7 @@ class Drawable
class Pixmap
{
inherit Drawable;
object parent;
constant FreeRequest = Requests.FreePixmap;
// Init function.
void create(mixed ... args)
......@@ -377,14 +423,15 @@ class Pixmap
class Window
{
inherit Drawable;
object visual, parent;
int currentInputMask;
constant FreeRequest = lambda(){}; // FIXME!!
mapping(string:array(function)) event_callbacks = ([ ]);
int alt_gr, num_lock, shift, control, caps_lock;
int meta, alt, super, hyper;
mapping attributes;
#include "keysyms.h"
void ReleaseKey( int sym )
......@@ -565,11 +612,11 @@ class Window
object CreateWindow(int x, int y, int width, int height,
int border_width, mapping attributes,
object|void visual, int|void depth,
object|void visual, int|void d,
int|void c_class)
{
object req = CreateWindow_req(x, y, width, height,
border_width,depth,visual);
border_width,d,visual);
object c = colormap||parent->defaultColorMap;
if (attributes)
......@@ -581,8 +628,10 @@ class Window
// object w = Window(display, req->wid);
display->send_request(req);
object w = new(display, req->wid, visual, this_object());
w->depth = d||depth||this_object()->rootDepth;
w->colormap = c;
w->currentInputMask = req->attributes->EventMask;
w->attributes = attributes;
return w;
}
......@@ -614,6 +663,7 @@ class Window
void ChangeAttributes(mapping m)
{
attributes |= m;
display->send_request(ChangeAttributes_req(m));
}
......@@ -645,20 +695,13 @@ class Window
event_callbacks[type] = (event_callbacks[type] || ({ }) )
+ ({ f });
}
#if 0
function remove_event_callback(string type)
{
function f = event_callbacks[type];
m_delete(event_callbacks, type);
}
#endif
object SelectInput_req()
{
object req = Requests.ChangeWindowAttributes();
req->window = id;
req->attributes->EventMask = currentInputMask;
attributes->EventMask = currentInputMask;
return req;
}
......@@ -896,6 +939,12 @@ class RootWindow
int saveUnders;
int rootDepth;
mapping depths;
void create(mixed ... args)
{
::create(@args);
autofree=0;
}
object new(mixed ... args) /* Kludge */
{
......
......@@ -326,3 +326,51 @@ class PixmapImage
set_drawable( p );
}
}
object MakeShapeMask(object in, object alpha)
{
object shape = in->CreatePixmap(alpha->xsize(),alpha->ysize(),1);
mapping f;
foreach(in->display->formats, f) if(f->depth == 1) break;
shape->PutImage( shape->CreateGC(), 1, 0, 0, alpha->xsize(), alpha->ysize(),
Image.X.encode_truecolor( alpha->invert(),
1, f->scanLinePad,
!in->display->bitmapBitOrder,
1, 0, 0, 0, 0, 0), 0);
return shape;
}
void ShapedWindowImage(object in, object color, object alpha, int contour)
{
object bgpm;
int width = color->xsize();
int height = color->ysize();
object bgpm = in->CreatePixmap(width, height, in->depth);
PixmapImage( bgpm )->set_image( color );
in->ChangeAttributes( (["BackPixmap":bgpm ]) );
mapping f;
object shape = in->CreatePixmap(alpha->xsize(),alpha->ysize(),1);
foreach(in->display->formats, f) if(f->depth == 1) break;
shape->PutImage( shape->CreateGC(), 1, 0, 0, alpha->xsize(), alpha->ysize(),
Image.X.encode_truecolor( alpha->invert(),
1, f->scanLinePad,
!in->display->bitmapBitOrder,
1, 0, 0, 0, 0, 0), 0);
in->ShapeMask("both", 0, 0, "set", shape);
if(contour)
{
in->ShapeMask("bounding", -1, -1, "union", shape);
in->ShapeMask("bounding", -1, 1, "union", shape);
in->ShapeMask("bounding", 1, -1, "union", shape);
in->ShapeMask("bounding", 1, 1, "union", shape);
in->ShapeMask("bounding", 1, 0, "union", shape);
in->ShapeMask("bounding", 0, 1, "union", shape);
in->ShapeMask("bounding", -1, 0, "union", shape);
in->ShapeMask("bounding", 0, -1, "union", shape);
}
}
......@@ -347,6 +347,7 @@ class Display
object r = Types.RootWindow(this_object(), wid);
int cm = struct->get_uint(4);
r->colormap = r->defaultColorMap = Types.Colormap(this_object(), cm, 0);
r->colormap->autofree=0;
r->whitePixel = struct->get_uint(4);
r->blackPixel = struct->get_uint(4);
r->currentInputMask = struct->get_uint(4);
......@@ -376,6 +377,7 @@ class Display
{
int visualID = struct->get_uint(4);
object v = Types.Visual(this_object(), visualID);
v->depth = depth;
v->c_class = struct->get_uint(1);
v->bitsPerRGB = struct->get_uint(1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment