/** * Compute absolute clip * * \param style Style to process * \param ex_size Ex size in ems * \return CSS_OK on success */ css_error compute_absolute_clip(css_computed_style *style, const css_hint_length *ex_size) { css_computed_clip_rect rect = { 0, 0, 0, 0, CSS_UNIT_PX, CSS_UNIT_PX, CSS_UNIT_PX, CSS_UNIT_PX, false, false, false, false }; css_error error; if (get_clip(style, &rect) == CSS_CLIP_RECT) { if (rect.top_auto == false) { if (rect.tunit == CSS_UNIT_EX) { rect.top = FMUL(rect.top, ex_size->value); rect.tunit = ex_size->unit; } } if (rect.right_auto == false) { if (rect.runit == CSS_UNIT_EX) { rect.right = FMUL(rect.right, ex_size->value); rect.runit = ex_size->unit; } } if (rect.bottom_auto == false) { if (rect.bunit == CSS_UNIT_EX) { rect.bottom = FMUL(rect.bottom, ex_size->value); rect.bunit = ex_size->unit; } } if (rect.left_auto == false) { if (rect.lunit == CSS_UNIT_EX) { rect.left = FMUL(rect.left, ex_size->value); rect.lunit = ex_size->unit; } } error = set_clip(style, CSS_CLIP_RECT, &rect); if (error != CSS_OK) return error; } return CSS_OK; }
static void button_paint_icon(HWND win, button_t* button, HDC dc) { HICON icon; RECT rect; RECT content; int state; SIZE size; UINT flags; HFONT font, old_font; int old_bk_mode; COLORREF old_text_color; HRGN old_clip; /* When theming is not used, we keep all the work on COMCTL32 button * implementation. */ MC_ASSERT(button->theme != NULL); GetClientRect(win, &rect); icon = (HICON) MC_SEND(win, BM_GETIMAGE, IMAGE_ICON, 0); font = (HFONT) MC_SEND(win, WM_GETFONT, 0, 0); if(font == NULL) font = GetStockObject(SYSTEM_FONT); old_font = SelectObject(dc, font); old_bk_mode = GetBkMode(dc); old_text_color = GetTextColor(dc); old_clip = get_clip(dc); /* Draw background */ if(button->style & WS_DISABLED) { state = PBS_DISABLED; } else { LRESULT s = MC_SEND(win, BM_GETSTATE, 0, 0); if(s & BST_PUSHED) state = PBS_PRESSED; else if(s & BST_HOT) state = PBS_HOT; else if(button->style & BS_DEFPUSHBUTTON) state = PBS_DEFAULTED; else state = PBS_NORMAL; } if(mcIsThemeBackgroundPartiallyTransparent(button->theme, BP_PUSHBUTTON, state)) mcDrawThemeParentBackground(win, dc, &rect); mcDrawThemeBackground(button->theme, dc, BP_PUSHBUTTON, state, &rect, &rect); /* Get content rectangle of the button and clip DC to it */ mcGetThemeBackgroundContentRect(button->theme, dc, BP_PUSHBUTTON, state, &rect, &content); IntersectClipRect(dc, content.left, content.top, content.right, content.bottom); /* Draw focus rectangle */ if(MC_SEND(win, BM_GETSTATE, 0, 0) & BST_FOCUS) { if(!button->hide_focus) DrawFocusRect(dc, &content); } /* Draw the contents (i.e. the icon) */ if(icon != NULL) { mc_icon_size(icon, &size); flags = DST_ICON; if(button->style & WS_DISABLED) flags |= DSS_DISABLED; DrawState(dc, NULL, NULL, (LPARAM) icon, 0, (rect.right + rect.left - size.cx) / 2, (rect.bottom + rect.top - size.cy) / 2, size.cx, size.cy, flags); } /* Revert DC into original state */ SelectObject(dc, old_font); SetBkMode(dc, old_bk_mode); SetTextColor(dc, old_text_color); SelectObject(dc, old_clip); }
static void button_paint_split(HWND win, button_t* button, HDC dc) { RECT rect; RECT rect_left, rect_right; int state_left, state_right; int text_offset = 0; HFONT font, old_font; int old_bk_mode; COLORREF old_text_color; HRGN old_clip; HICON glyph; int width_right = DROPDOWN_W; glyph = ImageList_GetIcon(mc_bmp_glyphs, MC_BMP_GLYPH_MORE_OPTIONS, ILD_TRANSPARENT); GetClientRect(win, &rect); font = (HFONT) MC_SEND(win, WM_GETFONT, 0, 0); if(font == NULL) font = GetStockObject(SYSTEM_FONT); old_font = SelectObject(dc, font); old_bk_mode = GetBkMode(dc); old_text_color = GetTextColor(dc); old_clip = get_clip(dc); /* Draw what's common for left and right parts background. */ if(!button->theme && (button->style & BS_DEFPUSHBUTTON)) { SelectObject(dc, GetSysColorBrush(COLOR_WINDOWFRAME)); Rectangle(dc, rect.left, rect.top, rect.right, rect.bottom); mc_rect_inflate(&rect, -1, -1); width_right--; } /* Setup subrectangles (mainpart 1 and push-down part 2) */ mc_rect_copy(&rect_left, &rect); rect_left.right -= width_right; mc_rect_copy(&rect_right, &rect); rect_right.left = rect_left.right; /* Draw background. */ if(button->theme) { UINT transparent; RECT tmp; /* Determine styles for left and right parts */ if(button->style & WS_DISABLED) { state_left = state_right = PBS_DISABLED; } else { LRESULT state; state = MC_SEND(win, BM_GETSTATE, 0, 0); if(state & MC_BST_DROPDOWNPUSHED) { state_left = PBS_NORMAL; state_right = PBS_PRESSED; } else { if(state & BST_PUSHED) state_left = state_right = PBS_PRESSED; else if(state & BST_HOT) state_left = state_right = PBS_HOT; else if(button->style & BS_DEFPUSHBUTTON) state_left = state_right = PBS_DEFAULTED; else state_left = state_right = PBS_NORMAL; } } /* Handle (semi-)transparent themes. */ transparent = 0; if(mcIsThemeBackgroundPartiallyTransparent(button->theme, BP_PUSHBUTTON, state_left)) transparent |= 0x1; if(mcIsThemeBackgroundPartiallyTransparent(button->theme, BP_PUSHBUTTON, state_right)) transparent |= 0x2; switch(transparent) { case 0x1: mcDrawThemeParentBackground(win, dc, &rect_left); break; case 0x2: mcDrawThemeParentBackground(win, dc, &rect_right); break; case 0x3: mcDrawThemeParentBackground(win, dc, &rect); break; } /* Draw backgrond. */ mcDrawThemeBackground(button->theme, dc, BP_PUSHBUTTON, state_left, &rect, &rect_left); mcDrawThemeBackground(button->theme, dc, BP_PUSHBUTTON, state_right, &rect, &rect_right); /* Deflate both rects to content rects only */ mcGetThemeBackgroundContentRect(button->theme, dc, BP_PUSHBUTTON, state_left, &rect_left, &tmp); rect_left.left = tmp.left; rect_left.top = tmp.top; rect_left.bottom = tmp.bottom; mcGetThemeBackgroundContentRect(button->theme, dc, BP_PUSHBUTTON, state_right, &rect_right, &tmp); rect_right.top = tmp.top; rect_right.right = tmp.right; rect_right.bottom = tmp.bottom; /* Draw delimiter of left and right parts. */ rect_right.top += 1; rect_right.bottom -= 1; mcDrawThemeEdge(button->theme, dc, BP_PUSHBUTTON, state_right, &rect_right, BDR_SUNKEN, BF_LEFT, NULL); rect_right.left = tmp.left; } else { /* Determine styles for left and right parts */ if(button->style & WS_DISABLED) { state_left = state_right = DFCS_INACTIVE; } else { LRESULT s = MC_SEND(win, BM_GETSTATE, 0, 0); if(s & MC_BST_DROPDOWNPUSHED) { state_left = 0; state_right = DFCS_PUSHED; } else { if(s & BST_PUSHED) { state_left = state_right = DFCS_PUSHED; } else { state_left = state_right = 0; } } } button_send_ctlcolorbtn(win, dc); /* Draw control edges */ IntersectClipRect(dc, rect_left.left, rect_left.top, rect_left.right, rect_left.bottom); DrawFrameControl(dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH | state_left); SelectClipRgn(dc, NULL); IntersectClipRect(dc, rect_right.left, rect_right.top, rect_right.right, rect_right.bottom); DrawFrameControl(dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH | state_right); /* Parts which are pushed, should have the contents moved a bit */ if(state_left == DFCS_PUSHED) mc_rect_offset(&rect_left, 1, 1); if(state_right == DFCS_PUSHED) mc_rect_offset(&rect_right, 1, 1); /* Draw delimiter */ if(state_left == state_right) { DrawEdge(dc, &rect_right, BDR_SUNKENOUTER | BDR_RAISEDINNER, BF_LEFT | BF_SOFT); } else { rect_right.left--; DrawEdge(dc, &rect_right, BDR_SUNKENOUTER, BF_LEFT | BF_SOFT); rect_right.left++; } /* Adjust for the outer control edges */ mc_rect_inflate(&rect_left, 0, -2); rect_left.left += 2; mc_rect_inflate(&rect_right, -2, -2); } /* Draw focus rectangle. */ if((MC_SEND(win, BM_GETSTATE, 0, 0) & BST_FOCUS) && !button->hide_focus) { SelectClipRgn(dc, NULL); if(button->theme) { mc_rect_set(&rect, rect_left.left, rect_left.top, rect_right.right - DROPDOWN_W, rect_right.bottom); DrawFocusRect(dc, &rect); } else { mc_rect_inflate(&rect_left, -1, -2); DrawFocusRect(dc, &rect_left); mc_rect_inflate(&rect_left, -1, -1); } } /* Draw glyph into the right part */ SelectClipRgn(dc, NULL); IntersectClipRect(dc, rect_right.left, rect_right.top, rect_right.right, rect_right.bottom); DrawIconEx(dc, (rect_right.right + rect_right.left - MC_BMP_GLYPH_W) / 2, (rect_right.bottom + rect_right.top - MC_BMP_GLYPH_H) / 2, glyph, MC_BMP_GLYPH_W, MC_BMP_GLYPH_H, 0, NULL, DI_NORMAL); /* Draw left part contents */ SelectClipRgn(dc, NULL); IntersectClipRect(dc, rect_left.left, rect_left.top, rect_left.right, rect_left.bottom); if(button->style & BS_ICON) { /* Paint (BS_SPLITBUTTON | BS_ICON). Note that this is used even on * Vista, as according to some my testing this style combination * is not supported there... */ HICON icon; icon = (HICON) MC_SEND(win, BM_GETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) 0); if(icon != NULL) { SIZE size; UINT flags; mc_icon_size(icon, &size); flags = DST_ICON; if(button->style & WS_DISABLED) flags |= DSS_DISABLED; DrawState(dc, NULL, NULL, (LPARAM) icon, 0, (rect_left.right + rect_left.left - size.cx) / 2, (rect_left.bottom + rect_left.top - size.cy) / 2, size.cx, size.cy, flags); } } else { /* Paint text label */ TCHAR buffer[256]; int n; UINT flags = 0; /* Setup flags for TextOut/mcDrawThemeText */ switch(button->style & (BS_LEFT | BS_CENTER | BS_RIGHT)) { case BS_LEFT: flags |= DT_LEFT; break; case BS_RIGHT: flags |= DT_RIGHT; break; default: if(GetWindowLong(win, GWL_EXSTYLE) & WS_EX_RIGHT) flags |= DT_RIGHT; else flags |= DT_CENTER; break; } switch(button->style & (BS_TOP | BS_VCENTER | BS_BOTTOM)) { case BS_TOP: flags |= DT_TOP; break; case BS_BOTTOM: flags |= DT_BOTTOM; break; default: flags |= DT_VCENTER; break; } if(button->style & BS_MULTILINE) flags |= DT_WORDBREAK; else flags |= DT_SINGLELINE; if(button->hide_accel) flags |= DT_HIDEPREFIX; n = MC_SEND(win, WM_GETTEXT, MC_ARRAY_SIZE(buffer), buffer); if(button->theme) { mcDrawThemeText(button->theme, dc, BP_PUSHBUTTON, state_left, buffer, n, flags, 0, &rect_left); } else { SetBkMode(dc, TRANSPARENT); SetTextColor(dc, GetSysColor(COLOR_BTNTEXT)); mc_rect_offset(&rect_left, text_offset, text_offset); DrawText(dc, buffer, n, &rect_left, flags); } } SelectObject(dc, old_font); SetBkMode(dc, old_bk_mode); SetTextColor(dc, old_text_color); SelectObject(dc, old_clip); }
void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y) { unsigned long *selpoint; if (y<0) y = 0; if (y>=rows) y = rows-1; if (x<0) { if (y > 0) { x = cols-1; y--; } else x = 0; } if (x>=cols) x = cols-1; selpoint = disptop + y * (cols+1) + x; if (b == MB_SELECT && a == MA_CLICK) { deselect(); selstate = ABOUT_TO; selanchor = selpoint; selmode = SM_CHAR; } else if (b == MB_SELECT && (a == MA_2CLK || a == MA_3CLK)) { deselect(); selmode = (a == MA_2CLK ? SM_WORD : SM_LINE); selstate = DRAGGING; selstart = selanchor = selpoint; selend = selstart + 1; sel_spread(); } else if ((b == MB_SELECT && a == MA_DRAG) || (b == MB_EXTEND && a != MA_RELEASE)) { if (selstate == ABOUT_TO && selanchor == selpoint) return; if (b == MB_EXTEND && a != MA_DRAG && selstate == SELECTED) { if (selpoint-selstart < (selend-selstart)/2) selanchor = selend - 1; else selanchor = selstart; selstate = DRAGGING; } if (selstate != ABOUT_TO && selstate != DRAGGING) selanchor = selpoint; selstate = DRAGGING; if (selpoint < selanchor) { selstart = selpoint; selend = selanchor + 1; } else { selstart = selanchor; selend = selpoint + 1; } sel_spread(); } else if ((b == MB_SELECT || b == MB_EXTEND) && a == MA_RELEASE) { if (selstate == DRAGGING) { /* * We've completed a selection. We now transfer the * data to the clipboard. */ unsigned char *p = selspace; unsigned long *q = selstart; while (q < selend) { int nl = FALSE; unsigned long *lineend = q - (q-text) % (cols+1) + cols; unsigned long *nlpos = lineend; if (!(*nlpos & ATTR_WRAPPED)) { while ((nlpos[-1] & CHAR_MASK) == 0x20 && nlpos > q) nlpos--; if (nlpos < selend) nl = TRUE; } while (q < nlpos && q < selend) *p++ = (unsigned char) (*q++ & CHAR_MASK); if (nl) { int i; for (i=0; i<sizeof(sel_nl); i++) *p++ = sel_nl[i]; } q = lineend + 1; /* start of next line */ } write_clip (selspace, p - selspace); selstate = SELECTED; } else selstate = NO_SELECTION; } else if (b == MB_PASTE && (a==MA_CLICK || a==MA_2CLK || a==MA_3CLK)) { char *data; int len; get_clip((void **) &data, &len); if (data) { char *p, *q; p = q = data; while (p < data+len) { while (p < data+len && !(p <= data+len-sizeof(sel_nl) && !memcmp(p, sel_nl, sizeof(sel_nl)))) p++; { int i; unsigned char c; for(i=0;i<p-q;i++) { c=xlat_kbd2tty(q[i]); ldisc->send(&c,1); } } if (p <= data+len-sizeof(sel_nl) && !memcmp(p, sel_nl, sizeof(sel_nl))) { ldisc->send ("\r", 1); p += sizeof(sel_nl); } q = p; } } get_clip(NULL, NULL); } term_update(); }
int main(int argc, char **argv) { ULONG ulType = 0; ULONG ulAttr = 0; APIRET rc; int i; int iMode = MODE_NONE; rc = DosQueryHType(0, &ulType, &ulAttr); //STDIN if(!rc) { ulType &= 0xFF; if(ulType == 0 || ulType == 2) //file or pipe iMode |= MODE_IN; } rc = DosQueryHType(1, &ulType, &ulAttr); //STDOUT if(!rc) { ulType &= 0xFF; if(ulType == 0 || ulType == 2) //file or pipe iMode |= MODE_OUT; } for(i = 1; i < argc; i++) { if(argv[i][0] == '-' || argv[i][0] == '/') { switch(argv[i][1]) { case 'I': case 'i': if(argv[i][2] == '-') iMode &= ~MODE_IN; else iMode |= MODE_IN; break; case 'o': case 'O': if(argv[i][2] == '-') iMode &= ~MODE_OUT; else iMode |= MODE_OUT; break; case 'h': case 'H': case '?': usage(); return 0; } } } if(!iMode) { usage(); return 0; } rc = init_pm(); if(rc) return -1; if(iMode & MODE_IN) { char *str = ReadPipe(0); if(str) set_clip(str); delete str; } if(iMode & MODE_OUT) { char *str = get_clip(); if(str) { ULONG ulWrote = 0; rc = DosWrite(1, str, strlen(str), &ulWrote); } } done_pm(); return rc; }