mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Removed incomplete edialog.
Imported new and functional ede-dialog. ede-help uses ede-dialog for error reports; xmessage is not used since some OS-es to not install it by default, e.g. OpenSolaris. Removed obsolete ede-tip.conf. Fixed background issue in ede-tip; background will now always be white so it can nicely blend with the image. Commit fixed ede.desktop.in; previous commit was only renaming without content change. Reduce some debug output in ede-autostart.
This commit is contained in:
227
ede-dialog/ede-dialog.cpp
Normal file
227
ede-dialog/ede-dialog.cpp
Normal file
@@ -0,0 +1,227 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ede-dialog, a dialog displayer
|
||||
* Part of Equinox Desktop Environment (EDE).
|
||||
* Copyright (c) 2005-2009 EDE Authors.
|
||||
*
|
||||
* This program is licensed under terms of the
|
||||
* GNU General Public License version 2 or newer.
|
||||
* See COPYING for details.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <FL/Fl.h>
|
||||
#include <edelib/MessageBox.h>
|
||||
#include <edelib/Window.h>
|
||||
#include <edelib/Nls.h>
|
||||
|
||||
EDELIB_NS_USING(MessageBox)
|
||||
EDELIB_NS_USING(MessageBoxType)
|
||||
EDELIB_NS_USING(MessageBoxIconType)
|
||||
EDELIB_NS_USING(MSGBOX_PLAIN)
|
||||
EDELIB_NS_USING(MSGBOX_INPUT)
|
||||
EDELIB_NS_USING(MSGBOX_INPUT_SECRET)
|
||||
EDELIB_NS_USING(MSGBOX_ICON_TYPE_INFO)
|
||||
EDELIB_NS_USING(MSGBOX_ICON_TYPE_ALERT)
|
||||
EDELIB_NS_USING(MSGBOX_ICON_TYPE_QUESTION)
|
||||
EDELIB_NS_USING(MSGBOX_ICON_TYPE_INPUT)
|
||||
EDELIB_NS_USING(MSGBOX_ICON_TYPE_PASSWORD)
|
||||
|
||||
EDELIB_NS_USING_AS(Window, EdelibWindow)
|
||||
|
||||
#define CHECK_ARGV(argv, pshort, plong) ((strcmp(argv, pshort) == 0) || (strcmp(argv, plong) == 0))
|
||||
#define CHECK_ARGV_LONG(argv, plong) (strcmp(argv, plong) == 0)
|
||||
|
||||
/* kdialog returns this in the case of error and I'm using it too */
|
||||
#define EDE_DIALOG_ERROR_RET 254
|
||||
|
||||
static MessageBox *mbox;
|
||||
|
||||
enum {
|
||||
OPT_NONE,
|
||||
OPT_YESNO,
|
||||
OPT_YESNOCANCEL,
|
||||
OPT_ERROR,
|
||||
OPT_SORRY,
|
||||
OPT_MSGBOX,
|
||||
OPT_INPUTBOX,
|
||||
OPT_PASSWORD
|
||||
};
|
||||
|
||||
static const char* next_param(int curr, char **argv, int argc) {
|
||||
int j = curr + 1;
|
||||
if(j >= argc)
|
||||
return NULL;
|
||||
if(argv[j][0] == '-')
|
||||
return NULL;
|
||||
return argv[j];
|
||||
}
|
||||
|
||||
static void help(void) {
|
||||
puts("Usage: ede-dialog [OPTIONS]");
|
||||
puts("Display a message in a window from shell scripts");
|
||||
puts("");
|
||||
puts("Options:");
|
||||
puts(" -h, --help this help");
|
||||
puts(" --yesno [TEXT] question message with yes/no buttons");
|
||||
puts(" --yesnocancel [TEXT] question message with yes/no/cancel buttons");
|
||||
puts(" --error [TEXT] error message dialog");
|
||||
puts(" --sorry [TEXT] sorry message dialog");
|
||||
puts(" --msgbox [TEXT] message dialog");
|
||||
puts(" --inputbox [TEXT] dialog with input box");
|
||||
puts(" --password [TEXT] dialog with input box for password input (text will be hidden)");
|
||||
puts(" --title [TEXT] set dialog title");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
const char *title, *txt;
|
||||
int opt = OPT_NONE;
|
||||
int ret = EDE_DIALOG_ERROR_RET;
|
||||
int nbuttons = 0;
|
||||
|
||||
MessageBoxType mtype = MSGBOX_PLAIN;
|
||||
MessageBoxIconType itype = MSGBOX_ICON_TYPE_INFO;
|
||||
|
||||
title = txt = NULL;
|
||||
|
||||
if(argc <= 1) {
|
||||
help();
|
||||
return EDE_DIALOG_ERROR_RET;
|
||||
}
|
||||
|
||||
for(int i = 1; i < argc; i++) {
|
||||
if(CHECK_ARGV(argv[i], "-h", "--help")) {
|
||||
help();
|
||||
return EDE_DIALOG_ERROR_RET;
|
||||
}
|
||||
|
||||
/* optional flags */
|
||||
if(CHECK_ARGV_LONG(argv[i], "--title")) {
|
||||
title = next_param(i, argv, argc);
|
||||
if(!title) {
|
||||
puts("'title' option requires a parameter");
|
||||
return EDE_DIALOG_ERROR_RET;
|
||||
}
|
||||
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* mandatory flags */
|
||||
if(CHECK_ARGV_LONG(argv[i], "--yesno")) {
|
||||
itype = MSGBOX_ICON_TYPE_QUESTION;
|
||||
opt = OPT_YESNO;
|
||||
} else if(CHECK_ARGV_LONG(argv[i], "--yesnocancel")) {
|
||||
itype = MSGBOX_ICON_TYPE_QUESTION;
|
||||
opt = OPT_YESNOCANCEL;
|
||||
} else if(CHECK_ARGV_LONG(argv[i], "--error")) {
|
||||
itype = MSGBOX_ICON_TYPE_ALERT;
|
||||
opt = OPT_ERROR;
|
||||
} else if(CHECK_ARGV_LONG(argv[i], "--sorry")) {
|
||||
itype = MSGBOX_ICON_TYPE_ALERT;
|
||||
opt = OPT_SORRY;
|
||||
} else if(CHECK_ARGV_LONG(argv[i], "--msgbox")) {
|
||||
opt = OPT_MSGBOX;
|
||||
/* for else do nothing; use default values */
|
||||
} else if(CHECK_ARGV_LONG(argv[i], "--inputbox")) {
|
||||
itype = MSGBOX_ICON_TYPE_INPUT;
|
||||
mtype = MSGBOX_INPUT;
|
||||
opt = OPT_INPUTBOX;
|
||||
} else if(CHECK_ARGV_LONG(argv[i], "--password")) {
|
||||
itype = MSGBOX_ICON_TYPE_PASSWORD;
|
||||
mtype = MSGBOX_INPUT_SECRET;
|
||||
opt = OPT_PASSWORD;
|
||||
} else {
|
||||
printf("Unknown '%s' parameter\n", argv[i]);
|
||||
return EDE_DIALOG_ERROR_RET;
|
||||
}
|
||||
|
||||
/* every above option requres additional parameter */
|
||||
txt = next_param(i, argv, argc);
|
||||
if(!txt) {
|
||||
printf("'%s' option requires a parameter\n", argv[i]);
|
||||
return EDE_DIALOG_ERROR_RET;
|
||||
}
|
||||
|
||||
/* skip parameter */
|
||||
i++;
|
||||
}
|
||||
|
||||
if(opt == OPT_NONE) {
|
||||
puts("Missing one of the flags that will describe the dialog. Run program with '--help' for the details");
|
||||
return EDE_DIALOG_ERROR_RET;
|
||||
}
|
||||
|
||||
/*
|
||||
* Use a trick to load icon theme and colors using xsettings stuff. edelib::Window will load them
|
||||
* and fill static FLTK values; every further window will use those values, including our will use them
|
||||
*
|
||||
* TODO: this hack needs appropriate solution in edelib.
|
||||
*/
|
||||
EdelibWindow *win = new EdelibWindow(-100, -100, 0, 0);
|
||||
win->show();
|
||||
Fl::wait(0.2);
|
||||
win->hide();
|
||||
|
||||
mbox = new MessageBox(mtype);
|
||||
mbox->set_icon_from_type(itype);
|
||||
mbox->set_text(txt);
|
||||
mbox->label(title);
|
||||
|
||||
/* determine buttons */
|
||||
switch(opt) {
|
||||
case OPT_YESNO:
|
||||
mbox->add_button(_("&No"));
|
||||
mbox->add_button(_("&Yes"));
|
||||
nbuttons = 2;
|
||||
break;
|
||||
case OPT_YESNOCANCEL:
|
||||
mbox->add_button(_("&Cancel"));
|
||||
mbox->add_button(_("&No"));
|
||||
mbox->add_button(_("&Yes"));
|
||||
nbuttons = 3;
|
||||
break;
|
||||
case OPT_ERROR:
|
||||
case OPT_MSGBOX:
|
||||
case OPT_SORRY:
|
||||
mbox->add_button(_("&Close"));
|
||||
nbuttons = 1;
|
||||
break;
|
||||
case OPT_INPUTBOX:
|
||||
case OPT_PASSWORD:
|
||||
mbox->add_button(_("&Cancel"));
|
||||
mbox->add_button(_("&OK"));
|
||||
nbuttons = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = mbox->run();
|
||||
|
||||
/* check box type and 'Cancel' wasn't present */
|
||||
if((opt == OPT_INPUTBOX || opt == OPT_PASSWORD) && ret != 0)
|
||||
printf("%s\n", mbox->get_input());
|
||||
|
||||
/*
|
||||
* Now emulate kdialog return values; e.g. 'OK' will be 0 and 'Cancel' will be 1 if two buttons
|
||||
* are exists. Because MessageBox already do this in reversed way, here value is just re-reversed again if
|
||||
* we have more that one button.
|
||||
*/
|
||||
if(nbuttons > 1) {
|
||||
/* xor-ing with 2 is different so button number can't be decreased */
|
||||
if(nbuttons == 3) {
|
||||
ret ^= nbuttons;
|
||||
ret -= 1;
|
||||
} else {
|
||||
ret ^= (nbuttons - 1);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
Reference in New Issue
Block a user