kill non-opaque move/resize

add an option for redrawing/resizing the client window while resizing, when disabled the client is not touched until the resize is complete.
This commit is contained in:
Dana Jansens 2003-08-03 17:47:10 +00:00
parent 9ba3f7d0fd
commit 26827d875a
5 changed files with 16 additions and 106 deletions

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- Do not edit this file, it will be overwritten on install. Edit the file <!-- Do not edit this file, it will be overwritten on install. Copy the file
in $HOME/.openbox/ instead. --> to $HOME/.openbox/ instead. -->
<openbox_config> <openbox_config>
@ -38,10 +38,9 @@
</names> </names>
</desktops> </desktops>
<moveresize> <resize>
<opaqueMove>yes</opaqueMove> <drawContents>yes</drawContents>
<opaqueResize>yes</opaqueResize> </resize>
</moveresize>
<dock> <dock>
<position>topleft</position> <position>topleft</position>

View file

@ -1888,9 +1888,9 @@ void client_configure_full(ObClient *self, ObCorner anchor,
/* for app-requested resizes, always resize if 'resized' is true. /* for app-requested resizes, always resize if 'resized' is true.
for user-requested ones, only resize if final is true, or when for user-requested ones, only resize if final is true, or when
resizing in opaque mode */ resizing in redraw mode */
if ((!user && resized) || if ((!user && resized) ||
(user && (final || (resized && config_opaque_resize)))) (user && (final || (resized && config_redraw_resize))))
XResizeWindow(ob_display, self->window, w, h); XResizeWindow(ob_display, self->window, w, h);
/* move/resize the frame to match the request */ /* move/resize the frame to match the request */

View file

@ -14,8 +14,7 @@ gchar *config_title_layout;
int config_desktops_num; int config_desktops_num;
GSList *config_desktops_names; GSList *config_desktops_names;
gboolean config_opaque_move; gboolean config_redraw_resize;
gboolean config_opaque_resize;
ObStackingLayer config_dock_layer; ObStackingLayer config_dock_layer;
gboolean config_dock_floating; gboolean config_dock_floating;
@ -86,16 +85,14 @@ static void parse_desktops(xmlDocPtr doc, xmlNodePtr node, void *d)
} }
} }
static void parse_moveresize(xmlDocPtr doc, xmlNodePtr node, void *d) static void parse_resize(xmlDocPtr doc, xmlNodePtr node, void *d)
{ {
xmlNodePtr n; xmlNodePtr n;
node = node->xmlChildrenNode; node = node->xmlChildrenNode;
if ((n = parse_find_node("opaqueMove", node))) if ((n = parse_find_node("drawContents", node)))
config_opaque_move = parse_bool(doc, n); config_redraw_resize = parse_bool(doc, n);
if ((n = parse_find_node("opaqueResize", node)))
config_opaque_resize = parse_bool(doc, n);
} }
static void parse_dock(xmlDocPtr doc, xmlNodePtr node, void *d) static void parse_dock(xmlDocPtr doc, xmlNodePtr node, void *d)
@ -179,10 +176,9 @@ void config_startup()
parse_register("desktops", parse_desktops, NULL); parse_register("desktops", parse_desktops, NULL);
config_opaque_move = TRUE; config_redraw_resize = TRUE;
config_opaque_resize = TRUE;
parse_register("moveresize", parse_moveresize, NULL); parse_register("resize", parse_resize, NULL);
config_dock_layer = OB_STACKING_LAYER_TOP; config_dock_layer = OB_STACKING_LAYER_TOP;
config_dock_pos = OB_DIRECTION_NORTHEAST; config_dock_pos = OB_DIRECTION_NORTHEAST;

View file

