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

📄 unicodedialog.c

📁 具有IDE功能的编辑器
💻 C
字号:
/* unicodedialog.c - draw a unicode selector   Copyright (C) 1996-2000 Paul Sheer   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307, USA. */#include <config.h>#include <stdio.h>#include <my_string.h>#include <stdlib.h>#include <stdarg.h>#include <X11/Intrinsic.h>#include <X11/Xatom.h>#include "lkeysym.h"#include "stringtools.h"#include "app_glob.c"#include "coolwidget.h"#include "coollocal.h"#include "edit.h"#include "editcmddef.h"#include "mad.h"#define MID_X 20#define MID_Y 20extern struct look *look;int last_unichar_left = 0;int last_unichar_right = 0;int last_unichar_focussed = 0;static void render_unicode (CWidget * wdt){    int w, h, isfocussed, i, j;    Window win, temp_win;    CPushFont ("editor", 0);    win = wdt->pixmap;    isfocussed = (wdt->winid == CGetFocus ());    CSetColor (COLOR_WHITE);    CRectangle (win, 2, 2, wdt->width - 4, wdt->height - 4);    for (j = 0; j < 16; j++)	for (i = 0; i < 17; i++) {	    wchar_t wc;	    int l;	    XChar2b c;	    c.byte1 = wdt->cursor >> 8;	    c.byte2 = i + j * 16;	    wc = i + j * 16 + (wdt->cursor & ~0xFF);	    w = (FONT_MEAN_WIDTH * 2 + 5) * i + 5;	    h = (FONT_PIX_PER_LINE + 5) * j + 5;	    CSetBackgroundColor (COLOR_WHITE);	    if (i == 16) {		CSetColor (COLOR_FLAT);		CImageText (win, w, h + FONT_BASE_LINE, "0123456789ABCDEF" + j, 1);	    } else {		l = FONT_PER_CHAR (wc);		if (l) {		    CSetColor (COLOR_BLACK);		    CImageTextWC (win, w, h + FONT_BASE_LINE, &c, &wc, 1);		} else {		    CSetColor (COLOR_FLAT);		    l = FONT_MEAN_WIDTH;		    CRectangle (win, w, h, l, FONT_PIX_PER_LINE);		}		if (wc == wdt->cursor) {		    CSetColor (color_palette (18));		    CBox (win, w - 2, h - 2, l + 4, FONT_PIX_PER_LINE + 4);		}	    }	}    {	char c[10];	sprintf (c, "%0.4X", (unsigned int) wdt->cursor);	w = (FONT_MEAN_WIDTH * 2 + 5) * 0 + 5;	h = (FONT_PIX_PER_LINE + 5) * j + 5;	CSetBackgroundColor (COLOR_WHITE);	CSetColor (color_palette (1));	CImageText (win, w, h + FONT_BASE_LINE, c, strlen (c));    }    for (i = 3; i < 16; i++) {	w = (FONT_MEAN_WIDTH * 2 + 5) * i + 5;	h = (FONT_PIX_PER_LINE + 5) * j + 5;	CSetBackgroundColor (COLOR_WHITE);	CSetColor (COLOR_FLAT);	CImageText (win, w, h + FONT_BASE_LINE, "0123456789ABCDEF" + i, 1);    }    w = wdt->width;    h = wdt->height;    temp_win = wdt->winid;    wdt->winid = win;    (*look->render_textbox_tidbits) (wdt, isfocussed);    wdt->winid = temp_win;    XCopyArea(CDisplay, win, wdt->winid, CGC, 0, 0, w, h, 0, 0);    CPopFont ();    return;}/*   This will reallocate a previous draw of the same identifier.   so you can draw the same widget over and over without flicker */CWidget *CDrawUnicodeInput (const char *identifier, Window parent, int x, int y, wchar_t start_char){    CWidget *wdt;    int w, h;    CPushFont ("editor", 0);    w = (FONT_MEAN_WIDTH * 2 + 5) * (16 + 1) - FONT_MEAN_WIDTH + 5;    h = (FONT_PIX_PER_LINE + 5) * (16 + 1) + 5;    set_hint_pos (x + w + WIDGET_SPACING, y + h + WIDGET_SPACING);    wdt = CSetupWidget (identifier, parent, x, y, w, h, C_UNICODE_WIDGET, INPUT_KEY, COLOR_WHITE, 1);    wdt->cursor = start_char;    wdt->pixmap = XCreatePixmap (CDisplay, wdt->winid, w, h, CDepth);    xdnd_set_type_list (CDndClass, wdt->winid, xdnd_typelist_send[DndText]);    CPopFont ();    return wdt;}int eh_unicode (CWidget * w, XEvent * xevent, CEvent * cwevent){    int handled = 0;    int i, j;    long cursor;    cursor = w->cursor;    switch (xevent->type) {    case ButtonPress:	resolve_button (xevent, cwevent);	CFocus (w);	CPushFont ("editor", 0);	i = (xevent->xbutton.x - 5) / (FONT_MEAN_WIDTH * 2 + 5);	j = (xevent->xbutton.y - 5) / (FONT_PIX_PER_LINE + 5);	if (i < 16 && j < 16 && i >= 0 && j >= 0)	    w->cursor = i + j * 16 + (w->cursor & ~0xFF);	CPopFont ();	break;    case FocusIn:    case FocusOut:	render_unicode (w);	return 0;    case Expose:	if (!xevent->xexpose.count)	    render_unicode (w);	return 0;    case ButtonRelease:    case EnterNotify:    case MotionNotify:    case LeaveNotify:	return 0;	break;    case KeyPress:	cwevent->ident = w->ident;	cwevent->state = xevent->xkey.state;	switch (cwevent->command) {	case CK_Down:	    if (w->cursor <= 0xFFFF - 16)		w->cursor += 16;	    handled = 1;	    break;	case CK_Up:	    if (w->cursor >= 16)		w->cursor -= 16;	    handled = 1;	    break;	case CK_Right:	    if (w->cursor <= 0xFFFF - 1)		w->cursor += 1;	    handled = 1;	    break;	case CK_Left:	    if (w->cursor >= 1)		w->cursor -= 1;	    handled = 1;	    break;	case CK_Home:	    w->cursor = 0;	    handled = 1;	    break;	case CK_End:	    w->cursor = 0xFFFF;	    handled = 1;	    break;	case CK_Page_Up:	    if (w->cursor >= 256)		w->cursor -= 256;	    handled = 1;	    break;	case CK_Page_Down:	    if (w->cursor <= 0xFFFF - 256)		w->cursor += 256;	    handled = 1;	    break;	}	break;    }    if (w->cursor != cursor)	render_unicode (w);    w->keypressed |= handled;    return handled;}long CUnicodeDialog (Window in, int x, int y, char *heading){    Window win;    CEvent cwevent;    CState s;    CWidget *w;    long result = -1;    if (!in) {	x = MID_X;	y = MID_Y;    }    in = find_mapped_window (in);    CBackupState (&s);    CDisable ("*");    if (heading)	win = CDrawHeadedDialog ("_unicode", in, x, y, heading);    else	win = CDrawDialog ("_unicode", in, x, y);    CGetHintPos (&x, &y);    CDrawUnicodeInput ("_unicode.box1", win, x, y, last_unichar_left);    CGetHintPos (&x, 0);    CDrawUnicodeInput ("_unicode.box2", win, x, y, last_unichar_right);    CSetSizeHintPos ("_unicode");    CMapDialog ("_unicode");    if (last_unichar_focussed)	CFocus (CIdent ("_unicode.box2"));    else	CFocus (CIdent ("_unicode.box1"));    do {	CNextEvent (NULL, &cwevent);	if (!CIdent ("_unicode"))	    break;	if (cwevent.double_click)	    cwevent.command = CK_Enter;    } while (cwevent.command != CK_Cancel && cwevent.command != CK_Enter);    if ((w = CIdent ("_unicode.box1"))) {	if (CGetFocus () == w->winid) {	    last_unichar_focussed = 0;	    if (cwevent.command == CK_Enter)		result = (wchar_t) w->cursor;	}	last_unichar_left = (int) w->cursor;    }    if ((w = CIdent ("_unicode.box2"))) {	if (CGetFocus () == w->winid) {	    last_unichar_focussed = 1;	    if (cwevent.command == CK_Enter)		result = (wchar_t) w->cursor;	}	last_unichar_right = (int) w->cursor;    }    CDestroyWidget ("_unicode");    CRestoreState (&s);    return result;}unsigned char *CGetUnichar (Window in, char *heading){    long r;    r = CUnicodeDialog (in, MID_X, MID_Y, heading);    if (r == -1)	return 0;    return wcrtomb_ucs4_to_utf8 (r);}

⌨️ 快捷键说明

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