I've been using FVWM for almost ten years, now, so in a sense, every piece of work I've done in the last decade owes at least something to FVWM. So, my sincere thanks to the team.
Lately I decided to overhaul my setup, and I've been making heavy use of the State portions of window states and styles. I've primarily been using a snapshot from April 28, just after the State style was added. Something odd was happening, so I started looking poring through and debugging the code. Wow. Impressive code base. Now, all I know about the code base is what I've learned from printf debugging over the last week, so please pardon me if I sound like a numnut. Here are is what I think I've learned, and I am intentionaly stating the obvious to make sure I'm not making any stupid mistakes, and my conclusions: 1. Using the WindowStyle command adds a style to the all_styles that is specific to a given window ID. 2. The UserState is stored in the flag portion of a style. 3. There are four copies of the flags. The actual flags are stored in "flags". The mask of which flags have actually been set is in "flag_mask". To be honest, I haven't figured out how "flag_default" and "change_mask" are used. 4. The flag portions of styles are merged, bit-by-bit, at the end of merge_styles (style.c). 5. The flag sets for the State style are set toward the end of style_parse_one_style_option (style.c:~3650). In this chunk of code, states corresponds to the old states value, mask is a mask of which state bit is being set. This mask is then used to update state. 6. The common flags (SCF) are set to state. This appears to be correct. 7. The flag mask (SCM) is currently set to 1. I think this is incorrect. I think this should be set to S_USER_STATES(SCM(*ps)) | mask. Right now, only the bottom bit of the mask is ever changed. 8. I'm not sure how the change mask is used, but I suspect that it needs to be set differently. 9. I have no idea how the default mask is used. I'm loathe to actually change the code in CVS, since I'm not even remotely on the development team, so here is the snippet that I think needs to be changed: else if (StrEquals(token, "State")) { spargs = GetIntegerArguments(rest, NULL, tmpno, 1); if (spargs == 1 && tmpno[0] >= 0 && tmpno[0] <= 31) { unsigned int old_state; unsigned int set_mask; unsigned int new_state; unsigned int flag_mask; unsigned int change_mask; unsigned int default_mask; old_state = S_USER_STATES(SCF(*ps)); set_mask = (1 << tmpno[0]); new_state = old_state; if (on) { new_state |= mask; } else { new_state &= ~mask; } flag_mask = S_USER_STATES(SCM(*ps)) flag_mask |= mask; change_mask = S_USER_STATES(SCC(*ps)); change_mask |= ~(new_state ^ old_state) default_mask = S_USER_STATES(SCD(*ps)); default_mask = ????; S_SET_USER_STATES(SCF(*ps), new_state); S_SET_USER_STATES(SCM(*ps), flag_mask); S_SET_USER_STATES(SCC(*ps), change_mask); S_SET_USER_STATES(SCD(*ps), default_mask); } else { fvwm_msg( ERR,"style_parse_one_style_option", "bad State arg: %s", rest); } } Thanks again for all of your hard work. Hope this is useful. -- Sal smile. -------------- Salvatore Domenick Desiano Research Scientist NASA Ames Research Center (QSS Group, Inc.) -- Visit the official FVWM web page at <URL:http://www.fvwm.org/>. To unsubscribe from the list, send "unsubscribe fvwm-workers" in the body of a message to [EMAIL PROTECTED] To report problems, send mail to [EMAIL PROTECTED]