From 35ed95fe18e9b8d7a79f79f4fd7466a2b46435e3 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 12 Aug 2003 19:57:04 +0000 Subject: [PATCH] move the resistance plugin into the kernel. dont resist when move/resizing with the keyboard, only when doing it with the mouse. --- Makefile.am | 39 +----- openbox/config.c | 20 +++ openbox/config.h | 5 + openbox/moveresize.c | 25 ++-- openbox/plugin.c | 1 - .../resistance.c => openbox/resist.c | 132 +++++++----------- openbox/resist.h | 11 ++ plugins/resistance/.cvsignore | 7 - plugins/resistance/Makefile | 4 - plugins/resistance/resistance.glade | 109 --------------- plugins/resistance/resistance.gladep | 8 -- plugins/resistance/resistance.h | 1 - plugins/resistance/resistance_config.c | 64 --------- 13 files changed, 103 insertions(+), 323 deletions(-) rename plugins/resistance/resistance.c => openbox/resist.c (65%) create mode 100644 openbox/resist.h delete mode 100644 plugins/resistance/.cvsignore delete mode 100644 plugins/resistance/Makefile delete mode 100644 plugins/resistance/resistance.glade delete mode 100644 plugins/resistance/resistance.gladep delete mode 100644 plugins/resistance/resistance.h delete mode 100644 plugins/resistance/resistance_config.c diff --git a/Makefile.am b/Makefile.am index b4aeea19..0b485927 100644 --- a/Makefile.am +++ b/Makefile.am @@ -26,7 +26,6 @@ bin_PROGRAMS = \ tools/kdetrayproxy/kdetrayproxy plugin_LTLIBRARIES = \ - plugins/resistance/resistance.la \ plugins/placement/placement.la \ plugins/menu/timed_menu.la \ plugins/menu/fifo_menu.la \ @@ -36,9 +35,6 @@ plugin_LTLIBRARIES = \ if OBCONF bin_PROGRAMS += \ tools/obconf/obconf - -#plugin_LTLIBRARIES += \ -# plugins/resistance/resistance-config.la endif ## render ## @@ -176,6 +172,8 @@ kernel_openbox_SOURCES = \ kernel/popup.h \ kernel/prop.c \ kernel/prop.h \ + kernel/resist.c \ + kernel/resist.h \ kernel/screen.c \ kernel/screen.h \ kernel/session.c \ @@ -194,39 +192,6 @@ kernel_openbox_SOURCES = \ kernel/xerror.h \ plugins/interface.h -## plugins/resistance ## - -plugins_resistance_resistance_la_CPPFLAGS = \ - $(XFT_CFLAGS) \ - $(GLIB_CFLAGS) \ - $(LIBSN_CFLAGS) \ - $(XML_CFLAGS) \ - -DPLUGINDIR=\"$(plugindir)\" \ - -DG_LOG_DOMAIN=\"Plugin-Resistance\" -plugins_resistance_resistance_la_LDFLAGS = \ - -module \ - -avoid-version -plugins_resistance_resistance_la_SOURCES = \ - plugins/resistance/resistance.c \ - plugins/resistance/resistance.h - -if OBCONF -plugins_resistance_resistance_config_la_CPPFLAGS = \ - $(XFT_CFLAGS) \ - $(GLIB_CFLAGS) \ - $(LIBSN_CFLAGS) \ - $(XML_CFLAGS) \ - -DPLUGINDIR=\"$(plugindir)\" \ - -DG_LOG_DOMAIN=\"Plugin-Resistance\" \ - $(GTK_CFLAGS) \ - $(GLADE_CFLAGS) -plugins_resistance_resistance_config_la_LDFLAGS = \ - -module \ - -avoid-version -plugins_resistance_resistance_config_la_SOURCES = \ - plugins/resistance/resistance_config.c -endif - ## plugins/placement ## plugins_placement_placement_la_CPPFLAGS = \ diff --git a/openbox/config.c b/openbox/config.c index a3c236fc..d03ba031 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -38,6 +38,9 @@ gint config_mouse_dclicktime; gchar *config_menu_path; +gint config_resist_win; +gint config_resist_edge; + gchar *expand_tilde(const gchar *f) { if (!f) @@ -348,6 +351,18 @@ static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, void *d) } } +static void parse_resistance(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, + void *d) +{ + xmlNodePtr n; + + node = node->xmlChildrenNode; + if ((n = parse_find_node("strength", node))) + config_resist_win = parse_int(doc, n); + if ((n = parse_find_node("screen_edge_strength", node))) + config_resist_edge = parse_int(doc, n); +} + void config_startup(ObParseInst *i) { config_focus_new = TRUE; @@ -395,6 +410,11 @@ void config_startup(ObParseInst *i) parse_register(i, "mouse", parse_mouse, NULL); + config_resist_win = 10; + config_resist_edge = 10; + + parse_register(i, "resistance", parse_resistance, NULL); + config_menu_path = NULL; parse_register(i, "menu", parse_menu, NULL); diff --git a/openbox/config.h b/openbox/config.h index ab1b7493..98a5340b 100644 --- a/openbox/config.h +++ b/openbox/config.h @@ -67,6 +67,11 @@ extern gint config_mouse_threshold; double-click */ extern gint config_mouse_dclicktime; +/*! Number of pixels to resist while crossing another window's edge */ +gint config_resist_win; +/*! Number of pixels to resist while crossing a screen's edge */ +gint config_resist_edge; + /*! User-specified path to the menu file */ extern gchar *config_menu_path; diff --git a/openbox/moveresize.c b/openbox/moveresize.c index 564bf711..14abd5cd 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -6,6 +6,7 @@ #include "frame.h" #include "dispatch.h" #include "openbox.h" +#include "resist.h" #include "popup.h" #include "config.h" #include "render/render.h" @@ -72,12 +73,8 @@ void moveresize_start(ObClient *c, int x, int y, guint b, guint32 cnr) start_ch = c->area.height; start_x = x; start_y = y; - if (corner == prop_atoms.net_wm_moveresize_move_keyboard || - corner == prop_atoms.net_wm_moveresize_size_keyboard) - button = 0; /* mouse can't end it without being pressed first */ - else - button = b; corner = cnr; + button = b; if (corner == prop_atoms.net_wm_moveresize_move || corner == prop_atoms.net_wm_moveresize_move_keyboard) { @@ -145,10 +142,13 @@ void moveresize_end(gboolean cancel) moveresize_client = NULL; } -static void do_move() +static void do_move(gboolean resist) { Rect *a; + if (resist) + resist_move(moveresize_client, &cur_x, &cur_y); + dispatch_move(moveresize_client, &cur_x, &cur_y); /* get where the client should be */ @@ -164,7 +164,7 @@ static void do_move() moveresize_client->frame->area.y - a->y); } -static void do_resize() +static void do_resize(gboolean resist) { /* dispatch_resize needs the frame size */ cur_x += moveresize_client->frame->size.left + @@ -172,6 +172,9 @@ static void do_resize() cur_y += moveresize_client->frame->size.top + moveresize_client->frame->size.bottom; + if (resist) + resist_size(moveresize_client, &cur_x, &cur_y, lockcorner); + dispatch_resize(moveresize_client, &cur_x, &cur_y, lockcorner); cur_x -= moveresize_client->frame->size.left + @@ -207,7 +210,7 @@ void moveresize_event(XEvent *e) if (moving) { cur_x = start_cx + e->xmotion.x_root - start_x; cur_y = start_cy + e->xmotion.y_root - start_y; - do_move(); + do_move(TRUE); } else { if (corner == prop_atoms.net_wm_moveresize_size_topleft) { cur_x = start_cw - (e->xmotion.x_root - start_x); @@ -250,7 +253,7 @@ void moveresize_event(XEvent *e) } else g_assert_not_reached(); - do_resize(); + do_resize(TRUE); } } else if (e->type == KeyPress) { if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) @@ -269,7 +272,7 @@ void moveresize_event(XEvent *e) cur_y -= MAX(4, moveresize_client->size_inc.height); else return; - do_resize(); + do_resize(FALSE); } else if (corner == prop_atoms.net_wm_moveresize_move_keyboard) { if (e->xkey.keycode == ob_keycode(OB_KEY_RIGHT)) cur_x += 4; @@ -281,7 +284,7 @@ void moveresize_event(XEvent *e) cur_y -= 4; else return; - do_move(); + do_move(FALSE); } } } diff --git a/openbox/plugin.c b/openbox/plugin.c index 9b8e2d59..18c55064 100644 --- a/openbox/plugin.c +++ b/openbox/plugin.c @@ -158,7 +158,6 @@ void plugin_loadall(ObParseInst *i) if (io == NULL) { /* load the default plugins */ plugin_open("placement", i); - plugin_open("resistance", i); /* XXX rm me when the parser loads me magically */ plugin_open("client_menu", i); diff --git a/plugins/resistance/resistance.c b/openbox/resist.c similarity index 65% rename from plugins/resistance/resistance.c rename to openbox/resist.c index f5e68052..a41c5a9d 100644 --- a/plugins/resistance/resistance.c +++ b/openbox/resist.c @@ -1,42 +1,22 @@ -#include "kernel/dispatch.h" -#include "kernel/client.h" -#include "kernel/frame.h" -#include "kernel/stacking.h" -#include "kernel/screen.h" +#include "dispatch.h" +#include "client.h" +#include "frame.h" +#include "stacking.h" +#include "screen.h" +#include "config.h" #include "parser/parse.h" -#include "resistance.h" -#include - -static int win_resistance; -static int edge_resistance; - -static void parse_xml(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, void *d) -{ - xmlNodePtr n; - - node = node->xmlChildrenNode; - if ((n = parse_find_node("strength", node))) - win_resistance = parse_int(doc, n); - if ((n = parse_find_node("screen_edge_strength", node))) - edge_resistance = parse_int(doc, n); -} - -void plugin_setup_config(ObParseInst *i) -{ - win_resistance = edge_resistance = DEFAULT_RESISTANCE; - parse_register(i, "resistance", parse_xml, NULL); -} +#include -static void resist_move(ObClient *c, int *x, int *y) +void resist_move(ObClient *c, gint *x, gint *y) { GList *it; Rect *area; guint i; - 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 */ + gint l, t, r, b; /* requested edges */ + gint al, at, ar, ab; /* screen area edges */ + gint cl, ct, cr, cb; /* current edges */ + gint w, h; /* current size */ ObClient *snapx = NULL, *snapy = NULL; w = c->frame->area.width; @@ -53,7 +33,7 @@ static void resist_move(ObClient *c, int *x, int *y) cb = ct + c->frame->area.height - 1; /* snap to other clients */ - if (win_resistance) + if (config_resist_win) for (it = stacking_list; it != NULL; it = it->next) { ObClient *target; int tl, tt, tr, tb; /* 1 past the target's edges on each side */ @@ -75,30 +55,36 @@ static void resist_move(ObClient *c, int *x, int *y) */ if (snapx == NULL) { if (ct < tb && cb > tt) { - if (cl >= tr && l < tr && l >= tr - win_resistance) + if (cl >= tr && l < tr && l >= tr - config_resist_win) *x = tr, snapx = target; - else if (cr <= tl && r > tl && r <= tl + win_resistance) + else if (cr <= tl && r > tl && + r <= tl + config_resist_win) *x = tl - w + 1, snapx = target; if (snapx != NULL) { /* try to corner snap to the window */ - if (ct > tt && t <= tt && t > tt - win_resistance) + if (ct > tt && t <= tt && + t > tt - config_resist_win) *y = tt + 1, snapy = target; - else if (cb < tb && b >= tb && b < tb + win_resistance) + else if (cb < tb && b >= tb && + b < tb + config_resist_win) *y = tb - h, snapy = target; } } } if (snapy == NULL) { if (cl < tr && cr > tl) { - if (ct >= tb && t < tb && t >= tb - win_resistance) + if (ct >= tb && t < tb && t >= tb - config_resist_win) *y = tb, snapy = target; - else if (cb <= tt && b > tt && b <= tt + win_resistance) + else if (cb <= tt && b > tt && + b <= tt + config_resist_win) *y = tt - h + 1, snapy = target; if (snapy != NULL) { /* try to corner snap to the window */ - if (cl > tl && l <= tl && l > tl - win_resistance) + if (cl > tl && l <= tl && + l > tl - config_resist_win) *x = tl + 1, snapx = target; - else if (cr < tr && r >= tr && r < tr + win_resistance) + else if (cr < tr && r >= tr && + r < tr + config_resist_win) *x = tr - w, snapx = target; } } @@ -108,7 +94,7 @@ static void resist_move(ObClient *c, int *x, int *y) } /* get the screen boundaries */ - if (edge_resistance) { + if (config_resist_edge) { for (i = 0; i < screen_num_monitors; ++i) { area = screen_area_monitor(c->desktop, i); @@ -121,27 +107,27 @@ static void resist_move(ObClient *c, int *x, int *y) ab = at + area->height - 1; /* snap to screen edges */ - if (cl >= al && l < al && l >= al - edge_resistance) + if (cl >= al && l < al && l >= al - config_resist_edge) *x = al; - else if (cr <= ar && r > ar && r <= ar + edge_resistance) + else if (cr <= ar && r > ar && r <= ar + config_resist_edge) *x = ar - w + 1; - if (ct >= at && t < at && t >= at - edge_resistance) + if (ct >= at && t < at && t >= at - config_resist_edge) *y = at; - else if (cb <= ab && b > ab && b < ab + edge_resistance) + else if (cb <= ab && b > ab && b < ab + config_resist_edge) *y = ab - h + 1; } } } -static void resist_size(ObClient *c, int *w, int *h, ObCorner corn) +void resist_size(ObClient *c, gint *w, gint *h, ObCorner corn) { GList *it; ObClient *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 */ + gint l, t, r, b; /* my left, top, right and bottom sides */ + gint dlt, drb; /* my destination left/top and right/bottom sides */ + gint tl, tt, tr, tb; /* target's left, top, right and bottom bottom sides*/ Rect *area; - int al, at, ar, ab; /* screen boundaries */ + gint al, at, ar, ab; /* screen boundaries */ ObClient *snapx = NULL, *snapy = NULL; /* don't snap windows with size increments */ @@ -161,7 +147,7 @@ static void resist_size(ObClient *c, int *w, int *h, ObCorner corn) ab = at + area->height - 1; /* snap to other windows */ - if (win_resistance) { + if (config_resist_win) { for (it = stacking_list; it != NULL; it = it->next) { if (!WINDOW_IS_CLIENT(it->data)) continue; @@ -183,14 +169,16 @@ static void resist_size(ObClient *c, int *w, int *h, ObCorner corn) case OB_CORNER_BOTTOMLEFT: dlt = l; drb = r + *w - c->frame->area.width; - if (r < tl && drb >= tl && drb < tl + win_resistance) + if (r < tl && drb >= tl && + drb < tl + config_resist_win) *w = tl - l, snapx = target; break; case OB_CORNER_TOPRIGHT: case OB_CORNER_BOTTOMRIGHT: dlt = l - *w + c->frame->area.width; drb = r; - if (l > tr && dlt <= tr && dlt > tr - win_resistance) + if (l > tr && dlt <= tr && + dlt > tr - config_resist_win) *w = r - tr, snapx = target; break; } @@ -205,14 +193,16 @@ static void resist_size(ObClient *c, int *w, int *h, ObCorner corn) case OB_CORNER_TOPRIGHT: dlt = t; drb = b + *h - c->frame->area.height; - if (b < tt && drb >= tt && drb < tt + win_resistance) + if (b < tt && drb >= tt && + drb < tt + config_resist_win) *h = tt - t, snapy = target; break; case OB_CORNER_BOTTOMLEFT: case OB_CORNER_BOTTOMRIGHT: dlt = t - *h + c->frame->area.height; drb = b; - if (t > tb && dlt <= tb && dlt > tb - win_resistance) + if (t > tb && dlt <= tb && + dlt > tb - config_resist_win) *h = b - tb, snapy = target; break; } @@ -226,21 +216,21 @@ static void resist_size(ObClient *c, int *w, int *h, ObCorner corn) /* snap to screen edges */ - if (edge_resistance) { + if (config_resist_edge) { /* horizontal snapping */ switch (corn) { case OB_CORNER_TOPLEFT: case OB_CORNER_BOTTOMLEFT: dlt = l; drb = r + *w - c->frame->area.width; - if (r <= ar && drb > ar && drb <= ar + edge_resistance) + if (r <= ar && drb > ar && drb <= ar + config_resist_edge) *w = ar - l + 1; break; case OB_CORNER_TOPRIGHT: case OB_CORNER_BOTTOMRIGHT: dlt = l - *w + c->frame->area.width; drb = r; - if (l >= al && dlt < al && dlt >= al - edge_resistance) + if (l >= al && dlt < al && dlt >= al - config_resist_edge) *w = r - al + 1; break; } @@ -251,36 +241,16 @@ static void resist_size(ObClient *c, int *w, int *h, ObCorner corn) case OB_CORNER_TOPRIGHT: dlt = t; drb = b + *h - c->frame->area.height; - if (b <= ab && drb > ab && drb <= ab + edge_resistance) + if (b <= ab && drb > ab && drb <= ab + config_resist_edge) *h = ab - t + 1; break; case OB_CORNER_BOTTOMLEFT: case OB_CORNER_BOTTOMRIGHT: dlt = t - *h + c->frame->area.height; drb = b; - if (t >= at && dlt < at && dlt >= at - edge_resistance) + if (t >= at && dlt < at && dlt >= at - config_resist_edge) *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/openbox/resist.h b/openbox/resist.h new file mode 100644 index 00000000..4031ac24 --- /dev/null +++ b/openbox/resist.h @@ -0,0 +1,11 @@ +#ifndef ob__resist_h +#define ob__resist_h + +struct _ObClient; + +#include + +void resist_move(struct _ObClient *c, gint *x, gint *y); +void resist_size(struct _ObClient *c, gint *w, gint *h, ObCorner corn); + +#endif diff --git a/plugins/resistance/.cvsignore b/plugins/resistance/.cvsignore deleted file mode 100644 index 4b63246e..00000000 --- a/plugins/resistance/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -.libs -resistance-config.la -resistance.la -.dirstamp -plugins_resistance_resistance_la-resistance.lo -plugins_resistance_resistance_config_la-resistance_config.lo diff --git a/plugins/resistance/Makefile b/plugins/resistance/Makefile deleted file mode 100644 index cfc46539..00000000 --- a/plugins/resistance/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -all clean install: - $(MAKE) -C ../.. -$(MAKEFLAGS) $@ - -.PHONY: all clean install diff --git a/plugins/resistance/resistance.glade b/plugins/resistance/resistance.glade deleted file mode 100644 index ecb52b0e..00000000 --- a/plugins/resistance/resistance.glade +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - 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 deleted file mode 100644 index 1951d46b..00000000 --- a/plugins/resistance/resistance.gladep +++ /dev/null @@ -1,8 +0,0 @@ - - - - - resistance - resistance - FALSE - diff --git a/plugins/resistance/resistance.h b/plugins/resistance/resistance.h deleted file mode 100644 index 3479389f..00000000 --- a/plugins/resistance/resistance.h +++ /dev/null @@ -1 +0,0 @@ -#define DEFAULT_RESISTANCE 10 diff --git a/plugins/resistance/resistance_config.c b/plugins/resistance/resistance_config.c deleted file mode 100644 index 1384fe3f..00000000 --- a/plugins/resistance/resistance_config.c +++ /dev/null @@ -1,64 +0,0 @@ -#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() -{ -} -- 2.39.2