Fixed menu parsing
This commit is contained in:
parent
f456a2dd0b
commit
ed2da1f141
2 changed files with 316 additions and 469 deletions
779
src/Screen.cc
779
src/Screen.cc
|
@ -34,15 +34,13 @@
|
||||||
# include "../config.h"
|
# include "../config.h"
|
||||||
#endif // HAVE_CONFIG_H
|
#endif // HAVE_CONFIG_H
|
||||||
|
|
||||||
#include <X11/Xatom.h>
|
#include "Screen.hh"
|
||||||
#include <X11/keysym.h>
|
|
||||||
|
|
||||||
#include "i18n.hh"
|
#include "i18n.hh"
|
||||||
#include "fluxbox.hh"
|
#include "fluxbox.hh"
|
||||||
#include "Clientmenu.hh"
|
#include "Clientmenu.hh"
|
||||||
#include "Icon.hh"
|
#include "Icon.hh"
|
||||||
#include "Image.hh"
|
#include "Image.hh"
|
||||||
#include "Screen.hh"
|
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
|
|
||||||
#ifdef SLIT
|
#ifdef SLIT
|
||||||
|
@ -56,8 +54,6 @@
|
||||||
#include "Workspacemenu.hh"
|
#include "Workspacemenu.hh"
|
||||||
|
|
||||||
#ifdef STDC_HEADERS
|
#ifdef STDC_HEADERS
|
||||||
# include <stdlib.h>
|
|
||||||
# include <string.h>
|
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
#endif // STDC_HEADERS
|
#endif // STDC_HEADERS
|
||||||
|
|
||||||
|
@ -94,6 +90,9 @@
|
||||||
#define FONT_ELEMENT_SIZE 50
|
#define FONT_ELEMENT_SIZE 50
|
||||||
#endif // FONT_ELEMENT_SIZE
|
#endif // FONT_ELEMENT_SIZE
|
||||||
|
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
#include <X11/keysym.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
@ -945,7 +944,6 @@ void BScreen::raiseWindows(Window *workspace_stack, int num) {
|
||||||
|
|
||||||
XRestackWindows(getBaseDisplay()->getXDisplay(), session_stack, i);
|
XRestackWindows(getBaseDisplay()->getXDisplay(), session_stack, i);
|
||||||
|
|
||||||
// delete session_stack;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1079,7 +1077,7 @@ void BScreen::raiseFocus(void) {
|
||||||
raiseWindow(fluxbox->getFocusedWindow());
|
raiseWindow(fluxbox->getFocusedWindow());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX - no good parsing here
|
||||||
void BScreen::InitMenu(void) {
|
void BScreen::InitMenu(void) {
|
||||||
I18n *i18n = I18n::instance();
|
I18n *i18n = I18n::instance();
|
||||||
|
|
||||||
|
@ -1095,45 +1093,28 @@ void BScreen::InitMenu(void) {
|
||||||
Bool defaultMenu = True;
|
Bool defaultMenu = True;
|
||||||
|
|
||||||
if (fluxbox->getMenuFilename()) {
|
if (fluxbox->getMenuFilename()) {
|
||||||
FILE *menu_file = fopen(fluxbox->getMenuFilename(), "r");
|
ifstream menu_file(fluxbox->getMenuFilename());
|
||||||
|
|
||||||
if (menu_file) {
|
if (!menu_file.fail()) {
|
||||||
if (! feof(menu_file)) {
|
if (! menu_file.eof()) {
|
||||||
const int buff_size = 1024;
|
string line;
|
||||||
char line[buff_size], label[buff_size];
|
int row = 0;
|
||||||
memset(line, 0, buff_size);
|
while (getline(menu_file, line) && ! menu_file.eof()) {
|
||||||
memset(label, 0, buff_size);
|
row++;
|
||||||
|
|
||||||
while (fgets(line, buff_size, menu_file) && ! feof(menu_file)) {
|
|
||||||
if (line[0] != '#') {
|
if (line[0] != '#') {
|
||||||
int i, key = 0, index = -1, len = strlen(line);
|
string key;
|
||||||
key = 0;
|
int pos=0;
|
||||||
for (i = 0; i < len; i++) {
|
int err = StringUtil::getStringBetween(key, line.c_str(), '[', ']');
|
||||||
if (line[i] == '[')
|
|
||||||
index = 0;
|
if (key == "begin") {
|
||||||
else if (line[i] == ']')
|
pos += err;
|
||||||
break;
|
string label;
|
||||||
else if (line[i] != ' ')
|
err = StringUtil::getStringBetween(label, line.c_str()+pos, '(', ')');
|
||||||
if (index++ >= 0)
|
if (err>0) {
|
||||||
key += tolower(line[i]);
|
rootmenu->setLabel(label.c_str());
|
||||||
}
|
defaultMenu = parseMenuFile(menu_file, rootmenu, row);
|
||||||
if (key == 517) {
|
} else
|
||||||
index = -1;
|
cerr<<"Error in menufile. Line("<<row<<")"<<endl;
|
||||||
for (i = index; i < len; i++) {
|
|
||||||
if (line[i] == '(') index = 0;
|
|
||||||
else if (line[i] == ')') break;
|
|
||||||
else if (index++ >= 0) {
|
|
||||||
if (line[i] == '\\' && i < len - 1) i++;
|
|
||||||
label[index - 1] = line[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index == -1)
|
|
||||||
index = 0;
|
|
||||||
label[index] = '\0';
|
|
||||||
|
|
||||||
rootmenu->setLabel(label);
|
|
||||||
defaultMenu = parseMenuFile(menu_file, rootmenu);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1141,16 +1122,15 @@ void BScreen::InitMenu(void) {
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
i18n->getMessage(
|
i18n->getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenEmptyMenuFile,
|
ScreenSet, ScreenEmptyMenuFile,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"%s: Empty menu file"),
|
"%s: Empty menu file"),
|
||||||
fluxbox->getMenuFilename());
|
fluxbox->getMenuFilename());
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(menu_file);
|
|
||||||
} else
|
} else
|
||||||
perror(fluxbox->getMenuFilename());
|
perror(fluxbox->getMenuFilename());
|
||||||
}
|
}
|
||||||
|
@ -1158,415 +1138,284 @@ void BScreen::InitMenu(void) {
|
||||||
if (defaultMenu) {
|
if (defaultMenu) {
|
||||||
rootmenu->setInternalMenu();
|
rootmenu->setInternalMenu();
|
||||||
rootmenu->insert(i18n->getMessage(
|
rootmenu->insert(i18n->getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, Screenxterm,
|
ScreenSet, Screenxterm,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"xterm"),
|
"xterm"),
|
||||||
BScreen::EXECUTE,
|
BScreen::EXECUTE,
|
||||||
i18n->getMessage(
|
i18n->getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, Screenxterm,
|
ScreenSet, Screenxterm,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"xterm"));
|
"xterm"));
|
||||||
rootmenu->insert(i18n->getMessage(
|
rootmenu->insert(i18n->getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenRestart,
|
ScreenSet, ScreenRestart,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"Restart"),
|
"Restart"),
|
||||||
BScreen::RESTART);
|
BScreen::RESTART);
|
||||||
rootmenu->insert(i18n->getMessage(
|
rootmenu->insert(i18n->getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenExit,
|
ScreenSet, ScreenExit,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"Exit"),
|
"Exit"),
|
||||||
BScreen::EXIT);
|
BScreen::EXIT);
|
||||||
} else
|
} else
|
||||||
fluxbox->saveMenuFilename(fluxbox->getMenuFilename());
|
fluxbox->saveMenuFilename(fluxbox->getMenuFilename());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// looks through a menufile and adds correct items to the root-menu.
|
||||||
|
Bool BScreen::parseMenuFile(ifstream &file, Rootmenu *menu, int &row) {
|
||||||
|
|
||||||
|
string line;
|
||||||
|
|
||||||
Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
while (! file.eof()) {
|
||||||
const int buff_size = 1024;
|
|
||||||
char line[buff_size], label[buff_size], command[buff_size];
|
|
||||||
|
|
||||||
while (! feof(file)) {
|
if (getline(file, line)) {
|
||||||
memset(line, 0, buff_size);
|
row++;
|
||||||
memset(label, 0, buff_size);
|
|
||||||
memset(command, 0, buff_size);
|
|
||||||
|
|
||||||
if (fgets(line, buff_size, file)) {
|
|
||||||
if (line[0] != '#') {
|
if (line[0] != '#') {
|
||||||
register int i, key = 0, parse = 0,
|
int parse_pos = 0, err = 0;
|
||||||
index = -1,
|
|
||||||
line_length = strlen(line), label_length = 0, command_length = 0;
|
|
||||||
|
|
||||||
// determine the keyword
|
|
||||||
key = 0;
|
|
||||||
for (i = 0; i < line_length; i++) {
|
|
||||||
if (line[i] == '[')
|
|
||||||
parse = 1;
|
|
||||||
else if (line[i] == ']')
|
|
||||||
break;
|
|
||||||
else if (line[i] != ' ')
|
|
||||||
if (parse)
|
|
||||||
key += tolower(line[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the label enclosed in ()'s
|
std::string str_key, str_label, str_cmd;
|
||||||
parse = 0;
|
|
||||||
|
err = StringUtil::getStringBetween(str_key, line.c_str(), '[', ']');
|
||||||
for (i = 0; i < line_length; i++) {
|
if (err > 0 ) {
|
||||||
if (line[i] == '(') {
|
parse_pos += err;
|
||||||
index = 0;
|
err = StringUtil::getStringBetween(str_label, line.c_str() + parse_pos, '(', ')');
|
||||||
parse = 1;
|
if (err>0) {
|
||||||
} else if (line[i] == ')')
|
parse_pos += err;
|
||||||
break;
|
StringUtil::getStringBetween(str_cmd, line.c_str() + parse_pos, '{', '}');
|
||||||
else if (index++ >= 0) {
|
|
||||||
if (line[i] == '\\' && i < line_length - 1)
|
|
||||||
i++;
|
|
||||||
label[index - 1] = line[i];
|
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
if (parse) {
|
continue; //read next line
|
||||||
label[index] = '\0';
|
|
||||||
label_length = index;
|
if (!str_key.size())
|
||||||
} else {
|
continue; //read next line
|
||||||
label[0] = '\0';
|
|
||||||
label_length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the command enclosed in {}'s
|
|
||||||
parse = 0;
|
|
||||||
index = -1;
|
|
||||||
for (i = 0; i < line_length; i++)
|
|
||||||
if (line[i] == '{') {
|
|
||||||
index = 0;
|
|
||||||
parse = 1;
|
|
||||||
} else if (line[i] == '}') break;
|
|
||||||
else if (index++ >= 0) {
|
|
||||||
if (line[i] == '\\' && i < line_length - 1)
|
|
||||||
i++;
|
|
||||||
command[index - 1] = line[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parse) {
|
|
||||||
command[index] = '\0';
|
|
||||||
command_length = index;
|
|
||||||
} else {
|
|
||||||
command[0] = '\0';
|
|
||||||
command_length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
I18n *i18n = I18n::instance();
|
I18n *i18n = I18n::instance();
|
||||||
|
|
||||||
switch (key) {
|
if (str_key == "end") {
|
||||||
case 311: //end
|
|
||||||
return ((menu->getCount() == 0) ? True : False);
|
return ((menu->getCount() == 0) ? True : False);
|
||||||
break;
|
} else if (str_key == "nop") {
|
||||||
|
menu->insert(str_label.c_str());
|
||||||
case 333: // nop
|
} else if (str_key == "exec") { // exec
|
||||||
menu->insert(label);
|
if (!(str_label.size() && str_cmd.size())) {
|
||||||
break;
|
fprintf(stderr,
|
||||||
|
|
||||||
case 421: // exec
|
|
||||||
if ((! *label) && (! *command)) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->getMessage(
|
|
||||||
#ifdef NLS
|
|
||||||
ScreenSet, ScreenEXECError,
|
|
||||||
#else // !NLS
|
|
||||||
0, 0,
|
|
||||||
#endif // NLS
|
|
||||||
"BScreen::parseMenuFile: [exec] error, "
|
|
||||||
"no menu label and/or command defined\n"));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->insert(label, BScreen::EXECUTE, command);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 442: // exit
|
|
||||||
if (! *label) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->getMessage(
|
i18n->getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
|
ScreenSet, ScreenEXECError,
|
||||||
|
#else // !NLS
|
||||||
|
0, 0,
|
||||||
|
#endif // NLS
|
||||||
|
"BScreen::parseMenuFile: [exec] error, "
|
||||||
|
"no menu label and/or command defined\n"));
|
||||||
|
cerr<<"Row: "<<row<<endl;
|
||||||
|
} else
|
||||||
|
menu->insert(str_label.c_str(), BScreen::EXECUTE, str_cmd.c_str());
|
||||||
|
|
||||||
|
} else if (str_key == "exit") { // exit
|
||||||
|
if (!str_label.size()) {
|
||||||
|
fprintf(stderr,
|
||||||
|
i18n->getMessage(
|
||||||
|
#ifdef NLS
|
||||||
ScreenSet, ScreenEXITError,
|
ScreenSet, ScreenEXITError,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"BScreen::parseMenuFile: [exit] error, "
|
"BScreen::parseMenuFile: [exit] error, "
|
||||||
"no menu label defined\n"));
|
"no menu label defined\n"));
|
||||||
continue;
|
cerr<<"Row: "<<row<<endl;
|
||||||
}
|
} else
|
||||||
|
menu->insert(str_label.c_str(), BScreen::EXIT);
|
||||||
menu->insert(label, BScreen::EXIT);
|
} // end of exit
|
||||||
break;
|
else if (str_key == "style") { // style
|
||||||
|
if (!( str_label.size() && str_cmd.size())) {
|
||||||
case 561: // style
|
fprintf(stderr,
|
||||||
{
|
|
||||||
if ((! *label) || (! *command)) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
i18n->
|
||||||
getMessage(
|
getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenSTYLEError,
|
ScreenSet, ScreenSTYLEError,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"BScreen::parseMenuFile: [style] error, "
|
"BScreen::parseMenuFile: [style] error, "
|
||||||
"no menu label and/or filename defined\n"));
|
"no menu label and/or filename defined\n"));
|
||||||
continue;
|
cerr<<"Row: "<<row<<endl;
|
||||||
}
|
} else {
|
||||||
|
char *style;
|
||||||
char style[MAXPATHLEN];
|
|
||||||
|
// perform shell style ~ home directory expansion
|
||||||
// perform shell style ~ home directory expansion
|
style = StringUtil::expandFilename(str_cmd.c_str());
|
||||||
char *homedir = 0;
|
menu->insert(str_label.c_str(), BScreen::SETSTYLE, style);
|
||||||
int homedir_len = 0;
|
delete style;
|
||||||
if (*command == '~' && *(command + 1) == '/') {
|
}
|
||||||
homedir = getenv("HOME");
|
} // end of style
|
||||||
homedir_len = strlen(homedir);
|
|
||||||
}
|
else if (str_key == "config") {
|
||||||
|
if (! str_label.size()) {
|
||||||
if (homedir && homedir_len != 0) {
|
fprintf(stderr,
|
||||||
strncpy(style, homedir, homedir_len);
|
|
||||||
|
|
||||||
strncpy(style + homedir_len, command + 1,
|
|
||||||
command_length - 1);
|
|
||||||
*(style + command_length + homedir_len - 1) = '\0';
|
|
||||||
} else {
|
|
||||||
strncpy(style, command, command_length);
|
|
||||||
*(style + command_length) = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->insert(label, BScreen::SETSTYLE, style);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 630: // config
|
|
||||||
if (! *label) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
i18n->
|
||||||
getMessage(
|
getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenCONFIGError,
|
ScreenSet, ScreenCONFIGError,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"BScreen::parseMenufile: [config] error, "
|
"BScreen::parseMenufile: [config] error, "
|
||||||
"no label defined"));
|
"no label defined"));
|
||||||
continue;
|
cerr<<"Row: "<<row<<endl;
|
||||||
}
|
} else
|
||||||
|
menu->insert(str_label.c_str(), configmenu);
|
||||||
menu->insert(label, configmenu);
|
} // end of config
|
||||||
|
else if ( str_key == "include") { // include
|
||||||
break;
|
if (!str_label.size()) {
|
||||||
|
fprintf(stderr,
|
||||||
case 740: // include
|
|
||||||
{
|
|
||||||
if (! *label) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
i18n->
|
||||||
getMessage(
|
getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenINCLUDEError,
|
ScreenSet, ScreenINCLUDEError,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"BScreen::parseMenuFile: [include] error, "
|
"BScreen::parseMenuFile: [include] error, "
|
||||||
"no filename defined\n"));
|
"no filename defined\n"));
|
||||||
continue;
|
cerr<<"Row: "<<row<<endl;
|
||||||
}
|
} else { // start of else 'x'
|
||||||
|
char *newfile;
|
||||||
char newfile[MAXPATHLEN];
|
|
||||||
|
|
||||||
// perform shell style ~ home directory expansion
|
|
||||||
char *homedir = 0;
|
|
||||||
int homedir_len = 0;
|
|
||||||
if (*label == '~' && *(label + 1) == '/') {
|
|
||||||
homedir = getenv("HOME");
|
|
||||||
homedir_len = strlen(homedir);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (homedir && homedir_len != 0) {
|
|
||||||
strncpy(newfile, homedir, homedir_len);
|
|
||||||
|
|
||||||
strncpy(newfile + homedir_len, label + 1,
|
|
||||||
label_length - 1);
|
|
||||||
*(newfile + label_length + homedir_len - 1) = '\0';
|
|
||||||
} else {
|
|
||||||
strncpy(newfile, label, label_length);
|
|
||||||
*(newfile + label_length) = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newfile) {
|
|
||||||
FILE *submenufile = fopen(newfile, "r");
|
|
||||||
|
|
||||||
if (submenufile) {
|
|
||||||
struct stat buf;
|
|
||||||
if (fstat(fileno(submenufile), &buf) ||
|
|
||||||
(! S_ISREG(buf.st_mode))) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
|
||||||
getMessage(
|
|
||||||
#ifdef NLS
|
|
||||||
ScreenSet, ScreenINCLUDEErrorReg,
|
|
||||||
#else // !NLS
|
|
||||||
0, 0,
|
|
||||||
#endif // NLS
|
|
||||||
"BScreen::parseMenuFile: [include] error: "
|
|
||||||
"'%s' is not a regular file\n"), newfile);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! feof(submenufile)) {
|
|
||||||
if (! parseMenuFile(submenufile, menu))
|
|
||||||
fluxbox->saveMenuFilename(newfile);
|
|
||||||
|
|
||||||
fclose(submenufile);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
perror(newfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 767: // submenu
|
|
||||||
{
|
|
||||||
if (! *label) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
|
||||||
getMessage(
|
|
||||||
#ifdef NLS
|
|
||||||
ScreenSet, ScreenSUBMENUError,
|
|
||||||
#else // !NLS
|
|
||||||
0, 0,
|
|
||||||
#endif // NLS
|
|
||||||
"BScreen::parseMenuFile: [submenu] error, "
|
|
||||||
"no menu label defined\n"));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Rootmenu *submenu = new Rootmenu(this);
|
|
||||||
|
|
||||||
if (*command)
|
|
||||||
submenu->setLabel(command);
|
|
||||||
else
|
|
||||||
submenu->setLabel(label);
|
|
||||||
|
|
||||||
parseMenuFile(file, submenu);
|
|
||||||
submenu->update();
|
|
||||||
menu->insert(label, submenu);
|
|
||||||
rootmenuList->insert(submenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 773: // restart
|
|
||||||
{
|
|
||||||
if (! *label) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
|
||||||
getMessage(
|
|
||||||
#ifdef NLS
|
|
||||||
ScreenSet, ScreenRESTARTError,
|
|
||||||
#else // !NLS
|
|
||||||
0, 0,
|
|
||||||
#endif // NLS
|
|
||||||
"BScreen::parseMenuFile: [restart] error, "
|
|
||||||
"no menu label defined\n"));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*command)
|
|
||||||
menu->insert(label, BScreen::RESTARTOTHER, command);
|
|
||||||
else
|
|
||||||
menu->insert(label, BScreen::RESTART);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 845: // reconfig
|
|
||||||
{
|
|
||||||
if (! *label) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
|
||||||
getMessage(
|
|
||||||
#ifdef NLS
|
|
||||||
ScreenSet, ScreenRECONFIGError,
|
|
||||||
#else // !NLS
|
|
||||||
0, 0,
|
|
||||||
#endif // NLs
|
|
||||||
"BScreen::parseMenuFile: [reconfig] error, "
|
|
||||||
"no menu label defined\n"));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->insert(label, BScreen::RECONFIGURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 995: // stylesdir
|
|
||||||
case 1113: // stylesmenu
|
|
||||||
{
|
|
||||||
Bool newmenu = ((key == 1113) ? True : False);
|
|
||||||
|
|
||||||
if ((! *label) || ((! *command) && newmenu)) {
|
|
||||||
fprintf(stderr,
|
|
||||||
i18n->
|
|
||||||
getMessage(
|
|
||||||
#ifdef NLS
|
|
||||||
ScreenSet, ScreenSTYLESDIRError,
|
|
||||||
#else // !NLS
|
|
||||||
0, 0,
|
|
||||||
#endif // NLS
|
|
||||||
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
|
|
||||||
" error, no directory defined\n"));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
char stylesdir[MAXPATHLEN];
|
|
||||||
|
|
||||||
char *directory = ((newmenu) ? command : label);
|
|
||||||
int directory_length = ((newmenu) ? command_length : label_length);
|
|
||||||
|
|
||||||
// perform shell style ~ home directory expansion
|
// perform shell style ~ home directory expansion
|
||||||
char *homedir = 0;
|
newfile = StringUtil::expandFilename(str_label.c_str());
|
||||||
int homedir_len = 0;
|
|
||||||
|
|
||||||
if (*directory == '~' && *(directory + 1) == '/') {
|
if (newfile) {
|
||||||
homedir = getenv("HOME");
|
FILE *submenufile = fopen(newfile, "r");
|
||||||
homedir_len = strlen(homedir);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (homedir && homedir_len != 0) {
|
if (submenufile) {
|
||||||
strncpy(stylesdir, homedir, homedir_len);
|
struct stat buf;
|
||||||
|
if (fstat(fileno(submenufile), &buf) ||
|
||||||
|
(! S_ISREG(buf.st_mode))) {
|
||||||
|
fprintf(stderr,
|
||||||
|
i18n->
|
||||||
|
getMessage(
|
||||||
|
#ifdef NLS
|
||||||
|
ScreenSet, ScreenINCLUDEErrorReg,
|
||||||
|
#else // !NLS
|
||||||
|
0, 0,
|
||||||
|
#endif // NLS
|
||||||
|
"BScreen::parseMenuFile: [include] error: "
|
||||||
|
"'%s' is not a regular file\n"), newfile);
|
||||||
|
cerr<<"Row: "<<row<<endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! feof(submenufile)) {
|
||||||
|
fclose(submenufile);
|
||||||
|
ifstream subfile(newfile);
|
||||||
|
if (! parseMenuFile(subfile, menu, row))
|
||||||
|
fluxbox->saveMenuFilename(newfile);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
perror(newfile);
|
||||||
|
delete newfile;
|
||||||
|
}
|
||||||
|
} // end of else 'x'
|
||||||
|
} // end of include
|
||||||
|
else if (str_key == "submenu") { // sub
|
||||||
|
if (!str_label.size()) {
|
||||||
|
fprintf(stderr,
|
||||||
|
i18n->
|
||||||
|
getMessage(
|
||||||
|
#ifdef NLS
|
||||||
|
ScreenSet, ScreenSUBMENUError,
|
||||||
|
#else // !NLS
|
||||||
|
0, 0,
|
||||||
|
#endif // NLS
|
||||||
|
"BScreen::parseMenuFile: [submenu] error, "
|
||||||
|
"no menu label defined\n"));
|
||||||
|
cerr<<"Row: "<<row<<endl;
|
||||||
|
} else {
|
||||||
|
Rootmenu *submenu = new Rootmenu(this);
|
||||||
|
|
||||||
strncpy(stylesdir + homedir_len, directory + 1,
|
if (str_cmd.size())
|
||||||
directory_length - 1);
|
submenu->setLabel(str_cmd.c_str());
|
||||||
*(stylesdir + directory_length + homedir_len - 1) = '\0';
|
else
|
||||||
} else {
|
submenu->setLabel(str_label.c_str());
|
||||||
strncpy(stylesdir, directory, directory_length);
|
|
||||||
*(stylesdir + directory_length) = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
parseMenuFile(file, submenu, row);
|
||||||
|
submenu->update();
|
||||||
|
menu->insert(str_label.c_str(), submenu);
|
||||||
|
rootmenuList->insert(submenu);
|
||||||
|
}
|
||||||
|
} // end of sub
|
||||||
|
else if (str_key == "restart") {
|
||||||
|
if (!str_label.size()) {
|
||||||
|
fprintf(stderr,
|
||||||
|
i18n->
|
||||||
|
getMessage(
|
||||||
|
#ifdef NLS
|
||||||
|
ScreenSet, ScreenRESTARTError,
|
||||||
|
#else // !NLS
|
||||||
|
0, 0,
|
||||||
|
#endif // NLS
|
||||||
|
"BScreen::parseMenuFile: [restart] error, "
|
||||||
|
"no menu label defined\n"));
|
||||||
|
cerr<<"Row: "<<row<<endl;
|
||||||
|
} else {
|
||||||
|
if (str_cmd.size())
|
||||||
|
menu->insert(str_label.c_str(), BScreen::RESTARTOTHER, str_cmd.c_str());
|
||||||
|
else
|
||||||
|
menu->insert(str_label.c_str(), BScreen::RESTART);
|
||||||
|
}
|
||||||
|
} // end of restart
|
||||||
|
else if (str_key == "reconfig") { // reconf
|
||||||
|
if (!str_label.c_str()) {
|
||||||
|
fprintf(stderr,
|
||||||
|
i18n->
|
||||||
|
getMessage(
|
||||||
|
#ifdef NLS
|
||||||
|
ScreenSet, ScreenRECONFIGError,
|
||||||
|
#else // !NLS
|
||||||
|
0, 0,
|
||||||
|
#endif // NLS
|
||||||
|
"BScreen::parseMenuFile: [reconfig] error, "
|
||||||
|
"no menu label defined\n"));
|
||||||
|
cerr<<"Row: "<<row<<endl;
|
||||||
|
} else
|
||||||
|
menu->insert(str_label.c_str(), BScreen::RECONFIGURE);
|
||||||
|
} // end of reconf
|
||||||
|
else if (str_key == "stylesdir" || str_key == "stylesmenu") {
|
||||||
|
bool newmenu = (str_key == "stylesmenu");
|
||||||
|
if (!( str_label.size() && str_cmd.size()) && newmenu) {
|
||||||
|
fprintf(stderr,
|
||||||
|
i18n->
|
||||||
|
getMessage(
|
||||||
|
#ifdef NLS
|
||||||
|
ScreenSet, ScreenSTYLESDIRError,
|
||||||
|
#else // !NLS
|
||||||
|
0, 0,
|
||||||
|
#endif // NLS
|
||||||
|
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
|
||||||
|
" error, no directory defined\n"));
|
||||||
|
cerr<<"Row: "<<row<<endl;
|
||||||
|
} else { // else 'y'
|
||||||
|
char *stylesdir;
|
||||||
|
const char *directory = ((newmenu) ? str_cmd.c_str() : str_label.c_str());
|
||||||
|
|
||||||
|
// perform shell style ~ home directory expansion
|
||||||
|
stylesdir = StringUtil::expandFilename(directory);
|
||||||
|
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
|
|
||||||
if (! stat(stylesdir, &statbuf)) {
|
if (! stat(stylesdir, &statbuf)) { // stat
|
||||||
if (S_ISDIR(statbuf.st_mode)) {
|
if (S_ISDIR(statbuf.st_mode)) { // dir
|
||||||
Rootmenu *stylesmenu;
|
Rootmenu *stylesmenu;
|
||||||
|
|
||||||
if (newmenu)
|
if (newmenu)
|
||||||
stylesmenu = new Rootmenu(this);
|
stylesmenu = new Rootmenu(this);
|
||||||
else
|
else
|
||||||
|
@ -1588,7 +1437,7 @@ Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
||||||
qsort(ls, entries, sizeof(char *), dcmp);
|
qsort(ls, entries, sizeof(char *), dcmp);
|
||||||
|
|
||||||
int n, slen = strlen(stylesdir);
|
int n, slen = strlen(stylesdir);
|
||||||
for (n = 0; n < entries; n++) {
|
for (n = 0; n < entries; n++) { // for
|
||||||
int nlen = strlen(ls[n]);
|
int nlen = strlen(ls[n]);
|
||||||
char style[MAXPATHLEN + 1];
|
char style[MAXPATHLEN + 1];
|
||||||
|
|
||||||
|
@ -1598,75 +1447,71 @@ Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
|
||||||
|
|
||||||
if ((! stat(style, &statbuf)) && S_ISREG(statbuf.st_mode))
|
if ((! stat(style, &statbuf)) && S_ISREG(statbuf.st_mode))
|
||||||
stylesmenu->insert(ls[n], BScreen::SETSTYLE, style);
|
stylesmenu->insert(ls[n], BScreen::SETSTYLE, style);
|
||||||
|
|
||||||
delete [] ls[n];
|
delete [] ls[n];
|
||||||
}
|
} // end for
|
||||||
|
|
||||||
delete [] ls;
|
delete [] ls;
|
||||||
|
|
||||||
stylesmenu->update();
|
stylesmenu->update();
|
||||||
|
|
||||||
if (newmenu) {
|
if (newmenu) {
|
||||||
stylesmenu->setLabel(label);
|
stylesmenu->setLabel(str_label.c_str());
|
||||||
menu->insert(label, stylesmenu);
|
menu->insert(str_label.c_str(), stylesmenu);
|
||||||
rootmenuList->insert(stylesmenu);
|
rootmenuList->insert(stylesmenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxbox->saveMenuFilename(stylesdir);
|
fluxbox->saveMenuFilename(stylesdir);
|
||||||
} else {
|
} else { // dir
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
i18n->
|
i18n->
|
||||||
getMessage(
|
getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenSTYLESDIRErrorNotDir,
|
ScreenSet, ScreenSTYLESDIRErrorNotDir,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"BScreen::parseMenuFile:"
|
"BScreen::parseMenuFile:"
|
||||||
" [stylesdir/stylesmenu] error, %s is not a"
|
" [stylesdir/stylesmenu] error, %s is not a"
|
||||||
" directory\n"), stylesdir);
|
" directory\n"), stylesdir);
|
||||||
}
|
cerr<<"Row: "<<row<<endl;
|
||||||
} else {
|
} // end of 'dir'
|
||||||
|
} else { // stat
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
i18n->
|
i18n->
|
||||||
getMessage(
|
getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenSTYLESDIRErrorNoExist,
|
ScreenSet, ScreenSTYLESDIRErrorNoExist,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
|
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
|
||||||
" error, %s does not exist\n"), stylesdir);
|
" error, %s does not exist\n"), stylesdir);
|
||||||
}
|
cerr<<"Row: "<<row<<endl;
|
||||||
|
} // end of 'stat'
|
||||||
break;
|
|
||||||
}
|
delete stylesdir;
|
||||||
|
} // end of else 'y'
|
||||||
case 1090: // workspaces
|
} // end of stylesdir
|
||||||
{
|
else if (str_key == "workspaces") {
|
||||||
if (! *label) {
|
if (!str_label.size()) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
i18n->getMessage(
|
i18n->getMessage(
|
||||||
#ifdef NLS
|
#ifdef NLS
|
||||||
ScreenSet, ScreenWORKSPACESError,
|
ScreenSet, ScreenWORKSPACESError,
|
||||||
#else // !NLS
|
#else // !NLS
|
||||||
0, 0,
|
0, 0,
|
||||||
#endif // NLS
|
#endif // NLS
|
||||||
"BScreen:parseMenuFile: [workspaces] error, "
|
"BScreen:parseMenuFile: [workspaces] error, "
|
||||||
"no menu label defined\n"));
|
"no menu label defined\n"));
|
||||||
continue;
|
cerr<<"Row: "<<row<<endl;
|
||||||
}
|
} else
|
||||||
|
menu->insert(str_label.c_str(), workspacemenu);
|
||||||
menu->insert(label, workspacemenu);
|
} // end of work
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ((menu->getCount() == 0) ? True : False);
|
return ((menu->getCount() == 0) ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
// DEALINGS IN THE SOFTWARE.
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
// $Id: Screen.hh,v 1.12 2002/01/21 02:12:11 fluxgen Exp $
|
// $Id: Screen.hh,v 1.13 2002/01/27 12:45:32 fluxgen Exp $
|
||||||
|
|
||||||
#ifndef _SCREEN_HH_
|
#ifndef _SCREEN_HH_
|
||||||
#define _SCREEN_HH_
|
#define _SCREEN_HH_
|
||||||
|
@ -82,6 +82,8 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
|
||||||
class BScreen : public ScreenInfo {
|
class BScreen : public ScreenInfo {
|
||||||
public:
|
public:
|
||||||
|
@ -314,7 +316,7 @@ private:
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Bool parseMenuFile(FILE *, Rootmenu *);
|
Bool parseMenuFile(std::ifstream &, Rootmenu *, int&);
|
||||||
|
|
||||||
bool readDatabaseTexture(char *, char *, BTexture *, unsigned long);
|
bool readDatabaseTexture(char *, char *, BTexture *, unsigned long);
|
||||||
bool readDatabaseColor(char *, char *, BColor *, unsigned long);
|
bool readDatabaseColor(char *, char *, BColor *, unsigned long);
|
||||||
|
|
Loading…
Reference in a new issue