|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: M T
Length: 6739 (0x1a53)
Types: TextFile
Names: »Move.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/xwm/Move.c«
#include <X/mit-copyright.h>
/* Copyright Massachusetts Institute of Technology 1985 */
/*
* Move - Window movement subroutine for the X Window System window
* manager (xwm).
*
* File: Move.c
*/
#ifndef lint
static char *rcsid_Move_c = "$Header: Move.c,v 10.3 86/02/01 16:09:58 tony Rel $";
#endif
#include "xwm.h"
Move(window, x, y)
Window window;
int x;
int y;
{
register int prev_x; /* Previous event window X location. */
register int prev_y; /* Previous event window Y location. */
register WindowInfo window_info; /* Event window information. */
int cur_x; /* Current event window X location. */
int cur_y; /* Current event window Y location. */
int ulx, uly; /* Event window upper left X and Y. */
int lrx, lry; /* Event window lower right X and Y. */
int init_ulx, init_uly; /* Init window upper left X and Y. */
int init_lrx, init_lry; /* Init window lower right X and Y. */
int status; /* Routine call status. */
int num_vectors; /* Number of vectors in box. */
Window sub_window; /* Query mouse event sub-window. */
XButtonEvent button_event; /* Button event packet. */
Bool moving; /* Are we moving the window? */
Vertex box[MAX_BOX_VECTORS]; /* Box vertex buffer. */
Vertex zap[MAX_ZAP_VECTORS]; /* Zap effect verted buffer. */
/*
* Clear the vector buffers.
*/
bzero(box, sizeof(box));
if (Zap) bzero(zap, sizeof(zap));
/*
* Gather info on the event window since we may move it.
*/
status = XQueryWindow(window, &window_info);
if (status == FAILURE) {
/*
* If there is a query error, abort the operation and return.
*/
return;
}
/*
* Initialize movement variables.
*/
ulx = window_info.x;
init_ulx = ulx;
uly = window_info.y;
init_uly = uly;
lrx = window_info.x + window_info.width + (window_info.bdrwidth << 1) - 1;
init_lrx = lrx;
lry = window_info.y + window_info.height + (window_info.bdrwidth << 1) - 1;
init_lry = lry;
moving = FALSE;
while (TRUE) {
/*
* Check to see if we have a change in mouse button status.
* This is how we get out of this "while" loop.
*/
if (XPending() && GetButton(&button_event)) {
/*
* Process the pending events, this sequence is the only
* way out of the loop and the routine.
*/
if (
(button_event.type == ButtonReleased) &&
((button_event.detail & ValueMask) == RightButton)
){
/*
* Ok, the right button was released.
* If we are not moving see if we should be. If we
* have move more than Delta pixels then start moving
* the window.
*/
cur_x = button_event.x;
cur_y = button_event.y;
if (
!moving &&
(abs(cur_x - x) > Delta) || (abs(cur_y - y) > Delta)
){
/*
* Start moving.
*/
/*
* Change the cursor.
*/
status = XGrabButton(
RootWindow,
ArrowCrossCursor,
(RightMask | ButtonMask),
(ButtonPressed | ButtonReleased)
);
if (status == FAILURE) {
Error("Move -> Unable to grab right button and change cursor.");
}
/*
* Set the moving flag.
*/
moving = TRUE;
}
if (moving) {
/*
* We are moveing so reset the cursor and move the
* window.
*/
status = XGrabButton(
RootWindow,
CircleCursor,
(RightMask | ButtonMask),
(ButtonPressed | ButtonReleased)
);
if (status == FAILURE) {
Error("Move -> Unable to grab right button and change cursor.");
}
if (Zap) {
num_vectors = StoreZap(
zap,
init_ulx, init_uly,
init_lrx, init_lry,
ulx, uly,
lrx, lry
);
XDraw(
RootWindow,
zap, num_vectors,
DRAW_HEIGHT, DRAW_WIDTH,
DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
);
XDraw(
RootWindow,
zap, num_vectors,
DRAW_HEIGHT, DRAW_WIDTH,
DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
);
}
XMoveWindow(window, ulx, uly);
return;
}
else {
/*
* We didn't move so this must have been a raise
* window operation only. No need to reset the
* cursor since we only change it if we are moving.
*/
XRaiseWindow(window);
return;
}
}
else {
/*
* Some other button event occured, this aborts the
* current operation.
*/
if (moving) {
/*
* If we were moving then reset the cursor.
*/
status = XGrabButton(
RootWindow,
CircleCursor,
(RightMask | ButtonMask),
(ButtonPressed | ButtonReleased)
);
if (status == FAILURE) {
Error("Move -> Unable to grab right button and change cursor.");
}
}
return;
}
}
if (!moving) {
/*
* If we are not moving see if we should be. If we
* have move more than Delta pixels then start moving
* the window.
*/
XQueryMouse(RootWindow, &cur_x, &cur_y, &sub_window);
if ((abs(cur_x - x) > Delta) || (abs(cur_y - y) > Delta)) {
/*
* Start moving.
*/
/*
* Change the cursor.
*/
status = XGrabButton(
RootWindow,
ArrowCrossCursor,
(RightMask | ButtonMask),
(ButtonPressed | ButtonReleased)
);
if (status == FAILURE) {
Error("Move -> Unable to grab right button and change cursor.");
}
/*
* Store the box.
*/
if (Grid) {
num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
}
else {
num_vectors = StoreBox(box, ulx, uly, lrx, lry);
}
/*
* Initialize the previous location variables.
*/
prev_x = x;
prev_y = y;
/*
* Set the moving flag.
*/
moving = TRUE;
}
else {
/*
* We haven't moved enough yet.
*/
continue;
}
}
if (moving) {
/*
* If we have begun moving or have been moving take care
* of all the little that have to change.
*/
XQueryMouse(RootWindow, &cur_x, &cur_y, &sub_window);
if ((cur_x != prev_x) || (cur_y != prev_y)) {
/*
* Box position has changed.
*/
ulx += cur_x - prev_x;
uly += cur_y - prev_y;
lrx += cur_x - prev_x;
lry += cur_y - prev_y;
/*
* Box needs to be restored.
*/
if (Grid) {
num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
}
else {
num_vectors = StoreBox(box, ulx, uly, lrx, lry);
}
/*
* Save old box position.
*/
prev_x = cur_x;
prev_y = cur_y;
}
/*
* Draw Box.
*/
XDraw(
RootWindow,
box, num_vectors,
DRAW_HEIGHT, DRAW_WIDTH,
DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
);
XDraw(
RootWindow,
box, num_vectors,
DRAW_HEIGHT, DRAW_WIDTH,
DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
);
}
}
}