mirror of
https://git.yoctoproject.org/libmatchboxwm2
synced 2025-11-03 20:55:44 +08:00
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:
13
ChangeLog
13
ChangeLog
@@ -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
6
TODO
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user