2007-09-18 Tomas Frydrych <tf@o-hand.com>

* TODO:
	Removed items already done.

        * src/core/mb-window-manager.c:
        * src/core/mb-window-manager.h:
        * src/core/mb-wm-layout.c:
        * src/core/mb-wm-layout.h:
        * src/core/mb-wm-types.h:
        * src/managers/matchbox-window-manager-2-simple.c:
	Objectified layout.
This commit is contained in:
Tomas Frydrych
2007-09-18 10:40:35 +00:00
parent bf6b08a094
commit 73eb7a07ba
8 changed files with 219 additions and 68 deletions

View File

@@ -1,3 +1,16 @@
2007-09-18 Tomas Frydrych <tf@o-hand.com>
* TODO:
Removed items already done.
* src/core/mb-window-manager.c:
* src/core/mb-window-manager.h:
* src/core/mb-wm-layout.c:
* src/core/mb-wm-layout.h:
* src/core/mb-wm-types.h:
* src/managers/matchbox-window-manager-2-simple.c:
Objectified layout.
2007-09-18 Tomas Frydrych <tf@o-hand.com>
* src/core/mb-wm-client.c:

6
TODO
View File

@@ -6,9 +6,6 @@ In no particular order
+ add tracking of these props changing with some kind of signals
(so clients types can use them)
- Support root window EWMH props and abstract in API accordingly.
+ Also track changes.
- Simple signal mechanism for MBObject ?
- Add an extras/ dir adding optional support for;
@@ -28,9 +25,6 @@ In no particular order
+ this will then allow support for _NET_WM_PING proto.
+ event calls should be modular enough to hook into glib main loop.
- Port mb-wm-layout, mb-wm to be MBObjects. Allow creation of MBWM
with alternate layout engine for example. (Stacking too?)
- Improve client types, add an input window type.
- Image based theme engine - takes a single 'template' image and conf file

View File

@@ -62,6 +62,7 @@ mb_wm_destroy (MBWMObject *this)
mb_wm_object_unref (MB_WM_OBJECT (wm->root_win));
mb_wm_object_unref (MB_WM_OBJECT (wm->theme));
mb_wm_object_unref (MB_WM_OBJECT (wm->layout));
}
static void
@@ -347,7 +348,8 @@ mb_wm_sync (MBWindowManager *wm)
/* Size stuff first assume newly managed windows unmapped ?
*
*/
mb_wm_layout_manager_update (wm);
if (wm->layout)
mb_wm_layout_update (wm->layout);
/* Create the actual window */
mb_wm_stack_enumerate(wm, client)
@@ -837,7 +839,7 @@ mb_wm_init (MBWMObject *this, va_list vap)
MBWMObjectProp prop;
int argc = 0;
char **argv = NULL;
prop = va_arg(vap, MBWMObjectProp);
while (prop)
{
@@ -1033,3 +1035,12 @@ mb_wm_handle_show_desktop (MBWindowManager * wm, Bool show)
if (wm_klass->show_desktop)
wm_klass->show_desktop (wm, show);
}
void
mb_wm_set_layout (MBWindowManager *wm, MBWMLayout *layout, Bool sync)
{
wm->layout = layout;
if (sync)
mb_wm_sync (wm);
}

View File

@@ -77,6 +77,7 @@ struct MBWindowManager
const char *sm_client_id;
MBWMTheme *theme;
MBWMLayout *layout;
};
struct MBWindowManagerClass
@@ -86,7 +87,7 @@ struct MBWindowManagerClass
void (*process_cmdline) (MBWindowManager * wm, int argc, char **argv);
void (*show_desktop) (MBWindowManager *wm, Bool show);
MBWindowManagerClient* (*client_new) (MBWindowManager *wm,
MBWMClientWindow *w);
@@ -101,6 +102,9 @@ struct MBWindowManagerClass
MBWindowManager *
mb_wm_new (int argc, char **argv);
void
mb_wm_set_layout (MBWindowManager *wm, MBWMLayout *layout, Bool sync);
int
mb_wm_class_type ();

View File

