📄 coolwidget.c
字号:
/* 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 + -