/* winfncs.c */
#include "ml.h"
#include <X11/cursorfont.h>
#include <Xm/MessageB.h>
Widget ConfirmW;
int Confirmation = 0;
/* globals */
Cursor clock_cursor = 0;
Cursor top_left_cursor = 0;
Cursor pirate_cursor = 0;
Cursor create_left_cursor();
Cursor create_clock_cursor();
Cursor create_pirate_cursor();
Menu help_help_menu[] = {
{ NULL, "dismiss", NUL_TERM,
help_dismiss, NULL, 0, NULL, NULL, BTN_ON },
{ NULL, "print", NUL_TERM,
help_print, NULL, 0, NULL, NULL, BTN_ON },
{ NULL, "HELP", NUL_TERM,
help_help, NULL, 0, NULL, NULL, BTN_ON },
};
typedef struct _CURSOR_STACK_ {
int stack[64];
int pointer;
} Cursor_Stack;
Cursor_Stack cursor_stack;
#ifdef __STDC__
void push_cursor(int cursor_type)
#else
void push_cursor(cursor_type)
int cursor_type;
#endif
{
cursor_stack.pointer ++;
cursor_stack.stack[cursor_stack.pointer] = cursor_type;
set_cursor(cursor_type);
return;
}
#ifdef __STDC__
void pop_cursor(void)
#else
void pop_cursor()
#endif
{
if(cursor_stack.pointer) {
cursor_stack.pointer --;
set_cursor(cursor_stack.stack[cursor_stack.pointer]);
}
else
reset_cursors();
}
#ifdef __STDC__
void set_cursor(int cursor_type)
#else
void set_cursor(cursor_type)
int cursor_type;
#endif
{
switch (cursor_type) {
case PIRATE_CURSOR:
set_pirate_cursors();
break;
case WATCH_CURSOR:
set_watch_cursors();
break;
case DEFAULT_CURSOR:
default:
reset_cursors();
break;
}
return;
}
#ifdef __STDC__
void create_cursors(Display *display)
#else
void create_cursors(display)
Display *display;
#endif
{
clock_cursor = create_clock_cursor(display);
top_left_cursor = create_left_cursor(display);
pirate_cursor = create_pirate_cursor(display);
cursor_stack.pointer = 0;
return;
}
#ifdef __STDC__
Cursor create_left_cursor(Display *display)
#else
Cursor create_left_cursor(display)
Display *display;
#endif
{
return (XCreateFontCursor(display, XC_top_left_arrow));
}
#ifdef __STDC__
Cursor create_pirate_cursor(Display *display)
#else
Cursor create_pirate_cursor(display)
Display *display;
#endif
{
return(XCreateFontCursor(display, XC_pirate));
}
#ifdef __STDC__
Cursor create_clock_cursor(Display *display)
#else
Cursor create_clock_cursor(display)
Display *display;
#endif
{
return(XCreateFontCursor(display, XC_watch));
}
#ifdef __STDC__
void display_fontcursor(Display *display, Window w, Cursor cursor)
#else
void display_fontcursor(display, w, cursor)
Display *display;
Window w;
Cursor cursor;
#endif
{
if(cursor)
XDefineCursor(display, w, cursor);
return;
}
#ifdef __STDC__
void reset_cursor(Display *display, Window w)
#else
void reset_cursor(display, w)
Display *display;
Window w;
#endif
{
XUndefineCursor(display, w);
XFlush(display);
return;
}
#ifdef __STDC__
void set_watch_cursors(void)
#else
void set_watch_cursors()
#endif
{
MainWindow *mwin;
Read *read;
Gentext *gentext;
MLCompose *compose;
session->busy = TRUE;
if((session->lwin) && (session->lwin->destroyed == FALSE))
XDefineCursor(display, XtWindow(session->lwin->shell), clock_cursor);
if(session->netconf && session->netconf->is_realized)
XDefineCursor(display, XtWindow(session->netconf->shell), clock_cursor);
for(mwin = session->mwin; mwin; mwin = mwin->next) {
if(mwin->destroyed)
continue;
XDefineCursor(display, XtWindow(mwin->shell), clock_cursor);
if(mwin->listwin->is_realized)
XDefineCursor(display, XtWindow(mwin->listwin->shell), clock_cursor);
}
if(session->mailboxwin && session->mailboxwin->is_realized)
XDefineCursor(display, XtWindow(session->mailboxwin->shell),clock_cursor);
if(session->mailcopywin && session->mailcopywin->is_realized)
XDefineCursor(display, XtWindow(session->mailcopywin->shell),clock_cursor);
if(session->edfilter && session->edfilter->is_realized)
XDefineCursor(display,XtWindow(session->edfilter->shell), clock_cursor);
if(session->address_book && session->address_book->is_realized)
XDefineCursor(display, XtWindow(session->address_book->shell),
clock_cursor);
if(session->compose)
for(compose = session->compose; compose; compose = compose->next) {
XDefineCursor(display, XtWindow(compose->window->shell), clock_cursor);
if(compose->spellwindow && compose->spellwindow->is_realized)
XDefineCursor(display,XtWindow(compose->spellwindow->shell),
clock_cursor);
if(compose->options && compose->options->window &&
compose->options->window->destroyed == FALSE)
XDefineCursor(display,XtWindow(compose->options->window->shell),
clock_cursor);
}
for(read = session->read; read; read = read->next)
XDefineCursor(display, XtWindow(read->shell), clock_cursor);
if(session->prefst && session->prefst->is_realized)
XDefineCursor(display, XtWindow(session->prefst->shell), clock_cursor);
if(session->pref2st && session->pref2st->is_realized)
XDefineCursor(display, XtWindow(session->pref2st->shell), clock_cursor);
if(session->note && session->note->is_realized)
XDefineCursor(display, XtWindow(session->note->shell), clock_cursor);
for(gentext = session->gentext; gentext; gentext = gentext->next)
XDefineCursor(display,XtWindow(gentext->shell), clock_cursor);
XFlush(display);
return;
}
#ifdef __STDC__
void set_pirate_cursors(void)
#else
void set_pirate_cursors()
#endif
{
MainWindow *mwin;
Read *read;
Gentext *gentext;
MLCompose *compose;
session->busy = TRUE;
if((session->lwin) && (session->lwin->destroyed == FALSE))
XDefineCursor(display, XtWindow(session->lwin->shell), pirate_cursor);
if(session->netconf && session->netconf->is_realized)
XDefineCursor(display, XtWindow(session->netconf->shell), pirate_cursor);
for(mwin = session->mwin; mwin; mwin = mwin->next) {
if(mwin->destroyed)
continue;
XDefineCursor(display, XtWindow(mwin->shell), pirate_cursor);
if(mwin->listwin->is_realized)
XDefineCursor(display, XtWindow(mwin->listwin->shell), pirate_cursor);
}
if(session->mailboxwin && session->mailboxwin->is_realized)
XDefineCursor(display,XtWindow(session->mailboxwin->shell),
pirate_cursor);
if(session->mailcopywin && session->mailcopywin->is_realized)
XDefineCursor(display,XtWindow(session->mailcopywin->shell),
pirate_cursor);
if(session->edfilter && session->edfilter->is_realized)
XDefineCursor(display, XtWindow(session->edfilter->shell), pirate_cursor);
if(session->address_book && session->address_book->is_realized)
XDefineCursor(display,XtWindow(session->address_book->shell),
pirate_cursor);
if(session->compose)
for(compose = session->compose; compose; compose = compose->next) {
XDefineCursor(display, XtWindow(compose->window->shell), pirate_cursor);
if(compose->spellwindow && compose->spellwindow->is_realized)
XDefineCursor(display,XtWindow(compose->spellwindow->shell),
pirate_cursor);
if(compose->options && compose->options->window &&
compose->options->window->destroyed == FALSE)
XDefineCursor(display,XtWindow(compose->options->window->shell),
pirate_cursor);
}
for(read = session->read; read; read = read->next)
XDefineCursor(display,XtWindow(read->shell), pirate_cursor);
if(session->prefst && session->prefst->is_realized)
XDefineCursor(display, XtWindow(session->prefst->shell), pirate_cursor);
if(session->pref2st && session->pref2st->is_realized)
XDefineCursor(display, XtWindow(session->pref2st->shell), pirate_cursor);
if(session->note && session->note->is_realized)
XDefineCursor(display, XtWindow(session->note->shell), pirate_cursor);
for(gentext = session->gentext; gentext; gentext = gentext->next)
XDefineCursor(display,XtWindow(gentext->shell), pirate_cursor);
XFlush(display);
return;
}
#ifdef __STDC__
void reset_cursors(void)
#else
void reset_cursors()
#endif
{
MainWindow *mwin;
Read *read;
Gentext *gentext;
MLCompose *compose;
if((session->lwin) && (session->lwin->destroyed == FALSE))
XUndefineCursor(display, XtWindow(session->lwin->shell));
if(session->netconf && session->netconf->is_realized)
XUndefineCursor(display, XtWindow(session->netconf->shell));
for(mwin = session->mwin; mwin; mwin = mwin->next) {
if(mwin->destroyed)
continue;
XUndefineCursor(display, XtWindow(mwin->shell));
if(mwin->listwin->is_realized)
XUndefineCursor(display, XtWindow(mwin->listwin->shell));
}
if(session->mailboxwin && session->mailboxwin->is_realized)
XUndefineCursor(display, XtWindow(session->mailboxwin->shell));
if(session->mailcopywin && session->mailcopywin->is_realized)
XUndefineCursor(display, XtWindow(session->mailcopywin->shell));
if(session->edfilter && session->edfilter->is_realized)
XUndefineCursor(display,XtWindow(session->edfilter->shell));
if(session->address_book && session->address_book->is_realized)
XUndefineCursor(display,XtWindow(session->address_book->shell));
if(session->compose)
for(compose = session->compose; compose; compose = compose->next) {
XUndefineCursor(display, XtWindow(compose->window->shell));
if(compose->spellwindow && compose->spellwindow->is_realized)
XUndefineCursor(display,XtWindow(compose->spellwindow->shell));
if(compose->options && compose->options->window &&
compose->options->window->destroyed == FALSE)
XUndefineCursor(display,XtWindow(compose->options->window->shell));
}
for(read = session->read; read; read = read->next)
XUndefineCursor(display,XtWindow(read->shell));
if(session->prefst && session->prefst->is_realized)
XUndefineCursor(display,XtWindow(session->prefst->shell));
if(session->pref2st && session->pref2st->is_realized)
XUndefineCursor(display,XtWindow(session->pref2st->shell));
if(session->note && session->note->is_realized)
XUndefineCursor(display,XtWindow(session->note->shell));
for(gentext = session->gentext; gentext; gentext = gentext->next)
XUndefineCursor(display,XtWindow(gentext->shell));
XFlush(display);
session->busy = FALSE;
return;
}
#ifdef __STDC__
void get_pointer_position(Widget w, Position *x, Position *y)
#else
void get_pointer_position(w,x,y)
Widget w;
Position *x;
Position *y;
#endif
{
Window junk1, junk2;
int root_x, root_y, junkX, junkY;
unsigned int junkM;
if (XQueryPointer(XtDisplay(w), XtWindow(w),
&junk1, &junk2,
&root_x, &root_y,
&junkX, &junkY,
&junkM) == FALSE)
return;
*x = (short) root_x;
*y = (short) root_y;
return;
}
#ifdef __STDC__
void get_screen_size(int *x, int *y)
#else
void get_screen_size(x,y)
int *x;
int *y;
#endif
{
int screen_number;
screen_number = XDefaultScreen(display);
*x = XDisplayWidth(display,screen_number);
*y = XDisplayHeight(display,screen_number);
return;
}
#define BORDER_SLOP 60
#ifdef __STDC__
void position_popup_widget(Widget w, Boolean force)
#else
void position_popup_widget(w, force)
Widget w;
Boolean force;
#endif
{
int rsize_x, rsize_y;
Dimension wid_h, wid_w, wid_b;
Position p_x, p_y;
get_screen_size(&rsize_x, &rsize_y);
get_pointer_position(w, &p_x, &p_y);
XtRealizeWidget(w);
if((preferences.autoPlace == FALSE) && (force == FALSE))
return;
XtVaGetValues(w,
XmNheight, &wid_h,
XmNwidth, &wid_w,
XmNborderWidth, &wid_b,
NULL);
p_x -= (Position) (wid_w / 2) - wid_b;
p_y -= (Position) (wid_h / 2) - wid_b;
if(p_x < BORDER_SLOP)
p_x = BORDER_SLOP;
else
if(((int) (p_x + wid_w + wid_b)) > rsize_x)
p_x = rsize_x - wid_w - wid_b - BORDER_SLOP;
if(p_y < BORDER_SLOP)
p_y = BORDER_SLOP;
else
if(((int) (p_y + wid_h + wid_b)) > rsize_y)
p_y = rsize_y - wid_h - wid_b - BORDER_SLOP;
XtVaSetValues(w, XtNx, p_x, XtNy, p_y, NULL);
}
/* To determine if an item in a list widget was selected or deselected */
#ifdef __STDC__
Boolean is_selected(XmListCallbackStruct *ptr, unsigned long num)
#else
Boolean is_selected(ptr,num)
XmListCallbackStruct *ptr;
unsigned long num;
#endif
{
register int i;
for(i = 0; i < ptr->selected_item_count; i ++) {
if(ptr->selected_item_positions[i] == num)
return(TRUE);
}
return(FALSE);
}
#ifdef __STDC__
Widget create_label(Widget form, Widget below, char *string)
#else
Widget create_label(form,below,string)
Widget form;
Widget below;
char *string;
#endif
{
Arg args[ARGLISTSIZE];
int n = 0;
Widget label;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET ); n ++;
XtSetArg(args[n], XmNtopWidget, below ); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM ); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM ); n ++;
XtSetArg(args[n], XmNborderWidth, 0 ); n ++;
label = XmCreateLabel(form, string, args, n); n = 0;
XtManageChild(label);
return(label);
}
#ifdef __STDC__
Widget create_text_field(Widget form, Widget below, char *label_string,
char *string, int width,
XtPointer fn, XtPointer data)
#else
Widget create_text_field(form,below,label_string,string,width,fn,data)
Widget form;
Widget below;
char *label_string;
char *string;
int width;
XtPointer fn;
XtPointer data;
#endif
{
Arg args[ARGLISTSIZE];
int n = 0;
XtTranslations translations;
Widget this_widget;
Widget label;
char buffer[FILEBUFFLEN];
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET ); n ++;
XtSetArg(args[n], XmNtopWidget, below ); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM ); n ++;
XtSetArg(args[n], XmNborderWidth, 0 ); n ++;
strcpy(buffer,label_string);
strcat(buffer,"_lbl");
label = XmCreateLabel(form, buffer, args, n); n = 0;
XtManageChild(label);
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET ); n ++;
XtSetArg(args[n], XmNtopWidget, below ); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM ); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET ); n ++;
XtSetArg(args[n], XmNleftWidget, label ); n ++;
if(width) {
XtSetArg(args[n], XmNcolumns, width ); n ++;
}
strcpy(buffer,label_string);
strcat(buffer,"_textfld");
this_widget = XmCreateTextField(form, buffer, args, n); n = 0;
XtManageChild(this_widget);
if(string)
AppendText(this_widget,string);
translations = XtParseTranslationTable(GLOBAL_text_field_translations);
XtOverrideTranslations(this_widget,translations);
if(fn) {
translations =
XtParseTranslationTable(GLOBAL_terminal_text_field_translations);
XtOverrideTranslations(this_widget,translations);
XtAddCallback(this_widget, XmNactivateCallback, (XtCallbackProc) fn, data);
}
else {
translations =
XtParseTranslationTable(GLOBAL_nonterminal_text_field_translations);
XtOverrideTranslations(this_widget,translations);
}
XtAddCallback(this_widget, XmNmodifyVerifyCallback,
(XtCallbackProc) text_field_edit, NULL);
return(this_widget);
}
#ifdef __STDC__
void help(Widget w, char *filename)
#else
void help(w, filename)
Widget w;
char *filename;
#endif
{
char buffer[MAXPATHLEN];
char altbuffer[MAXPATHLEN];
char *local_language = NULL;
sprintf(buffer,"%s/%s",preferences.help_directory,filename);
strcpy(altbuffer,buffer);
local_language = getenv("LANG");
if(local_language == NULL)
local_language = getenv("ML_LANG");
if(local_language != NULL) {
strcat(altbuffer,".");
strcat(altbuffer,local_language);
}
if((access(altbuffer,R_OK)) == SYSCALL_SUCCESS)
display_text(w,NULL,altbuffer,NULL,DOCTYPE_HELP);
else
display_text(w,NULL,buffer,NULL,DOCTYPE_HELP);
return;
}
#ifdef __STDC__
void display_text(Widget w, char *title, char *filename,
char *string, Doc_Type doctype)
#else
void display_text(w,title,filename,string, doctype)
Widget w;
char *title;
char *filename;
char *string;
Doc_Type doctype;
#endif
{
Arg args[ARGLISTSIZE];
int n = 0;
Widget form, menubar, text;
XtTranslations translations;
Gentext *gentext;
FILE *fp;
char buffer[FILEBUFFLEN];
if(filename) {
if((fp = fopen(filename,"r")) == NULL) {
sprintf(buffer,MLGetLocalized(XtNmsgCannotReadFile,MsgCannotReadFile),
filename);
mm_log(buffer,WARN);
return;
}
if(doctype == DOCTYPE_HELP) {
if((fgets(buffer,sizeof(buffer),fp)) != NULL) {
buffer[strlen(buffer) - 1] = NUL_TERM;
XtSetArg(args[n], XmNtitle, buffer);
n ++;
}
}
}
gentext = (Gentext *) fs_get(sizeof(Gentext));
gentext->next = NULL;
gentext->prev = NULL;
if(title) {
XtSetArg(args[n], XmNtitle, title); n ++;
}
XtSetArg (args[n], XmNdeleteResponse, XmDO_NOTHING); n++;
gentext->shell = XtCreateWidget((filename) ? "helpwin" : "textwin",
topLevelShellWidgetClass,
w, args, n );
n = 0;
AddDestroyCallback (gentext->shell);
setup_editres(gentext->shell);
if(help_icon != (Pixmap) None)
XtVaSetValues(gentext->shell,
XmNiconPixmap,help_icon,
NULL);
form = XmCreateForm(gentext->shell, "form", args, n); n = 0;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
menubar = XmCreateMenuBar(form,"menubar", args, n); n = 0;
XtManageChild(menubar);
create_buttons(NULL, menubar,
help_help_menu, XtNumber(help_help_menu),
BTN_ON, (XtPointer) gentext, ROOTMENULEVEL);
XtSetArg(args[n], XmNeditable, FALSE); n ++;
XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n ++;
XtSetArg(args[n], XmNwordWrap, TRUE); n ++;
XtSetArg(args[n], XmNscrollVertical, TRUE); n ++;
XtSetArg(args[n], XmNscrollHorizontal, FALSE ); n ++;
gentext->text = XmCreateScrolledText(form, "text", args, n);
n = 0;
translations = XtParseTranslationTable(GLOBAL_text_translations);
XtOverrideTranslations(gentext->text, translations);
translations = XtParseTranslationTable(GLOBAL_help_pop_translations);
XtOverrideTranslations(gentext->text, translations);
XtManageChild(gentext->text);
if(filename) {
while(fgets(buffer,sizeof(buffer),fp))
AppendText(gentext->text,buffer);
fclose(fp);
}
else
XmTextSetString(gentext->text,string);
XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n ++;
XtSetArg(args[n], XmNtopWidget, menubar); n ++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n ++;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n ++;
XtSetValues(XtParent(gentext->text),args,n); n = 0;
XtManageChild(form);
XmTextShowPosition(gentext->text,0);
XmTextSetInsertionPosition(gentext->text,0);
XtAddCallback(gentext->shell, XmNdestroyCallback,
(XtCallbackProc) help_destroy, gentext);
if(session->gentext == NULL)
session->gentext = gentext;
else {
gentext->next = session->gentext;
session->gentext->prev = gentext;
session->gentext = gentext;
}
XtManageChild(gentext->shell);
XtRealizeWidget(gentext->shell);
XFlush(display);
return;
}
#ifdef __STDC__
void help_dismiss(Widget w, Gentext *gentext, XtPointer xp)
#else
void help_dismiss(w,gentext,xp)
Widget w;
Gentext *gentext;
XtPointer xp;
#endif
{
XtRemoveCallback(gentext->shell, XmNdestroyCallback,
(XtCallbackProc) help_destroy, gentext);
XtDestroyWidget(gentext->shell);
if(gentext->next)
gentext->next->prev = gentext->prev;
if(gentext->prev)
gentext->prev->next = gentext->next;
else
session->gentext = gentext->next;
fs_give((void **) &gentext);
return;
}
#ifdef __STDC__
void help_pop(Widget w, XtPointer xp)
#else
void help_pop(w,xp)
Widget w;
XtPointer xp;
#endif
{
Gentext *curr;
for(curr = session->gentext; curr; curr = curr->next) {
if(curr->text == w)
help_dismiss(w,curr,NULL);
}
return;
}
#ifdef __STDC__
void help_print(Widget w, Gentext *gentext, XtPointer xp)
#else
void help_print(w,gentext,xp)
Widget w;
Gentext *gentext;
XtPointer xp;
#endif
{
char *txt;
if(*preferences.print_command == NUL_TERM) {
mm_log(MLGetLocalized(XtNmsgNoPrintCommand,MsgNoPrintCommand), WARN);
return;
}
push_cursor(WATCH_CURSOR);
txt = XmTextGetString(gentext->text);
if(txt != NULL) {
if(write_to_pipe(preferences.print_command, NULL,
txt, strlen(txt)))
mm_log(MLGetLocalized(XtNmsgPrintFail,MsgPrintFail), WARN);
else
mm_log(MLGetLocalized(XtNmsgPrintSuccess,MsgPrintSuccess), NIL);
fs_give((void **) &txt);
}
pop_cursor();
return;
}
#ifdef __STDC__
void help_help(Widget w, Gentext *gentext, XtPointer xp)
#else
void help_help(w,gentext,xp)
Widget w;
Gentext *gentext;
XtPointer xp;
#endif
{
help(gentext->shell, HELPHELPFILE);
return;
}
#ifdef __STDC__
void help_destroy(Widget w, Gentext *gentext, XtPointer xp)
#else
void help_destroy(w,gentext,xp)
Widget w;
Gentext *gentext;
XtPointer xp;
#endif
{
if(gentext->next)
gentext->next->prev = gentext->prev;
if(gentext->prev)
gentext->prev->next = gentext->next;
else
session->gentext = gentext->next;
fs_give((void **) &gentext);
return;
}
syntax highlighted by Code2HTML, v. 0.9.1