⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coolwidget.c

📁 具有IDE功能的编辑器
💻 C
📖 第 1 页 / 共 3 页
字号:
/* int for_all_widgets (int (callback *) (CWidget *, void *, void *), void *data1, void *data2) */long for_all_widgets (void *call_back, void *data1, void *data2){    long (*callback) (CWidget *, void *, void *) = (long (*)(CWidget *, void *, void *)) call_back;    int i = last_widget;    while (--i > 0)	if (CIndex (i) != NULL)	    if ((*callback) (CIndex (i), data1, data2))		return 1;    return 0;}int widget_of_window (Window win){    int i = 0;    while (last_widget > i++)	if (CIndex (i) != NULL)	    if (CIndex (i)->winid == win)		return i;    return 0;}int find_next_child_of (Window win, Window child){    int i = widget_of_window (child);    if (i)	while (last_widget > i++)	    if (CIndex (i) != NULL)		if (CIndex (i)->parentid == win)		    return i;    return 0;}int find_previous_child_of (Window win, Window child){    int i = widget_of_window (child);    if (i)	while (--i > 0)	    if (CIndex (i) != NULL)		if (CIndex (i)->parentid == win)		    return i;    return 0;}CWidget *CDialogOfWindow (Window window){    for (;;) {	CWidget *w;	w = CWidgetOfWindow (window);	if (!w)	    break;	if (w->kind == C_WINDOW_WIDGET)	    return w;	window = w->parentid;    }    return 0;}Window CFindParentMainWindow (Window parent){    int i;    if (parent == CRoot)	return 0;    if (!(i = widget_of_window (parent)))	return 0;    if (!CIndex (i)->mainid)	return CIndex (i)->winid;    return CIndex (i)->mainid;}/*recursively destroys a widget and all its descendants */void recursive_destroy_widgets (int i){    int j;    while ((j = find_first_child_of (CIndex (i)->winid)))	recursive_destroy_widgets (j);    free_single_widget (i);}void CFocusLast (void);/*returns 1 on error --- not found. Destroys a widget by name and all its   descendents */int CDestroyWidget (const char *identifier){    int i = find_ident (identifier);    if (i) {	recursive_destroy_widgets (i);	CFocusLast ();	return 0;    } else	return 1;}void CDestroyAll (){    int j;    while ((j = find_first_child_of (CRoot)))	recursive_destroy_widgets (j);}void free_last_query_buttons (void);void edit_replace_cmd (WEdit * edit, int again);void free_selections (void);void remove_all_watch (void);void CShutdown (void){    remove_all_watch ();    CDestroyAll ();    free (home_dir);    free (temp_dir);    home_dir = 0;    temp_dir = 0;    free_last_query_buttons ();    edit_replace_cmd (0, 0);    edit_search_cmd (0, 0);    free_selections ();    mouse_shut ();    CFreeAllFonts ();    XCloseDisplay (CDisplay);}void drawstring_xy (Window win, int x, int y, const char *text){    if (!text)	return;    if (!*text)	return;    CImageString (win, FONT_OFFSET_X + x, FONT_OFFSET_Y + y, text);}char *whereis_hotchar (const char *labl, int hotkey){    unsigned char *label = (unsigned char *) labl;    int i;    if (hotkey <= ' ' || hotkey > 255)	return 0;    if (*label == hotkey)	return (char *) label;    for (i = 1; label[i]; i++)	if (label[i - 1] == ' ' && label[i] == hotkey)	    return (char *) label + i;    return (char *) strchr ((char *) label, hotkey);}void underline_hotkey (Window win, int x, int y, const char *text, int hotkey){    char *p;    if (hotkey <= ' ' || hotkey > 255)	return;    if (!(p = whereis_hotchar (text, hotkey)))	return;    x += CImageTextWidth (text, (unsigned long) p - (unsigned long) text);    y += FONT_BASE_LINE + FONT_PER_CHAR_DESCENT(hotkey) + 1;    (*look->draw_hotkey_understroke) (win, x, y, hotkey);}void drawstring_xy_hotkey (Window win, int x, int y, const char *text, int hotkey){    drawstring_xy (win, x, y, text);    underline_hotkey (win, x, y, text, hotkey);}void render_button (CWidget * wdt){    (*look->render_button) (wdt);}void render_bar (CWidget * wdt){    (*look->render_bar) (wdt);}#if 0#ifdef NEXT_LOOK_X#define FB (TEXT_RELIEF)#else#define FB (TEXT_RELIEF + 1)#endif#define FS (TEXT_RELIEF + 1)#else#define FB (TEXT_RELIEF + 1)#define FS (TEXT_RELIEF + 1)#endif/* this is a zero flicker routine */void render_status (CWidget * wdt, int expose){    static Window lastwin = 0;    static char lasttext[1024] = "";    Window win = CWindowOf (wdt);    char *q, *r;    int last_width = 0;    int h = CHeightOf (wdt);    int w = CWidthOf (wdt);    int l, x, x1 = 0, color = 0;    char *p;    CPushFont ("widget", 0);    q = wdt->text;    p = lasttext;    x = TEXT_RELIEF + 1;	/* bevel is 1 */    if (lastwin == win && !expose) {	for (; *p && *q && *p == *q; p++, q++) {	    if (*q >= ' ') {		x += CImageTextWidth (q, 1);	    } else {		if (*q == '\034') {		    x1 = x;		} else if (*q == '\035') {		    x1 = x;		    x += FS;		} else		    color = *q;	    }	}    }    for (l = x, r = q; *r; r++)	if (*r >= ' ')	    l += CImageTextWidth (r, 1);	else if (*r == '\035')	    l += FS;    if (lastwin == win && !expose) {	for (last_width = x, r = p; *r; r++)	    if (*r >= ' ')		last_width += CImageTextWidth (r, 1);	    else if (*r == '\035')		last_width += FS;    }    if (l < last_width && l < w) {	CSetColor (COLOR_FLAT);	CRectangle (win, l, 0, min (w - l, last_width - l), h);    }    CSetColor (color_palette (color % 27));    CSetBackgroundColor (COLOR_FLAT);    for (p = q;; p++) {	if (*p < ' ') {	    CImageText (win, FONT_OFFSET_X + x, FONT_OFFSET_Y + TEXT_RELIEF + 1, q, (unsigned long) p - (unsigned long) q);	    x += CImageTextWidth (q, (unsigned long) p - (unsigned long) q);	    if (*p == '\035') {		XClearArea (CDisplay, win, x, TEXT_RELIEF + 1, x + FS, FONT_PIX_PER_LINE, 0);		if (x - x1 + FB + FB - 2 > 0) {		    render_bevel (win, x1 - FB, 0, x + FB - 1, h - 1, 1, 1);		    XClearArea (CDisplay, win, x1 - FB + 1, 1, x - x1 + FB + FB - 2, TEXT_RELIEF + 1, 0);		    XClearArea (CDisplay, win, x1 - FB + 1, h - TEXT_RELIEF - 1, x - x1 + FB + FB - 2, TEXT_RELIEF, 0);		}		x1 = x;		x += FS;	    } else if (*p == '\034') {		if (x - x1 - FB - FB > 0) {		    XClearArea (CDisplay, win, x1 + FB, 0, x - x1 - FB - FB, TEXT_RELIEF + 1, 0);		    XClearArea (CDisplay, win, x1 + FB, h - TEXT_RELIEF - 1, x - x1 - FB - FB, TEXT_RELIEF + 1, 0);		}		x1 = x;	    } else		CSetColor (color_palette (*p % 27));	    if (!*p)		break;	    q = p + 1;	}    }    lastwin = win;    strncpy (lasttext, wdt->text, 1023);    CPopFont ();    return;}void render_text (CWidget * wdt){    (*look->render_text) (wdt);}void render_window (CWidget * wdt){    (*look->render_window) (wdt);}void render_progress (CWidget * wdt){    int w = wdt->width, h = wdt->height;    int p = wdt->cursor;    Window win = wdt->winid;    if (p > 65535)	p = 65535;    if (p < 0)	p = 0;    CSetColor (COLOR_FLAT);    CRectangle (win, 4 + p * (w - 5) / 65535, 2, (65535 - p) * (w - 5) / 65535, h - 4);    CSetColor (color_palette (3));    CRectangle (win, 4, 4, p * (w - 9) / 65535, h - 8);    render_bevel (win, 2, 2, 4 + p * (w - 9) / 65535, h - 3, 2, 0);    render_bevel (win, 0, 0, w - 1, h - 1, 2, 1);}void render_sunken (CWidget * wdt){    int w = wdt->width, h = wdt->height;    Window win = wdt->winid;    render_bevel (win, 0, 0, w - 1, h - 1, 2, 1);}void render_bevel (Window win, int x1, int y1, int x2, int y2, int thick, int sunken){    if (option_low_bandwidth)	return;    if (sunken & 1)	(*look->render_sunken_bevel) (win, x1, y1, x2, y2, thick, sunken);    else	(*look->render_raised_bevel) (win, x1, y1, x2, y2, thick, sunken);    CSetColor (COLOR_BLACK);}void expose_picture (CWidget * w);void set_widget_position (CWidget * w, int x, int y){    if (w->winid) {		/*some widgets have no window of there own */	w->x = x;	w->y = y;	XMoveWindow (CDisplay, w->winid, x, y);    } else {#ifdef HAVE_PICTURE	expose_picture (w);	w->x = x;	w->y = y;	expose_picture (w);#endif    }}void CSetWidgetPosition (const char *ident, int x, int y){    CWidget *w = CIdent (ident);    if (!w)	return;    set_widget_position (w, x, y);}void configure_children (CWidget * wt, int w, int h){    CWidget *wdt;    int new_w, new_h, new_x, new_y, i;    i = find_first_child_of (wt->winid);    while (i) {	wdt = CIndex (i);	if (CGetFocus () == wdt->winid)		/* focus border must follow the widget */	    destroy_focus_border ();	if (wdt->resize) {	    (*(wdt->resize)) (w, h, wt->width, wt->height, &new_w, &new_h, &new_x, &new_y);	    if (wdt->height != new_h || wdt->width != new_w)		CSetSize (wdt, new_w, new_h);	    if (wdt->x != new_x || wdt->y != new_y)		set_widget_position (wdt, new_x, new_y);	} else {	    if (wdt->position & POSITION_CENTRE)		set_widget_position (wdt, (w - wdt->width) / 2, wdt->y);	    if (wdt->position & POSITION_FILL)		CSetSize (wdt, w - (WIDGET_SPACING + WINDOW_EXTRA_SPACING) - wdt->x, wdt->height);	    if (wdt->position & POSITION_RIGHT)		set_widget_position (wdt, wdt->x + w - wt->width, wdt->y);	    if (wdt->position & POSITION_WIDTH)		CSetSize (wdt, wdt->width + w - wt->width, wdt->height);	    if (wdt->position & POSITION_BOTTOM)		set_widget_position (wdt, wdt->x, wdt->y + h - wt->height);	    if (wdt->position & POSITION_HEIGHT)		CSetSize (wdt, wdt->width, wdt->height + h - wt->height);	}	if (CGetFocus () == wdt->winid)		/* focus border must follow the widget */	    if ((wdt->options & WIDGET_TAKES_FOCUS_RING))		create_focus_border (wdt, 2);	i = find_next_child_of (wdt->parentid, wdt->winid);    }}void CSetSize (CWidget * wt, int w, int h){    int w_min, h_min;    if (!wt)	return;    if (w == wt->width && h == wt->height)	return;    wt->resized = 1;    if (w < 1)	w = 1;    if (h < 1)	h = 1;    if (wt->kind == C_WINDOW_WIDGET)	configure_children (wt, w, h);#if 0    else if (wt->kind == C_RXVT_WIDGET)	rxvt_resize_window (wt->rxvt, w, h);#endif/* redraw right and bottom borders */    w_min = min (wt->width, w);    h_min = min (wt->height, h);    if (wt->kind == C_WINDOW_WIDGET)	XClearArea (CDisplay, wt->winid, wt->width - 39, wt->height - 39, 39, 39, 1);    XClearArea (CDisplay, wt->winid, w_min - 3, 0, 3, h_min, 1);    XClearArea (CDisplay, wt->winid, 0, h_min - 3, w_min, 3, 1);    wt->width = w;    wt->height = h;    if (wt->parentid == CRoot && wt->mapped)	/* afterstep doesn't like us to change the size of a mapped main window */	return;    XResizeWindow (CDisplay, wt->winid, w, h);#ifdef USE_XIM    set_status_position (wt);#endif}void CSetWidgetSize (const char *ident, int w, int h){    CWidget *wt = CIdent (ident);    if (!wt)	return;    CSetSize (wt, w, h);}void CSetMovement (const char *ident, unsigned long position){    CWidget *w;    w = CIdent (ident);    if (!w)	return;    w->position |= position;}void CCentre (char *ident){    CSetMovement (ident, POSITION_CENTRE);}/* does a map as well */void CSetSizeHintPos (const char *ident){    int x, y;    CWidget *w;    get_hint_limits (&x, &y);    w = CIdent (ident);    x += WINDOW_EXTRA_SPACING;    y += WINDOW_EXTRA_SPACING;    if (!(w->options & WINDOW_NO_BORDER))	y += (*look->get_window_resize_bar_thickness) ();    XResizeWindow (CDisplay, w->winid, x, y);    w->width = x;    w->height = y;    configure_children (w, x, y);}/* for mapping a main window. other widgets are mapped when created */void CMapDialog (const char *ident){    CWidget *w;    w = CIdent (ident);    if (!w)	return;    if (w->kind != C_WINDOW_WIDGET)	return;    if (w->parentid == CRoot	&& !(w->options & WINDOW_SIZE_HINTS_SET)) {/* A main window with WM size hints not configured. */	CSetWindowSizeHints (w, w->width, w->height, w->width, w->height);    }    XMapWindow (CDisplay, w->winid);	/* shows the window */    XFlush (CDisplay);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -