static status verifyResizeGesture(ResizeGesture g, EventObj ev) { int frac = valInt(getClassVariableValueObject(g, NAME_marginFraction)); int mx = valInt(getClassVariableValueObject(g, NAME_marginWidth)); Int X, Y; int x, y, w, h; Graphical gr = ev->receiver; if ( !instanceOfObject(gr, ClassGraphical) || isNil(gr->device) ) fail; get_xy_event(ev, ev->receiver, ON, &X, &Y); x = valInt(X), y = valInt(Y); w = valInt(gr->area->w); h = valInt(gr->area->h); if ( x < w/frac && x < mx ) /* determine horizontal-mode */ assign(g, h_mode, NAME_left); else if ( x > ((frac-1) * w)/frac && x > w - mx ) assign(g, h_mode, NAME_right); else assign(g, h_mode, NAME_keep); if ( y < h/frac && y < mx ) /* determine vertical-mode */ assign(g, v_mode, NAME_top); else if ( y > ((frac-1) * h)/frac && y > h - mx ) assign(g, v_mode, NAME_bottom); else assign(g, v_mode, NAME_keep); if ( g->h_mode == NAME_keep && g->v_mode == NAME_keep ) fail; succeed; }
static status initialiseTileAdjuster(TileAdjuster p, TileObj t) { Image img = getClassVariableValueObject(p, NAME_image); Size size; CursorObj crs; BitmapObj bm; if ( isNil(t->super) ) return errorPce(p, NAME_noSubTile, t); if ( t->super->orientation == NAME_horizontal ) { img = getClassVariableValueObject(p, NAME_himage); crs = getClassVariableValueObject(p, NAME_horizontalResizeCursor); } else { img = getClassVariableValueObject(p, NAME_vimage); crs = getClassVariableValueObject(p, NAME_verticalResizeCursor); } size = getCopySize(img->size); initialiseWindow((PceWindow) p, NAME_adjuster, size, DEFAULT); assign(p, pen, ZERO); assign(p, cursor, crs); assign(p, orientation, t->super->orientation); send(p, NAME_display, bm=newObject(ClassBitmap, img, EAV), EAV); /*send(bm, NAME_cursor, crs, EAV);*/ assign(t, adjuster, p); assign(p, client, t); succeed; }
static status initialiseTextMargin(TextMargin m, Editor e, Int w, Int h) { initialiseGraphical(m, ZERO, ZERO, w, h); assign(m, editor, e); assign(m, background, getClassVariableValueObject(m, NAME_background)); assign(m, gap, newObject(ClassSize, EAV)); copySize(m->gap, getClassVariableValueObject(m, NAME_gap)); succeed; }
static int draw_button_popup_indicator(Button b, int x, int y, int w, int h, int up) { int rm; /* required right margin */ if ( notNil(b->popup_image) ) { int iw = valInt(b->popup_image->size->w); int ih = valInt(b->popup_image->size->h); rm = iw+8; r_image(b->popup_image, 0, 0, x+w-rm, y + (h-ih)/2, iw, ih, ON); } else { Elevation z = getClassVariableValueObject(b, NAME_elevation); if ( b->look == NAME_motif || b->look == NAME_gtk ) { int bw = 12; int bh = 8; rm = bw+8; r_3d_box(x+w-bw-8, y+(h-bh)/2, bw, bh, 0, z, TRUE); } else { int th = 8; int tw = 9; int tx, ty; rm = tw+8; tx = x+w-rm; ty = y + (h-th)/2; r_3d_triangle(tx+tw/2, ty+th, tx, ty, tx+tw, ty, z, up, 0x3); rm = tw; } } return rm; }
static status RedrawAreaTextMargin(TextMargin m, Area a) { int x, y, w, h; Elevation z = getClassVariableValueObject(m, NAME_elevation); Any obg; initialiseDeviceGraphical(m, &x, &y, &w, &h); margin_x = x; margin_y = y; obg = r_background(m->background); r_clear(x, y, w, h); if ( z && notNil(z) ) r_3d_box(x, y, w, h, 0, z, FALSE); else { r_thickness(valInt(m->pen)); r_dash(m->texture); r_box(x, y, w, h, 0, NIL); } scan_fragment_icons(m, paint_fragment, NAME_forSome, NIL); RedrawAreaGraphical(m, a); r_background(obg); succeed; }
status RedrawAreaButton(Button b, Area a) { int x, y, w, h; int defb; int rm = 0; /* right-margin */ PceWindow sw; int kbf; /* Button has keyboard focus */ int obhf; /* Other button has focus */ int focus; int swapbg = FALSE; int up; int flags = 0; Elevation z; if ( b->look == NAME_winMenuBar || b->look == NAME_gtkMenuBar ) return RedrawMenuBarButton(b, a); if ( b->active == OFF ) flags |= LABEL_INACTIVE; up = (b->status == NAME_active || b->status == NAME_inactive); defb = (b->default_button == ON); initialiseDeviceGraphical(b, &x, &y, &w, &h); NormaliseArea(x, y, w, h); if ( (sw = getWindowGraphical((Graphical)b)) ) { kbf = (sw->keyboard_focus == (Graphical) b); obhf = (!kbf && instanceOfObject(sw->keyboard_focus, ClassButton)); focus = (sw->input_focus == ON); } else kbf = obhf = focus = FALSE; /* should not happen */ if ( !ws_draw_button_face((DialogItem)b, x, y, w, h, up, defb, kbf && focus) ) draw_generic_button_face(b, x, y, w, h, up, defb, kbf && focus); if ( b->look == NAME_openLook && b->status == NAME_preview && !((z = getClassVariableValueObject(b, NAME_elevation)) && notNil(z)) ) { swapbg = TRUE; r_swap_background_and_foreground(); } if ( notNil(b->popup) && !instanceOfObject(b->label, ClassImage) ) rm = draw_button_popup_indicator(b, x, y, w, h, up); RedrawLabelDialogItem(b, accelerator_code(b->accelerator), x, y, w-rm, h, NAME_center, NAME_center, flags); if ( swapbg ) r_swap_background_and_foreground(); return RedrawAreaGraphical(b, a); }
status initialiseResizeGesture(ResizeGesture g, Name button, Modifier modifier) { Size ms = getClassVariableValueObject(g, NAME_minSize); initialiseGesture((Gesture) g, button, modifier); assign(g, h_mode, NAME_keep); assign(g, v_mode, NAME_keep); assign(g, min_size, ms != FAIL ? ms : newObject(ClassSize, EAV)); succeed; }
static status initialiseLBox(LBox lb, Int w) { if ( isDefault(w) ) w = getClassVariableValueObject(lb, NAME_width); obtainClassVariablesObject(lb); initialiseDevice((Device)lb); assign(lb->area, w, w); succeed; }
static status RedrawMenuBarButton(Button b, Area a) { int x, y, w, h; Any ofg = NIL; int flags = 0; initialiseDeviceGraphical(b, &x, &y, &w, &h); NormaliseArea(x, y, w, h); if ( b->status == NAME_preview ) { Elevation e; if ( b->look == NAME_gtkMenuBar && (e = getClassVariableValueObject(b, NAME_previewElevation)) && notNil(e) ) { r_3d_box(x, y, w, h, 0, e, TRUE); } else /* if ( b->look == NAME_winMenuBar ) */ { Any fg = getClassVariableValueObject(b, NAME_selectedForeground); Any bg = getClassVariableValueObject(b, NAME_selectedBackground); if ( !fg ) fg = WHITE_COLOUR; if ( !bg ) bg = BLACK_COLOUR; r_fill(x, y, w, h, bg); ofg = r_colour(fg); } } if ( b->active == OFF ) flags |= LABEL_INACTIVE; RedrawLabelDialogItem(b, accelerator_code(b->accelerator), x, y, w, h, NAME_center, NAME_center, flags); if ( notNil(ofg) ) r_colour(ofg); succeed; }
static status initialiseMoveOutlineGesture(MoveOutlineGesture g, Name button, Modifier modifier) { initialiseMoveGesture((MoveGesture) g, button, modifier); obtainClassVariablesObject(g); assign(g, outline, newObject(ClassBox, EAV)); send(g->outline, NAME_texture, getClassVariableValueObject(g, NAME_texture), EAV); send(g->outline, NAME_recogniser, newObject(ClassMoveGesture, g->button, g->modifier, EAV), EAV); succeed; }
status ws_create_font(FontObj f, DisplayObj d) { XpceFontInfo xref; DisplayWsXref r = d->ws_ref; XftFont *xft = NULL; if ( !instanceOfObject(f->x_name, ClassCharArray) || !isstrA(&f->x_name->data) ) /* HACK */ { XftPattern *p = XftPatternCreate(); XftPattern *match; FcResult fcrc; int i; char *fam; int mono = FALSE; Real scale = getClassVariableValueObject(f, NAME_scale); double fscale = (scale ? valReal(scale) : 1.0); if ( f->family == NAME_screen ) { fam = "monospace"; mono = TRUE; } else fam = strName(f->family); XftPatternAddString(p, XFT_FAMILY, fam); XftPatternAddDouble(p, XFT_PIXEL_SIZE, (double)valInt(f->points)*fscale); if ( f->style == NAME_italic ) XftPatternAddInteger(p, XFT_SLANT, XFT_SLANT_ITALIC); else if ( f->style == NAME_roman ) XftPatternAddInteger(p, XFT_SLANT, XFT_SLANT_ROMAN); else if ( f->style == NAME_bold ) XftPatternAddInteger(p, XFT_WEIGHT, XFT_WEIGHT_BOLD); if ( mono ) { DEBUG(NAME_font, Cprintf("Asking for fixed\n")); XftPatternAddInteger(p, XFT_SPACING, XFT_MONO); } if ( !(match = XftFontMatch(r->display_xref, r->screen, p, &fcrc)) ) { DEBUG(NAME_font, Cprintf("XftFontMatch() failed. Calling replaceFont()\n")); return replaceFont(f, d); } #ifdef HAVE_XFTNAMEUNPARSE DEBUG(NAME_font, { char buf[1024]; XftNameUnparse(match, buf, sizeof(buf)); Cprintf("Match = '%s'\n", buf); });
static UndoBuffer getUndoBufferTextBuffer(TextBuffer tb) { if ( tb->undo_buffer != NULL ) return tb->undo_buffer; if ( isDefault(tb->undo_buffer_size) ) assign(tb, undo_buffer_size, getClassVariableValueObject(tb, NAME_undoBufferSize)); if ( tb->undo_buffer_size != ZERO ) { tb->undo_buffer = createUndoBuffer(valInt(tb->undo_buffer_size)); tb->undo_buffer->client = tb; } return tb->undo_buffer; }
static status computeButton(Button b) { if ( notNil(b->request_compute) ) { int w, h, isimage; TRY(obtainClassVariablesObject(b)); dia_label_size(b, &w, &h, &isimage); if ( b->look == NAME_winMenuBar || b->look == NAME_gtkMenuBar ) { if ( !isimage ) { w += valInt(getExFont(b->label_font)) * 2; if ( b->look == NAME_gtkMenuBar ) h += 4; } else { w += 4; h += 4; } } else { if ( isimage ) { w += 4; h += 4; } else { Size size = getClassVariableValueObject(b, NAME_size); h += 6; w += 10 + valInt(b->radius); if ( notNil(b->popup) ) { if ( notNil(b->popup->popup_image) ) w += valInt(b->popup->popup_image->size->w) + 5; else if ( b->look == NAME_motif || b->look == NAME_gtk ) w += 12 + 5; else w += 9 + 5; } w = max(valInt(size->w), w); h = max(valInt(size->h), h); } } CHANGING_GRAPHICAL(b, assign(b->area, w, toInt(w)); assign(b->area, h, toInt(h))); assign(b, request_compute, NIL); }
static status rangeIntItem(IntItem ii, Int low, Int high) { char buf[48]; Type t = NULL; char s1[24], s2[24]; int b = valInt(getClassVariableValueObject(ii, NAME_border)); obtainClassVariablesObject(ii); if ( isDefault(low) ) { if ( isDefault(high) ) { t = TypeInt; sprintf(s1, INTPTR_FORMAT, PCE_MIN_INT); sprintf(s2, INTPTR_FORMAT, PCE_MAX_INT); } else { sprintf(s1, INTPTR_FORMAT, PCE_MIN_INT); sprintf(s2, INTPTR_FORMAT, valInt(high)); sprintf(buf, ".." INTPTR_FORMAT, valInt(high)); } } else { if ( isDefault(high) ) { sprintf(s1, INTPTR_FORMAT, valInt(low)); sprintf(s2, INTPTR_FORMAT, PCE_MAX_INT); sprintf(buf, INTPTR_FORMAT "..", valInt(low)); } else { sprintf(s1, INTPTR_FORMAT, valInt(low)); sprintf(s2, INTPTR_FORMAT, valInt(high)); sprintf(buf, INTPTR_FORMAT ".." INTPTR_FORMAT, valInt(low), valInt(high)); } } if ( !t ) t = checkType(CtoName(buf), TypeType, NIL); assign(ii, type, t); assign(ii, hor_stretch, ZERO); valueWidthTextItem((TextItem)ii, toInt(max(width_text(ii->value_font, s1), width_text(ii->value_font, s2)) + 2*b + 5 + + text_item_combo_width((TextItem)ii))); succeed; }
static status initialiseArc(Arc a, Int radius, Real start_angle, Real size_angle) { initialiseJoint((Joint) a, ZERO, ZERO, ZERO, ZERO, DEFAULT); if ( isDefault(radius) ) radius = getClassVariableValueObject(a, NAME_radius); if ( isDefault(start_angle) ) start_angle = CtoReal(0.0); if ( isDefault(size_angle) ) size_angle = CtoReal(90.0); assign(a, size, newObject(ClassSize, radius, radius, EAV)); assign(a, position, newObject(ClassPoint, EAV)); assign(a, start_angle, start_angle); assign(a, size_angle, size_angle); assign(a, close, NAME_none); return requestComputeGraphical(a, DEFAULT); }
static status initialiseView(View v, Name name, Size size, DisplayObj display, Editor editor) { Editor e; if ( isDefault(editor) ) { Size s2; if ( isDefault(size) && (s2 = getClassVariableValueObject(v, NAME_size)) ) size = newObject(ClassSize, s2->w, s2->h, EAV); TRY(e = get(v, NAME_createEditor, size, EAV)); } else e = editor; initialiseWindow((PceWindow) v, name, getSizeGraphical((Graphical) e), display); return send(v, NAME_editor, e, EAV); }
static Editor getCreateEditorView(View v, Size size) { Editor e; Int w, h; if ( notDefault(size) ) { w = size->w; h = size->h; } else w = h = DEFAULT; if ( (e = newObject(ClassEditor, DEFAULT, w, h, EAV)) ) { FontObj f; if ( (f = getClassVariableValueObject(v, NAME_font)) ) send(e, NAME_font, f, EAV); answer(e); } fail; }
static status RedrawAreaSlider(Slider s, Area a) { int x, y, w, h; int ny, vx, vy, lx, ly, sx, sy, hx, hy; int vv; int bw = (s->look == NAME_x ? BAR_WIDTH : OL_BOX_WIDTH); float lv = convert_value(s->low); float hv = convert_value(s->high); float dv = convert_value(s->displayed_value); int lflags = (s->active == ON ? 0 : LABEL_INACTIVE); if ( dv < lv ) dv = lv; else if ( dv > hv ) dv = hv; if ( hv > lv ) vv = rfloat(((float) (valInt(s->width) - bw) * (dv - lv)) / (hv - lv)); else vv = 0; initialiseDeviceGraphical(s, &x, &y, &w, &h); NormaliseArea(x, y, w, h); r_thickness(valInt(s->pen)); r_dash(s->texture); compute_slider(s, &ny, &vx, &vy, &lx, &ly, &sx, &sy, &hx, &hy); r_clear(x, y, w, h); if ( s->show_label == ON ) { int ex = valInt(getExFont(s->label_font)); RedrawLabelDialogItem(s, accelerator_code(s->accelerator), x, y+ny, vx-ex, 0, s->label_format, NAME_top, lflags); } if ( s->look == NAME_motif ) { int by = y+sy+(SLIDER_HEIGHT-OL_BAR_HEIGHT)/2; int ex = x + sx + valInt(s->width); Elevation z = getClassVariableValueObject(s, NAME_elevation); r_3d_box(x+sx, by, vv, OL_BAR_HEIGHT, 0, z, FALSE); r_3d_box(x+sx+vv+bw, by, ex-(x+sx+vv+bw), OL_BAR_HEIGHT, 0, z, FALSE); r_3d_box(x+sx+vv, y+sy, bw, SLIDER_HEIGHT, 0, z, TRUE); } else if ( s->look == NAME_openLook ) { int by = y+sy+(SLIDER_HEIGHT-OL_BAR_HEIGHT)/2; int ly2 = by+OL_BAR_HEIGHT-1; int ex = x + sx + valInt(s->width); r_fill(x+sx, by+1, 1, OL_BAR_HEIGHT-2, BLACK_IMAGE); r_fill(x+sx+1, by, vv-2, OL_BAR_HEIGHT, BLACK_IMAGE); r_line(x+sx+1+vv+bw, by, ex-2, by); r_line(x+sx+1+vv+bw, ly2, ex-2, ly2); r_line(ex-1, by+1, ex-1, ly2-1); r_shadow_box(x+sx+vv, y+sy, bw, SLIDER_HEIGHT, 0, 1, NIL); } else { r_fill(x+sx, y+sy, vv, SLIDER_HEIGHT, GREY50_IMAGE); r_box(x+sx, y+sy, valInt(s->width), SLIDER_HEIGHT, 0, NIL); r_fill(x+sx+vv, y+sy, bw, SLIDER_HEIGHT, BLACK_IMAGE); } if ( s->show_value == ON ) { char buf[100]; string str; buf[0] = '['; format_value(s, &buf[1], s->displayed_value); strcat(buf, "]"); str_set_ascii(&str, buf); str_label(&str, 0, s->value_font, x+vx, y+vy, 0, 0, NAME_left, NAME_top, lflags); format_value(s, buf, s->low); str_set_ascii(&str, buf); str_label(&str, 0, s->value_font, x+lx, y+ly, 0, 0, NAME_left, NAME_top, lflags); format_value(s, buf, s->high); str_set_ascii(&str, buf); str_label(&str, 0, s->value_font, x+hx, y+hy, 0, 0, NAME_left, NAME_top, lflags); } return RedrawAreaGraphical(s, a); }
static status RedrawAreaTextItem(TextItem ti, Area a) { int x, y, w, h; int al, av, am; int lw, lh; int fw = valInt(getExFont(ti->value_text->font)); Elevation z = getClassVariableValueObject(ti, NAME_elevation); int tx, ty, tw, th; TextObj vt = ti->value_text; int flags = 0; initialiseDeviceGraphical(ti, &x, &y, &w, &h); al = valInt(getAscentFont(ti->label_font)); av = valInt(getAscentFont(vt->font)) + valInt(vt->border); am = max(al, av); compute_label_text_item(ti, &lw, &lh); if ( ti->show_label == ON ) { RedrawLabelDialogItem(ti, accelerator_code(ti->accelerator), x, y+am-al, lw-fw, h, ti->label_format, NAME_top, ti->active == ON ? 0 : LABEL_INACTIVE); } tx = x+lw; ty = y+am-av; tw = valInt(vt->area->w); th = valInt(vt->area->h); if ( ti->editable == ON && ti->active == ON ) flags |= TEXTFIELD_EDITABLE; flags |= combo_flags(ti); if ( !ws_entry_field(tx, ty, tw+text_item_combo_width(ti), th, flags) ) { if ( flags & TEXTFIELD_EDITABLE ) { if ( z && notNil(z) ) { int zh = abs(valInt(z->height)); int ly = y+am+zh+valInt(getDescentFont(vt->font)); r_3d_line(x+lw, ly, x+lw+tw, ly, z, TRUE); } else if ( ti->pen != ZERO ) { int pen = valInt(ti->pen); int ly = y+am+1+pen/2; r_dash(ti->texture); r_thickness(valInt(ti->pen)); r_line(x+lw, ly, x+lw+tw, ly); } } if ( flags & (TEXTFIELD_COMBO|TEXTFIELD_COMBO_DOWN) ) { int trh = 8; int trw = 9; int trx, try; int up = (flags & TEXTFIELD_COMBO) ? TRUE : FALSE; trx = tx+tw+5; try = y + (h-trh)/2; r_3d_triangle(trx+trw/2, try+trh, trx, try, trx+trw, try, z, up, 0x3); } if ( flags & TEXTFIELD_STEPPER ) { int sw = STEPPER_BOX_W; int bx = x+w-sw; int bh = (h+1)/2; int iw, ih, ix, dy; Elevation e = getClassVariableValueClass(ClassButton, NAME_elevation); r_3d_box(bx, y, sw, bh, 0, e, !(flags & TEXTFIELD_INCREMENT)); r_3d_box(bx, y+bh, sw, h-bh, 0, e, !(flags & TEXTFIELD_DECREMENT)); iw = valInt(INT_ITEM_IMAGE->size->w)/2; ih = valInt(INT_ITEM_IMAGE->size->h); ix = x + w - (sw+iw+1)/2; dy = (bh-ih+1)/2; r_image(INT_ITEM_IMAGE, 0, 0, ix, y+dy, iw, ih, ON); r_image(INT_ITEM_IMAGE, iw, 0, ix, y+h-dy-ih, iw, ih, ON); } }
status ws_create_font(FontObj f, DisplayObj d) { WsFont wsf = alloc(sizeof(ws_font)); #ifdef __WINDOWS__ int widths[FONTTABLESIZE]; #else short widths[FONTTABLESIZE]; #endif HDC hdc; HFONT old; int n; TEXTMETRIC tm; int stock; if ( sscanf(strName(f->x_name), STOCKFMT, &stock) == 1 ) { wsf->hfont = GetStockObject(stock); wsf->from_stock = TRUE; } else { LOGFONT lfont; Real scale = getClassVariableValueObject(f, NAME_scale); float fscale = (scale ? valReal(scale) : 1.4); memset(&lfont, 0, sizeof(lfont)); lfont.lfHeight = (int)((float) valInt(f->points) * fscale); lfont.lfWeight = (f->style == NAME_bold ? FW_BOLD : FW_NORMAL); lfont.lfItalic = ((f->style == NAME_italic || f->style == NAME_oblique) ? 1 : 0); lfont.lfPitchAndFamily = (f->family == NAME_screen ? FIXED_PITCH : DEFAULT_PITCH); lfont.lfPitchAndFamily |= (f->family == NAME_helvetica ? FF_SWISS : f->family == NAME_times ? FF_ROMAN : f->family == NAME_screen ? FF_MODERN : FF_DONTCARE); if ( f->family == NAME_symbol ) strcpy(lfont.lfFaceName, "symbol"); if ( instanceOfObject(f->x_name, ClassCharArray) ) { strcpy(lfont.lfFaceName, strName(f->family)); parse_font(strName(f->x_name), &lfont); } else { lfont.lfOutPrecision = OUT_TT_ONLY_PRECIS; lfont.lfQuality = PROOF_QUALITY; } if ( !(wsf->hfont = CreateFontIndirect(&lfont)) ) { Cprintf("Failed to create logical font; replacing with stock font\n"); if ( f->family == NAME_screen ) { if ( f->style == NAME_bold ) stock = SYSTEM_FIXED_FONT; else stock = ANSI_FIXED_FONT; } else { if ( f->style == NAME_bold ) stock = SYSTEM_FONT; else stock = ANSI_VAR_FONT; } wsf->hfont = GetStockObject(stock); wsf->from_stock = TRUE; } else wsf->from_stock = FALSE; } wsf->widths = alloc(FONTTABLESIZE * sizeof(cwidth)); assign(f, iswide, OFF); hdc = GetDC(NULL); old = SelectObject(hdc, wsf->hfont); GetCharWidth(hdc, 0, FONTTABLESIZE-1, widths); for(n=0; n<FONTTABLESIZE; n++) wsf->widths[n] = widths[n]; GetTextMetrics(hdc, &tm); wsf->ascent = tm.tmAscent + tm.tmExternalLeading; wsf->descent = tm.tmDescent; /*if ( !(tm.tmPitchAndFamily & TMPF_TRUETYPE) && f->family != NAME_win ) Cprintf("%s (%s/%s): not a TrueType font\n", pp(f), pp(f->family), pp(f->style)); */ if ( isDefault(f->x_name) ) { char buf[256]; if ( GetTextFace(hdc, sizeof(buf), buf) ) assign(f, x_name, CtoName(buf)); } SelectObject(hdc, old); ReleaseDC(NULL, hdc); if ( wsf->widths['i'] == wsf->widths['w'] ) assign(f, fixed_width, ON); else assign(f, fixed_width, OFF); registerXrefObject(f, d, wsf); succeed; }
static void draw_generic_button_face(Button b, int x, int y, int w, int h, int up, int defb, int focus) { Elevation z = getClassVariableValueObject(b, NAME_elevation); int r = valInt(b->radius); if ( z && notNil(z) ) /* 3-d style */ { int up = (b->status == NAME_inactive || b->status == NAME_active); if ( b->look == NAME_motif || b->look == NAME_gtk || b->look == NAME_win ) { int bx = x, by = y, bw = w, bh = h; if ( b->look == NAME_motif || b->look == NAME_gtk ) { if ( b->show_focus_border == ON ) { PceWindow sw = getWindowGraphical((Graphical)b); Graphical kbfocus = (sw ? sw->keyboard_focus : NIL); if ( focus || kbfocus == (Graphical) b || /* inactive focus */ (defb && !instanceOfObject(kbfocus, ClassButton)) ) { static Elevation e = NULL; if ( !e ) e = newObject(ClassElevation, ONE, EAV); bx -= GTK_BUTTON_MARGIN; by -= GTK_BUTTON_MARGIN; bw += GTK_BUTTON_MARGIN * 2; bh += GTK_BUTTON_MARGIN * 2; r_3d_box(bx, by, bw, bh, r, e, FALSE); } } if ( focus ) { int pen = valInt(b->pen); if ( pen > 0 ) { r_thickness(pen); r_box(x-pen, y-pen, w+2*pen, h+2*pen, r, NIL); } } } else { if ( defb ) { int pen = valInt(b->pen); bx -= pen; by -= pen; bw += 2*pen; bh += 2*pen; r_thickness(pen); r_box(bx, by, bw, bh, r, NIL); } } } r_3d_box(x, y, w, h, r, z, up); if ( b->look == NAME_openLook && defb ) { Any old; old = r_colour(r_elevation_shadow(z)); r_box(x+2, y+2, w-4, h-4, r, NIL); r_colour(old); } } else /* 2-d style */ { int swapc = 0; int pen = valInt(b->pen); int radius = valInt(b->radius); int shadow = valInt(b->shadow); if ( defb && b->look != NAME_openLook ) pen++; r_thickness(pen); r_dash(b->texture); if ( up ) { r_shadow_box(x, y, w, h, radius, shadow, NIL); } else if ( b->status == NAME_preview ) { r_shadow_box(x, y, w, h, radius, shadow, BLACK_IMAGE); swapc = TRUE; } else if ( b->status == NAME_execute ) { r_shadow_box(x, y, w, h, radius, shadow, GREY25_IMAGE); } if ( swapc ) r_swap_background_and_foreground(); if ( defb && b->look == NAME_openLook ) r_box(x+pen, y+pen, w-2*pen-shadow, h-2*pen-shadow, radius, NIL); if ( swapc ) r_swap_background_and_foreground(); } }