/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these librararies and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* $XConsortium: IconWindow.c /main/13 1996/10/15 10:07:48 mustafa $ */ /************************************<+>************************************* **************************************************************************** * * FILE: IconWindow.c * * COMPONENT_NAME: Desktop File Manager (dtfile) * * Description: Processing functions for callbacks from the * icon display area. * * FUNCTIONS: CheckForBtnUp * DrawHighlight * DrawRectangle * DrawShadowTh * DrawUnhighlight * FM_XmHighlightBorder * FM_XmUnhighlightBorder * FileWindowExposeCallback * FileWindowInputCallback * FileWindowMapCallback * FileWindowResizeCallback * GetSelectionRectangle * ProcessSelection * WidgetRectToRegion * * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company * (c) Copyright 1993, 1994, 1995 International Business Machines Corp. * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc. * (c) Copyright 1993, 1994, 1995 Novell, Inc. * **************************************************************************** ************************************<+>*************************************/ #include #include #include #include #include #include #include #include #include
#include
#include
#include
#include
#include #include #ifndef XK_MISCELLANY #define XK_MISCELLANY #endif #include #include /* For HighlightBorder & UnhighlightBorder */ #include "Encaps.h" #include "FileMgr.h" #include "Desktop.h" #include "Main.h" #include "Prefs.h" #include "Common.h" #include "Filter.h" #include "SharedProcs.h" /* For HightlightBorder & UnhighlightBorder */ externalref XmPrimitiveClassRec xmPrimitiveClassRec; Boolean TurnOnTextName; /******** Static Function Declarations ********/ static Boolean CheckForBtnUp( Display *display, XEvent *event, XtPointer arg) ; static void GetSelectionRectangle( Display *display, Window window, XButtonEvent *event, FileMgrRec *file_mgr_rec, FileMgrData *file_mgr_data, Boolean toggleSelect) ; static void DrawRectangle( Display *display, Window window, GC gc, int x1, int y1, int x2, int y2) ; static void ProcessSelection( FileMgrData * file_mgr_data, Widget icon, Boolean toggleSelect, XButtonEvent *event) ; static void FM_XmHighlightBorder(Widget w); static void FM_XmUnhighlightBorder(Widget w); static XmGadget InputForGadget( Widget wid, int x, int y ) ; /******** End Static Function Declarations ********/ /************************************************************************ * * FileWindowExposeCallback * Callback function invoked upon an exposure event occuring * in the file display area. * ************************************************************************/ void FileWindowExposeCallback( Widget w, XtPointer client_data, XtPointer call_data ) { FileMgrRec * file_mgr_rec; DialogData * dialog_data; FileMgrData * file_mgr_data; XmDrawingAreaCallbackStruct * da_cbs; register int i; file_mgr_rec = (FileMgrRec *) client_data; dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec); /* Check for the view already being closed */ if (dialog_data == NULL) return; file_mgr_data = (FileMgrData *) dialog_data->data; da_cbs = (XmDrawingAreaCallbackStruct * )call_data; /* if necessary, redraw tree lines */ if (da_cbs->reason == XmCR_EXPOSE && file_mgr_data->show_type == MULTIPLE_DIRECTORY) { XExposeEvent *event = (XExposeEvent *)da_cbs->event; if (event && event->type == Expose) RedrawTreeLines(w, event->x, event->y, event->width, event->height, event->count, file_mgr_rec, file_mgr_data); else RedrawTreeLines(w, 0, 0, 999999, 999999, 0, file_mgr_rec, file_mgr_data); } } /************************************************************************ * * FileWindowResizeCallback * Callback function invoked upon a resize of the file display area. * ************************************************************************/ void FileWindowResizeCallback( Widget w, XtPointer client_data, XEvent *event ) { FileMgrRec * file_mgr_rec; DialogData * dialog_data; FileMgrData * file_mgr_data; if (event->type == ConfigureNotify) { XConfigureEvent * cevent = (XConfigureEvent *) event; file_mgr_rec = (FileMgrRec *) client_data; /* * If the incoming size is different than the current size of the * scrolled window, then ignore this event, since it means that our * size has changed since this configure notify event was generated; * we'll wait for the next one to arrive, and try again. */ if ((file_mgr_rec->scroll_window->core.height != cevent->height) || (file_mgr_rec->scroll_window->core.width != cevent->width)) { return; } dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec); if(dialog_data != NULL) { file_mgr_data = (FileMgrData *) dialog_data->data; LayoutFileIcons (file_mgr_rec, file_mgr_data, False, False); } } } /************************************************************************ * * FileWindowMapCallback * Callback function invoked upon a map or unmap of a file * manager window. * ************************************************************************/ void FileWindowMapCallback( Widget w, XtPointer client_data, XEvent *event ) { FileMgrRec * file_mgr_rec; DialogData * dialog_data; FileMgrData * file_mgr_data; file_mgr_rec = (FileMgrRec *) client_data; dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec); if(dialog_data != NULL) { file_mgr_data = (FileMgrData *) dialog_data->data; if (event->type == MapNotify) { file_mgr_data->mapped = True; FileWindowMapUnmap( file_mgr_data ); } else if (event->type == UnmapNotify) { file_mgr_data->mapped = False; FileWindowMapUnmap( file_mgr_data ); } } } /************************************************************************ * * FileWindowInputCallback * Callback function invoked upon input occuring in the * file display area, file icon, or within a desktop icon. * ************************************************************************/ void FileWindowInputCallback( Widget w, XtPointer client_data, XtPointer call_data) { static Boolean first = True; static KeySym PlusKeysym, MinusKeySym; static KeySym ActivateKeysym, SpaceKeysym; static XmKeyBinding SelectBindings; static int NumSelectKeys = 0; FileMgrRec * file_mgr_rec; XmAnyCallbackStruct * callback; DialogData * dialog_data; FileMgrData * file_mgr_data; DirectorySet * directoryData; XEvent *new_event; XButtonPressedEvent *event; XKeyEvent *kevent; Widget eventIcon; int i, j; FileViewData * fileViewData = NULL; Arg args[10]; DesktopRec * desktopRec; KeySym keysym; Modifiers modif; int offset; Boolean found; /* Do nothing if a Button 2 drag is already ramping up */ if (B2DragPossible) return; /* Determine if this is a desktop icon or a regular icon */ file_mgr_rec = NULL; desktopRec = NULL; for (i = 0; i < desktop_data->numIconsUsed; i++) { if (desktop_data->desktopWindows[i] == (DesktopRec *)client_data) { desktopRec = (DesktopRec *)client_data; break; } } if (desktopRec == NULL) { file_mgr_rec = (FileMgrRec *) client_data; dialog_data = _DtGetInstanceData ((XtPointer)file_mgr_rec); file_mgr_data = (FileMgrData *) dialog_data->data; } else file_mgr_data = NULL; callback = (XmAnyCallbackStruct *) call_data; new_event = (XEvent *)callback->event; if (new_event->type == ButtonPress) { XButtonEvent *bevent = (XButtonEvent *)new_event; desktop_data->event = *bevent; } else if (new_event->type == KeyPress || new_event->type == KeyRelease) { if(first) { /* set up the the keysyms we are looking for */ PlusKeysym = XStringToKeysym("plus"); MinusKeySym = XStringToKeysym("minus"); NumSelectKeys = XmeVirtualToActualKeysyms(XtDisplay(w), osfXK_Select, &SelectBindings); ActivateKeysym = XK_Return; SpaceKeysym = XStringToKeysym("space"); first = False; } kevent = (XKeyEvent *)new_event; if (kevent->state & ShiftMask) offset = 1; else offset = 0; /* keysym = XLookupKeysym(kevent, offset); */ XmTranslateKey( kevent->display, kevent->keycode, offset?ShiftMask:0, &modif, &keysym); } /* in tree mode '+' and '-' keys expand and collaps tree branches */ if (!desktopRec && new_event->type == KeyPress && (keysym == PlusKeysym || keysym == MinusKeySym)) { /* ignore +/- keys if not in tree mode */ if (file_mgr_data->show_type != MULTIPLE_DIRECTORY) return; /* get the gadget that received the input */ if (keybdFocusPolicy == XmEXPLICIT) eventIcon = (Widget) XmGetFocusWidget(w); else eventIcon = (Widget) InputForGadget(w, kevent->x, kevent->y); if (eventIcon == NULL) return; /* find the widget in the file_list */ found = False; for (i = -1; i < file_mgr_data->directory_count && !found; i++) { for (j = 0; j < file_mgr_data->directory_set[i]->file_count; j++) { fileViewData = file_mgr_data->directory_set[i]->file_view_data[j]; if (fileViewData->widget == eventIcon || fileViewData->treebtn == eventIcon) { found = True; break; } } } /* if found, expand the branch */ if (found && fileViewData->file_data->is_subdir) { XmDropSiteStartUpdate(w); DirTreeExpand(file_mgr_data, fileViewData, (keysym == PlusKeysym)); DrawCurrentDirectory (file_mgr_rec->current_directory, file_mgr_rec, file_mgr_data); LayoutFileIcons(file_mgr_rec, file_mgr_data, False, True); XmDropSiteEndUpdate(w); RedrawTreeLines(w, -w->core.x, -w->core.y, XtParent(w)->core.width, XtParent(w)->core.height, 0, file_mgr_rec, file_mgr_data); } } else if (new_event->type == ButtonPress || (new_event->type == KeyPress && keybdFocusPolicy == XmEXPLICIT)) { /* Any button event unposts the rename text field */ if (desktopRec) UnpostDTTextField(); else if( file_mgr_data ) { if( file_mgr_data->fast_cd_enabled ) UnpostTextPath( file_mgr_data ); UnpostTextField( file_mgr_data ); } if (new_event->type == KeyPress) { /* We have a KeyPress: need to check to see if the press is "return", "space", "select". If it is, need to select the Icon the focus is in. */ if (keysym == XK_Escape) { /* an escape unposts the name change text widget */ if(desktopRec) UnpostDTTextField(); else UnpostTextField(file_mgr_data); return; } else if ( keysym != ActivateKeysym && keysym != SpaceKeysym && keysym != osfXK_Delete && keysym != osfXK_EndLine && keysym != osfXK_BeginLine && keysym != osfXK_PageLeft && keysym != osfXK_PageUp && keysym != osfXK_PageDown && keysym != osfXK_PageRight && keysym != osfXK_Menu ) { Boolean select = FALSE; int i; for (i = 0; !select && (i < NumSelectKeys); i++) select = (keysym == SelectBindings[i].keysym); if (!select) return; } if (desktopRec) eventIcon = desktopRec->iconGadget; else eventIcon = (Widget) XmGetFocusWidget(file_mgr_rec->file_window); event = (XButtonPressedEvent *)new_event; } else { event = (XButtonPressedEvent *)new_event; if(event->button != Button1) { if(event->button == bMenuButton && desktopRec == NULL) FmPopup (NULL, NULL, (XEvent *)event, file_mgr_data); return; } eventIcon = (Widget) InputForGadget(w, event->x, event->y); } /* * If the event occurred in an icon, then we are either doing * a selection or a drag. If it started in the file window, then * we can only be doing a region selection. */ if (eventIcon != NULL) { /* * If this icon is currently selected, then we can't yet tell * whether the user is starting a drag operation, or simply * redoing the icon selection; we must wait for either the * drag threshold to be surpassed, or the button up event. */ /* Map the icon into its fileViewData structure */ /* Check for desktop icon first */ if (desktopRec) { for (i = 0; inumIconsUsed; i++) { if (desktop_data->desktopWindows[i]->iconGadget == eventIcon) { fileViewData = desktop_data->desktopWindows[i]->file_view_data; break; } } } else { /* Not a desktop icon */ XtSetArg(args[0], XmNuserData, (XtPointer) &directoryData); XtGetValues(eventIcon, args, 1); if( directoryData != NULL ) { for (i = 0; i < directoryData->file_count; i++) { if (directoryData->file_view_data[i]->widget == eventIcon && directoryData->file_view_data[i]->displayed) { fileViewData = directoryData->file_view_data[i]; break; } } } } if (((file_mgr_rec && FileIsSelected(file_mgr_data, fileViewData)) || (desktopRec && DTFileIsSelected(desktopRec, fileViewData))) && event->type == ButtonPress) { /* Need to wait to determine what to do */ ProcessBtnUp = True; B1DragPossible = True; initialDragX = event->x; initialDragY = event->y; if((file_mgr_rec && FileIsSelected(file_mgr_data, fileViewData)) && file_mgr_data->selected_file_count > 1) { if (PositioningEnabledInView(file_mgr_data)) { ObjectPtr top; FileViewData ** selection_list; top = GetTopOfStack(file_mgr_data); if(top != NULL && top->file_view_data != fileViewData) { ObjectPtr savetop, next, prev; savetop = top; while(top != NULL && top->file_view_data != fileViewData) top = top->next; if(top != NULL) { prev = top->prev; next = top->next; if (prev) prev->next = next; if (next) next->prev = prev; top->prev = NULL; top->next = savetop; top->stacking_order = 1; savetop->prev = top; top = savetop; for(i = 2; top->prev != NULL; i++) { top->stacking_order = i; if(top->next == NULL) break; top = top->next; } top = GetTopOfStack(file_mgr_data); RedrawOneGadget(top->file_view_data->widget,NULL,NULL); } } /* now make it the top of the selection list */ /* Force selection list order to match stacking order */ selection_list = (FileViewData **)XtMalloc( sizeof(FileViewData *) * (file_mgr_data->selected_file_count + 1)); i = 0; if(top->file_view_data != NULL) selection_list[i++] = top->file_view_data; for(j = 0;i < file_mgr_data->selected_file_count; j++,i++) { if(top->file_view_data != file_mgr_data->selection_list[j]) selection_list[i] = file_mgr_data->selection_list[j]; else i--; } selection_list[i] = NULL; XtFree((char *)file_mgr_data->selection_list); file_mgr_data->selection_list = selection_list; } } } else { /* * The icon is not currently selected, so we will select it. * It is still possible that the user may initiate a drag. */ ProcessBtnUp = False; if (event->type == ButtonPress) { B1DragPossible = True; initialDragX = event->x; initialDragY = event->y; } else { B1DragPossible = False; initialDragX = -1; initialDragY = -1; } switch( keysym ) { case osfXK_Delete: { DtActionArg * action_args; int arg_count; if( desktopRec == NULL && file_mgr_rec != NULL ) { if( file_mgr_data->selected_file_count && fileViewData && FileIsSelected(file_mgr_data, fileViewData) ) { _DtBuildActionArgsWithSelectedFiles( file_mgr_data->selection_list, file_mgr_data->selected_file_count, &action_args, &arg_count ); } else { _DtBuildActionArgsWithSelectedFiles( &fileViewData, 1, &action_args, &arg_count ); } DtActionInvoke( file_mgr_rec->shell, TRASH_ACTION, action_args, arg_count, NULL, NULL, trash_dir, True, NULL, NULL ); } else if( desktopRec != NULL ) { int selectedCount = desktop_data->workspaceData[desktopRec->workspace_num - 1]->files_selected; if( selectedCount ) { _DtBuildActionArgsWithDTSelectedFiles( desktop_data->workspaceData[desktopRec->workspace_num - 1]->selectedDTWindows, selectedCount, &action_args, &arg_count ); } else { _DtBuildActionArgsWithSelectedFiles( &fileViewData, 1, &action_args, &arg_count ); } DtActionInvoke( desktopRec->shell, TRASH_ACTION, action_args, arg_count, NULL, NULL, trash_dir, True, NULL, NULL ); } _DtFreeActionArgs( action_args, arg_count ); } break; case osfXK_Menu: if(file_mgr_data) /* if not, then it is a desktop object */ FmPopup( NULL, (XtPointer)fileViewData, (XEvent *)event, file_mgr_data ); break; case osfXK_EndLine: if( !desktopRec && file_mgr_data->show_type != MULTIPLE_DIRECTORY ) { Widget child = NULL; child = XmGetFocusWidget(file_mgr_rec->file_window); if( child ) { FileViewData * focusIcon = NULL; FileViewData **order_list; int order_count; order_list = ((IconLayoutData *)file_mgr_data->layout_data)->order_list; order_count = ((IconLayoutData *)file_mgr_data->layout_data)->order_count; for (i = 0; i < order_count; ++i) { if (order_list[i]->filtered) continue; if( order_list[i]->widget == child && !order_list[i]->need_update ) { int j; int y = order_list[i]->y; focusIcon = order_list[i]; for( j = i+1; j < order_count; ++j ) { if (order_list[j]->filtered) continue; if( order_list[j]->y == y ) focusIcon = order_list[j]; else break; } break; } } XmProcessTraversal( focusIcon->widget, XmTRAVERSE_CURRENT ); } } break; case osfXK_BeginLine: if( !desktopRec && file_mgr_data->show_type != MULTIPLE_DIRECTORY ) { Widget child = NULL; child = XmGetFocusWidget(file_mgr_rec->file_window); if( child ) { FileViewData * focusIcon = NULL; FileViewData **order_list; int order_count; order_list = ((IconLayoutData *)file_mgr_data->layout_data)->order_list; order_count = ((IconLayoutData *)file_mgr_data->layout_data)->order_count; for (i = 0; i < order_count; ++i) { if (order_list[i]->filtered) continue; if( order_list[i]->widget == child && !order_list[i]->need_update ) { int j; int y = order_list[i]->y; focusIcon = order_list[i]; for( j = i-1; j >= 0; --j ) { if (order_list[j]->filtered) continue; if( order_list[j]->y == y ) focusIcon = order_list[j]; else break; } break; } } XmProcessTraversal( focusIcon->widget, XmTRAVERSE_CURRENT ); } } break; case osfXK_PageUp: if( !desktopRec ) { if( VerticalScrollbarIsVisible( file_mgr_rec->vertical_scroll_bar, file_mgr_rec->scroll_window)) { String p; p = (String) XtMalloc(sizeof(char *)); *p = (char) 0; XtCallActionProc( file_mgr_rec->vertical_scroll_bar, "PageUpOrLeft", new_event, (char **) &p, 1 ); XtFree(p); } } break; case osfXK_PageDown: if( !desktopRec ) { if( VerticalScrollbarIsVisible( file_mgr_rec->vertical_scroll_bar, file_mgr_rec->scroll_window)) { String p; p = (String) XtMalloc(sizeof(char *)); *p = (char)0; XtCallActionProc( file_mgr_rec->vertical_scroll_bar, "PageDownOrRight", new_event, &p, 1 ); XtFree(p); } } break; default: if (desktopRec) ProcessDTSelection(desktopRec, (XButtonEvent *)event); else ProcessSelection( file_mgr_data, eventIcon, ((event->state & ControlMask) != 0), (XButtonEvent *)event); break; } } } else { /* In file window - start region select */ /* There are no region selects for desktop icons */ ProcessBtnUp = False; B1DragPossible = False; initialDragX = -1; initialDragY = -1; if (desktopRec == NULL) { ProcessSelection(file_mgr_data, NULL, ((event->state & ControlMask) != 0), (XButtonEvent *)event); } } } else if(new_event->type == ButtonRelease || (new_event->type == KeyRelease && keybdFocusPolicy == XmEXPLICIT)) { if(new_event->type == KeyRelease) { if (keysym != osfXK_Select) return; event = (XButtonPressedEvent *)new_event; } else { event = (XButtonPressedEvent *)new_event; if(event->button != Button1) return; } /* * When a button 1 up event is received, we will first see if the * select occurred in the icon's title; if so, then we will post * the rename text field. If the icon in which the button down * occurred was not already selected, then all of the selection * work was done at button 1 down time, so there is nothing left * for us to do but return. However, if the icon was already * selected, then we could not do any select processing at button * down time, because the user may have been trying to initate * a drag request; this can't be determined until either the drag * threshold is surpassed, or the button up occurs. */ if (((initialDragX >= 0) && (initialDragY >= 0)) && (eventIcon = (Widget) InputForGadget(w, initialDragX, initialDragY))) { /* * If processing was postponed until the button up, then do it now. */ B1DragPossible = False; if (ProcessBtnUp) { XEvent tmpEvent; tmpEvent.xbutton = *event; tmpEvent.xbutton.x = initialDragX; tmpEvent.xbutton.y = initialDragY; if (desktopRec) { ProcessDTSelection(desktopRec, (XButtonEvent *)&tmpEvent); } else { ProcessSelection(file_mgr_data, eventIcon, ((event->state & ControlMask) != 0), (XButtonEvent *)&tmpEvent); } } /* * If the select occurred in the title portion of the icon, then * put up a text edit field, which can be used to change the name * of the icon. The last field '0' means its not on the Desktop. */ if (_DtIconSelectInTitle(eventIcon, (Position)initialDragX, (Position)initialDragY) && ProcessBtnUpCD) { /* Map the icon into its fileViewData structure */ /* Check for desktop icon first */ if (desktopRec) { for (i = 0; inumIconsUsed; i++) { if (desktop_data->desktopWindows[i]->iconGadget == eventIcon) { fileViewData = desktop_data->desktopWindows[i]->file_view_data; break; } } } else { /* Not a desktop icon */ XtSetArg(args[0], XmNuserData, (XtPointer) &directoryData); XtGetValues(eventIcon, args, 1); for (i = 0; i < directoryData->file_count; i++) { if (directoryData->file_view_data[i]->widget == eventIcon && directoryData->file_view_data[i]->displayed) { fileViewData = directoryData->file_view_data[i]; break; } } } if (desktopRec) { CreateNameChangeDialog(eventIcon, fileViewData, (XtPointer)desktopRec, DESKTOP); } else if( file_mgr_data->view != BY_NAME ) { /* We don't allow users to rename when they are viewing a directory in 'By Name Only' mode. Because clicking on the label is the only way for them to select a file. Popup a text widget to allow rename would be very confusing */ if( file_mgr_data->view != BY_ATTRIBUTES || ( file_mgr_data->view == BY_ATTRIBUTES && TurnOnTextName ) ) CreateNameChangeDialog(eventIcon, fileViewData, (XtPointer)file_mgr_data, NOT_DESKTOP); } } } else { /* Clean up */ B1DragPossible = False; B2DragPossible = False; ProcessBtnUp = False; } ProcessBtnUpCD = True; } else if(new_event->type == KeyPress) { if (keysym == XK_Escape) { /* an escape unposts the name change text widget */ if(desktopRec) UnpostDTTextField(); else UnpostTextField(file_mgr_data); return; } } } /* * When a select operation terminates, we need to find the real button * up event, so that we can get the correct (x,y) for where the select * operation ended. */ static Boolean CheckForBtnUp( Display *display, XEvent *event, XtPointer arg ) { if ((event->type == ButtonRelease) && (event->xbutton.button == Button1)) return(True); return(False); } /************************************************************************ * * GetSelectionRectangle * ************************************************************************/ static void GetSelectionRectangle( Display *display, Window window, XButtonEvent *event, FileMgrRec *file_mgr_rec, FileMgrData *file_mgr_data, Boolean toggleSelect) { Screen * screen; static GC draw_gc = 0; XGCValues gc_values; Region region; Region widget_region; Region intersect_region; Region redraw_region; static XRectangle return_rect; int virt_x, virt_y; int virt_width, virt_height; int x1, y1; int x2, y2; int x3, y3; int x4, y4; int old_x, old_y; int temp, j, i; int pixmap_x, pixmap_y, pixmap_x1, pixmap_y1; int directory_count; Window root, sub_win; int win_x, win_y; unsigned int mask; XEvent btnUpEvent; XmManagerWidget file_window; Dimension current_file_window_width, sw_width; Dimension current_file_window_height, sw_height; Dimension file_window_width, file_window_height; Dimension max_width, max_height; Dimension min_width, min_height; Widget hb, vb; int vb_val_ret = 0; int vb_slide_size = 0; int vb_inc_ret = 0; int vb_pg_inc_ret = 0; int hb_val_ret = 0; int hb_slide_size = 0; int hb_inc_ret = 0; int hb_pg_inc_ret = 0; Boolean vsbVisible = False; Boolean hsbVisible = False; DirectorySet ** directory_set; FileViewData *file_view_data; Position x,y; Dimension highlightThickness, shadowThickness; Dimension width, height; Dimension marginWidth, marginHeight; Dimension pixmapWidth, pixmapHeight; Dimension stringWidth, stringHeight; unsigned char pixmapPosition; unsigned char alignment; Arg args[10]; /* Get the horizontal and vertical scrollbars. */ XtSetArg (args[0], XmNhorizontalScrollBar, &hb); XtSetArg (args[1], XmNverticalScrollBar, &vb); XtSetArg (args[2], XmNwidth, &sw_width); XtSetArg (args[3], XmNheight, &sw_height); XtGetValues (file_mgr_rec->scroll_window, args, 4); file_window = (XmManagerWidget)file_mgr_rec->file_window; XtSetArg (args[0], XmNwidth, &file_window_width); XtSetArg (args[1], XmNheight, &file_window_height); XtGetValues ((Widget)file_window, args, 2); file_window_width--; file_window_height--; if (VerticalScrollbarIsVisible(vb, file_mgr_rec->scroll_window)) { vsbVisible = True; current_file_window_width = sw_width - vb->core.width - 12; } else { current_file_window_width = sw_width - 9; } if (HorizontalScrollbarIsVisible(hb, file_mgr_rec->scroll_window)) { hsbVisible = True; current_file_window_height = sw_height - hb->core.height - 12; } else { current_file_window_height = sw_height - 9; } if(vsbVisible) { XmScrollBarGetValues(vb, &vb_val_ret, &vb_slide_size, &vb_inc_ret, &vb_pg_inc_ret); min_height = vb_val_ret; max_height = current_file_window_height + min_height; } else { max_height = current_file_window_height; min_height = 0; } if(hsbVisible) { XmScrollBarGetValues(hb, &hb_val_ret, &hb_slide_size, &hb_inc_ret, &hb_pg_inc_ret); min_width = hb_val_ret; max_width = current_file_window_width + min_width; } else { max_width = current_file_window_width; min_width = 0; } /* Get the gc to be used to draw the bounding rectangle */ if (!draw_gc) { unsigned int white_pixel; screen = XDefaultScreenOfDisplay (display); gc_values.function = GXxor; white_pixel = WhitePixelOfScreen (screen); if( white_pixel ) { gc_values.foreground = white_pixel; gc_values.background = BlackPixelOfScreen (screen); } else { gc_values.background = white_pixel; gc_values.foreground = BlackPixelOfScreen (screen); } draw_gc = XCreateGC (display, window, GCForeground | GCBackground | GCFunction, &gc_values); } widget_region = XCreateRegion(); intersect_region = XCreateRegion(); redraw_region = XCreateRegion(); x1 = x2 = old_x = event->x; y1 = y2 = old_y = event->y; DrawRectangle (display, window, draw_gc, x1, y1, x2, y2); while (1) /* Set up a loop to catch the select up point. */ { XQueryPointer (display, window, &root, &sub_win, &win_x, &win_y, &x2, &y2, &mask); if ((mask & Button1Mask) == 0) { /* Undraw the last rectangle we drew */ x2 = old_x; y2 = old_y; DrawRectangle (display, window, draw_gc, x1, y1, x2, y2); /* * The real bound of the rectangle is contained in the button up * event; you can't use the pointer position, because if the system * is slow, then by the time we query the mouse, the button may have * been long ago release, and the pointer subsequently moved. */ if (XPeekIfEvent(display, &btnUpEvent,(Bool (*)())CheckForBtnUp, NULL)) { x2 = btnUpEvent.xbutton.x; y2 = btnUpEvent.xbutton.y; } break; } if( x2 < 0 ) x2 = 0; if( y2 < 0 ) y2 = 0; if ((x2 > old_x && !hsbVisible && (Dimension)old_x < file_window_width) || (x2 > old_x && hsbVisible && (Dimension)(hb_val_ret + hb_slide_size) < (Dimension)(file_window_width + 1)) || (x2 < old_x && !hsbVisible && old_x > 0) || (x2 < old_x && hsbVisible && hb_val_ret >= 0) || (y2 > old_y && !vsbVisible && (Dimension)old_y < file_window_height) || (y2 > old_y && vsbVisible && (Dimension)(vb_val_ret + vb_slide_size) < (Dimension)(file_window_height + 1)) || (y2 < old_y && !vsbVisible && old_y > 0) || (y2 < old_y && vsbVisible && vb_val_ret >= 0)) { DrawRectangle (display, window, draw_gc, x1, y1, old_x, old_y); if((Dimension)x2 >= max_width) { if(hsbVisible) { hb_val_ret += (x2 - max_width); if((Dimension)(hb_val_ret + hb_slide_size) <= (Dimension)(file_window_width + 1)) { XmScrollBarSetValues(hb, hb_val_ret, hb_slide_size, hb_inc_ret, hb_pg_inc_ret, True); min_width = (x2 - max_width) + min_width; max_width = x2; XmUpdateDisplay ((Widget)file_window); } else if((Dimension)(hb_val_ret + hb_slide_size) > (Dimension)(file_window_width + 1) && (Dimension)(hb_val_ret - (x2 - max_width)) < (Dimension)(file_window_width - hb_slide_size)) { XmScrollBarSetValues(hb, file_window_width - hb_slide_size + 1, hb_slide_size, hb_inc_ret, hb_pg_inc_ret, True); temp = (file_window_width - hb_slide_size + 1) - hb_val_ret; hb_val_ret = file_window_width - hb_slide_size + 1; min_width = temp + min_width; max_width = temp + max_width; XmUpdateDisplay ((Widget)file_window); x2 = file_window_width; } else { hb_val_ret = file_window_width - hb_slide_size + 1; x2 = max_width = file_window_width; min_width = max_width - current_file_window_width; } } else { if(vsbVisible) { if((Dimension)x2 > current_file_window_width) x2 = current_file_window_width; } else { if((Dimension)x2 > file_window_width) x2 = file_window_width; } } } else if((Dimension)x2 < min_width) { if(hsbVisible) { if(min_width > 0) { hb_val_ret -= (min_width - x2); if(hb_val_ret >= 0) { XmScrollBarSetValues(hb, hb_val_ret, hb_slide_size, hb_inc_ret, hb_pg_inc_ret, True); max_width = max_width - (min_width - x2); min_width = x2; XmUpdateDisplay (file_mgr_rec->file_window); } else if((hb_val_ret < 0) && ((int)(hb_val_ret + (min_width - x2)) >= (int)0)) { XmScrollBarSetValues(hb, 0, hb_slide_size, hb_inc_ret, hb_pg_inc_ret, True); max_width = current_file_window_width; XmUpdateDisplay ((Widget)file_window); x2 = hb_val_ret = min_width = 0; } else { hb_val_ret = min_width = x2 = 0; max_width = current_file_window_width; } } else { if(x2 < 0) x2 = 0; } } else { if(x2 < 0) x2 = 0; } } if((Dimension)y2 > max_height) { if(vsbVisible) { vb_val_ret += (y2 - max_height); if((Dimension)(vb_val_ret + vb_slide_size) <= (Dimension)(file_window_height + 1)) { XmScrollBarSetValues(vb, vb_val_ret, vb_slide_size, vb_inc_ret, vb_pg_inc_ret, True); min_height = (y2 - max_height) + min_height; max_height = y2; XmUpdateDisplay ((Widget)file_window); } else if((Dimension)(vb_val_ret + vb_slide_size) > (Dimension)(file_window_height + 1) && (Dimension)(vb_val_ret - (y2 - max_height)) < (Dimension)(file_window_height + 1 - vb_slide_size)) { XmScrollBarSetValues(vb, file_window_height + 1 - vb_slide_size, vb_slide_size, vb_inc_ret, vb_pg_inc_ret, True); temp = (file_window_height + 1 - vb_slide_size) - vb_val_ret; vb_val_ret = file_window_height + 1 - vb_slide_size; min_height = temp + min_height; max_height = temp + max_height; XmUpdateDisplay ((Widget)file_window); y2 = file_window_height; } else { vb_val_ret = file_window_height + 1 - vb_slide_size; y2 = max_height = file_window_height; min_height = max_height - current_file_window_height; } } else { if(hsbVisible) { if((Dimension)y2 > current_file_window_height) y2 = current_file_window_height; } else { if((Dimension)y2 > file_window_height) y2 = file_window_height; } } } else if((Dimension)y2 < min_height) { if(vsbVisible) { if(min_height > 0) { vb_val_ret -= (min_height - y2); if(vb_val_ret >= 0) { XmScrollBarSetValues(vb, vb_val_ret, vb_slide_size, vb_inc_ret, vb_pg_inc_ret, True); max_height = max_height - (min_height - y2); min_height = y2; XmUpdateDisplay (file_mgr_rec->file_window); } else if(vb_val_ret < 0 && ((int)(vb_val_ret + (min_height - y2)) >= (int)0)) { XmScrollBarSetValues(vb, 0, vb_slide_size, vb_inc_ret, vb_pg_inc_ret, True); max_height = current_file_window_height; XmUpdateDisplay ((Widget)file_window); y2 = vb_val_ret = min_height = 0; } else { vb_val_ret = min_height = y2 = 0; max_height = current_file_window_height; } } else { if(y2 < 0) y2 = 0; } } else { if(y2 < 0) y2 = 0; } } old_x = x2; old_y = y2; x3 = x1; x4 = x2; y3 = y1; y4 = y2; if (x4 < x3) { temp = x3; x3 = x4; x4 = temp; } if (y4 < y3) { temp = y3; y3 = y4; y4 = temp; } virt_x = x3; virt_y = y3; virt_width = x4 - x3 + 1; virt_height = y4 - y3 + 1; return_rect.x = (short)virt_x; return_rect.y = (short)virt_y; return_rect.width = (unsigned short)virt_width; return_rect.height = (unsigned short)virt_height; region = XCreateRegion(); XUnionRectWithRegion (&return_rect, region, region); /* Run through the gadget set to cause each icon within the */ /* rectangle to be selected. */ if (file_mgr_data->show_type == SINGLE_DIRECTORY) directory_count = 1; else directory_count = file_mgr_data->directory_count; directory_set = file_mgr_data->directory_set; for (i = 0; i < directory_count; i++) { for (j = 0; j < directory_set[i]->file_count; j++) { DtIconGadget g; file_view_data = directory_set[i]->order_list[j]; if (!file_view_data->displayed || file_view_data->need_update) continue; g = (DtIconGadget) file_view_data->widget; highlightThickness = g->gadget.highlight_thickness; shadowThickness = g->gadget.shadow_thickness; x = g->rectangle.x; y = g->rectangle.y; marginWidth = g->icon.cache->margin_width; marginHeight = g->icon.cache->margin_height; pixmapPosition = g->icon.cache->pixmap_position; alignment = g->icon.cache->alignment; pixmapWidth = g->icon.pixmap_width; pixmapHeight = g->icon.pixmap_height; stringWidth = g->icon.string_width; stringHeight = g->icon.cache->string_height; switch ((int) pixmapPosition) { case XmPIXMAP_TOP: if (alignment == XmALIGNMENT_BEGINNING) pixmap_x = x + highlightThickness; else if(alignment == XmALIGNMENT_CENTER) { if(stringWidth >= pixmapWidth) pixmap_x = x + highlightThickness + ((Dimension)(stringWidth - pixmapWidth)/(Dimension)2); else pixmap_x = x + highlightThickness; } break; case XmPIXMAP_LEFT: default: pixmap_x = x + highlightThickness; break; } pixmap_y = y + pixmapHeight; pixmap_x = pixmap_x + pixmapWidth; /* pixmap_x1 = pixmap_x + pixmapWidth; pixmap_y1 = pixmap_y + pixmapHeight; */ if(XPointInRegion(region, pixmap_x, pixmap_y) /* && XPointInRegion(region, pixmap_x1, pixmap_y1) */ ) { if (toggleSelect == True && FileIsSelected (file_mgr_data, file_view_data)) DeselectFile (file_mgr_data, file_view_data, True); else { if(!FileIsSelected (file_mgr_data, file_view_data)) SelectFile (file_mgr_data, file_view_data); } } else if (FileIsSelected (file_mgr_data, file_view_data)) DeselectFile (file_mgr_data, file_view_data, True); } } DrawRectangle (display, window, draw_gc, x1, y1, x2, y2); XDestroyRegion (region); } } XDestroyRegion (widget_region); XDestroyRegion (intersect_region); XDestroyRegion (redraw_region); XSync (display, 0); return; } /************************************************************************ * * DrawRectangle * DrawRectangle takes two points as input and draws a rectangle with * a line width and height of 1 around the rectangle generated * by the two points. The rectangle is drawn XOR so that it * can be erased. * ************************************************************************/ static void DrawRectangle( Display *display, Window window, GC gc, int x1, int y1, int x2, int y2 ) { int x; int y; unsigned int width; unsigned int height; if (x2 >= x1) { x = x1; width = x2 - x1; } else { x = x2; width = x1 - x2; } if (y2 >= y1) { y = y1; height = y2 - y1; } else { y = y2; height = y1 - y2; } XDrawRectangle (display, window, gc, x, y, width, height); if (width > 2 && height > 2) XDrawRectangle (display, window, gc, x + 1, y + 1, width - 2, height - 2); } /* * Given a widget, create a region describing the area occupied by the * widget; it may be a simple rectangle, or a compound region composed * of two rectangles (the pixmap and the label). */ void WidgetRectToRegion ( FileMgrData * file_mgr_data, Widget w, Region region) { XRectangle widget_rect; XRectangle pRect, lRect; unsigned char flags; static Region temp_region = NULL; /* Empty the region */ if (temp_region == NULL) temp_region = XCreateRegion(); XSubtractRegion(temp_region, temp_region, region); if (w == NULL) return; /* Tree mode and attribute views do not support compound icons */ if ((file_mgr_data->show_type != SINGLE_DIRECTORY) || (file_mgr_data->view == BY_ATTRIBUTES)) { widget_rect.x = (short)w->core.x; widget_rect.y = (short)w->core.y; widget_rect.width = (unsigned short)w->core.width; widget_rect.height = (unsigned short)w->core.height; XUnionRectWithRegion(&widget_rect, region, region); } else { _DtIconGetIconRects((DtIconGadget)w, &flags, &pRect, &lRect); if (flags & XmPIXMAP_RECT) XUnionRectWithRegion(&pRect, region, region); if (flags & XmLABEL_RECT) XUnionRectWithRegion(&lRect, region, region); } } static void ProcessSelection ( FileMgrData * file_mgr_data, Widget icon, Boolean toggleSelect, XButtonEvent * event) { XRectangle * selection_rect; XRectangle widget_rect; DirectorySet ** directory_set; int directory_count; register int i, j; Region region; Region widget_region; Region intersect_region; Region redraw_region; FileMgrRec * file_mgr_rec; FileViewData * file_view_data; file_mgr_rec = (FileMgrRec *)file_mgr_data->file_mgr_rec; /* User is starting a new selection; clear all old ones */ if (!toggleSelect) { DeselectAllFiles (file_mgr_data); file_mgr_data->selected_file_count = 0; XFlush (XtDisplay (file_mgr_rec->file_window)); XmUpdateDisplay (file_mgr_rec->file_window); } /* Get the rectangle to be used as the selection area */ if (icon == NULL && event->type == ButtonPress) { /* User is starting a region select */ GetSelectionRectangle (XtDisplay(file_mgr_rec->file_window), (Window) XtWindow(file_mgr_rec->file_window), event, file_mgr_rec, file_mgr_data, toggleSelect); } else { /* User did a single select either through keyboard or mouse */ if(event->type == KeyPress) { widget_rect.x = (short)icon->core.x; widget_rect.y = (short)icon->core.y; widget_rect.width = (short)icon->core.width; widget_rect.height = (short)icon->core.height; } else { widget_rect.x = (short)event->x; widget_rect.y = (short)event->y; widget_rect.width = 1; widget_rect.height = 1; } selection_rect = &widget_rect; region = XCreateRegion(); widget_region = XCreateRegion(); intersect_region = XCreateRegion(); redraw_region = XCreateRegion(); XUnionRectWithRegion (selection_rect, region, region); /* Run through the gadget set to cause each icon within the */ /* rectangle to be selected. */ if (file_mgr_data->show_type == SINGLE_DIRECTORY) { i = 0; directory_count = 1; } else { directory_count = file_mgr_data->directory_count; i = -1; } directory_set = file_mgr_data->directory_set; for (; i < directory_count; i++) { if (PositioningEnabledInView(file_mgr_data)) { ObjectPtr top = GetTopOfStack(file_mgr_data); int next_position = 0; /* * Stacking order requires us to handle this specially. Objects * must be searched in top to bottom order when determining if * they are in the selection rectangle, but they must be drawn * bottom to top, to guarantee that the visuals are correct. */ /* Find set of selected objects */ while (top) { if(top->file_view_data == NULL) { top = top->next; continue; } if (!top->file_view_data->displayed) { top = top->next; continue; } WidgetRectToRegion(file_mgr_data, top->file_view_data->widget, widget_region); XIntersectRegion(region, widget_region, intersect_region); if (!XEmptyRegion(intersect_region)) { if (toggleSelect && FileIsSelected (file_mgr_data, top->file_view_data)) { DeselectFile(file_mgr_data, top->file_view_data, True); XUnionRegion(widget_region, redraw_region, redraw_region); } else { /* * We don't want to change the icon yet, because we * need to do it in bottom to top order. */ next_position++; RepositionUpInStack(file_mgr_data, top->stacking_order, next_position); } /* Higher item 'cover' lower ones */ XSubtractRegion(region, widget_region, region); } top = top->next; } /* Now, select any newly selected files */ if (next_position > 0) { /* Find where to start the redraw from */ top = GetTopOfStack(file_mgr_data); while (next_position - 1 > 0) { top = top->next; next_position--; } while(top) { if(top->file_view_data != NULL) SelectFile(file_mgr_data, top->file_view_data); top = top->prev; } } if (!XEmptyRegion(redraw_region)) RepaintDesktop(file_mgr_data, NULL, redraw_region); RegisterDesktopHotspots(file_mgr_data, file_mgr_rec); } else { for (j = 0; j < directory_set[i]->file_count; j++) { file_view_data = directory_set[i]->order_list[j]; if (!file_view_data->displayed) continue; WidgetRectToRegion(file_mgr_data, file_view_data->widget, widget_region); XIntersectRegion (region, widget_region, intersect_region); if (!XEmptyRegion (intersect_region)) { if (toggleSelect == True && FileIsSelected (file_mgr_data, file_view_data)) DeselectFile (file_mgr_data, file_view_data, True); else { SelectFile (file_mgr_data, file_view_data); if(file_mgr_data->view == BY_ATTRIBUTES) { /* * Need to determine whether the click was in the * file or before. */ XRectangle textExtent; Region tmp_region; XmFontList fontList; XmString fileNameString; DtIconGadget g = (DtIconGadget)file_view_data->widget; _DtIconGetTextExtent_r(file_view_data->widget, &textExtent); XtVaGetValues( file_view_data->widget, XmNfontList, &fontList, NULL ); fileNameString = XmStringCreateLocalized( file_view_data->file_data->file_name ); textExtent.width = XmStringWidth( fontList, fileNameString ); XmStringFree( fileNameString ); textExtent.height = (unsigned short)file_view_data->widget->core.height; textExtent.x = (short)file_view_data->widget->core.x + g->icon.pixmap_width + g->icon.cache->margin_width + g->icon.cache->spacing; textExtent.y = (short)file_view_data->widget->core.y; tmp_region = XCreateRegion(); XUnionRectWithRegion (&textExtent, tmp_region, tmp_region); XSubtractRegion (widget_region, tmp_region, tmp_region); XIntersectRegion (region, tmp_region, intersect_region); if (XEmptyRegion (intersect_region)) TurnOnTextName = True; else TurnOnTextName = False; XDestroyRegion (tmp_region); } } } } } } XDestroyRegion (region); XDestroyRegion (widget_region); XDestroyRegion (intersect_region); XDestroyRegion (redraw_region); } if(file_mgr_data != trashFileMgrData) { if (file_mgr_data->selected_file_count == 0) ActivateNoSelect (file_mgr_rec); else if (file_mgr_data->selected_file_count == 1) { ActivateSingleSelect (file_mgr_rec, file_mgr_data->selection_list[0]->file_data->logical_type); } else ActivateMultipleSelect (file_mgr_rec); } else SensitizeTrashBtns(); ProcessBtnUp = False; } void DrawHighlight ( Widget w, FileViewData *file_view_data, FileMgrData *file_mgr_data, int type) { int n, num_rectangles; Position x,y; Dimension highlightThickness, shadowThickness; Dimension half_shadowThickness; Dimension marginWidth, marginHeight; Dimension pixmapWidth, pixmapHeight; Dimension stringWidth, stringHeight; Dimension spacing; XRectangle rect[10]; unsigned char pixmapPosition; unsigned char alignment; Position adj_x, adj_y; GC gc ; Arg args[20]; DtIconGadget g = (DtIconGadget)w; ObjectPtr top; gc = ((XmManagerWidget)(g->object.parent))->manager.highlight_GC; #ifdef SHAPE if(shapeExtension) if(type == DESKTOP) { DrawShadowTh(w, gc, DESKTOP); return; } #endif /* in in as placed mode need to cycle the icons so the traversal box doesn't chop up the icons */ if(type == NOT_DESKTOP && file_view_data != NULL) { if (PositioningEnabledInView(file_mgr_data)) { top = GetTopOfStack(file_mgr_data); if(top != NULL && top->file_view_data != file_view_data) { ObjectPtr savetop, next, prev; int i; savetop = top; while(top != NULL && top->file_view_data != file_view_data) top = top->next; if(top != NULL) { prev = top->prev; next = top->next; if (prev) prev->next = next; if (next) next->prev = prev; top->prev = NULL; top->next = savetop; top->stacking_order = 1; savetop->prev = top; top = savetop; for(i = 2; top->prev != NULL; i++) { top->stacking_order = i; if(top->next == NULL) break; top = top->next; } RedrawOneGadget(w, NULL, NULL); } } } } n = 0; XtSetArg (args[n], XmNhighlightThickness, &highlightThickness); n++; XtSetArg (args[n], XmNshadowThickness, &shadowThickness); n++; XtSetArg (args[n], XmNx, &x); n++; XtSetArg (args[n], XmNy, &y); n++; XtSetArg (args[n], XmNmarginWidth, &marginWidth); n++; XtSetArg (args[n], XmNmarginHeight, &marginHeight); n++; XtSetArg (args[n], XmNpixmapPosition, &pixmapPosition); n++; XtSetArg (args[n], XmNalignment, &alignment); n++; XtGetValues (w, args, n); spacing = (((DtIconGadget)(g)) -> icon.cache -> spacing); pixmapWidth = g->icon.pixmap_width; pixmapHeight = g->icon.pixmap_height; stringWidth = g->icon.string_width; stringHeight = g->icon.cache->string_height; adj_x = shadowThickness + highlightThickness + marginWidth; adj_y = shadowThickness + highlightThickness + marginHeight; if(shadowThickness != 0) half_shadowThickness = shadowThickness/2; else half_shadowThickness = 0; num_rectangles = 0; switch ((int) pixmapPosition) { case XmPIXMAP_TOP: if (alignment == XmALIGNMENT_BEGINNING) { /* 1 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y; rect[num_rectangles].width = pixmapWidth + (2 * adj_x); rect[num_rectangles++].height = highlightThickness; if(stringWidth > pixmapWidth) { /* 2 */ rect[num_rectangles].x = x + pixmapWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + spacing; /* 3 */ rect[num_rectangles].x = x + pixmapWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y + pixmapHeight + spacing; rect[num_rectangles].width = stringWidth - pixmapWidth + highlightThickness; rect[num_rectangles++].height = highlightThickness; /* 4 */ rect[num_rectangles].x = x + stringWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y + pixmapHeight + spacing; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = stringHeight + (2 * adj_y); } else { /* 2 */ rect[num_rectangles].x = x + pixmapWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + (2 * adj_y) - highlightThickness; /* 3 */ rect[num_rectangles].x = x + stringWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y + pixmapHeight + (2 * adj_y) - highlightThickness; rect[num_rectangles].width = pixmapWidth - stringWidth + highlightThickness; rect[num_rectangles++].height = highlightThickness; /* 4 */ rect[num_rectangles].x = x + stringWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y + pixmapHeight + (2 * adj_y) - highlightThickness; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = spacing + stringHeight + highlightThickness; } /* 5 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y + pixmapHeight + stringHeight + spacing + (2 * adj_y) - highlightThickness; rect[num_rectangles].width = stringWidth + (2 * adj_y); rect[num_rectangles++].height = highlightThickness; /* 6 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + stringHeight + spacing + (2 * adj_y); } else if (alignment == XmALIGNMENT_CENTER) { if(stringWidth > pixmapWidth) { /* 1 */ rect[num_rectangles].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2; rect[num_rectangles].y = y; rect[num_rectangles].width = pixmapWidth + (2 * adj_x); rect[num_rectangles++].height = highlightThickness; /* 2 */ rect[num_rectangles].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + pixmapWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + spacing; /* 3 */ rect[num_rectangles].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + pixmapWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y + pixmapHeight + spacing; rect[num_rectangles].width = (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + (Dimension)(stringWidth - pixmapWidth)%(Dimension)2; rect[num_rectangles++].height = highlightThickness; /* 4 */ rect[num_rectangles].x = x + stringWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y + pixmapHeight + spacing; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = stringHeight + (2 * adj_y); /* 5 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y + pixmapHeight + stringHeight + spacing + (2 * adj_y) - highlightThickness; rect[num_rectangles].width = stringWidth + (2 * adj_y); rect[num_rectangles++].height = highlightThickness; /* 6 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y + pixmapHeight + spacing; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = stringHeight + (2 * adj_y); /* 7 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y + pixmapHeight + spacing; rect[num_rectangles].width = (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + highlightThickness; rect[num_rectangles++].height = highlightThickness; /* 8 */ rect[num_rectangles].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + spacing; } else { /* 1 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y; rect[num_rectangles].width = pixmapWidth + (2 * adj_x); rect[num_rectangles++].height = highlightThickness; /* 2 */ rect[num_rectangles].x = x + pixmapWidth + (2 * adj_x) - highlightThickness; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + spacing + 2 * highlightThickness; /* 3 */ rect[num_rectangles].x = x + pixmapWidth + adj_x - (Dimension)(pixmapWidth - stringWidth)/(Dimension)2 + highlightThickness; rect[num_rectangles].y = y + pixmapHeight + spacing + highlightThickness + 1; rect[num_rectangles].width = (Dimension)(pixmapWidth - stringWidth)/(Dimension)2 + highlightThickness; rect[num_rectangles++].height = highlightThickness; /* 4 */ rect[num_rectangles].x = x + stringWidth + adj_x + (Dimension)(pixmapWidth - stringWidth)/(Dimension)2 + highlightThickness; rect[num_rectangles].y = y + pixmapHeight + spacing + highlightThickness + 1; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = stringHeight + (2 * adj_y) - highlightThickness - 1; /* 5 */ rect[num_rectangles].x = x + (Dimension)(pixmapWidth - stringWidth)/(Dimension)2; rect[num_rectangles].y = y + pixmapHeight + stringHeight + spacing + (2 * adj_y) - highlightThickness; rect[num_rectangles].width = stringWidth + (2 * adj_y); rect[num_rectangles++].height = highlightThickness; /* 6 */ rect[num_rectangles].x = x + (Dimension)(pixmapWidth - stringWidth)/(Dimension)2; rect[num_rectangles].y = y + pixmapHeight + spacing + highlightThickness + 1; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = stringHeight + (2 * adj_y) - highlightThickness - 1; /* 7 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y + pixmapHeight + spacing + highlightThickness + 1; rect[num_rectangles].width = (Dimension)(pixmapWidth - stringWidth)/(Dimension)2 + highlightThickness; rect[num_rectangles++].height = highlightThickness; /* 8 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + spacing + 2 * highlightThickness; } } else FM_XmHighlightBorder ((Widget)w); break; case XmPIXMAP_LEFT: if((Dimension)(stringHeight + 4) >= pixmapHeight) FM_XmHighlightBorder ((Widget)w); else { /* 1 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y; rect[num_rectangles].width = adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2; rect[num_rectangles++].height = highlightThickness; /* 2 */ rect[num_rectangles].x = x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = (Dimension)(pixmapHeight - stringHeight)/(Dimension)2; /* 3 */ rect[num_rectangles].x = x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2; rect[num_rectangles].y = y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2; rect[num_rectangles].width = spacing/2 + stringWidth + adj_x; rect[num_rectangles++].height = highlightThickness; /* 4 */ rect[num_rectangles].x = x + adj_x + pixmapWidth + spacing + stringWidth + adj_x - highlightThickness; rect[num_rectangles].y = y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = stringHeight + 2*adj_y; /* 5 */ rect[num_rectangles].x = x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2; rect[num_rectangles].y = y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2 + stringHeight + 2*adj_y - highlightThickness; rect[num_rectangles].width = spacing/2 + stringWidth + adj_x; rect[num_rectangles++].height = highlightThickness; /* 6 */ rect[num_rectangles].x = x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2; rect[num_rectangles].y = y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2 + stringHeight + 2*adj_y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight - stringHeight - (Dimension)(pixmapHeight - stringHeight)/(Dimension)2; /* 7 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y + pixmapHeight + 2*adj_y - highlightThickness; rect[num_rectangles].width = adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2; rect[num_rectangles++].height = highlightThickness; /* 8 */ rect[num_rectangles].x = x; rect[num_rectangles].y = y; rect[num_rectangles].width = highlightThickness; rect[num_rectangles++].height = pixmapHeight + 2*adj_y; } break; case XmPIXMAP_BOTTOM: case XmPIXMAP_RIGHT: FM_XmHighlightBorder ((Widget)w); break; default: break; } XFillRectangles (XtDisplay (w), XtWindow (w), gc, &rect[0], num_rectangles); } void DrawUnhighlight ( Widget w, int type) { int n; Position x,y; Dimension highlightThickness, shadowThickness; Dimension half_shadowThickness; Dimension marginWidth, marginHeight; Dimension pixmapWidth, pixmapHeight; Dimension stringWidth, stringHeight; Dimension spacing; unsigned char pixmapPosition; unsigned char alignment; Position adj_x, adj_y; Arg args[20]; DtIconGadget g = (DtIconGadget)w; #ifdef SHAPE if(shapeExtension) if(type == DESKTOP) { DrawShadowTh(w, NULL, DESKTOP); return; } #endif n = 0; XtSetArg (args[n], XmNhighlightThickness, &highlightThickness); n++; XtSetArg (args[n], XmNshadowThickness, &shadowThickness); n++; XtSetArg (args[n], XmNx, &x); n++; XtSetArg (args[n], XmNy, &y); n++; XtSetArg (args[n], XmNmarginWidth, &marginWidth); n++; XtSetArg (args[n], XmNmarginHeight, &marginHeight); n++; XtSetArg (args[n], XmNpixmapPosition, &pixmapPosition); n++; XtSetArg (args[n], XmNalignment, &alignment); n++; XtGetValues (w, args, n); spacing = (((DtIconGadget)(g)) -> icon.cache -> spacing); pixmapWidth = g->icon.pixmap_width; pixmapHeight = g->icon.pixmap_height; stringWidth = g->icon.string_width; stringHeight = g->icon.cache->string_height; adj_x = shadowThickness + highlightThickness + marginWidth; adj_y = shadowThickness + highlightThickness + marginHeight; if(shadowThickness != 0) half_shadowThickness = shadowThickness/2; else half_shadowThickness = 0; switch ((int) pixmapPosition) { case XmPIXMAP_TOP: if (alignment == XmALIGNMENT_BEGINNING) { /* 1 */ XClearArea (XtDisplay (w), XtWindow (w), x, y, pixmapWidth + (2 * adj_x), highlightThickness, False); if(stringWidth > pixmapWidth) { /* 2 */ XClearArea (XtDisplay (w), XtWindow (w), x + pixmapWidth + (2 * adj_x) - highlightThickness, y, highlightThickness, pixmapHeight + spacing, False); /* 3 */ XClearArea (XtDisplay (w), XtWindow (w), x + pixmapWidth + (2 * adj_x) - highlightThickness, y + pixmapHeight + spacing, stringWidth - pixmapWidth + highlightThickness, highlightThickness, False); /* 4 */ XClearArea (XtDisplay (w), XtWindow (w), x + stringWidth + (2 * adj_x) - highlightThickness, y + pixmapHeight + spacing, highlightThickness, stringHeight + (2 * adj_y), False); } else { /* 2 */ XClearArea (XtDisplay (w), XtWindow (w), x + pixmapWidth + (2 * adj_x) - highlightThickness, y, highlightThickness, pixmapHeight + (2 * adj_y) - half_shadowThickness, False); /* 3 */ XClearArea (XtDisplay (w), XtWindow (w), x + stringWidth + (2 * adj_x) - highlightThickness, y + pixmapHeight + (2 * adj_y) - highlightThickness, pixmapWidth - stringWidth + highlightThickness, highlightThickness, False); /* 4 */ XClearArea (XtDisplay (w), XtWindow (w), x + stringWidth + (2 * adj_x) - highlightThickness, y + pixmapHeight + (2 * adj_y) - half_shadowThickness, highlightThickness, spacing + stringHeight + highlightThickness, False); } /* 5 */ XClearArea (XtDisplay (w), XtWindow (w), x, y + pixmapHeight + stringHeight + spacing + (2 * adj_y) - highlightThickness, stringWidth + (2 * adj_y), highlightThickness, False); /* 6 */ XClearArea (XtDisplay (w), XtWindow (w), x, y, highlightThickness, pixmapHeight + stringHeight + spacing + (2 * adj_y), False); } else if (alignment == XmALIGNMENT_CENTER) { if(stringWidth > pixmapWidth) { /* 1 */ XClearArea (XtDisplay (w), XtWindow (w), x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2, y, pixmapWidth + (2 * adj_x), highlightThickness, False); /* 2 */ XClearArea (XtDisplay (w), XtWindow (w), x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + pixmapWidth + (2 * adj_x) - highlightThickness, y, highlightThickness, pixmapHeight + spacing, False); /* 3 */ XClearArea (XtDisplay (w), XtWindow (w), x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + pixmapWidth + (2 * adj_x) - highlightThickness, y + pixmapHeight + spacing, (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + (Dimension)(stringWidth - pixmapWidth)%(Dimension)2, highlightThickness, False); /* 4 */ XClearArea (XtDisplay (w), XtWindow (w), x + stringWidth + (2 * adj_x) - highlightThickness, y + pixmapHeight + spacing, highlightThickness, stringHeight + (2 * adj_y), False); /* 5 */ XClearArea (XtDisplay (w), XtWindow (w), x, y + pixmapHeight + stringHeight + spacing + (2 * adj_y) - highlightThickness, stringWidth + (2 * adj_y), highlightThickness, False); /* 6 */ XClearArea (XtDisplay (w), XtWindow (w), x, y + pixmapHeight + spacing, highlightThickness, stringHeight + (2 * adj_y), False); /* 7 */ XClearArea (XtDisplay (w), XtWindow (w), x, y + pixmapHeight + spacing, (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + highlightThickness, highlightThickness, False); /* 8 */ XClearArea (XtDisplay (w), XtWindow (w), x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2, y, highlightThickness, pixmapHeight + spacing, False); } else { /* 1 */ XClearArea (XtDisplay (w), XtWindow (w), x, y, pixmapWidth + (2 * adj_x), highlightThickness, False); /* 2 */ XClearArea (XtDisplay (w), XtWindow (w), x + pixmapWidth + (2 * adj_x) - highlightThickness, y, highlightThickness, pixmapHeight + spacing + 2 * highlightThickness, False); /* 3 */ XClearArea (XtDisplay (w), XtWindow (w), x + pixmapWidth + adj_x + highlightThickness - (Dimension)(pixmapWidth - stringWidth)/(Dimension)2, y + pixmapHeight + spacing + highlightThickness + 1, (Dimension)(pixmapWidth - stringWidth)/(Dimension)2 + highlightThickness, highlightThickness, False); /* 4 */ XClearArea (XtDisplay (w), XtWindow (w), x + stringWidth + (Dimension)(pixmapWidth - stringWidth)/(Dimension)2 + adj_x + highlightThickness, y + pixmapHeight + spacing + highlightThickness + 1, highlightThickness, stringHeight + (2 * adj_y) - highlightThickness -1, False); /* 5 */ XClearArea (XtDisplay (w), XtWindow (w), x + (Dimension)(pixmapWidth - stringWidth)/(Dimension)2, y + pixmapHeight + stringHeight + spacing + (2 * adj_y) - highlightThickness, stringWidth + (2 * adj_y), highlightThickness, False); /* 6 */ XClearArea (XtDisplay (w), XtWindow (w), x + (Dimension)(pixmapWidth - stringWidth)/(Dimension)2, y + pixmapHeight + spacing + highlightThickness + 1, highlightThickness, stringHeight + (2 * adj_y) - highlightThickness - 1, False); /* 7 */ XClearArea (XtDisplay (w), XtWindow (w), x, y + pixmapHeight + spacing + highlightThickness + 1, (Dimension)(pixmapWidth - stringWidth)/(Dimension)2 + highlightThickness, highlightThickness, False); /* 8 */ XClearArea (XtDisplay (w), XtWindow (w), x, y, highlightThickness, pixmapHeight + spacing + 2 * highlightThickness, False); } } else FM_XmUnhighlightBorder ((Widget)w); break; case XmPIXMAP_LEFT: if((Dimension)(stringHeight + 4) >= pixmapHeight) FM_XmUnhighlightBorder ((Widget)w); else { /* 1 */ XClearArea (XtDisplay (w), XtWindow (w), x, y, adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2, highlightThickness, False); /* 2 */ XClearArea (XtDisplay (w), XtWindow (w), x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2, y, highlightThickness, (Dimension)(pixmapHeight - stringHeight)/(Dimension)2, False); /* 3 */ XClearArea (XtDisplay (w), XtWindow (w), x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2, y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2, spacing/2 + stringWidth + adj_x, highlightThickness, False); /* 4 */ XClearArea (XtDisplay (w), XtWindow (w), x + adj_x + pixmapWidth + spacing + stringWidth + adj_x - highlightThickness, y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2, highlightThickness, stringHeight + 2*adj_y, False); /* 5 */ XClearArea (XtDisplay (w), XtWindow (w), x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2, y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2 + stringHeight + 2*adj_y - highlightThickness, spacing/2 + stringWidth + adj_x, highlightThickness, False); /* 6 */ XClearArea (XtDisplay (w), XtWindow (w), x + adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2, y + (Dimension)(pixmapHeight - stringHeight)/(Dimension)2 + stringHeight + 2*adj_y, highlightThickness, pixmapHeight - stringHeight - (Dimension)(pixmapHeight - stringHeight)/(Dimension)2, False); /* 7 */ XClearArea (XtDisplay (w), XtWindow (w), x, y + pixmapHeight + 2*adj_y - highlightThickness, adj_x + pixmapWidth + (Dimension)(spacing+1)/(Dimension)2, highlightThickness, False); /* 8 */ XClearArea (XtDisplay (w), XtWindow (w), x, y, highlightThickness, pixmapHeight + 2*adj_y, False); } break; case XmPIXMAP_BOTTOM: case XmPIXMAP_RIGHT: FM_XmUnhighlightBorder ((Widget)w); break; default: break; } } void DrawShadowTh ( Widget w, GC gc, int type) { int n; Position x,y; Dimension highlightThickness, shadowThickness; Dimension width, height; Dimension marginWidth, marginHeight; Dimension pixmapWidth, pixmapHeight; Dimension stringWidth, stringHeight; Dimension spacing; unsigned char pixmapPosition; unsigned char alignment; unsigned char shadowType; GC top_gc, bottom_gc ; Arg args[20]; XRectangle rect[10]; DtIconGadget g = (DtIconGadget)w; XmManagerWidget mgr = (XmManagerWidget)XtParent(w); Boolean s_out = False, s_etched = False; n = 0; XtSetArg (args[n], XmNhighlightThickness, &highlightThickness); n++; XtSetArg (args[n], XmNshadowThickness, &shadowThickness); n++; XtSetArg (args[n], XmNx, &x); n++; XtSetArg (args[n], XmNy, &y); n++; XtSetArg (args[n], XmNwidth, &width); n++; XtSetArg (args[n], XmNheight, &height); n++; XtSetArg (args[n], XmNmarginWidth, &marginWidth); n++; XtSetArg (args[n], XmNmarginHeight, &marginHeight); n++; XtSetArg (args[n], XmNpixmapPosition, &pixmapPosition); n++; XtSetArg (args[n], XmNalignment, &alignment); n++; XtSetArg (args[n], XmNshadowType, &shadowType); n++; XtGetValues (w, args, n); spacing = (((DtIconGadget)(g)) -> icon.cache -> spacing); pixmapWidth = g->icon.pixmap_width; pixmapHeight = g->icon.pixmap_height; stringWidth = g->icon.string_width; stringHeight = g->icon.cache->string_height; /* Get shadow attributes. */ s_out = (shadowType == XmSHADOW_OUT || shadowType == XmSHADOW_ETCHED_OUT) ? True : False; s_etched = (shadowType == XmSHADOW_ETCHED_IN || shadowType == XmSHADOW_ETCHED_OUT) ? True : False; if(gc == NULL) { if(shadowType == XmSHADOW_ETCHED_OUT) { top_gc = (s_out) ? mgr->manager.top_shadow_GC : mgr->manager.bottom_shadow_GC; bottom_gc = (s_out) ? mgr->manager.bottom_shadow_GC : mgr->manager.top_shadow_GC; } else { bottom_gc = (s_out) ? mgr->manager.top_shadow_GC : mgr->manager.bottom_shadow_GC; top_gc = (s_out) ? mgr->manager.bottom_shadow_GC : mgr->manager.top_shadow_GC; } } else top_gc = bottom_gc = gc; /* Draw shadow. */ if (!s_etched) { XmeDrawShadows (XtDisplay(w), XtWindow(w), top_gc, bottom_gc, x + highlightThickness, y + highlightThickness, width - 2*highlightThickness, height - 2*highlightThickness, shadowThickness, XmSHADOW_IN); } else { int half_shadowThickness; int num_rects; if (shadowThickness <= 0) return; if (shadowThickness > (Dimension)(width / 2)) shadowThickness = width / 2; if (shadowThickness > (Dimension)(height / 2)) shadowThickness = height / 2; if (shadowThickness <= 0) return; shadowThickness = (shadowThickness % 2) ? (shadowThickness-1) : (shadowThickness); half_shadowThickness = shadowThickness / 2; switch ((int) pixmapPosition) { case XmPIXMAP_TOP: if (alignment == XmALIGNMENT_BEGINNING) { if(type == NOT_DESKTOP) { num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2 + shadowThickness + half_shadowThickness; if(stringWidth > pixmapWidth) { /* 3 */ rect[num_rects].x = x + highlightThickness + shadowThickness + pixmapWidth + (2 * marginWidth); rect[num_rects].y = y + pixmapHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = stringWidth - pixmapWidth + marginWidth - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + stringWidth + (2 * marginWidth) + shadowThickness + highlightThickness; rect[num_rects].y = y + pixmapHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + (2*marginHeight) + half_shadowThickness; } else { /* 3 */ rect[num_rects].x = x + highlightThickness + stringWidth + (2 * marginWidth) + shadowThickness; rect[num_rects].y = y + pixmapHeight + 2*marginHeight + shadowThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth - stringWidth + marginHeight - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + stringWidth + (2 * marginWidth) + shadowThickness; rect[num_rects].y = y + pixmapHeight + 2*marginHeight + shadowThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + (2*marginHeight); } /* 5 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + stringHeight + spacing + (2*marginHeight) + shadowThickness; if(stringWidth > pixmapWidth) rect[num_rects].width = stringWidth + (2 * marginWidth) + shadowThickness + half_shadowThickness; else rect[num_rects].width = stringWidth + (2 * marginWidth) + shadowThickness + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + stringHeight + spacing + (2 * marginHeight) + shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + (2 * marginWidth) + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; if(stringWidth > pixmapWidth) { /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + shadowThickness + (2 * marginWidth) + half_shadowThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight+ shadowThickness + (spacing/2) + half_shadowThickness; else rect[num_rects++].height = pixmapHeight + marginHeight+ shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness + shadowThickness + pixmapWidth + (2 * marginWidth); rect[num_rects].y = y + pixmapHeight + 2*marginHeight + shadowThickness + half_shadowThickness; rect[num_rects].width = stringWidth - pixmapWidth + marginWidth - shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + stringWidth + (2 * marginWidth) + shadowThickness + half_shadowThickness + highlightThickness; rect[num_rects].y = y + pixmapHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = half_shadowThickness; if(highlightThickness == 0) rect[num_rects++].height = stringHeight + (2*marginHeight) + half_shadowThickness; else rect[num_rects++].height = stringHeight + (2*marginHeight) + shadowThickness + half_shadowThickness; } else { /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + shadowThickness + (2 * marginWidth) + half_shadowThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + marginHeight + shadowThickness + (spacing/2) + half_shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness + stringWidth + (2 * marginWidth) + shadowThickness + half_shadowThickness; rect[num_rects].y = y + pixmapHeight + 2*marginHeight + 2*shadowThickness; rect[num_rects].width = pixmapWidth - stringWidth + marginHeight - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + stringWidth + (2 * marginWidth) + shadowThickness + half_shadowThickness; rect[num_rects].y = y + pixmapHeight + 2*marginHeight + 2*shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + (2*marginHeight) + half_shadowThickness; } /* 5 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + stringHeight + spacing + (2*marginHeight) + shadowThickness + half_shadowThickness; if(stringWidth > pixmapWidth) rect[num_rects].width = stringWidth + (2 * marginWidth) + half_shadowThickness + shadowThickness; else rect[num_rects].width = stringWidth + (2 * marginWidth) + (2*shadowThickness); rect[num_rects++].height = half_shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + stringHeight + spacing + (2 * marginHeight) + half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } else { num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects++].height = half_shadowThickness; if(stringWidth > pixmapWidth) { /* 3 */ rect[num_rects].x = x + highlightThickness + shadowThickness + pixmapWidth + (2 * marginWidth); rect[num_rects].y = y + highlightThickness + pixmapHeight + marginHeight + half_shadowThickness; rect[num_rects].width = stringWidth - pixmapWidth + marginWidth + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + shadowThickness + pixmapWidth + (2 * marginWidth); rect[num_rects].y = y + highlightThickness + pixmapHeight + marginHeight + shadowThickness; rect[num_rects].width = stringWidth - pixmapWidth + marginWidth; rect[num_rects++].height = half_shadowThickness; } /* 5 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + stringHeight + spacing + (2 * marginHeight) + shadowThickness + half_shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + stringHeight + spacing + (2 * marginHeight) + half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; if(stringWidth > pixmapWidth) { if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2; else rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2; } else { if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2 + half_shadowThickness + shadowThickness; else rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2 + half_shadowThickness; } /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + shadowThickness + (2 * marginWidth) + half_shadowThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; if(stringWidth > pixmapWidth) { if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + (spacing/2); else rect[num_rects++].height = pixmapHeight + marginHeight + half_shadowThickness; } else { if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + shadowThickness + (spacing/2) + half_shadowThickness; else rect[num_rects++].height = pixmapHeight + marginHeight + shadowThickness + shadowThickness; } /* 3 */ if(stringWidth > pixmapWidth) { rect[num_rects].x = x + stringWidth + (2 * marginWidth) + shadowThickness + highlightThickness; } else { rect[num_rects].x = x + highlightThickness + pixmapWidth + (2 * marginWidth) + shadowThickness; } rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + highlightThickness + (2*marginHeight) + 2*shadowThickness; /* 4 */ if(stringWidth > pixmapWidth) { rect[num_rects].x = x + stringWidth + (2 * marginWidth) + shadowThickness + half_shadowThickness + highlightThickness; } else { rect[num_rects].x = x + highlightThickness + pixmapWidth + shadowThickness + (2 * marginWidth) + half_shadowThickness; } rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + highlightThickness + (2*marginHeight) + shadowThickness + half_shadowThickness; /* 5 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + stringHeight + spacing + (2*marginHeight) + shadowThickness; if(stringWidth > pixmapWidth) rect[num_rects].width = stringWidth + (2 * marginWidth) + shadowThickness; else rect[num_rects].width = pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects++].height = half_shadowThickness; rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + stringHeight + spacing + (2*marginHeight) + shadowThickness + half_shadowThickness; if(stringWidth > pixmapWidth) rect[num_rects].width = stringWidth + (2 * marginWidth) + half_shadowThickness + shadowThickness; else rect[num_rects].width = pixmapWidth + (2 * marginWidth) + (2*shadowThickness); rect[num_rects++].height = half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } } else if (alignment == XmALIGNMENT_CENTER && type == DESKTOP) { if(stringWidth > pixmapWidth) { num_rects = 0; /* 1 */ rect[num_rects].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + (Dimension)(stringWidth -pixmapWidth)/(Dimension)2 + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 3 */ rect[num_rects].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + highlightThickness + shadowThickness + pixmapWidth + (2 * marginWidth); rect[num_rects].y = y + highlightThickness + pixmapHeight + marginHeight + half_shadowThickness; rect[num_rects].width = (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + (Dimension)(stringWidth - pixmapWidth)%(Dimension)2 + marginWidth + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + highlightThickness + shadowThickness + pixmapWidth + (2 * marginWidth); rect[num_rects].y = y + highlightThickness + pixmapHeight + marginHeight + shadowThickness; rect[num_rects].width = (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + (Dimension)(stringWidth - pixmapWidth)%(Dimension)2 + marginWidth; rect[num_rects++].height = half_shadowThickness; /* 5 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + highlightThickness + (2*marginHeight) + 2*shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + highlightThickness + (2*marginHeight) + shadowThickness + half_shadowThickness; /* 7 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + marginHeight + half_shadowThickness; rect[num_rects].width = (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 8 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + marginHeight + shadowThickness; rect[num_rects].width = (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 9 */ rect[num_rects].x = x + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2; else rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2; /* 10 */ rect[num_rects].x = x + highlightThickness + (Dimension)(stringWidth -pixmapWidth)/(Dimension)2 + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + (spacing/2); else rect[num_rects++].height = pixmapHeight + marginHeight + half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2 + (2 * marginWidth) + shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2; else rect[num_rects++].height = pixmapHeight + marginHeight + spacing/2; /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + shadowThickness + (2 * marginWidth) + half_shadowThickness + (Dimension)(stringWidth - pixmapWidth)/(Dimension)2; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; if(highlightThickness == 0) rect[num_rects++].height = pixmapHeight + marginHeight + (spacing/2); else rect[num_rects++].height = pixmapHeight + marginHeight + half_shadowThickness; /* 3 */ rect[num_rects].x = x + stringWidth + (2 * marginWidth) + shadowThickness + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + highlightThickness + (2*marginHeight) + 2*shadowThickness; /* 4 */ rect[num_rects].x = x + stringWidth + (2 * marginWidth) + shadowThickness + half_shadowThickness + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + highlightThickness + (2*marginHeight) + shadowThickness + half_shadowThickness; /* 5 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + stringHeight + spacing + (2*marginHeight) + shadowThickness; rect[num_rects].width = stringWidth + (2 * marginWidth) + shadowThickness; rect[num_rects++].height = half_shadowThickness; rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + stringHeight + spacing + (2*marginHeight) + shadowThickness + half_shadowThickness; rect[num_rects].width = stringWidth + (2 * marginWidth) + half_shadowThickness + shadowThickness; rect[num_rects++].height = half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } else { num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = 2 * highlightThickness + pixmapHeight + stringHeight + 2 * marginWidth + spacing; /* 4 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = 2 * highlightThickness + pixmapHeight + stringHeight + 2 * marginWidth + spacing - half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = 2 * highlightThickness + pixmapHeight + stringHeight + 2 * marginWidth + spacing - half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + shadowThickness + (2 * marginWidth) + half_shadowThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = 2 * highlightThickness + pixmapHeight + stringHeight + 2 * marginWidth + spacing; /* 3 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + 2 * highlightThickness + pixmapHeight + stringHeight + spacing + 2 * marginHeight; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + 2 * highlightThickness + pixmapHeight + stringHeight + spacing + 2 * marginHeight + half_shadowThickness; rect[num_rects].width = pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects++].height = half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } } else XmeDrawShadows (XtDisplay(w), XtWindow(w), top_gc, bottom_gc, x + highlightThickness, y + highlightThickness, width - 2*highlightThickness, height - 2*highlightThickness, shadowThickness, XmSHADOW_IN); break; case XmPIXMAP_LEFT: if(type == NOT_DESKTOP) { if((Dimension)(stringHeight+5) >= (Dimension)pixmapHeight) { num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + shadowThickness + half_shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + stringHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + shadowThickness + half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + half_shadowThickness + 2*marginWidth; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness + pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + 2*shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + stringHeight + 2*marginHeight + shadowThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + 2*shadowThickness + 2*marginWidth; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } else { num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight - half_shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight -shadowThickness; rect[num_rects].width = stringWidth + marginWidth + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 3*marginWidth + stringWidth - half_shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + half_shadowThickness; /* 5 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + stringHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = stringWidth + marginWidth + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + stringHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight; /* 7 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 8 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + 2*marginHeight + shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + (2 * marginWidth) + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight - shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + half_shadowThickness; rect[num_rects].width = stringWidth + marginWidth + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 3*marginWidth + 2*shadowThickness + stringWidth; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2); rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + 2*shadowThickness; /* 5 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + 2*marginHeight + shadowThickness + stringHeight + half_shadowThickness; rect[num_rects].width = stringWidth + marginWidth + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + 2*marginHeight + shadowThickness + stringHeight + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight; /* 7 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + shadowThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + 2*marginWidth + 2*shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 8 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + 2*marginHeight + half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } } else { if((Dimension)(stringHeight+5) >= pixmapHeight) { num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + 2*shadowThickness + 2*marginWidth; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth; rect[num_rects++].height = half_shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; if(pixmapHeight > stringHeight) rect[num_rects++].height = pixmapHeight + 2*marginHeight + 2*shadowThickness; else rect[num_rects++].height = stringHeight + 2*marginHeight + 2*shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; if(pixmapHeight > stringHeight) rect[num_rects++].height = pixmapHeight + 2*marginHeight + half_shadowThickness; else rect[num_rects++].height = stringHeight + 2*marginHeight + half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth + highlightThickness; rect[num_rects].y = y + highlightThickness + shadowThickness; rect[num_rects].width = half_shadowThickness; if(pixmapHeight > stringHeight) rect[num_rects++].height = pixmapHeight + 2*marginHeight + shadowThickness; else rect[num_rects++].height = stringHeight + 2*marginHeight + shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness + pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; if(pixmapHeight > stringHeight) rect[num_rects++].height = pixmapHeight + 2*marginHeight + shadowThickness; else rect[num_rects++].height = stringHeight + 2*marginHeight + shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; if(pixmapHeight > stringHeight) rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + shadowThickness; else rect[num_rects].y = y + highlightThickness + stringHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + shadowThickness + 2*marginWidth - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness; if(pixmapHeight > stringHeight) rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + shadowThickness + half_shadowThickness; else rect[num_rects].y = y + highlightThickness + stringHeight + 2*marginHeight + shadowThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + stringWidth + spacing + 2*shadowThickness + 2*marginWidth; rect[num_rects++].height = half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } else { num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = pixmapWidth + (2 * shadowThickness) + (2 * marginWidth) + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + (2 * marginWidth) + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight -shadowThickness; rect[num_rects].width = stringWidth + marginWidth + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + half_shadowThickness; rect[num_rects].width = stringWidth + marginWidth + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 5 */ rect[num_rects].x = x + highlightThickness; rect[num_rects].y = y + highlightThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + 2*marginHeight + 2*shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = pixmapHeight + 2*marginHeight + shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), top_gc, &rect[0], num_rects); num_rects = 0; /* 1 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness + shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight - half_shadowThickness - shadowThickness; /* 2 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight - half_shadowThickness - shadowThickness; /* 3 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 3*marginWidth + stringWidth - half_shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + half_shadowThickness; /* 4 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 3*marginWidth + 2*shadowThickness + stringWidth; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2); rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = stringHeight + 2*marginHeight + 2*shadowThickness; /* 5 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + stringHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = stringWidth + marginWidth + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 6 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + 2*marginHeight + shadowThickness + stringHeight + half_shadowThickness; rect[num_rects].width = stringWidth + marginWidth + shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 7 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*shadowThickness + 2*marginWidth - shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + stringHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight; /* 8 */ rect[num_rects].x = x + highlightThickness + pixmapWidth + 2*marginWidth + shadowThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + 2*marginHeight + shadowThickness + stringHeight + half_shadowThickness; rect[num_rects].width = half_shadowThickness; rect[num_rects++].height = ((Dimension)(pixmapHeight - stringHeight)/(Dimension)2) + marginHeight; /* 9 */ rect[num_rects].x = x + highlightThickness + shadowThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + shadowThickness; rect[num_rects].width = pixmapWidth + shadowThickness + (2 * marginWidth) - half_shadowThickness; rect[num_rects++].height = half_shadowThickness; /* 10 */ rect[num_rects].x = x + highlightThickness + half_shadowThickness; rect[num_rects].y = y + highlightThickness + pixmapHeight + 2*marginHeight + shadowThickness + half_shadowThickness; rect[num_rects].width = pixmapWidth + 2*marginWidth + shadowThickness + half_shadowThickness; rect[num_rects++].height = half_shadowThickness; XFillRectangles (XtDisplay (w), XtWindow (w), bottom_gc, &rect[0], num_rects); } } break; case XmPIXMAP_BOTTOM: case XmPIXMAP_RIGHT: XmeDrawShadows (XtDisplay(w), XtWindow(w), top_gc, bottom_gc, x + highlightThickness, y + highlightThickness, width - 2*highlightThickness, height - 2*highlightThickness, shadowThickness, XmSHADOW_IN); break; default: break; } } } static void FM_XmHighlightBorder( Widget w ) { if( XmIsPrimitive( w) ) { (*(xmPrimitiveClassRec.primitive_class.border_highlight))( w) ; } else { if( XmIsGadget( w) ) { (*(xmGadgetClassRec.gadget_class.border_highlight))( w) ; } } return ; } static void FM_XmUnhighlightBorder( Widget w ) { if( XmIsPrimitive( w) ) { (*(xmPrimitiveClassRec.primitive_class.border_unhighlight))( w) ; } else { if( XmIsGadget( w) ) { (*(xmGadgetClassRec.gadget_class.border_unhighlight))( w) ; } } return ; } static XmGadget InputForGadget( Widget wid, int x, int y ) { Widget widget; widget = XmObjectAtPoint (wid, x, y); if (!widget || !XtIsSensitive (widget)) return ((XmGadget) NULL); return ((XmGadget) widget); }