From d1e355de2c6aae38cea3cdc0e0b902ea2b194e86 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 24 May 2003 21:47:06 +0000 Subject: this is a big one! im putting stats in here just cuz! 59 files changed, 1691 insertions(+), 607 deletions(-) Adding the beginings of ObConf. Adding a resistance-config plugin for ObConf. Creating an obparser library that obrender can use, the kernel can use, plugins can use, and ObConf and its plugins can use. (its just code for using libXml2) --- plugins/Makefile.am | 18 +-- plugins/interface.h | 19 +++ plugins/keyboard/keyboard.c | 4 +- plugins/menu/Makefile.am | 3 +- plugins/mouse/mouse.c | 4 +- plugins/obconf_interface.h | 40 +++++ plugins/placement/history.c | 14 +- plugins/placement/placement.c | 2 +- plugins/resistance.c | 274 -------------------------------- plugins/resistance/.cvsignore | 8 + plugins/resistance/Makefile.am | 32 ++++ plugins/resistance/resistance.c | 275 +++++++++++++++++++++++++++++++++ plugins/resistance/resistance.glade | 109 +++++++++++++ plugins/resistance/resistance.gladep | 8 + plugins/resistance/resistance.h | 2 + plugins/resistance/resistance_config.c | 64 ++++++++ 16 files changed, 568 insertions(+), 308 deletions(-) create mode 100644 plugins/interface.h create mode 100644 plugins/obconf_interface.h delete mode 100644 plugins/resistance.c create mode 100644 plugins/resistance/.cvsignore create mode 100644 plugins/resistance/Makefile.am create mode 100644 plugins/resistance/resistance.c create mode 100644 plugins/resistance/resistance.glade create mode 100644 plugins/resistance/resistance.gladep create mode 100644 plugins/resistance/resistance.h create mode 100644 plugins/resistance/resistance_config.c (limited to 'plugins') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index b23259d6..ec89616d 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -1,20 +1,6 @@ -plugindir=$(libdir)/openbox/plugins +SUBDIRS = keyboard mouse placement menu resistance -SUBDIRS = keyboard mouse placement menu - -CPPFLAGS=$(XFT_CFLAGS) $(GLIB_CFLAGS) $(LIBSN_CFLAGS) $(GL_CFLAGS) \ - $(XML_CFLAGS) @CPPFLAGS@ \ --DPLUGINDIR=\"$(plugindir)\" - -INCLUDES=-I.. - -plugin_LTLIBRARIES=resistance.la - -resistance_la_CPPFLAGS=-DG_LOG_DOMAIN=\"Plugin-Resistance\" -resistance_la_LDFLAGS=-module -avoid-version -resistance_la_SOURCES=resistance.c - -noinst_HEADERS= +noinst_HEADERS = interface.h obconf_interface.h MAINTAINERCLEANFILES= Makefile.in diff --git a/plugins/interface.h b/plugins/interface.h new file mode 100644 index 00000000..8c5c6458 --- /dev/null +++ b/plugins/interface.h @@ -0,0 +1,19 @@ +#ifndef __plugins_interface_h +#define __plugins_interface_h + +/* plugin_setup_config() */ +typedef void (*PluginSetupConfig)(void); + +/* plugin_startup() */ +typedef void (*PluginStartup)(void); + +/* plugin_shutdown() */ +typedef void (*PluginShutdown)(void); + +/* plugin_create() - for menu plugins only */ +typedef void *(*PluginCreate)(/* TODO */); + +/* plugin_destroy() - for menu plugins only */ +typedef void (*PluginDestroy)(void *); + +#endif diff --git a/plugins/keyboard/keyboard.c b/plugins/keyboard/keyboard.c index d1d93241..374f2493 100644 --- a/plugins/keyboard/keyboard.c +++ b/plugins/keyboard/keyboard.c @@ -5,8 +5,8 @@ #include "kernel/grab.h" #include "kernel/action.h" #include "kernel/prop.h" -#include "kernel/parse.h" #include "kernel/timer.h" +#include "parser/parse.h" #include "tree.h" #include "keyboard.h" #include "translate.h" @@ -45,7 +45,7 @@ static void parse_key(xmlDocPtr doc, xmlNodePtr node, GList *keylist) if (keylist) { nact = parse_find_node("action", node); while (nact) { - if ((action = parse_action(doc, nact))) { + if ((action = action_parse(doc, nact))) { /* validate that its okay for a key binding */ if (action->func == action_moveresize && action->data.moveresize.corner != diff --git a/plugins/menu/Makefile.am b/plugins/menu/Makefile.am index 40b9b64d..3ed9c5c6 100644 --- a/plugins/menu/Makefile.am +++ b/plugins/menu/Makefile.am @@ -1,6 +1,7 @@ plugindir=$(libdir)/openbox/plugins -CPPFLAGS=$(XFT_CFLAGS) $(GLIB_CFLAGS) $(LIBSN_CFLAGS) @CPPFLAGS@ \ +CPPFLAGS=$(XFT_CFLAGS) $(GLIB_CFLAGS) $(LIBSN_CFLAGS) $(XML_CFLAGS) + \@CPPFLAGS@ \ -DG_LOG_DOMAIN=\"Plugin-Timed-Menu\" INCLUDES=-I../.. diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c index 0bfe602c..a2b3d7e0 100644 --- a/plugins/mouse/mouse.c +++ b/plugins/mouse/mouse.c @@ -5,8 +5,8 @@ #include "kernel/client.h" #include "kernel/prop.h" #include "kernel/grab.h" -#include "kernel/parse.h" #include "kernel/frame.h" +#include "parser/parse.h" #include "translate.h" #include "mouse.h" #include @@ -59,7 +59,7 @@ static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d) goto next_nbut; nact = parse_find_node("action", nbut->xmlChildrenNode); while (nact) { - if ((action = parse_action(doc, nact))) { + if ((action = action_parse(doc, nact))) { /* validate that its okay for a mouse binding*/ if (mact == MouseAction_Motion) { if (action->func != action_moveresize || diff --git a/plugins/obconf_interface.h b/plugins/obconf_interface.h new file mode 100644 index 00000000..52b19a8f --- /dev/null +++ b/plugins/obconf_interface.h @@ -0,0 +1,40 @@ +#ifndef __obconf_plugin_interface_h +#define __obconf_plugin_interface_h + +#include "parser/parse.h" + +struct GtkWidget; + +#define OBCONF_INTERFACE_VERSION 1 + +/* plugin_interface_version() */ +typedef int (*PluginInterfaceVersionFunc)(void); + +/* plugin_startup() */ +typedef void (*PluginStartupFunc)(void); + +/* plugin_shutdown() */ +typedef void (*PluginShutdownFunc)(void); + +/* plugin_name() - user friendly name of the plugin */ +typedef char* (*PluginNameFunc)(void); + +/* plugin_plugin_name() - the name of the plugin to load with openbox */ +typedef char* (*PluginPluginNameFunc)(void); + +/* plugin_icon() XXX FIXME */ +typedef void (*PluginIconFunc)(void); + +/* plugin_toplevel_widget() */ +typedef struct _GtkWidget* (*PluginToplevelWidgetFunc)(void); + +/* plugin_edited() */ +typedef gboolean (*PluginEditedFunc)(void); + +/* plugin_load() */ +typedef void (*PluginLoadFunc)(xmlDocPtr doc, xmlNodePtr root); + +/* plugin_save() */ +typedef void (*PluginSaveFunc)(xmlDocPtr doc, xmlNodePtr root); + +#endif diff --git a/plugins/placement/history.c b/plugins/placement/history.c index 9d932b9e..716487b6 100644 --- a/plugins/placement/history.c +++ b/plugins/placement/history.c @@ -3,7 +3,7 @@ #include "kernel/frame.h" #include "kernel/client.h" #include "kernel/screen.h" -#include "kernel/parse.h" +#include "parser/parse.h" #include "history.h" #include #include @@ -193,18 +193,8 @@ static void load_history() char *role; struct HistoryItem *hi; - if (!(doc = xmlParseFile(history_path))) + if (!parse_load(history_path, "openbox_history", &doc, &node)) return; - if (!(node = xmlDocGetRootElement(doc))) { - xmlFreeDoc(doc); - doc = NULL; - return; - } - if (xmlStrcasecmp(node->name, (const xmlChar*)"openbox_history")) { - xmlFreeDoc(doc); - doc = NULL; - return; - } node = parse_find_node("entry", node->xmlChildrenNode); while (node) { diff --git a/plugins/placement/placement.c b/plugins/placement/placement.c index dd818970..889168b9 100644 --- a/plugins/placement/placement.c +++ b/plugins/placement/placement.c @@ -3,7 +3,7 @@ #include "kernel/frame.h" #include "kernel/screen.h" #include "kernel/openbox.h" -#include "kernel/parse.h" +#include "parser/parse.h" #include "history.h" #include diff --git a/plugins/resistance.c b/plugins/resistance.c deleted file mode 100644 index ee6f6e1e..00000000 --- a/plugins/resistance.c +++ /dev/null @@ -1,274 +0,0 @@ -#include "kernel/dispatch.h" -#include "kernel/client.h" -#include "kernel/frame.h" -#include "kernel/parse.h" -#include "kernel/stacking.h" -#include "kernel/screen.h" -#include - -static int resistance; -static gboolean resist_windows; - -static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d) -{ - xmlNodePtr n; - - if ((n = parse_find_node("strength", node))) - resistance = parse_int(doc, n); - if ((n = parse_find_node("windows", node))) - resist_windows = parse_bool(doc, n); -} - -void plugin_setup_config() -{ - resistance = 10; - resist_windows = TRUE; - - parse_register("resistance", parse_xml, NULL); -} - -static void resist_move(Client *c, int *x, int *y) -{ - GList *it; - Rect *area; - int l, t, r, b; /* requested edges */ - int al, at, ar, ab; /* screen area edges */ - int cl, ct, cr, cb; /* current edges */ - int w, h; /* current size */ - Client *snapx = NULL, *snapy = NULL; - - w = c->frame->area.width; - h = c->frame->area.height; - - l = *x; - t = *y; - r = l + w - 1; - b = t + h - 1; - - cl = c->frame->area.x; - ct = c->frame->area.y; - cr = cl + c->frame->area.width - 1; - cb = ct + c->frame->area.height - 1; - - /* snap to other clients */ - if (resist_windows) - for (it = stacking_list; it != NULL; it = it->next) { - Client *target; - int tl, tt, tr, tb; /* 1 past the target's edges on each side */ - - if (!WINDOW_IS_CLIENT(it->data)) - continue; - target = it->data; - /* don't snap to self or non-visibles */ - if (!target->frame->visible || target == c) continue; - - tl = target->frame->area.x - 1; - tt = target->frame->area.y - 1; - tr = tl + target->frame->area.width + 1; - tb = tt + target->frame->area.height + 1; - - /* snapx and snapy ensure that the window snaps to the top-most - window edge available, without going all the way from - bottom-to-top in the stacking list - */ - if (snapx == NULL) { - if (ct < tb && cb > tt) { - if (cl >= tr && l < tr && l >= tr - resistance) - *x = tr, snapx = target; - else if (cr <= tl && r > tl && r <= tl + resistance) - *x = tl - w + 1, snapx = target; - if (snapx != NULL) { - /* try to corner snap to the window */ - if (ct > tt && t <= tt && t > tt - resistance) - *y = tt + 1, snapy = target; - else if (cb < tb && b >= tb && b < tb + resistance) - *y = tb - h, snapy = target; - } - } - } - if (snapy == NULL) { - if (cl < tr && cr > tl) { - if (ct >= tb && t < tb && t >= tb - resistance) - *y = tb, snapy = target; - else if (cb <= tt && b > tt && b <= tt + resistance) - *y = tt - h + 1, snapy = target; - if (snapy != NULL) { - /* try to corner snap to the window */ - if (cl > tl && l <= tl && l > tl - resistance) - *x = tl + 1, snapx = target; - else if (cr < tr && r >= tr && r < tr + resistance) - *x = tr - w, snapx = target; - } - } - } - - if (snapx && snapy) break; - } - - /* get the screen boundaries */ - area = screen_area(c->desktop); - al = area->x; - at = area->y; - ar = al + area->width - 1; - ab = at + area->height - 1; - - /* snap to screen edges */ - if (cl >= al && l < al && l >= al - resistance) - *x = al; - else if (cr <= ar && r > ar && r <= ar + resistance) - *x = ar - w + 1; - if (ct >= at && t < at && t >= at - resistance) - *y = at; - else if (cb <= ab && b > ab && b < ab + resistance) - *y = ab - h + 1; -} - -static void resist_size(Client *c, int *w, int *h, Corner corn) -{ - GList *it; - Client *target; /* target */ - int l, t, r, b; /* my left, top, right and bottom sides */ - int dlt, drb; /* my destination left/top and right/bottom sides */ - int tl, tt, tr, tb; /* target's left, top, right and bottom bottom sides */ - Rect *area; - int al, at, ar, ab; /* screen boundaries */ - Client *snapx = NULL, *snapy = NULL; - - /* don't snap windows with size increments */ - if (c->size_inc.width > 1 || c->size_inc.height > 1) - return; - - l = c->frame->area.x; - r = l + c->frame->area.width - 1; - t = c->frame->area.y; - b = t + c->frame->area.height - 1; - - /* get the screen boundaries */ - area = screen_area(c->desktop); - al = area->x; - at = area->y; - ar = al + area->width - 1; - ab = at + area->height - 1; - - /* snap to other windows */ - if (resist_windows) { - for (it = stacking_list; it != NULL; it = it->next) { - if (!WINDOW_IS_CLIENT(it->data)) - continue; - target = it->data; - - /* don't snap to invisibles or ourself */ - if (!target->frame->visible || target == c) continue; - - tl = target->frame->area.x; - tr = target->frame->area.x + target->frame->area.width - 1; - tt = target->frame->area.y; - tb = target->frame->area.y + target->frame->area.height - 1; - - if (snapx == NULL) { - /* horizontal snapping */ - if (t < tb && b > tt) { - switch (corn) { - case Corner_TopLeft: - case Corner_BottomLeft: - dlt = l; - drb = r + *w - c->frame->area.width; - if (r < tl && drb >= tl && drb < tl + resistance) - *w = tl - l, snapx = target; - break; - case Corner_TopRight: - case Corner_BottomRight: - dlt = l - *w + c->frame->area.width; - drb = r; - if (l > tr && dlt <= tr && dlt > tr - resistance) - *w = r - tr, snapx = target; - break; - } - } - } - - if (snapy == NULL) { - /* vertical snapping */ - if (l < tr && r > tl) { - switch (corn) { - case Corner_TopLeft: - case Corner_TopRight: - dlt = t; - drb = b + *h - c->frame->area.height; - if (b < tt && drb >= tt && drb < tt + resistance) - *h = tt - t, snapy = target; - break; - case Corner_BottomLeft: - case Corner_BottomRight: - dlt = t - *h + c->frame->area.height; - drb = b; - if (t > tb && dlt <= tb && dlt > tb - resistance) - *h = b - tb, snapy = target; - break; - } - } - } - - /* snapped both ways */ - if (snapx && snapy) break; - } - } - - /* snap to screen edges */ - - /* horizontal snapping */ - switch (corn) { - case Corner_TopLeft: - case Corner_BottomLeft: - dlt = l; - drb = r + *w - c->frame->area.width; - if (r <= ar && drb > ar && drb <= ar + resistance) - *w = ar - l + 1; - break; - case Corner_TopRight: - case Corner_BottomRight: - dlt = l - *w + c->frame->area.width; - drb = r; - if (l >= al && dlt < al && dlt >= al - resistance) - *w = r - al + 1; - break; - } - - /* vertical snapping */ - switch (corn) { - case Corner_TopLeft: - case Corner_TopRight: - dlt = t; - drb = b + *h - c->frame->area.height; - if (b <= ab && drb > ab && drb <= ab + resistance) - *h = ab - t + 1; - break; - case Corner_BottomLeft: - case Corner_BottomRight: - dlt = t - *h + c->frame->area.height; - drb = b; - if (t >= at && dlt < at && dlt >= at - resistance) - *h = b - at + 1; - break; - } -} - -static void event(ObEvent *e, void *foo) -{ - if (e->type == Event_Client_Moving) - resist_move(e->data.c.client, &e->data.c.num[0], &e->data.c.num[1]); - else if (e->type == Event_Client_Resizing) - resist_size(e->data.c.client, &e->data.c.num[0], &e->data.c.num[1], - e->data.c.num[2]); -} - -void plugin_startup() -{ - dispatch_register(Event_Client_Moving | Event_Client_Resizing, - (EventHandler)event, NULL); -} - -void plugin_shutdown() -{ - dispatch_register(0, (EventHandler)event, NULL); -} diff --git a/plugins/resistance/.cvsignore b/plugins/resistance/.cvsignore new file mode 100644 index 00000000..fe97c5fa --- /dev/null +++ b/plugins/resistance/.cvsignore @@ -0,0 +1,8 @@ +.deps +.libs +Makefile +Makefile.in +resistance-config.la +resistance.la +resistance_config_la-resistance_config.lo +resistance_la-resistance.lo diff --git a/plugins/resistance/Makefile.am b/plugins/resistance/Makefile.am new file mode 100644 index 00000000..9f95f947 --- /dev/null +++ b/plugins/resistance/Makefile.am @@ -0,0 +1,32 @@ +plugindir=$(libdir)/openbox/plugins + +CPPFLAGS=$(XFT_CFLAGS) $(GLIB_CFLAGS) $(LIBSN_CFLAGS) $(GL_CFLAGS) \ + $(XML_CFLAGS) @CPPFLAGS@ \ + -DPLUGINDIR=\"$(plugindir)\" + +INCLUDES=-I../.. -I../../tools + +plugin_LTLIBRARIES=resistance.la +if OBCONF +plugin_LTLIBRARIES+=resistance-config.la +endif + +resistance_la_CPPFLAGS=-DG_LOG_DOMAIN=\"Plugin-Resistance\" +resistance_la_LDFLAGS=-module -avoid-version +resistance_la_SOURCES=resistance.c + +if OBCONF +resistance_config_la_CPPFLAGS=-DG_LOG_DOMAIN=\"Plugin-Resistance\" \ + $(GTK_CFLAGS) $(GLADE_CFLAGS) +resistance_config_la_LDFLAGS=-module -avoid-version +resistance_config_la_SOURCES=resistance_config.c +endif + +noinst_HEADERS=resistance.h + +noinst_DATA=resistance.glade resistance.gladep + +MAINTAINERCLEANFILES= Makefile.in + +distclean-local: + $(RM) *\~ *.orig *.rej .\#* diff --git a/plugins/resistance/resistance.c b/plugins/resistance/resistance.c new file mode 100644 index 00000000..91c10c0e --- /dev/null +++ b/plugins/resistance/resistance.c @@ -0,0 +1,275 @@ +#include "kernel/dispatch.h" +#include "kernel/client.h" +#include "kernel/frame.h" +#include "kernel/stacking.h" +#include "kernel/screen.h" +#include "parser/parse.h" +#include "resistance.h" +#include + +static int resistance; +static gboolean resist_windows; + +static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d) +{ + xmlNodePtr n; + + if ((n = parse_find_node("strength", node))) + resistance = parse_int(doc, n); + if ((n = parse_find_node("windows", node))) + resist_windows = parse_bool(doc, n); +} + +void plugin_setup_config() +{ + resistance = DEFAULT_RESISTANCE; + resist_windows = DEFAULT_RESIST_WINDOWS; + + parse_register("resistance", parse_xml, NULL); +} + +static void resist_move(Client *c, int *x, int *y) +{ + GList *it; + Rect *area; + int l, t, r, b; /* requested edges */ + int al, at, ar, ab; /* screen area edges */ + int cl, ct, cr, cb; /* current edges */ + int w, h; /* current size */ + Client *snapx = NULL, *snapy = NULL; + + w = c->frame->area.width; + h = c->frame->area.height; + + l = *x; + t = *y; + r = l + w - 1; + b = t + h - 1; + + cl = c->frame->area.x; + ct = c->frame->area.y; + cr = cl + c->frame->area.width - 1; + cb = ct + c->frame->area.height - 1; + + /* snap to other clients */ + if (resist_windows) + for (it = stacking_list; it != NULL; it = it->next) { + Client *target; + int tl, tt, tr, tb; /* 1 past the target's edges on each side */ + + if (!WINDOW_IS_CLIENT(it->data)) + continue; + target = it->data; + /* don't snap to self or non-visibles */ + if (!target->frame->visible || target == c) continue; + + tl = target->frame->area.x - 1; + tt = target->frame->area.y - 1; + tr = tl + target->frame->area.width + 1; + tb = tt + target->frame->area.height + 1; + + /* snapx and snapy ensure that the window snaps to the top-most + window edge available, without going all the way from + bottom-to-top in the stacking list + */ + if (snapx == NULL) { + if (ct < tb && cb > tt) { + if (cl >= tr && l < tr && l >= tr - resistance) + *x = tr, snapx = target; + else if (cr <= tl && r > tl && r <= tl + resistance) + *x = tl - w + 1, snapx = target; + if (snapx != NULL) { + /* try to corner snap to the window */ + if (ct > tt && t <= tt && t > tt - resistance) + *y = tt + 1, snapy = target; + else if (cb < tb && b >= tb && b < tb + resistance) + *y = tb - h, snapy = target; + } + } + } + if (snapy == NULL) { + if (cl < tr && cr > tl) { + if (ct >= tb && t < tb && t >= tb - resistance) + *y = tb, snapy = target; + else if (cb <= tt && b > tt && b <= tt + resistance) + *y = tt - h + 1, snapy = target; + if (snapy != NULL) { + /* try to corner snap to the window */ + if (cl > tl && l <= tl && l > tl - resistance) + *x = tl + 1, snapx = target; + else if (cr < tr && r >= tr && r < tr + resistance) + *x = tr - w, snapx = target; + } + } + } + + if (snapx && snapy) break; + } + + /* get the screen boundaries */ + area = screen_area(c->desktop); + al = area->x; + at = area->y; + ar = al + area->width - 1; + ab = at + area->height - 1; + + /* snap to screen edges */ + if (cl >= al && l < al && l >= al - resistance) + *x = al; + else if (cr <= ar && r > ar && r <= ar + resistance) + *x = ar - w + 1; + if (ct >= at && t < at && t >= at - resistance) + *y = at; + else if (cb <= ab && b > ab && b < ab + resistance) + *y = ab - h + 1; +} + +static void resist_size(Client *c, int *w, int *h, Corner corn) +{ + GList *it; + Client *target; /* target */ + int l, t, r, b; /* my left, top, right and bottom sides */ + int dlt, drb; /* my destination left/top and right/bottom sides */ + int tl, tt, tr, tb; /* target's left, top, right and bottom bottom sides */ + Rect *area; + int al, at, ar, ab; /* screen boundaries */ + Client *snapx = NULL, *snapy = NULL; + + /* don't snap windows with size increments */ + if (c->size_inc.width > 1 || c->size_inc.height > 1) + return; + + l = c->frame->area.x; + r = l + c->frame->area.width - 1; + t = c->frame->area.y; + b = t + c->frame->area.height - 1; + + /* get the screen boundaries */ + area = screen_area(c->desktop); + al = area->x; + at = area->y; + ar = al + area->width - 1; + ab = at + area->height - 1; + + /* snap to other windows */ + if (resist_windows) { + for (it = stacking_list; it != NULL; it = it->next) { + if (!WINDOW_IS_CLIENT(it->data)) + continue; + target = it->data; + + /* don't snap to invisibles or ourself */ + if (!target->frame->visible || target == c) continue; + + tl = target->frame->area.x; + tr = target->frame->area.x + target->frame->area.width - 1; + tt = target->frame->area.y; + tb = target->frame->area.y + target->frame->area.height - 1; + + if (snapx == NULL) { + /* horizontal snapping */ + if (t < tb && b > tt) { + switch (corn) { + case Corner_TopLeft: + case Corner_BottomLeft: + dlt = l; + drb = r + *w - c->frame->area.width; + if (r < tl && drb >= tl && drb < tl + resistance) + *w = tl - l, snapx = target; + break; + case Corner_TopRight: + case Corner_BottomRight: + dlt = l - *w + c->frame->area.width; + drb = r; + if (l > tr && dlt <= tr && dlt > tr - resistance) + *w = r - tr, snapx = target; + break; + } + } + } + + if (snapy == NULL) { + /* vertical snapping */ + if (l < tr && r > tl) { + switch (corn) { + case Corner_TopLeft: + case Corner_TopRight: + dlt = t; + drb = b + *h - c->frame->area.height; + if (b < tt && drb >= tt && drb < tt + resistance) + *h = tt - t, snapy = target; + break; + case Corner_BottomLeft: + case Corner_BottomRight: + dlt = t - *h + c->frame->area.height; + drb = b; + if (t > tb && dlt <= tb && dlt > tb - resistance) + *h = b - tb, snapy = target; + break; + } + } + } + + /* snapped both ways */ + if (snapx && snapy) break; + } + } + + /* snap to screen edges */ + + /* horizontal snapping */ + switch (corn) { + case Corner_TopLeft: + case Corner_BottomLeft: + dlt = l; + drb = r + *w - c->frame->area.width; + if (r <= ar && drb > ar && drb <= ar + resistance) + *w = ar - l + 1; + break; + case Corner_TopRight: + case Corner_BottomRight: + dlt = l - *w + c->frame->area.width; + drb = r; + if (l >= al && dlt < al && dlt >= al - resistance) + *w = r - al + 1; + break; + } + + /* vertical snapping */ + switch (corn) { + case Corner_TopLeft: + case Corner_TopRight: + dlt = t; + drb = b + *h - c->frame->area.height; + if (b <= ab && drb > ab && drb <= ab + resistance) + *h = ab - t + 1; + break; + case Corner_BottomLeft: + case Corner_BottomRight: + dlt = t - *h + c->frame->area.height; + drb = b; + if (t >= at && dlt < at && dlt >= at - resistance) + *h = b - at + 1; + break; + } +} + +static void event(ObEvent *e, void *foo) +{ + if (e->type == Event_Client_Moving) + resist_move(e->data.c.client, &e->data.c.num[0], &e->data.c.num[1]); + else if (e->type == Event_Client_Resizing) + resist_size(e->data.c.client, &e->data.c.num[0], &e->data.c.num[1], + e->data.c.num[2]); +} + +void plugin_startup() +{ + dispatch_register(Event_Client_Moving | Event_Client_Resizing, + (EventHandler)event, NULL); +} + +void plugin_shutdown() +{ + dispatch_register(0, (EventHandler)event, NULL); +} diff --git a/plugins/resistance/resistance.glade b/plugins/resistance/resistance.glade new file mode 100644 index 00000000..ecb52b0e --- /dev/null +++ b/plugins/resistance/resistance.glade @@ -0,0 +1,109 @@ + + + + + + + + GTK_WINDOW_POPUP + GTK_WIN_POS_NONE + False + True + False + + + + True + False + 0 + + + + True + False + 6 + + + + True + _Strength + True + False + GTK_JUSTIFY_LEFT + False + False + 0.49 + 0.5 + 0 + 0 + resist_strength + + + 0 + False + False + + + + + + True + Set to the amount of resistance to provide when moving or resizing a window past a screen or window edge. A value of 0 disables resistance. + True + 1 + 0 + True + GTK_UPDATE_ALWAYS + False + False + 1 0 30 1 10 10 + + + 0 + False + True + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + True + Resist other _Windows + True + GTK_RELIEF_NORMAL + False + False + True + + + 0 + False + False + + + + + 0 + True + True + + + + + + + diff --git a/plugins/resistance/resistance.gladep b/plugins/resistance/resistance.gladep new file mode 100644 index 00000000..1951d46b --- /dev/null +++ b/plugins/resistance/resistance.gladep @@ -0,0 +1,8 @@ + + + + + resistance + resistance + FALSE + diff --git a/plugins/resistance/resistance.h b/plugins/resistance/resistance.h new file mode 100644 index 00000000..5bec224b --- /dev/null +++ b/plugins/resistance/resistance.h @@ -0,0 +1,2 @@ +#define DEFAULT_RESISTANCE 10 +#define DEFAULT_RESIST_WINDOWS TRUE diff --git a/plugins/resistance/resistance_config.c b/plugins/resistance/resistance_config.c new file mode 100644 index 00000000..1384fe3f --- /dev/null +++ b/plugins/resistance/resistance_config.c @@ -0,0 +1,64 @@ +#include "plugins/obconf_interface.h" +#include "parser/parse.h" +#include "resistance.h" +#include +#include + +static GtkWidget *conf_widget; +static GtkCheckButton *conf_resist_windows; +static GtkSpinButton *conf_resist_strength; +static gboolean conf_edited = FALSE; + +int plugin_interface_version() { return OBCONF_INTERFACE_VERSION; } + +char *plugin_name() { return "Resistance"; } +char *plugin_plugin_name() { return "resistance"; } +void plugin_icon() {} + +GtkWidget *plugin_toplevel_widget() { return conf_widget; } + +gboolean plugin_edited() { return conf_edited; } + +void plugin_load(xmlDocPtr doc, xmlNodePtr root) +{ + xmlNodePtr node, n; + + gtk_spin_button_set_value(conf_resist_strength, DEFAULT_RESISTANCE); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(conf_resist_windows), + DEFAULT_RESIST_WINDOWS); + + node = parse_find_node("resistance", root); + while (node) { + if ((n = parse_find_node("strength", node))) + gtk_spin_button_set_value(conf_resist_strength, + parse_int(doc, n)); + if ((n = parse_find_node("windows", node))) + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON(conf_resist_windows), + parse_bool(doc, n)); + + node = parse_find_node("resistance", node->next); + } +} + +void plugin_save(xmlDocPtr doc, xmlNodePtr root) +{ +} + +void plugin_startup() +{ + GladeXML *xml; + + xml = glade_xml_new("obconf.glade", NULL, NULL); + glade_xml_signal_autoconnect(xml); + + conf_widget = glade_xml_get_widget(xml, "resistwindow"); + conf_resist_strength = + GTK_SPIN_BUTTON(glade_xml_get_widget(xml, "resist_strength")); + conf_resist_windows = + GTK_CHECK_BUTTON(glade_xml_get_widget(xml, "resist_windows")); +} + +void plugin_shutdown() +{ +} -- cgit v1.2.3