sync with bb-cvs (fixes the java bug, plus menu prasing redone)

This commit is contained in:
Dana Jansens 2002-07-28 18:40:43 +00:00
parent 9e7f5d2208
commit 03f9d6170b
2 changed files with 381 additions and 450 deletions

View file

@ -1646,7 +1646,9 @@ void BScreen::InitMenu(void) {
memset(label, 0, 1024);
while (fgets(line, 1024, menu_file) && ! feof(menu_file)) {
if (line[0] != '#') {
if (line[0] == '#')
continue;
int i, key = 0, index = -1, len = strlen(line);
for (i = 0; i < len; i++) {
@ -1679,7 +1681,6 @@ void BScreen::InitMenu(void) {
}
}
}
}
fclose(menu_file);
}
@ -1698,70 +1699,70 @@ void BScreen::InitMenu(void) {
}
bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
char line[1024], label[1024], command[1024];
static
void string_within(char begin, char end, const char *input, size_t length,
char *output) {
bool parse = False;
size_t index = 0;
while (! feof(file)) {
for (size_t i = 0; i < length; ++i) {
if (input[i] == begin) {
parse = True;
} else if (input[i] == end) {
break;
} else if (parse) {
if (input[i] == '\\' && i < length - 1) i++;
output[index++] = input[i];
}
}
if (parse)
output[index] = '\0';
else
output[0] = '\0';
}
bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
char line[1024], keyword[1024], label[1024], command[1024];
bool done = False;
while (! (done || feof(file))) {
memset(line, 0, 1024);
memset(label, 0, 1024);
memset(command, 0, 1024);
if (fgets(line, 1024, file)) {
if (line[0] != '#') {
int i, key = 0, parse = 0, index = -1, line_length = strlen(line);
if (! fgets(line, 1024, file))
continue;
// determine the keyword
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]);
if (line[0] == '#') // comment, skip it
continue;
size_t line_length = strlen(line);
unsigned int key = 0;
// get the keyword enclosed in []'s
string_within('[', ']', line, line_length, keyword);
if (keyword[0] == '\0') { // no keyword, no menu entry
continue;
} else {
size_t len = strlen(keyword);
for (size_t i = 0; i < len; ++i) {
if (keyword[i] != ' ')
key += tolower(keyword[i]);
}
}
// get the label enclosed in ()'s
parse = 0;
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++;
label[index - 1] = line[i];
}
}
if (parse) {
label[index] = '\0';
} else {
label[0] = '\0';
}
string_within('(', ')', line, line_length, label);
// 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';
} else {
command[0] = '\0';
}
string_within('{', '}', line, line_length, command);
switch (key) {
case 311: // end
return ((menu->getCount() == 0) ? True : False);
done = True;
break;
@ -1823,8 +1824,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
break;
case 740: // include
{
case 740: { // include
if (! *label) {
fprintf(stderr, i18n(ScreenSet, ScreenINCLUDEError,
"BScreen::parseMenuFile: [include] error, "
@ -1835,7 +1835,11 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
string newfile = expandTilde(label);
FILE *submenufile = fopen(newfile.c_str(), "r");
if (submenufile) {
if (! submenufile) {
perror(newfile.c_str());
continue;
}
struct stat buf;
if (fstat(fileno(submenufile), &buf) ||
! S_ISREG(buf.st_mode)) {
@ -1852,15 +1856,11 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
fclose(submenufile);
}
} else {
perror(newfile.c_str());
}
}
break;
case 767: // submenu
{
case 767: { // submenu
if (! *label) {
fprintf(stderr, i18n(ScreenSet, ScreenSUBMENUError,
"BScreen::parseMenuFile: [submenu] error, "
@ -1883,8 +1883,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
break;
case 773: // restart
{
case 773: { // restart
if (! *label) {
fprintf(stderr, i18n(ScreenSet, ScreenRESTARTError,
"BScreen::parseMenuFile: [restart] error, "
@ -1900,8 +1899,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
break;
case 845: // reconfig
{
case 845: { // reconfig
if (! *label) {
fprintf(stderr,
i18n(ScreenSet, ScreenRECONFIGError,
@ -1916,8 +1914,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
break;
case 995: // stylesdir
case 1113: // stylesmenu
{
case 1113: { // stylesmenu
bool newmenu = ((key == 1113) ? True : False);
if (! *label || (! *command && newmenu)) {
@ -1934,8 +1931,22 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
struct stat statbuf;
if (! stat(stylesdir.c_str(), &statbuf)) {
if (S_ISDIR(statbuf.st_mode)) {
if (stat(stylesdir.c_str(), &statbuf) == -1) {
fprintf(stderr,
i18n(ScreenSet, ScreenSTYLESDIRErrorNoExist,
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
" error, %s does not exist\n"), stylesdir.c_str());
continue;
}
if (! S_ISDIR(statbuf.st_mode)) {
fprintf(stderr,
i18n(ScreenSet, ScreenSTYLESDIRErrorNotDir,
"BScreen::parseMenuFile:"
" [stylesdir/stylesmenu] error, %s is not a"
" directory\n"), stylesdir.c_str());
continue;
}
Rootmenu *stylesmenu;
if (newmenu)
@ -1966,8 +1977,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
style += '/';
style += fname;
if (! stat(style.c_str(), &statbuf) &&
S_ISREG(statbuf.st_mode))
if (! stat(style.c_str(), &statbuf) && S_ISREG(statbuf.st_mode))
stylesmenu->insert(fname, BScreen::SetStyle, style);
}
@ -1980,24 +1990,10 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
}
blackbox->addMenuTimestamp(stylesdir);
} else {
fprintf(stderr,
i18n(ScreenSet, ScreenSTYLESDIRErrorNotDir,
"BScreen::parseMenuFile:"
" [stylesdir/stylesmenu] error, %s is not a"
" directory\n"), stylesdir.c_str());
}
} else {
fprintf(stderr,
i18n(ScreenSet, ScreenSTYLESDIRErrorNoExist,
"BScreen::parseMenuFile: [stylesdir/stylesmenu]"
" error, %s does not exist\n"), stylesdir.c_str());
}
break;
}
case 1090: // workspaces
{
case 1090: { // workspaces
if (! *label) {
fprintf(stderr,
i18n(ScreenSet, ScreenWORKSPACESError,
@ -2007,13 +2003,10 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
}
menu->insert(label, workspacemenu);
}
break;
}
}
}
}
}
return ((menu->getCount() == 0) ? True : False);
}

View file

@ -107,11 +107,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
return;
}
#ifdef DEBUG
fprintf(stderr, "0x%lx: initial (%d, %d) w: %d, h: %d\n", client.window,
wattrib.x, wattrib.y, wattrib.width, wattrib.height);
#endif // DEBUG
// set the eventmask early in the game so that we make sure we get
// all the events we are interested in
XSetWindowAttributes attrib_set;
@ -167,36 +162,31 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
client.rect.setRect(wattrib.x, wattrib.y, wattrib.width, wattrib.height);
client.old_bw = wattrib.border_width;
windowmenu = 0;
lastButtonPressTime = 0;
timer = new BTimer(blackbox, this);
timer->setTimeout(blackbox->getAutoRaiseDelay());
windowmenu = new Windowmenu(this);
// get size, aspect, minimum/maximum size and other hints set by the
// client
if (! getBlackboxHints()) {
getMWMHints();
getNetWMHints();
}
// get size, aspect, minimum/maximum size and other hints set by the
// client
getWMProtocols();
getWMHints();
getWMNormalHints();
#ifdef DEBUG
fprintf(stderr, "0x%lx: after hints (%d, %d) w: %d, h: %d\n", client.window,
client.rect.x(), client.rect.y(),
client.rect.width(), client.rect.height());
#endif // DEBUG
frame.window = createToplevelWindow();
frame.plate = createChildWindow(frame.window);
associateClientWindow();
blackbox->saveWindowSearch(frame.window, this);
frame.plate = createChildWindow(frame.window);
blackbox->saveWindowSearch(frame.plate, this);
blackbox->saveWindowSearch(client.window, this);
// determine if this is a transient window
getTransientInfo();
@ -206,6 +196,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
getWindowType();
// adjust the window decorations/behavior based on the window type
switch (window_type) {
case Type_Desktop:
case Type_Dock:
@ -231,6 +222,8 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
break;
}
setAllowedActions();
// further adjeust the window's decorations/behavior based on window sizes
if ((client.normal_hint_flags & PMinSize) &&
(client.normal_hint_flags & PMaxSize) &&
@ -239,18 +232,17 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
decorations &= ~(Decor_Maximize | Decor_Handle);
functions &= ~(Func_Resize | Func_Maximize);
}
if (decorations & Decor_Titlebar)
createTitlebar();
if (decorations & Decor_Handle)
createHandle();
// apply the size and gravity hint to the frame
upsize();
#ifdef DFEBUG
fprintf(stderr, "0x%lx: sizes reflect the frame from now on\n",
client.window);
fprintf(stderr, "0x%lx: after upsize (%d, %d) w: %d, h: %d\n", client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif // DEBUG
setAllowedActions();
bool place_window = True;
if (blackbox->isStartup() || isTransient() ||
client.normal_hint_flags & (PPosition|USPosition)) {
@ -260,51 +252,56 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
place_window = False;
}
#ifdef DEBUG
fprintf(stderr, "0x%lx: after gravity (%d, %d) w: %d, h: %d\n",
client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif // DEBUG
// add the window's strut. note this is done *after* placing the window.
screen->addStrut(&client.strut);
updateStrut();
if (decorations & Decor_Titlebar)
createTitlebar();
if (decorations & Decor_Handle)
createHandle();
#ifdef SHAPE
if (blackbox->hasShapeExtensions() && flags.shaped) {
if (blackbox->hasShapeExtensions() && flags.shaped)
configureShape();
}
#endif // SHAPE
windowmenu = new Windowmenu(this);
if (blackbox_attrib.workspace >= screen->getWorkspaceCount())
screen->getCurrentWorkspace()->addWindow(this, place_window);
else
screen->getWorkspace(blackbox_attrib.workspace)->
addWindow(this, place_window);
/*
the server needs to be grabbed here to prevent client's from sending
events while we are in the process of configuring their window.
We hold the grab until after we are done moving the window around.
*/
XGrabServer(blackbox->getXDisplay());
associateClientWindow();
blackbox->saveWindowSearch(client.window, this);
if (! place_window) {
// don't need to call configure if we are letting the workspace
// place the window
configure(frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#ifdef DEBUG
fprintf(stderr, "0x%lx: after configure (%d, %d) w: %d, h: %d\n",
client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif // DEBUG
}
positionWindows();
XUngrabServer(blackbox->getXDisplay());
// now that we know where to put the window and what it should look like
// we apply the decorations
decorate();
grabButtons();
XMapSubwindows(blackbox->getXDisplay(), frame.window);
// this ensures the title, buttons, and other decor are properly displayed
redrawWindowFrame();
// preserve the window's initial state on first map, and its current state
// across a restart
unsigned long initial_state = current_state;
@ -316,6 +313,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
client.transient_for->isStuck() != flags.stuck)
stick();
// the following flags are set by blackbox native apps only
if (flags.shaded) {
flags.shaded = False;
initial_state = current_state;
@ -336,31 +334,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
if (flags.maximized && (functions & Func_Maximize))
remaximize();
/*
When the window is mapped (and also when its attributes are restored), the
current_state that was set here will be used.
It is set to Normal if the window is to be mapped or it is set to Iconic
if the window is to be iconified.
*Note* that for sticky windows, the same rules apply here, they are in
fact never set to Iconic since there is no way for us to tell if a sticky
window was iconified previously.
*/
positionWindows();
decorate();
grabButtons();
XMapSubwindows(blackbox->getXDisplay(), frame.window);
redrawWindowFrame();
#ifdef DEBUG
fprintf(stderr, "0x%lx: end of constructor (%d, %d) w: %d, h: %d\n",
client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif // DEBUG
}
@ -482,8 +455,10 @@ void BlackboxWindow::associateClientWindow(void) {
XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask);
XGrabServer(blackbox->getXDisplay());
/*
note we used to grab around this call to XReparentWindow however the
server is now grabbed before this method is called
*/
unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
StructureNotifyMask;
XSelectInput(blackbox->getXDisplay(), client.window,
@ -491,12 +466,9 @@ void BlackboxWindow::associateClientWindow(void) {
XReparentWindow(blackbox->getXDisplay(), client.window, frame.plate, 0, 0);
XSelectInput(blackbox->getXDisplay(), client.window, event_mask);
XUngrabServer(blackbox->getXDisplay());
XRaiseWindow(blackbox->getXDisplay(), frame.plate);
XMapSubwindows(blackbox->getXDisplay(), frame.plate);
#ifdef SHAPE
if (blackbox->hasShapeExtensions()) {
XShapeSelectInput(blackbox->getXDisplay(), client.window,
@ -883,9 +855,7 @@ void BlackboxWindow::grabButtons(void) {
void BlackboxWindow::ungrabButtons(void) {
if (! screen->isSloppyFocus() || screen->doClickRaise())
blackbox->ungrabButton(Button1, 0, frame.plate);
blackbox->ungrabButton(Button1, ModMask, frame.window);
blackbox->ungrabButton(Button2, ModMask, frame.window);
blackbox->ungrabButton(Button3, ModMask, frame.window);
@ -2627,12 +2597,6 @@ void BlackboxWindow::mapRequestEvent(const XMapRequestEvent *re) {
case InactiveState:
case ZoomState:
default:
#ifdef DEBUG
fprintf(stderr, "0x%lx: just before show (%d, %d) w: %d, h: %d\n",
client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif // DEBUG
show();
screen->getWorkspace(blackbox_attrib.workspace)->raiseWindow(this);
if (isNormal()) {
@ -2726,12 +2690,6 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
}
reconfigure();
#ifdef DEBUG
fprintf(stderr, "0x%lx: transient hint (%d, %d) w: %d, h: %d\n",
client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif
}
break;
@ -2784,12 +2742,6 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
if (old_rect != frame.rect)
reconfigure();
#ifdef DEBUG
fprintf(stderr, "0x%lx: normal hint (%d, %d) w: %d, h: %d\n",
client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif // DEBUG
break;
}
@ -2849,19 +2801,11 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
applyGravity(req);
}
if (cr->value_mask & CWWidth) {
if (cr->value_mask & CWWidth)
req.setWidth(cr->width + frame.margin.left + frame.margin.right);
#ifdef DEBUG
fprintf(stderr, "0x%lx: new width - %d\n", client.window, cr->width);
#endif // DEBUG
}
if (cr->value_mask & CWHeight) {
if (cr->value_mask & CWHeight)
req.setHeight(cr->height + frame.margin.top + frame.margin.bottom);
#ifdef DEBUG
fprintf(stderr, "0x%lx: new height - %d\n", client.window, cr->height);
#endif // DEBUG
}
configure(req.x(), req.y(), req.width(), req.height());
}
@ -2880,13 +2824,6 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
break;
}
}
#ifdef DEBUG
fprintf(stderr, "0x%lx: change request (%d, %d) w: %d, h: %d\n",
client.window,
frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
#endif // DEBUG
}
@ -3564,7 +3501,8 @@ void BlackboxWindow::restore(bool remap) {
XSelectInput(blackbox->getXDisplay(), frame.plate, NoEventMask);
// do not leave a shaded window as an icon unless it was an icon
if (flags.shaded && ! flags.iconic) setState(NormalState);
if (flags.shaded && ! flags.iconic)
setState(NormalState);
restoreGravity(client.rect);