wmii/cmd/wm/wm.h

288 lines
6.8 KiB
C
Raw Normal View History

2005-11-18 18:54:58 +03:00
/*
* (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include <stdio.h>
#include <X11/Xutil.h>
#include "wmii.h"
/* array indexes of page file pointers */
enum {
2005-12-21 18:18:11 +03:00
P_PREFIX,
P_NAME,
2006-01-12 18:44:06 +03:00
P_LAYOUT_PREFIX,
P_SEL_LAYOUT,
2005-12-21 18:18:11 +03:00
P_CTL,
P_LAST
2005-11-18 18:54:58 +03:00
};
2006-01-12 18:06:50 +03:00
/* array indexes of layout file pointers */
2005-11-18 18:54:58 +03:00
enum {
2006-01-12 18:06:50 +03:00
L_PREFIX,
L_FRAME_PREFIX,
L_SEL_FRAME,
L_CTL,
L_NAME,
L_LAST
2005-11-18 18:54:58 +03:00
};
/* array indexes of frame file pointers */
enum {
2005-12-21 18:18:11 +03:00
F_PREFIX,
F_NAME,
2005-12-21 18:18:11 +03:00
F_GEOMETRY,
F_BORDER,
F_TAB,
F_HANDLE_INC,
F_LAST
2005-11-18 18:54:58 +03:00
};
/* array indexes of wm file pointers */
enum {
2005-12-21 18:18:11 +03:00
WM_CTL,
WM_TRANS_COLOR,
2006-01-12 18:44:06 +03:00
WM_MANAGED_GEOMETRY,
2005-12-21 18:18:11 +03:00
WM_SEL_BG_COLOR,
WM_SEL_BORDER_COLOR,
WM_SEL_FG_COLOR,
WM_NORM_BG_COLOR,
WM_NORM_BORDER_COLOR,
WM_NORM_FG_COLOR,
WM_FONT,
WM_BORDER,
WM_TAB,
WM_HANDLE_INC,
WM_SNAP_VALUE,
WM_SEL_PAGE,
WM_LAYOUT,
WM_EVENT_PAGE_UPDATE,
WM_EVENT_CLIENT_UPDATE,
WM_EVENT_B1PRESS,
WM_EVENT_B2PRESS,
WM_EVENT_B3PRESS,
WM_EVENT_B4PRESS,
WM_EVENT_B5PRESS,
WM_LAST
2005-11-18 18:54:58 +03:00
};
2005-12-27 23:13:50 +03:00
/* array indexes of EWMH window properties */
/* TODO: set / react */
enum {
NET_NUMBER_OF_DESKTOPS, /* ✓ */
NET_CURRENT_DESKTOP, /* ✓ ✓ */
NET_WM_DESKTOP /* ✗ ✗ */
};
#define NET_ATOM_COUNT 3
2005-11-18 18:54:58 +03:00
#define PROTO_DEL 1
2005-12-07 04:20:36 +03:00
#define BORDER_WIDTH 3
2005-12-12 19:04:40 +03:00
#define LAYOUT "column"
2005-12-07 04:20:36 +03:00
#define GAP 5
2005-11-18 18:54:58 +03:00
#define ROOT_MASK SubstructureRedirectMask
#define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask)
2005-11-18 18:54:58 +03:00
typedef struct Page Page;
typedef struct AttachQueue AttachQueue;
2006-01-12 18:06:50 +03:00
typedef struct LayoutDef LayoutDef;
2005-11-18 18:54:58 +03:00
typedef struct Layout Layout;
typedef struct Frame Frame;
typedef struct Client Client;
struct AttachQueue {
Page *page;
AttachQueue *next;
};
2005-11-18 18:54:58 +03:00
struct Page {
2006-01-12 18:06:50 +03:00
Layout *managed;
Layout *floating;
Layout *sel;
2005-12-21 18:18:11 +03:00
File *file[P_LAST];
Page *next;
Page *prev;
2005-12-27 23:13:50 +03:00
size_t index;
2005-11-18 18:54:58 +03:00
};
2006-01-12 18:06:50 +03:00
struct LayoutDef {
2005-12-21 18:18:11 +03:00
char *name;
void (*init) (Layout *, Client *); /* called when layout is initialized */
2006-01-12 18:06:50 +03:00
Client *(*deinit) (Layout *); /* called when layout is uninitialized */
void (*arrange) (Layout *); /* called when layout is resized */
Bool(*attach) (Layout *, Client *); /* called on attach */
void (*detach) (Layout *, Client *, Bool unmap); /* called on detach */
void (*resize) (Frame *, XRectangle *, XPoint *); /* called after resize */
void (*focus) (Layout *, Client *, Bool raise); /* focussing a client */
Frame *(*frames) (Layout *); /* called for drawing */
Client *(*sel) (Layout *); /* returns selected client */
Action *(*actions) (Layout *); /* local action table */
2006-01-12 18:06:50 +03:00
LayoutDef *next;
2005-11-18 18:54:58 +03:00
};
2006-01-12 18:06:50 +03:00
struct Layout {
2005-12-21 18:18:11 +03:00
Page *page;
2006-01-12 18:06:50 +03:00
LayoutDef *def;
void *aux; /* auxillary pointer */
2006-01-12 18:06:50 +03:00
File *file[L_LAST];
2005-11-18 18:54:58 +03:00
};
struct Frame {
2006-01-12 18:06:50 +03:00
Layout *layout;
2005-12-21 18:18:11 +03:00
Window win;
Client *sel;
Client *clients;
size_t nclients;
GC gc;
XRectangle rect;
Cursor cursor;
void *aux; /* auxillary pointer */
2005-12-21 18:18:11 +03:00
File *file[F_LAST];
Frame *next;
Frame *prev;
2005-11-18 18:54:58 +03:00
};
struct Client {
2005-12-21 18:18:11 +03:00
int proto;
unsigned int border;
unsigned int ignore_unmap;
char name[256];
2005-12-21 18:18:11 +03:00
Bool destroyed;
Window win;
Window trans;
XRectangle rect;
XSizeHints size;
Frame *frame;
Client *next;
Client *prev;
2005-11-18 18:54:58 +03:00
};
/* global variables */
Page *pages;
Page *selpage;
AttachQueue *attachqueue;
size_t npages;
Client *detached;
size_t ndetached;
2006-01-12 18:06:50 +03:00
LayoutDef *layouts;
2005-12-05 01:45:59 +03:00
Display *dpy;
IXPServer *ixps;
int screen_num;
Window root;
Window transient;
XRectangle rect;
2006-01-12 18:06:50 +03:00
XRectangle layout_rect;
2005-12-05 01:45:59 +03:00
XFontStruct *font;
XColor xorcolor;
GC xorgc;
GC transient_gc;
2005-11-18 18:54:58 +03:00
2005-12-27 23:13:50 +03:00
Atom wm_state; /* TODO: Maybe replace with wm_atoms[WM_ATOM_COUNT]? */
2005-12-05 01:45:59 +03:00
Atom wm_change_state;
Atom wm_protocols;
Atom wm_delete;
Atom motif_wm_hints;
2005-12-27 23:13:50 +03:00
Atom net_atoms[NET_ATOM_COUNT];
2005-11-18 18:54:58 +03:00
2005-12-05 01:45:59 +03:00
Cursor normal_cursor;
Cursor resize_cursor;
Cursor move_cursor;
Cursor drag_cursor;
Cursor w_cursor;
Cursor e_cursor;
Cursor n_cursor;
Cursor s_cursor;
Cursor nw_cursor;
Cursor ne_cursor;
Cursor sw_cursor;
Cursor se_cursor;
2005-11-18 18:54:58 +03:00
/* default file pointers */
2005-12-05 04:50:02 +03:00
File *def[WM_LAST];
2005-11-18 18:54:58 +03:00
2005-12-05 01:45:59 +03:00
unsigned int valid_mask, num_lock_mask;
2005-11-18 18:54:58 +03:00
/* client.c */
2005-12-05 01:45:59 +03:00
Client *alloc_client(Window w);
2005-12-05 22:38:03 +03:00
void init_client(Client * c, XWindowAttributes * wa);
void destroy_client(Client * c);
2005-12-05 01:45:59 +03:00
void configure_client(Client * c);
void handle_client_property(Client * c, XPropertyEvent * e);
void close_client(Client * c);
2005-12-21 18:18:11 +03:00
void draw_client(Client * client);
2005-12-05 01:45:59 +03:00
void draw_clients(Frame * f);
void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert);
void grab_client(Client * c, unsigned long mod, unsigned int button);
void ungrab_client(Client * c, unsigned long mod, unsigned int button);
void unmap_client(Client * c);
void map_client(Client * c);
2005-12-05 01:45:59 +03:00
void reparent_client(Client * c, Window w, int x, int y);
2005-12-21 18:18:11 +03:00
void attach_client(Client * c);
void detach_client(Client * c, Bool unmap);
Client *sel_client();
2005-12-21 18:18:11 +03:00
Client *clientat(Client * clients, size_t idx);
void detach_detached(Client * c);
void attach_detached(Client * c);
2005-11-18 18:54:58 +03:00
/* frame.c */
2005-12-05 01:45:59 +03:00
Frame *win_to_frame(Window w);
2005-12-05 22:38:03 +03:00
Frame *alloc_frame(XRectangle * r);
2005-12-05 01:45:59 +03:00
void destroy_frame(Frame * f);
2005-12-21 18:18:11 +03:00
void resize_frame(Frame * f, XRectangle * r, XPoint * pt);
void draw_frame(Frame * f);
void handle_frame_buttonpress(XButtonEvent * e, Frame * f);
void attach_client_to_frame(Frame * f, Client * client);
void detach_client_from_frame(Client * client, Bool unmap);
unsigned int tab_height(Frame * f);
unsigned int border_width(Frame * f);
Frame *sel_frame();
2005-11-18 18:54:58 +03:00
/* event.c */
2005-12-05 01:45:59 +03:00
void init_event_hander();
void check_event(Connection * c);
2005-11-18 18:54:58 +03:00
/* mouse.c */
2005-12-05 01:45:59 +03:00
void mouse_resize(Frame * f, Align align);
void mouse_move(Frame * f);
Cursor cursor_for_motion(Frame * f, int x, int y);
Align cursor_to_align(Cursor cursor);
Align xy_to_align(XRectangle * rect, int x, int y);
void drop_move(Frame * f, XRectangle * new, XPoint * pt);
2005-11-18 18:54:58 +03:00
/* page.c */
Page *pageat(unsigned int idx);
2005-12-05 22:38:03 +03:00
Page *alloc_page();
2005-12-21 18:18:11 +03:00
void destroy_page(Page * p);
void focus_page(Page * p);
2005-12-05 01:45:59 +03:00
XRectangle *rectangles(unsigned int *num);
2005-11-18 18:54:58 +03:00
/* layout.c */
2006-01-12 18:06:50 +03:00
Layout *alloc_layout(Page * p, char *layout);
void destroy_layout(Layout *l);
void focus_layout(Layout *l);
void unmap_layout(Layout *l);
void map_layout(Layout *l, Bool raise);
2006-01-12 18:06:50 +03:00
Layout *sel_layout();
void attach_frame_to_layout(Layout *l, Frame * f);
void detach_frame_from_layout(Frame * f);
LayoutDef *match_layout_def(char *name);
/* layoutdef.c */
2005-12-05 01:45:59 +03:00
void init_layouts();
2005-12-05 04:15:25 +03:00
/* wm.c */
void invoke_wm_event(File * f);
void run_action(File * f, void *obj, Action * acttbl);
void scan_wins();
Client *win_to_client(Window w);
int win_proto(Window w);
int win_state(Window w);
void handle_after_write(IXPServer * s, File * f);
void detach(Frame * f, int client_destroyed);
void set_client_state(Client * c, int state);