summaryrefslogtreecommitdiff
path: root/geometry.c
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:52 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:52 +0000
commitefce7cb078dd34e9e9f7d6f5f5cdd0c8ef267691 (patch)
treef9652b85cbb9728b5999913ea2aadee0b3ad1a17 /geometry.c
R6.6 is the Xorg base-lineXORG-MAINXORG-STABLE
Diffstat (limited to 'geometry.c')
-rw-r--r--geometry.c490
1 files changed, 490 insertions, 0 deletions
diff --git a/geometry.c b/geometry.c
new file mode 100644
index 0000000..164308c
--- /dev/null
+++ b/geometry.c
@@ -0,0 +1,490 @@
+/*
+ * $Xorg: geometry.c,v 1.4 2001/02/09 02:05:29 xorgcvs Exp $
+ *
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ * Author: Chris D. Peterson, MIT X Consortium
+ */
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <stdio.h>
+
+#include <X11/Xaw/Cardinals.h>
+
+#include "editresP.h"
+
+extern void SetMessage(), SetCommand(), SetAndCenterTreeNode(), AddString();
+extern void GetAllStrings(), InsertWidgetFromNode();
+extern int HandleXErrors();
+extern WNode * FindNode();
+
+static WNode *FindWidgetFromWindow(), *FindWidgetFromWindowGivenNode();
+static void CreateFlashWidget(), FlashWidgets();
+static void AddToFlashList(), _AddToFlashList();
+static void FlashWidgetsOn(), FlashWidgetsOff(), FlashWidgetsCleanup();
+
+/* Function Name: _FindWidget
+ * Description: Finds a widget in the tree and shows it to the user.
+ * Arguments: w - any widget in the application.
+ * Returns: none.
+ */
+
+void
+_FindWidget(w)
+Widget w;
+{
+ char msg[BUFSIZ];
+ WNode * node;
+ Window win, GetClientWindow();
+ int x, y; /* location of event in root coordinates. */
+
+ sprintf(msg, res_labels[14]);
+
+ SetMessage(global_screen_data.info_label, msg);
+
+ if ( (win = GetClientWindow(w, &x, &y)) != None) {
+ node = FindWidgetFromWindow(global_tree_info, win);
+ if (node != NULL) {
+ ProtocolStream * stream = &(global_client.stream);
+
+ _XEditResResetStream(stream);
+ InsertWidgetFromNode(stream, node);
+ _XEditResPut16(stream, (short) x);
+ _XEditResPut16(stream, (short) y);
+ SetCommand(w, LocalFindChild, NULL);
+ return;
+ }
+ }
+
+ SetMessage(global_screen_data.info_label,
+ res_labels[15]);
+}
+
+/* Function Name: FindWidgetFromWindow
+ * Description: finds a widget in the current tree given its window id.
+ * Arguments: tree_info - information about this tree.
+ * win - window to search for.
+ * Returns: node - the node corrosponding to this widget.
+ */
+
+static WNode *
+FindWidgetFromWindow(tree_info, win)
+TreeInfo * tree_info;
+Window win;
+{
+ if (tree_info == NULL)
+ return(NULL);
+
+ return(FindWidgetFromWindowGivenNode(tree_info->top_node, win));
+}
+
+/* Function Name: FindWidgetFromWindowGivenNode
+ * Description: finds a widget in the current tree given its window id.
+ * Arguments: node - current node.
+ * win - window to search for.
+ * Returns: node - the node corrosponding to this widget.
+ */
+
+static WNode *
+FindWidgetFromWindowGivenNode(node, win)
+WNode * node;
+Window win;
+{
+ int i;
+ WNode * ret_node;
+
+ if (node->window == win)
+ return(node);
+
+ for (i = 0; i < node->num_children; i++) {
+ ret_node = FindWidgetFromWindowGivenNode(node->children[i], win);
+ if (ret_node != NULL)
+ return(ret_node);
+ }
+ return(NULL);
+}
+
+/* Function Name: DisplayChild
+ * Description: Displays the child node returned by the client
+ * Arguments: event - the event from the client.
+ * Returns: none.
+ */
+
+void
+DisplayChild(event)
+Event * event;
+{
+ FindChildEvent * find_event = (FindChildEvent *) event;
+ WNode * node;
+ char msg[BUFSIZ];
+ void _FlashActiveWidgets();
+
+ node = FindNode(global_tree_info->top_node, find_event->widgets.ids,
+ find_event->widgets.num_widgets);
+
+ if (node == NULL) {
+ sprintf(msg, res_labels[13]);
+ SetMessage(global_screen_data.info_label, msg);
+ return;
+ }
+
+ SetAndCenterTreeNode(node);
+
+ node = node->tree_info->top_node;
+
+ sprintf(msg, res_labels[12], node->name, node->class);
+ SetMessage(global_screen_data.info_label, msg);
+
+ _FlashActiveWidgets(global_tree_info);
+}
+
+/* Function Name: _FlashActiveWidgets
+ * Description: Highlights all active widgets in the tree.
+ * Arguments: tree_info - information about the current tree.
+ * Returns: none.
+ */
+
+void
+_FlashActiveWidgets(tree_info)
+TreeInfo * tree_info;
+{
+ int i;
+ ProtocolStream * stream = &(global_client.stream);
+
+ if (tree_info == NULL) {
+ SetMessage(global_screen_data.info_label,
+ res_labels[17]);
+ return;
+ }
+
+ if (tree_info->num_nodes == 0) {
+ SetMessage(global_screen_data.info_label,res_labels[18]);
+ return;
+ }
+
+ _XEditResResetStream(stream);
+ /*
+ * Insert the number of widgets.
+ */
+ _XEditResPut16(stream, (unsigned short) tree_info->num_nodes);
+
+ for (i = 0; i < tree_info->num_nodes; i++)
+ InsertWidgetFromNode(stream, global_tree_info->active_nodes[i]);
+
+ SetCommand(tree_info->tree_widget, LocalFlashWidget, NULL);
+}
+
+/* Function Name: HandleFlashWidget
+ * Description: Is called when client has returned geometry of all widget
+ * to flash.
+ * Arguments: event - the event containing the client info.
+ * Returns: none.
+ */
+
+char *
+HandleFlashWidget(event)
+Event * event;
+{
+ GetGeomEvent * geom_event = (GetGeomEvent *) event;
+ char * errors = NULL;
+ int i;
+
+ for (i = 0; i < (int)geom_event->num_entries; i++)
+ AddToFlashList(global_tree_info, geom_event->info + i, &errors);
+
+ FlashWidgets(global_tree_info);
+
+ return(errors);
+}
+
+/* Function Name: AddWidgetToFlashList
+ * Description: Adds a widget to the list of widget to flash.
+ * Arguments: tree_info - info about this tree.
+ * geom_info - the info from the client about this widget.
+ * errors - a string containing the errors.
+ * Returns: none
+ */
+
+static void
+AddToFlashList(tree_info, geom_info, errors)
+TreeInfo * tree_info;
+GetGeomInfo * geom_info;
+char ** errors;
+{
+ WNode * node;
+ char buf[BUFSIZ];
+
+ node = FindNode(tree_info->top_node,
+ geom_info->widgets.ids, geom_info->widgets.num_widgets);
+
+ if (node == NULL) {
+ sprintf(buf, "Editres Internal Error: Unable to FindNode.\n");
+ AddString(errors, buf);
+ return;
+ }
+
+ if (geom_info->error) {
+ AddString(errors, geom_info->message);
+ return;
+ }
+
+ if (!geom_info->visable) {
+ sprintf(buf, "%s(0x%lx) - This widget is not mapped\n",
+ node->name, node->id);
+ AddString(errors, buf);
+ return;
+ }
+
+ _AddToFlashList(tree_info, errors, node,
+ geom_info->x, geom_info->y,
+ geom_info->width + geom_info->border_width,
+ geom_info->height + geom_info->border_width);
+}
+
+/* Function Name: _AddToFlashList
+ * Description: adds the window to the current client's flash list.
+ * Arguments: errors - a string to stuff any errors encountered.
+ * node - the node associated with this object.
+ * x, y - location of the flash widget in root coords.
+ * width, height - size of the flash widget.
+ * Returns: none.
+ */
+
+static void
+_AddToFlashList(tree_info, errors, node, x, y, width, height)
+TreeInfo * tree_info;
+char ** errors;
+WNode * node;
+int x, y;
+unsigned int width, height;
+{
+ Display * dpy = XtDisplay(tree_info->tree_widget);
+ Window window = (Window) node->window;
+ XWindowAttributes attrs;
+
+ if (window == EDITRES_IS_OBJECT)
+ window = node->parent->window;
+
+ if (window == EDITRES_IS_UNREALIZED) {
+ char buf[BUFSIZ];
+
+ if (node->window == EDITRES_IS_OBJECT)
+ sprintf(buf, "%s(0x%lx) - This object's parent is unrealized\n",
+ node->name, node->id);
+ else
+ sprintf(buf, "%s(0x%lx) - This widget is unrealized\n",
+ node->name, node->id);
+
+ AddString(errors, buf);
+ return;
+ }
+
+ global_error_code = NO_ERROR; /* Reset Error code. */
+ global_old_error_handler = XSetErrorHandler(HandleXErrors);
+ global_serial_num = NextRequest(dpy);
+
+ XGetWindowAttributes(dpy, window, &attrs);
+
+ XSync(dpy, FALSE);
+ XSetErrorHandler(global_old_error_handler);
+ if (global_error_code == NO_WINDOW) {
+ char buf[BUFSIZ];
+
+ sprintf(buf, "%s(0x%lx) - This widget's window no longer exists.\n",
+ node->name, node->id);
+ AddString(errors, buf);
+ return;
+ }
+
+ if (attrs.map_state != IsViewable) {
+ char buf[BUFSIZ];
+
+ sprintf(buf, "%s(0x%lx) - This widget is not mapped.\n",
+ node->name, node->id);
+ AddString(errors, buf);
+ return;
+ }
+
+ CreateFlashWidget(tree_info, x, y, width, height);
+}
+
+/* Function Name: CreateFlashWidget
+ * Description: Creates a widget of the size specified that
+ * will flash on the display, and adds it to the list
+ * of widgets to flash.
+ * Arguments: tree_info - the tree information structure.
+ * x,y,width, height - size and location of the flash widget.
+ * Returns: none.
+ */
+
+#define MORE_FLASH_WIDGETS 5
+
+static void
+CreateFlashWidget(tree_info, x, y, width, height)
+TreeInfo * tree_info;
+int x, y;
+unsigned int width, height;
+{
+ Widget shell;
+ Arg args[3];
+ Cardinal num = 0;
+ Dimension bw;
+
+ XtSetArg(args[num], XtNx, x); num++;
+ XtSetArg(args[num], XtNy, y); num++;
+ XtSetArg(args[num], XtNbackground, global_resources.flash_color); num++;
+
+ shell = XtCreatePopupShell("flash", overrideShellWidgetClass,
+ tree_info->tree_widget, args, num);
+
+ num = 0;
+ XtSetArg(args[num], XtNborderWidth, &bw); num++;
+ XtGetValues(shell, args, num);
+
+ bw *= 2;
+
+ num = 0;
+ XtSetArg(args[num], XtNwidth, (width - bw)); num++;
+ XtSetArg(args[num], XtNheight, (height - bw)); num++;
+ XtSetValues(shell, args, num);
+
+ if (tree_info->num_flash_widgets + 1 > tree_info->alloc_flash_widgets) {
+ tree_info->alloc_flash_widgets += MORE_FLASH_WIDGETS;
+ tree_info->flash_widgets =
+ (Widget *) XtRealloc((char *)tree_info->flash_widgets,
+ sizeof(Widget) * tree_info->alloc_flash_widgets);
+ }
+
+ tree_info->flash_widgets[tree_info->num_flash_widgets] = shell;
+ tree_info->num_flash_widgets++;
+}
+
+/* Function Name: FlashWidgets
+ * Description: Starts the widgets flashing.
+ * Arguments: tree_info - the info about the tree (contains flash list)
+ * Returns: none
+ */
+
+static void
+FlashWidgets(tree_info)
+TreeInfo * tree_info;
+{
+ int i;
+ unsigned long wait, half_flash;
+ XtAppContext ac = XtWidgetToApplicationContext(tree_info->tree_widget);
+
+ if (tree_info->flash_widgets == NULL) /* no widgets to flash. */
+ return;
+
+ wait = half_flash = global_resources.flash_time/2;
+ for (i = 1; i < global_resources.num_flashes; i++) {
+ XtAppAddTimeOut(ac, wait, FlashWidgetsOff,(XtPointer)tree_info);
+ wait += half_flash;
+ XtAppAddTimeOut(ac, wait, FlashWidgetsOn,(XtPointer)tree_info);
+ wait += half_flash;
+ }
+
+ wait += half_flash;
+ XtAppAddTimeOut(ac, wait, FlashWidgetsCleanup, (XtPointer)tree_info);
+
+ FlashWidgetsOn((XtPointer) tree_info, (XtIntervalId *) NULL);
+}
+
+/* Function Name: FlashWidgetsOn
+ * Description: Turns on all the Flash Widgets.
+ * Arguments: info_ptr - pointer to the tree info.
+ * id - *** UNUSED ***.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+FlashWidgetsOn(info_ptr, id)
+XtPointer info_ptr;
+XtIntervalId * id;
+{
+
+ int i;
+ TreeInfo * tree_info = (TreeInfo *) info_ptr;
+
+ for (i = 0; i < tree_info->num_flash_widgets; i++) {
+ XtRealizeWidget(tree_info->flash_widgets[i]);
+ XMapRaised(XtDisplay(tree_info->flash_widgets[i]),
+ XtWindow(tree_info->flash_widgets[i]));
+ }
+}
+
+/* Function Name: FlashWidgetsOff
+ * Description: Turns off all the Flash Widgets.
+ * Arguments: info_ptr - pointer to the tree info.
+ * id - *** UNUSED ***.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+FlashWidgetsOff(info_ptr, id)
+XtPointer info_ptr;
+XtIntervalId * id;
+{
+ int i;
+ TreeInfo * tree_info = (TreeInfo *) info_ptr;
+
+ for (i = 0; i < tree_info->num_flash_widgets; i++)
+ XtUnmapWidget(tree_info->flash_widgets[i]);
+}
+
+/* Function Name: FlashWidgetsCleanup
+ * Description: Destroys all the Flash Widgets.
+ * Arguments: info_ptr - pointer to the tree info.
+ * id - *** UNUSED ***.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+FlashWidgetsCleanup(info_ptr, id)
+XtPointer info_ptr;
+XtIntervalId * id;
+{
+ int i;
+ TreeInfo * tree_info = (TreeInfo *) info_ptr;
+
+/*
+ * Unmap 'em first for consistency.
+ */
+
+ for (i = 0; i < tree_info->num_flash_widgets; i++)
+ XtUnmapWidget(tree_info->flash_widgets[i]);
+
+ XFlush(XtDisplay(tree_info->tree_widget));
+
+ for (i = 0; i < tree_info->num_flash_widgets; i++)
+ XtDestroyWidget(tree_info->flash_widgets[i]);
+
+ XtFree((char *)tree_info->flash_widgets);
+ tree_info->flash_widgets = NULL;
+ tree_info->num_flash_widgets = tree_info->alloc_flash_widgets = 0;
+}