All pastes #39990 Raw Edit

ppl

public text v1 · immutable
#39990 ·published 2006-02-04 18:29 UTC
rendered paste body
/*
	Find the modifier mask for Num_Lock.
*/
unsigned int
find_numlock_mask(void)
{
	int i;
	XModifierKeymap *map;
	unsigned int modmask = 0;

	if ( (map = XGetModifierMapping(display)) == NULL)
	{
		fputs("xrun: Failed to find your numlock key\n", stderr);
		return 0;
	}

	for (i = 0; i < 8; ++i)
	{
		int j;

		for (j = 0; j < map->max_keypermod; ++j)
		{
			KeySym sym;
			char *s;
			int index = 0;
			int min_keycode, max_keycode, keysyms_per_keycode = 0;

			const KeyCode keycode = *(map->modifiermap +
						  (i * map->max_keypermod)
						  + j);

			if (keycode == 0)
			{
				continue;
			}

			XDisplayKeycodes(display, &min_keycode, &max_keycode);
			XGetKeyboardMapping(display, min_keycode, max_keycode - min_keycode + 1,
				                    &keysyms_per_keycode);

			do
			{
				sym = XKeycodeToKeysym(display, keycode, index);
				index++;
			} while (sym == NoSymbol && index < keysyms_per_keycode);

			s = XKeysymToString(sym);

			/*
				If the name is Num_Lock
			*/
			if (s != NULL && strcmp(s, "Num_Lock") == 0)
			{
				#ifndef NDEBUG
				puts("Found Num_Lock modifier");
				#endif

				switch (i)
				{
				case 0:
					modmask |= ShiftMask;
					break;

				case 1:
					modmask |= LockMask;
					break;

				case 2:
					modmask |= ControlMask;
					break;

				case 3:
					modmask |= Mod1Mask;
					break;

				case 4:
					modmask |= Mod2Mask;
					break;

				case 5:
					modmask |= Mod3Mask;
					break;

				case 6:
					modmask |= Mod4Mask;
					break;

				case 7:
					modmask |= Mod5Mask;
					break;

				default:
					assert(0);
					break;

				}
			}
		}
	}

	if (map != NULL)
	{
		XFreeModifiermap(map);
	}

	return modmask;
}