@ -18,12 +18,9 @@ extern gboolean config_focus_last_on_desktop;
extern gboolean config_focus_popup; extern gboolean config_focus_popup;
/*! The number of slits to create /*! The number of slits to create
extern int config_slit_number;*/ extern int config_slit_number;*/
/*! When true windows are moved opaquely, when false just an outline is shown /*! When true windows' contents are refreshed while they are resized; otherwise
while they are moved */ they are not updated until the resize is complete */
extern gboolean config_opaque_move; extern gboolean config_redraw_resize;
/*! When true windows are resize opaquely, when false just an outline is shown
while they are resize */
extern gboolean config_opaque_resize;
/*! The stacking layer the dock will reside in */ /*! The stacking layer the dock will reside in */
extern ObStackingLayer config_dock_layer; extern ObStackingLayer config_dock_layer;

View file

@ -26,9 +26,6 @@ static guint32 corner;
static ObCorner lockcorner; static ObCorner lockcorner;
static Popup *popup = NULL; static Popup *popup = NULL;
static InternalWindow opaque_window = { { Window_Internal }, None };
static GC opaque_gc = None;
static gboolean first_draw = FALSE;
#define POPUP_X (10) #define POPUP_X (10)
#define POPUP_Y (10) #define POPUP_Y (10)
@ -36,37 +33,17 @@ static gboolean first_draw = FALSE;
void moveresize_startup() void moveresize_startup()
{ {
XSetWindowAttributes attrib; XSetWindowAttributes attrib;
XGCValues gcv;
popup = popup_new(FALSE); popup = popup_new(FALSE);
popup_size_to_string(popup, "W: 0000 W: 0000"); popup_size_to_string(popup, "W: 0000 W: 0000");
attrib.save_under = True; attrib.save_under = True;
opaque_window.win = XCreateWindow(ob_display,
RootWindow(ob_display, ob_screen),
0, 0, 1, 1, 0,
RrDepth(ob_rr_inst), InputOutput,
RrVisual(ob_rr_inst),
CWSaveUnder, &attrib);
stacking_add(INTERNAL_AS_WINDOW(&opaque_window));
stacking_raise(INTERNAL_AS_WINDOW(&opaque_window));
/* a GC to invert stuff */
gcv.function = GXxor;
gcv.line_width = ob_rr_theme->bwidth;
gcv.foreground = (WhitePixel(ob_display, ob_screen) ^
BlackPixel(ob_display, ob_screen));
opaque_gc = XCreateGC(ob_display, opaque_window.win,
GCFunction | GCForeground | GCLineWidth, &gcv);
} }
void moveresize_shutdown() void moveresize_shutdown()
{ {
popup_free(popup); popup_free(popup);
popup = NULL; popup = NULL;
stacking_remove(&opaque_window);
XFreeGC(ob_display, opaque_gc);
XDestroyWindow(ob_display, opaque_window.win);
} }
static void popup_coords(char *format, int a, int b) static void popup_coords(char *format, int a, int b)
@ -85,7 +62,6 @@ static void popup_coords(char *format, int a, int b)
void moveresize_start(ObClient *c, int x, int y, guint b, guint32 cnr) void moveresize_start(ObClient *c, int x, int y, guint b, guint32 cnr)
{ {
ObCursor cur; ObCursor cur;
Rect *a;
g_assert(!moveresize_in_progress); g_assert(!moveresize_in_progress);
@ -143,27 +119,10 @@ void moveresize_start(ObClient *c, int x, int y, guint b, guint32 cnr)
grab_pointer(TRUE, cur); grab_pointer(TRUE, cur);
grab_keyboard(TRUE); grab_keyboard(TRUE);
a = screen_physical_area();
XMoveResizeWindow(ob_display, opaque_window.win,
a->x, a->y, a->width, a->height);
stacking_raise(INTERNAL_AS_WINDOW(&opaque_window));
if (corner == prop_atoms.net_wm_moveresize_move ||
corner == prop_atoms.net_wm_moveresize_move_keyboard) {
if (!config_opaque_move)
XMapWindow(ob_display, opaque_window.win);
} else {
if (!config_opaque_resize)
XMapWindow(ob_display, opaque_window.win);
}
first_draw = TRUE;
} }
void moveresize_end(gboolean cancel) void moveresize_end(gboolean cancel)
{ {
XUnmapWindow(ob_display, opaque_window.win);
grab_keyboard(FALSE); grab_keyboard(FALSE);
grab_pointer(FALSE, None); grab_pointer(FALSE, None);
@ -188,35 +147,12 @@ void moveresize_end(gboolean cancel)
static void do_move() static void do_move()
{ {
int oldx, oldy, oldw, oldh;
dispatch_move(moveresize_client, &cur_x, &cur_y); dispatch_move(moveresize_client, &cur_x, &cur_y);
oldx = moveresize_client->frame->area.x;
oldy = moveresize_client->frame->area.y;
oldw = moveresize_client->frame->area.width;
oldh = moveresize_client->frame->area.height;
/* get where the client should be */ /* get where the client should be */
frame_frame_gravity(moveresize_client->frame, &cur_x, &cur_y); frame_frame_gravity(moveresize_client->frame, &cur_x, &cur_y);
client_configure(moveresize_client, OB_CORNER_TOPLEFT, cur_x, cur_y, client_configure(moveresize_client, OB_CORNER_TOPLEFT, cur_x, cur_y,
start_cw, start_ch, TRUE, FALSE); start_cw, start_ch, TRUE, FALSE);
/* draw the new one */
if (moveresize_client->frame->area.x != oldx ||
moveresize_client->frame->area.y != oldy ||
moveresize_client->frame->area.width != oldw ||
moveresize_client->frame->area.height != oldh) {
if (!config_opaque_move)
XDrawRectangle(ob_display, opaque_window.win, opaque_gc,
moveresize_client->frame->area.x,
moveresize_client->frame->area.y,
moveresize_client->frame->area.width - 1,
moveresize_client->frame->area.height - 1);
/* erase the old one */
if (!config_opaque_move && !first_draw)
XDrawRectangle(ob_display, opaque_window.win, opaque_gc,
oldx, oldy, oldw - 1, oldh - 1);
first_draw = FALSE;
}
/* this would be better with a fixed width font ... XXX can do it better /* this would be better with a fixed width font ... XXX can do it better
if there are 2 text boxes */ if there are 2 text boxes */
@ -226,8 +162,6 @@ static void do_move()
static void do_resize() static void do_resize()
{ {
int oldx, oldy, oldw, oldh;
/* dispatch_resize needs the frame size */ /* dispatch_resize needs the frame size */
cur_x += moveresize_client->frame->size.left + cur_x += moveresize_client->frame->size.left +
moveresize_client->frame->size.right; moveresize_client->frame->size.right;
@ -241,25 +175,9 @@ static void do_resize()
cur_y -= moveresize_client->frame->size.top + cur_y -= moveresize_client->frame->size.top +
moveresize_client->frame->size.bottom; moveresize_client->frame->size.bottom;
oldx = moveresize_client->frame->area.x;
oldy = moveresize_client->frame->area.y;
oldw = moveresize_client->frame->area.width;
oldh = moveresize_client->frame->area.height;
client_configure(moveresize_client, lockcorner, client_configure(moveresize_client, lockcorner,
moveresize_client->area.x, moveresize_client->area.y, moveresize_client->area.x, moveresize_client->area.y,
cur_x, cur_y, TRUE, FALSE); cur_x, cur_y, TRUE, FALSE);
/* draw the new one */
if (!config_opaque_resize)
XDrawRectangle(ob_display, opaque_window.win, opaque_gc,
moveresize_client->frame->area.x,
moveresize_client->frame->area.y,
moveresize_client->frame->area.width - 1,
moveresize_client->frame->area.height - 1);
/* erase the old one */
if (!config_opaque_resize && !first_draw)
XDrawRectangle(ob_display, opaque_window.win, opaque_gc,
oldx, oldy, oldw - 1, oldh - 1);
first_draw = FALSE;
/* this would be better with a fixed width font ... XXX can do it better /* this would be better with a fixed width font ... XXX can do it better
if there are 2 text boxes */ if there are 2 text boxes */