wmii/cmd/wm/wm.h

288 lines
6.3 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 {
P_PREFIX,
P_NAME,
2005-11-18 18:54:58 +03:00
P_AREA_PREFIX,
P_SEL_AREA,
P_CTL,
P_LAST
};
/* array indexes of area file pointers */
enum {
A_PREFIX,
2005-12-05 22:38:03 +03:00
A_FRAME_PREFIX,
2005-11-18 18:54:58 +03:00
A_SEL_FRAME,
A_CTL,
2005-12-05 01:45:59 +03:00
A_GEOMETRY,
2005-11-18 18:54:58 +03:00
A_LAYOUT,
A_LAST
};
/* array indexes of frame file pointers */
enum {
F_PREFIX,
F_CLIENT_PREFIX,
F_SEL_CLIENT,
F_CTL,
F_GEOMETRY,
2005-11-18 18:54:58 +03:00
F_BORDER,
F_TAB,
F_HANDLE_INC,
F_LOCKED,
F_SEL_BG_COLOR,
F_SEL_FG_COLOR,
F_SEL_BORDER_COLOR,
F_NORM_BG_COLOR,
F_NORM_FG_COLOR,
F_NORM_BORDER_COLOR,
F_EVENT_B2PRESS,
F_EVENT_B3PRESS,
F_EVENT_B4PRESS,
F_EVENT_B5PRESS,
F_LAST
};
/* array indexes of client file pointers */
enum {
C_PREFIX,
C_NAME,
C_LAST
};
/* array indexes of wm file pointers */
enum {
WM_CTL,
WM_DETACHED_FRAME,
WM_DETACHED_CLIENT,
WM_TRANS_COLOR,
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_LOCKED,
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
};
#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
2005-12-12 01:52:04 +03:00
#define ROOT_MASK (SubstructureRedirectMask | ButtonPressMask | ButtonReleaseMask)
#define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask | EnterWindowMask)
2005-11-18 18:54:58 +03:00
typedef struct Page Page;
typedef struct Layout Layout;
typedef struct Area Area;
typedef struct Frame Frame;
typedef struct Client Client;
struct Page {
Container areas;
2005-12-05 22:38:03 +03:00
File *file[P_LAST];
2005-11-18 18:54:58 +03:00
};
struct Layout {
2005-12-05 01:45:59 +03:00
char *name;
void (*init) (Area *); /* called when layout is initialized */
void (*deinit) (Area *); /* called when layout is uninitialized */
void (*arrange) (Area *); /* called when area is resized */
Bool (*attach) (Area *, Client *); /* called on attach */
2005-12-11 18:24:52 +03:00
void (*detach) (Area *, Client *, Bool unmap); /* called on detach */
2005-12-09 04:46:59 +03:00
void (*resize) (Frame *, XRectangle *, XPoint *); /* called after resize */
2005-12-11 01:43:45 +03:00
void (*select) (Frame *, Bool raise); /* selection */
Container *(*get_frames) (Area *); /* called after resize */
2005-12-11 01:43:45 +03:00
Action *(*get_actions) (Area *);
2005-11-18 18:54:58 +03:00
};
struct Area {
2005-12-05 01:45:59 +03:00
Page *page;
Layout *layout;
Container clients;
2005-12-05 01:45:59 +03:00
XRectangle rect;
void *aux; /* free pointer */
2005-12-05 22:38:03 +03:00
File *file[A_LAST];
2005-11-18 18:54:58 +03:00
};
struct Frame {
2005-12-05 01:45:59 +03:00
Area *area;
Window win;
Container clients;
2005-12-05 01:45:59 +03:00
GC gc;
XRectangle rect;
Cursor cursor;
void *aux; /* free pointer */
2005-12-05 22:38:03 +03:00
File *file[F_LAST];
2005-11-18 18:54:58 +03:00
};
struct Client {
Area *area;
2005-12-05 01:45:59 +03:00
int proto;
unsigned int border;
2005-12-12 01:52:04 +03:00
unsigned int ignore_unmap;
2005-12-06 00:22:24 +03:00
Bool destroyed;
2005-12-05 01:45:59 +03:00
Window win;
Window trans;
XRectangle rect;
XSizeHints size;
Frame *frame;
2005-12-05 22:38:03 +03:00
File *file[C_LAST];
2005-11-18 18:54:58 +03:00
};
/* global variables */
2005-12-05 01:45:59 +03:00
Display *dpy;
IXPServer *ixps;
int screen_num;
Window root;
Window transient;
XRectangle rect;
Container detached;
Container pages;
Container areas;
Container frames;
Container clients;
Container layouts;
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-05 01:45:59 +03:00
Atom wm_state;
Atom wm_change_state;
Atom wm_protocols;
Atom wm_delete;
Atom motif_wm_hints;
Atom net_wm_desktop;
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
/* area.c */
2005-12-05 22:38:03 +03:00
Area *alloc_area(Page *p, XRectangle * r, char *layout);
2005-12-05 01:45:59 +03:00
void destroy_area(Area * a);
void sel_area(Area * a);
2005-12-05 01:45:59 +03:00
void draw_area(Area * a);
void hide_area(Area * a);
void show_area(Area * a);
Area *get_sel_area();
void attach_frame_to_area(Area *a, Frame *f);
void detach_frame_from_area(Frame *f);
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);
void draw_client(void *item, void *aux);
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 hide_client(Client * c);
void show_client(Client * c);
void reparent_client(Client * c, Window w, int x, int y);
2005-12-06 00:22:24 +03:00
void sel_client(Client *c);
void attach_client(Client *c);
2005-12-11 18:24:52 +03:00
void detach_client(Client *c, Bool unmap);
Client *get_sel_client();
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-10 18:38:43 +03:00
void resize_frame(Frame *f, XRectangle *r, XPoint *pt);
void draw_frame(void *frame, void *aux);
void handle_frame_buttonpress(XButtonEvent *e, Frame *f);
void attach_client_to_frame(Frame *f, Client *c);
2005-12-11 18:24:52 +03:00
void detach_client_from_frame(Client *c, Bool unmap);
unsigned int tab_height(Frame * f);
unsigned int border_width(Frame * f);
Frame *get_sel_frame();
Frame *get_sel_frame_of_area(Area *a);
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);
void center_pointer(Frame * f);
2005-11-18 18:54:58 +03:00
/* page.c */
Page *get_sel_page();
2005-12-05 22:38:03 +03:00
Page *alloc_page();
2005-12-05 01:45:59 +03:00
void free_page(Page * p);
void destroy_page(Page * p);
2005-12-06 00:22:24 +03:00
void sel_page(Page *p);
2005-12-05 01:45:59 +03:00
XRectangle *rectangles(unsigned int *num);
void hide_page(Page * p);
void show_page(Page * p);
void draw_page(Page * p);
2005-11-18 18:54:58 +03:00
/* layout.c */
Layout *get_layout(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);