@@ -6,10 +6,85 @@
#define SET_HEIGHT (1<<4)
#define SET_ALL (SET_X|SET_Y|SET_WIDTH|SET_HEIGHT)
static void
mb_wm_layout_real_update (MBWMLayout * layout);
static void
mb_wm_layout_class_init (MBWMObjectClass *klass)
{
MBWMLayoutClass * layout_class = MB_WM_LAYOUT_CLASS (klass);
layout_class->update = mb_wm_layout_real_update;
}
static void
mb_wm_layout_destroy (MBWMObject *this)
{
}
static void
mb_wm_layout_init (MBWMObject *this, va_list vap)
{
MBWMLayout *layout = MB_WM_LAYOUT (this);
MBWMObjectProp prop;
MBWindowManager *wm = NULL;
prop = va_arg(vap, MBWMObjectProp);
while (prop)
{
switch (prop)
{
case MBWMObjectPropWm:
wm = va_arg(vap, MBWindowManager *);
break;
default:
MBWMO_PROP_EAT (vap, prop);
}
prop = va_arg(vap, MBWMObjectProp);
}
MBWM_ASSERT (wm);
layout->wm = wm;
}
int
mb_wm_layout_class_type ()
{
static int type = 0;
if (UNLIKELY(type == 0))
{
static MBWMObjectClassInfo info = {
sizeof (MBWMLayoutClass),
sizeof (MBWMLayout),
mb_wm_layout_init,
mb_wm_layout_destroy,
mb_wm_layout_class_init
};
type = mb_wm_object_register_class (&info, MB_WM_TYPE_OBJECT, 0);
}
return type;
}
MBWMLayout*
mb_wm_layout_new (MBWindowManager *wm)
{
MBWMLayout *layout;
layout = MB_WM_LAYOUT (mb_wm_object_new (MB_WM_TYPE_LAYOUT,
MBWMObjectPropWm, wm,
NULL));
return layout;
}
static Bool
clip_geometry (MBGeometry *geom,
MBGeometry *min,
int flags)
mb_wm_layout_clip_geometry (MBGeometry *geom,
MBGeometry *min,
int flags)
{
Bool changed = False;
@@ -45,9 +120,9 @@ clip_geometry (MBGeometry *geom,
}
static Bool
maximise_geometry (MBGeometry *geom,
MBGeometry *max,
int flags)
mb_wm_layout_maximise_geometry (MBGeometry *geom,
MBGeometry *max,
int flags)
{
Bool changed = False;
@@ -78,9 +153,9 @@ maximise_geometry (MBGeometry *geom,
return changed;
}
int /* FIXME: work for multiple edges */
mb_wm_layout_manager_get_edge_offset (MBWindowManager *wm,
int edge)
static int /* FIXME: work for multiple edges */
mb_wm_layout_get_edge_offset (MBWindowManager *wm,
int edge)
{
MBGeometry coverage;
MBWindowManagerClient *client = NULL;
@@ -111,21 +186,22 @@ mb_wm_layout_manager_get_edge_offset (MBWindowManager *wm,
}
return offset;
}
}
void
mb_wm_layout_manager_update (MBWindowManager *wm)
static void
mb_wm_layout_real_update (MBWMLayout * layout)
{
MBWindowManager *wm = layout->wm;
int min_x, max_x, min_y, max_y;
MBGeometry coverage, avail_geom;
MBWindowManagerClient *client = NULL;
Bool need_change;
mb_wm_get_display_geometry (wm, &avail_geom);
mb_wm_get_display_geometry (wm, &avail_geom);
/*
cycle through clients, laying out each in below order.
Note they must have LayoutPrefVisible set.
Note they must have LayoutPrefVisible set.
LayoutPrefReserveEdgeNorth
LayoutPrefReserveEdgeSouth
@@ -143,10 +219,10 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
LayoutPrefFullscreen
XXX need to check they are mapped too
XXX need to check they are mapped too
foreach client with LayoutPrefReserveEdgeNorth & LayoutPrefVisible
grab there current geometry
grab there current geometry
does it fit well into current restraints ( min_, max_ )
yes leave
no resize so it does, mark dirty
@@ -163,17 +239,18 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
if (client->layout_hints == (LayoutPrefReserveEdgeNorth|LayoutPrefVisible))
{
mb_wm_client_get_coverage (client, &coverage);
/* set x,y to avail and max width */
need_change = maximise_geometry (&coverage,
&avail_geom,
SET_X|SET_Y|SET_WIDTH);
/* Too high */
need_change |= clip_geometry (&coverage, &avail_geom, SET_HEIGHT);
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
/* set x,y to avail and max width */
need_change = mb_wm_layout_maximise_geometry (&coverage,
&avail_geom,
SET_X|SET_Y|SET_WIDTH);
/* Too high */
need_change |= mb_wm_layout_clip_geometry (&coverage,
&avail_geom, SET_HEIGHT);
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
MBWMClientReqGeomIsViaLayoutManager);
/* FIXME: what if this returns False ? */
@@ -186,13 +263,14 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
if (client->layout_hints == (LayoutPrefReserveEdgeSouth|LayoutPrefVisible))
{
mb_wm_client_get_coverage (client, &coverage);
/* set x,y to avail and max width */
need_change = maximise_geometry (&coverage,
&avail_geom,
SET_X|SET_WIDTH);
need_change = mb_wm_layout_maximise_geometry (&coverage,
&avail_geom,
SET_X|SET_WIDTH);
/* Too high */
need_change |= clip_geometry (&coverage, &avail_geom, SET_HEIGHT);
need_change |= mb_wm_layout_clip_geometry (&coverage,
&avail_geom, SET_HEIGHT);
if (coverage.y != avail_geom.y + avail_geom.height - coverage.height)
{
@@ -200,9 +278,9 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
need_change = True;
}
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
MBWMClientReqGeomIsViaLayoutManager);
avail_geom.height = avail_geom.height - coverage.height;
@@ -213,17 +291,18 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
if (client->layout_hints == (LayoutPrefReserveEdgeWest|LayoutPrefVisible))
{
mb_wm_client_get_coverage (client, &coverage);
/* set x,y to avail and max width */
need_change = maximise_geometry (&coverage,
&avail_geom,
SET_X|SET_Y|SET_HEIGHT);
/* Too wide */
need_change |= clip_geometry (&coverage, &avail_geom, SET_WIDTH);
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
/* set x,y to avail and max width */
need_change = mb_wm_layout_maximise_geometry (&coverage,
&avail_geom,
SET_X|SET_Y|SET_HEIGHT);
/* Too wide */
need_change |= mb_wm_layout_clip_geometry (&coverage,
&avail_geom, SET_WIDTH);
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
MBWMClientReqGeomIsViaLayoutManager);
avail_geom.x = coverage.x + coverage.width;
@@ -235,17 +314,18 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
if (client->layout_hints == (LayoutPrefReserveEdgeEast|LayoutPrefVisible))
{
mb_wm_client_get_coverage (client, &coverage);
/* set x,y to avail and max width */
need_change = maximise_geometry (&coverage,
&avail_geom,
SET_Y|SET_HEIGHT);
/* Too wide */
need_change |= clip_geometry (&coverage, &avail_geom, SET_WIDTH);
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
/* set x,y to avail and max width */
need_change = mb_wm_layout_maximise_geometry (&coverage,
&avail_geom,
SET_Y|SET_HEIGHT);
/* Too wide */
need_change |= mb_wm_layout_clip_geometry (&coverage,
&avail_geom, SET_WIDTH);
if (need_change)
mb_wm_client_request_geometry (client,
&coverage,
MBWMClientReqGeomIsViaLayoutManager);
if (coverage.x != avail_geom.x + avail_geom.width - coverage.width)
@@ -266,7 +346,7 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
{
mb_wm_client_get_coverage (client, &coverage);
if (coverage.x != avail_geom.x
if (coverage.x != avail_geom.x
|| coverage.width != avail_geom.width
|| coverage.y != avail_geom.y
|| coverage.height != avail_geom.height)
@@ -279,11 +359,22 @@ mb_wm_layout_manager_update (MBWindowManager *wm)
coverage.x = avail_geom.x;
coverage.y = avail_geom.y;
mb_wm_client_request_geometry (client,
&coverage,
mb_wm_client_request_geometry (client,
&coverage,
MBWMClientReqGeomIsViaLayoutManager);
}
}
}
void
mb_wm_layout_update (MBWMLayout * layout)
{
MBWMLayoutClass *klass;
klass = MB_WM_LAYOUT_CLASS (MB_WM_OBJECT_GET_CLASS (layout));
MBWM_ASSERT (klass->update);
klass->update (layout);
}

View File

@@ -1,4 +1,4 @@
/*
/*
* Matchbox Window Manager II - A lightweight window manager not for the
* desktop.
*
@@ -21,7 +21,33 @@
#ifndef _HAVE_MB_WM_LAYOUT_MANAGER_H
#define _HAVE_MB_WM_LAYOUT_MANAGER_H
#include "mb-wm.h"
#define MB_WM_LAYOUT(c) ((MBWMLayout*)(c))
#define MB_WM_LAYOUT_CLASS(c) ((MBWMLayoutClass*)(c))
#define MB_WM_TYPE_LAYOUT (mb_wm_layout_class_type ())
struct MBWMLayout
{
MBWMObject parent;
MBWindowManager *wm;
};
struct MBWMLayoutClass
{
MBWMObjectClass parent;
void (*update) (MBWMLayout *layout);
};
int
mb_wm_layout_class_type ();
MBWMLayout*
mb_wm_layout_new (MBWindowManager *wm);
void
mb_wm_layout_manager_update (MBWindowManager *wm);
mb_wm_layout_update (MBWMLayout *layout);
#endif

View File

@@ -92,6 +92,9 @@ typedef struct MBWMDecor MBWMDecor;
typedef struct MBWMDecorClass MBWMDecorClass;
typedef struct MBWMDecorButton MBWMDecorButton;
typedef struct MBWMDecorButtonClass MBWMDecorButtonClass;
typedef struct MBWMLayout MBWMLayout;
typedef struct MBWMLayoutClass MBWMLayoutClass;
typedef unsigned long MBWMCookie;
typedef int MBWindowManagerClientType;

View File

@@ -82,6 +82,8 @@ key_binding_func (MBWindowManager *wm,
int
main(int argc, char **argv)
{
MBWMLayout * layout;
#ifdef MBWM_WANT_DEBUG
struct sigaction sa;
sigfillset(&sa.sa_mask);
@@ -96,6 +98,13 @@ main(int argc, char **argv)
if (wm == NULL)
mb_wm_util_fatal_error("OOM?");
layout = mb_wm_layout_new (wm);
if (layout == NULL)
mb_wm_util_fatal_error("OOM?");
mb_wm_set_layout (wm, layout, False);
mb_wm_keys_binding_add_with_spec (wm,
"<alt>d",
key_binding_func,