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

📄 wtools.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* {{{  */

/* {{{ Copyright Notice */

/* Widget based utility functions.
   Copyright (C) 1994, 1995 the Free Software Foundation

   Authors: 1994, 1995, 1996 Miguel de Icaza
            1994, 1995 Radek Doulik
	    1995  Jakub Jelinek
	    1995  Andrej Borsenkow

   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., 675 Mass Ave, Cambridge, MA 02139, USA.

 */

/* }}} */

/*  [] = "$Id: wtools.c 15091 2005-05-07 21:24:31Z sedwards $" */

#include <config.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include "tty.h"
#include <stdarg.h>
#include "mad.h"
#include "global.h"
#include "util.h"
#include "win.h"
#include "color.h"
#include "mouse.h"
#include "dlg.h"
#include "widget.h"
#include "menu.h"
#include "wtools.h"
#include "key.h"	/* For mi_getch() */
#include "dialog.h"	/* For do_refresh() and my_wputs() */
#include "complete.h"   /* INPUT_COMPLETE_CD */
#include "x.h"

/* }}} */

/* {{{ Common dialog callback */
#ifdef HAVE_X
void dialog_repaint (struct Dlg_head *h, int back, int title_fore)
{
}
#else
void
dialog_repaint (struct Dlg_head *h, int back, int title_fore)
{
    attrset (back);
    dlg_erase (h);
    draw_box (h, 1, 1, h->lines - 2, h->cols - 2);
    attrset (title_fore);
    if (h->title){
	dlg_move (h, 1, (h->cols-strlen (h->title))/2);
	addstr (h->title);
    }
}
#endif
void
common_dialog_repaint (struct Dlg_head *h)
{
    dialog_repaint (h, COLOR_NORMAL, COLOR_HOT_NORMAL);
}

int
common_dialog_callback (struct Dlg_head *h, int id, int msg)
{
    if (msg == DLG_DRAW)
	common_dialog_repaint (h);
    return 0;
}

/* }}} */
/* {{{ Listbox utility functions */

void
listbox_refresh (Dlg_head *h)
{
    dialog_repaint (h, COLOR_NORMAL, COLOR_HOT_NORMAL);
}

static int listbox_callback (Dlg_head *h, int id, int msg)
{
    switch (msg) {
    case DLG_DRAW:
#ifndef HAVE_X
        listbox_refresh(h);
#endif
        return 1;
    }
    return 0;
}

Listbox *create_listbox_window (int cols, int lines, char *title, char *help)
{
    int xpos, ypos, len;
    Listbox  *listbox = xmalloc (sizeof (Listbox), "create_listbox_window");
    char* cancel_string = _("&Cancel");

    /* Adjust sizes */
    lines = (lines > LINES-6) ? LINES - 6 : lines;

	if (title && (cols < (len = strlen(title) + 2)))
		cols = len;

	/* no &, but 4 spaces around button for brackets and such */
	if (cols < (len = strlen(cancel_string) + 3))
		cols = len;

    cols = cols > COLS-6 ? COLS-6 : cols;

    /* I'm not sure if this -2 is safe, should test it */
    xpos = (COLS-cols)/2;
    ypos = (LINES-lines)/2 - 2;

    /* Create components */
    listbox->dlg = create_dlg (ypos, xpos, lines+6, cols+4, dialog_colors,
			       listbox_callback, help, "listbox", DLG_CENTER|DLG_GRID);
    x_set_dialog_title (listbox->dlg, title);

    listbox->list = listbox_new (2, 2, cols, lines, listbox_finish, 0, "li");

    add_widget (listbox->dlg,
		button_new (lines+3, (cols/2 + 2) - len/2,
		B_CANCEL, NORMAL_BUTTON, cancel_string, 0, 0, "c"));
    add_widget (listbox->dlg, listbox->list);
#ifndef HAVE_X
    listbox_refresh(listbox->dlg);
#endif /* !HAVE_X */
    return listbox;
}

/* Returns the number of the item selected */
int run_listbox (Listbox *l)
{
    int val;

    run_dlg (l->dlg);
    if (l->dlg->ret_value == B_CANCEL)
	val = -1;
    else
	val = l->list->pos;
    destroy_dlg (l->dlg);
    free (l);
    return val;
}

/* }}} */


/* {{{ Query Dialog functions */
#ifndef HAVE_GNOME
struct text_struct {
    char *text;
    char *header;
};

static int query_callback (struct Dlg_head *h, int Id, int Msg)
{
    struct text_struct *info;

    info = (struct text_struct *) h->data;

    switch (Msg){
#ifndef HAVE_X
    case DLG_DRAW:
	/* designate window */
	attrset (NORMALC);
	dlg_erase (h);
	draw_box (h, 1, 1, h->lines-2, h->cols-2);
	attrset (HOT_NORMALC);
	dlg_move (h, 1, (h->cols-strlen (info->header))/2);
	addstr (info->header);
	break;
#endif
    }
    return 0;
}


Dlg_head *last_query_dlg;

static int sel_pos = 0;

/* Used to ask questions to the user */
int query_dialog (char *header, char *text, int flags, int count, ...)
{
    va_list ap;
    Dlg_head *query_dlg;
    int win_len = 0;
    int i;
    int result = -1;
    int xpos, ypos;
    int cols, lines;
    char *cur_name;
    static int query_colors [4];
    static struct text_struct pass;
#ifdef HAVE_X
    static char *buttonnames [10];
#endif

    /* set dialog colors */
    query_colors [0] = (flags & D_ERROR) ? ERROR_COLOR :  Q_UNSELECTED_COLOR;
    query_colors [1] = (flags & D_ERROR) ? REVERSE_COLOR : Q_SELECTED_COLOR;
    query_colors [2] = (flags & D_ERROR) ? ERROR_COLOR : COLOR_HOT_NORMAL;
    query_colors [3] = (flags & D_ERROR) ? COLOR_HOT_NORMAL :  COLOR_HOT_FOCUS;

    if (header == MSG_ERROR)
	    header = _(" Error ");

    if (count > 0){
	va_start (ap, count);
	for (i = 0; i < count; i++)
	{
		char* cp = va_arg (ap, char *);
	    win_len += strlen (cp) + 6;
		if (strchr (cp, '&') != NULL)
			win_len--;
	}
	va_end (ap);
    }

    /* count coordinates */
    cols = 6 + max (win_len, max (strlen (header), msglen (text, &lines)));
    lines += 4 + (count > 0 ? 2 : 0);
    xpos = COLS/2 - cols/2;
    ypos = LINES/3 - (lines-3)/2;
    pass.header = header;
    pass.text   = text;

    /* prepare dialog */
    query_dlg = create_dlg (ypos, xpos, lines, cols, query_colors,
			    query_callback, "[QueryBox]", "query", DLG_NONE);
    x_set_dialog_title (query_dlg, header);

    /* The data we need to pass to the callback */
    query_dlg->cols = cols;
    query_dlg->lines = lines;
    query_dlg->data  = &pass;

    query_dlg->direction = DIR_BACKWARD;

    if (count > 0){

	cols = (cols-win_len-2)/2+2;
	va_start (ap, count);
	for (i = 0; i < count; i++){
	    cur_name = va_arg (ap, char *);
	    xpos = strlen (cur_name)+6;
		if (strchr(cur_name, '&') != NULL)
			xpos--;
#ifndef HAVE_XVIEW
	    add_widget (query_dlg, button_new
			(lines-3, cols, B_USER+i, NORMAL_BUTTON, cur_name,
			 0, 0, NULL));
#else
	    buttonnames [i] = cur_name;
#endif
	    cols += xpos;
	    if (i == sel_pos)
		query_dlg->initfocus = query_dlg->current;
	}
	va_end (ap);

#ifdef HAVE_XVIEW
	for (i = count - 1; i >= 0; i--)
	    add_widgetl (query_dlg, button_new
			 (0, 0, B_USER+i, NORMAL_BUTTON, buttonnames [i], 0, 0, NULL),
			 i ? XV_WLAY_RIGHTOF : XV_WLAY_CENTERROW);
#endif
	add_widget (query_dlg, label_new (2, 3, text, NULL));

	/* run dialog and make result */
	run_dlg (query_dlg);
	switch (query_dlg->ret_value){
	case B_CANCEL:
	    break;
	default:
	    result = query_dlg->ret_value-B_USER;
	}

	/* free used memory */
	destroy_dlg (query_dlg);
    } else {
#ifdef HAVE_X
	add_widgetl (query_dlg, button_new(0, 0, B_EXIT, NORMAL_BUTTON, _("&Ok"), 0, 0, NULL),
	    XV_WLAY_CENTERROW);

	add_widget (query_dlg, label_new (2, 3, text, NULL));
#ifdef HAVE_TK
	if (flags & D_INSERT){
	} else
#endif
	{
	    run_dlg (query_dlg);
	    destroy_dlg (query_dlg);
	}
#else
	add_widget (query_dlg, label_new (2, 3, text, NULL));
	add_widget (query_dlg, button_new(0, 0, 0, HIDDEN_BUTTON, "-", 0, 0, NULL));
#endif /* HAVE_X */
	last_query_dlg = query_dlg;
    }
    sel_pos = 0;
    return result;
}

void query_set_sel (int new_sel)
{
    sel_pos = new_sel;
}

/* }}} */

/* {{{ The message function */

/* To show nice messages to the users */
Dlg_head *message (int error, char *header, char *text, ...)
{
    va_list  args;
    char     buffer [4096];
    Dlg_head *d;

    /* Setup the display information */
    strcpy (buffer, "\n");
    va_start (args, text);
    vsprintf (&buffer [1], text, args);
    strcat (buffer, "\n");
    va_end (args);

    query_dialog (header, buffer, error, 0);
#ifndef HAVE_XVIEW
    d = last_query_dlg;
#ifdef HAVE_TK
    if (error & D_INSERT){
	init_dlg (d);
	tk_dispatch_all ();
	return d;
    }
#else
    init_dlg (d);
    if (!(error & D_INSERT)){
	mi_getch ();
	dlg_run_done (d);
	destroy_dlg (d);
    } else
	return d;
#endif
#endif
    return 0;
}
#endif
/* }}} */

/* {{{ The chooser routines */

⌨️ 快捷键说明

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