From 0f834b91a4768673833ab4917e87d86c237bb1a6 Mon Sep 17 00:00:00 2001 From: marha Date: Fri, 23 Mar 2012 10:05:55 +0100 Subject: libX11 xserver fontconfig mesa pixman xkbcomp xkeyboard-config git update 23 Mar 2012 --- xorg-server/hw/xwin/winprefs.c | 1157 +++++++++++++++++++--------------------- 1 file changed, 538 insertions(+), 619 deletions(-) (limited to 'xorg-server/hw/xwin/winprefs.c') diff --git a/xorg-server/hw/xwin/winprefs.c b/xorg-server/hw/xwin/winprefs.c index 76c30e9e3..86a788287 100644 --- a/xorg-server/hw/xwin/winprefs.c +++ b/xorg-server/hw/xwin/winprefs.c @@ -52,165 +52,142 @@ extern const char *winGetBaseDir(void); /* From winprefslex.l, the real parser */ -extern int parse_file (FILE *fp); - +extern int parse_file(FILE * fp); /* Currently in use command ID, incremented each new menu item created */ static int g_cmdid = STARTMENUID; - /* Defined in DIX */ extern char *display; /* Local function to handle comma-ified icon names */ -static HICON -LoadImageComma (char *fname, int sx, int sy, int flags); - +static HICON LoadImageComma(char *fname, int sx, int sy, int flags); /* * Creates or appends a menu from a MENUPARSED structure */ static HMENU -MakeMenu (char *name, - HMENU editMenu, - int editItem) +MakeMenu(char *name, HMENU editMenu, int editItem) { - int i; - int item; - MENUPARSED *m; - HMENU hmenu, hsub; - - for (i=0; imenuItems; i++) - { - /* Only assign IDs one time... */ - if ( m->menuItem[i].commandID == 0 ) - m->menuItem[i].commandID = g_cmdid++; - - switch (m->menuItem[i].cmd) - { - case CMD_EXEC: - case CMD_ALWAYSONTOP: - case CMD_RELOAD: - InsertMenu (hmenu, - item, - MF_BYPOSITION|MF_ENABLED|MF_STRING, - m->menuItem[i].commandID, - m->menuItem[i].text); - break; - - case CMD_SEPARATOR: - InsertMenu (hmenu, - item, - MF_BYPOSITION|MF_SEPARATOR, - 0, - NULL); - break; - - case CMD_MENU: - /* Recursive! */ - hsub = MakeMenu (m->menuItem[i].param, 0, 0); - if (hsub) - InsertMenu (hmenu, - item, - MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING, - (UINT_PTR)hsub, - m->menuItem[i].text); - break; - } - - /* If item==-1 (means to add at end of menu) don't increment) */ - if (item>=0) - item++; + /* Add the menu items */ + for (i = 0; i < m->menuItems; i++) { + /* Only assign IDs one time... */ + if (m->menuItem[i].commandID == 0) + m->menuItem[i].commandID = g_cmdid++; + + switch (m->menuItem[i].cmd) { + case CMD_EXEC: + case CMD_ALWAYSONTOP: + case CMD_RELOAD: + InsertMenu(hmenu, + item, + MF_BYPOSITION | MF_ENABLED | MF_STRING, + m->menuItem[i].commandID, m->menuItem[i].text); + break; + + case CMD_SEPARATOR: + InsertMenu(hmenu, item, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + break; + + case CMD_MENU: + /* Recursive! */ + hsub = MakeMenu(m->menuItem[i].param, 0, 0); + if (hsub) + InsertMenu(hmenu, + item, + MF_BYPOSITION | MF_POPUP | MF_ENABLED | MF_STRING, + (UINT_PTR) hsub, m->menuItem[i].text); + break; + } + + /* If item==-1 (means to add at end of menu) don't increment) */ + if (item >= 0) + item++; } - return hmenu; + return hmenu; } - #ifdef XWIN_MULTIWINDOW /* * Callback routine that is executed once per window class. * Removes or creates custom window settings depending on LPARAM */ static wBOOL CALLBACK -ReloadEnumWindowsProc (HWND hwnd, LPARAM lParam) +ReloadEnumWindowsProc(HWND hwnd, LPARAM lParam) { - HICON hicon; - Window wid; + HICON hicon; + Window wid; - if (!hwnd) { - ErrorF("ReloadEnumWindowsProc: hwnd==NULL!\n"); - return FALSE; - } + if (!hwnd) { + ErrorF("ReloadEnumWindowsProc: hwnd==NULL!\n"); + return FALSE; + } - /* It's our baby, either clean or dirty it */ - if (lParam==FALSE) - { - /* Reset the window's icon to undefined. */ - hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_BIG, 0); + /* It's our baby, either clean or dirty it */ + if (lParam == FALSE) { + /* Reset the window's icon to undefined. */ + hicon = (HICON) SendMessage(hwnd, WM_SETICON, ICON_BIG, 0); - /* If the old icon is generated on-the-fly, get rid of it, will regen */ - winDestroyIcon (hicon); + /* If the old icon is generated on-the-fly, get rid of it, will regen */ + winDestroyIcon(hicon); - /* Same for the small icon */ - hicon = (HICON)SendMessage(hwnd, WM_SETICON, ICON_SMALL, 0); - winDestroyIcon (hicon); + /* Same for the small icon */ + hicon = (HICON) SendMessage(hwnd, WM_SETICON, ICON_SMALL, 0); + winDestroyIcon(hicon); - /* Remove any menu additions; bRevert=TRUE destroys any modified menus */ - GetSystemMenu (hwnd, TRUE); - - /* This window is now clean of our taint (but with undefined icons) */ + /* Remove any menu additions; bRevert=TRUE destroys any modified menus */ + GetSystemMenu(hwnd, TRUE); + + /* This window is now clean of our taint (but with undefined icons) */ } - else - { - /* winUpdateIcon() will set the icon default, dynamic, or from xwinrc */ - wid = (Window)GetProp (hwnd, WIN_WID_PROP); - if (wid) - winUpdateIcon (wid); + else { + /* winUpdateIcon() will set the icon default, dynamic, or from xwinrc */ + wid = (Window) GetProp(hwnd, WIN_WID_PROP); + if (wid) + winUpdateIcon(wid); - /* Update the system menu for this window */ - SetupSysMenu ((unsigned long)hwnd); + /* Update the system menu for this window */ + SetupSysMenu((unsigned long) hwnd); - /* That was easy... */ + /* That was easy... */ } - return TRUE; + return TRUE; } #endif - /* * Removes any custom icons in classes, custom menus, etc. * Frees all members in pref structure. @@ -218,353 +195,327 @@ ReloadEnumWindowsProc (HWND hwnd, LPARAM lParam) * Set custom icons and menus again. */ static void -ReloadPrefs (void) +ReloadPrefs(void) { - int i; + int i; #ifdef XWIN_MULTIWINDOW - /* First, iterate over all windows, deleting their icons and custom menus. - * This is really only needed because winDestroyIcon() will try to - * destroy the old global icons, which will have changed. - * It is probably better to set a windows USER_DATA to flag locally defined - * icons, and use that to accurately know when to destroy old icons. - */ - EnumThreadWindows (g_dwCurrentThreadID, ReloadEnumWindowsProc, FALSE); + /* First, iterate over all windows, deleting their icons and custom menus. + * This is really only needed because winDestroyIcon() will try to + * destroy the old global icons, which will have changed. + * It is probably better to set a windows USER_DATA to flag locally defined + * icons, and use that to accurately know when to destroy old icons. + */ + EnumThreadWindows(g_dwCurrentThreadID, ReloadEnumWindowsProc, FALSE); #endif - - /* Now, free/clear all info from our prefs structure */ - for (i=0; imenuItems; j++) - { - if (command==m->menuItem[j].commandID) - { - /* Match! */ - switch(m->menuItem[j].cmd) - { + HWND hwnd; + int i, j; + MENUPARSED *m; + DWORD dwExStyle; + + hwnd = (HWND) hwndIn; + + if (!command) + return FALSE; + + for (i = 0; i < pref.menuItems; i++) { + m = &(pref.menu[i]); + for (j = 0; j < m->menuItems; j++) { + if (command == m->menuItem[j].commandID) { + /* Match! */ + switch (m->menuItem[j].cmd) { #ifdef __CYGWIN__ - case CMD_EXEC: - if (fork()==0) - { - struct rlimit rl; - unsigned long i; - - /* Close any open descriptors except for STD* */ - getrlimit (RLIMIT_NOFILE, &rl); - for (i = STDERR_FILENO+1; i < rl.rlim_cur; i++) - close(i); - - /* Disassociate any TTYs */ - setsid(); - - execl ("/bin/sh", - "/bin/sh", - "-c", - m->menuItem[j].param, - NULL); - exit (0); - } - else - return TRUE; - break; + case CMD_EXEC: + if (fork() == 0) { + struct rlimit rl; + unsigned long i; + + /* Close any open descriptors except for STD* */ + getrlimit(RLIMIT_NOFILE, &rl); + for (i = STDERR_FILENO + 1; i < rl.rlim_cur; i++) + close(i); + + /* Disassociate any TTYs */ + setsid(); + + execl("/bin/sh", + "/bin/sh", "-c", m->menuItem[j].param, NULL); + exit(0); + } + else + return TRUE; + break; #else - case CMD_EXEC: - { - /* Start process without console window */ - STARTUPINFO start; - PROCESS_INFORMATION child; - - memset (&start, 0, sizeof (start)); - start.cb = sizeof (start); - start.dwFlags = STARTF_USESHOWWINDOW; - start.wShowWindow = SW_HIDE; - - memset (&child, 0, sizeof (child)); - - if (CreateProcess (NULL, m->menuItem[j].param, NULL, NULL, FALSE, 0, - NULL, NULL, &start, &child)) - { - CloseHandle (child.hThread); - CloseHandle (child.hProcess); - } - else - MessageBox(NULL, m->menuItem[j].param, "Mingrc Exec Command Error!", MB_OK | MB_ICONEXCLAMATION); - } - return TRUE; + case CMD_EXEC: + { + /* Start process without console window */ + STARTUPINFO start; + PROCESS_INFORMATION child; + + memset(&start, 0, sizeof(start)); + start.cb = sizeof(start); + start.dwFlags = STARTF_USESHOWWINDOW; + start.wShowWindow = SW_HIDE; + + memset(&child, 0, sizeof(child)); + + if (CreateProcess + (NULL, m->menuItem[j].param, NULL, NULL, FALSE, 0, NULL, + NULL, &start, &child)) { + CloseHandle(child.hThread); + CloseHandle(child.hProcess); + } + else + MessageBox(NULL, m->menuItem[j].param, + "Mingrc Exec Command Error!", + MB_OK | MB_ICONEXCLAMATION); + } + return TRUE; #endif - case CMD_ALWAYSONTOP: - if (!hwnd) - return FALSE; - - /* Get extended window style */ - dwExStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE); - - /* Handle topmost windows */ - if (dwExStyle & WS_EX_TOPMOST) - SetWindowPos (hwnd, - HWND_NOTOPMOST, - 0, 0, - 0, 0, - SWP_NOSIZE | SWP_NOMOVE); - else - SetWindowPos (hwnd, - HWND_TOPMOST, - 0, 0, - 0, 0, - SWP_NOSIZE | SWP_NOMOVE); + case CMD_ALWAYSONTOP: + if (!hwnd) + return FALSE; + + /* Get extended window style */ + dwExStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE); + + /* Handle topmost windows */ + if (dwExStyle & WS_EX_TOPMOST) + SetWindowPos(hwnd, + HWND_NOTOPMOST, + 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + else + SetWindowPos(hwnd, + HWND_TOPMOST, + 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); #if XWIN_MULTIWINDOW - /* Reflect the changed Z order */ - winReorderWindowsMultiWindow (); + /* Reflect the changed Z order */ + winReorderWindowsMultiWindow(); #endif - return TRUE; - - case CMD_RELOAD: - ReloadPrefs(); - return TRUE; - - default: - return FALSE; - } - } /* match */ - } /* for j */ - } /* for i */ - - return FALSE; -} + return TRUE; + case CMD_RELOAD: + ReloadPrefs(); + return TRUE; + + default: + return FALSE; + } + } /* match */ + } /* for j */ + } /* for i */ + + return FALSE; +} #ifdef XWIN_MULTIWINDOW /* * Add the default or a custom menu depending on the class match */ void -SetupSysMenu (unsigned long hwndIn) +SetupSysMenu(unsigned long hwndIn) { - HWND hwnd; - HMENU sys; - int i; - WindowPtr pWin; - char *res_name, *res_class; - - hwnd = (HWND)hwndIn; - if (!hwnd) - return; - - pWin = GetProp (hwnd, WIN_WINDOW_PROP); - - sys = GetSystemMenu (hwnd, FALSE); - if (!sys) - return; - - if (pWin) - { - /* First see if there's a class match... */ - if (winMultiWindowGetClassHint (pWin, &res_name, &res_class)) - { - for (i=0; i, */ + + *(strrchr(file, ',')) = 0; /* End string at comma */ + index = atoi(strrchr(fname, ',') + 1); + hicon = ExtractIcon(g_hInstance, file, index); + } + else { + /* Just an .ico file... */ + + hicon = (HICON) LoadImage(NULL, + file, + IMAGE_ICON, + sx, sy, LR_LOADFROMFILE | flags); } - strcat (file, fname); - - if (strrchr (file, ',')) - { - /* Specified as , */ - - *(strrchr (file, ',')) = 0; /* End string at comma */ - index = atoi (strrchr (fname, ',') + 1); - hicon = ExtractIcon (g_hInstance, file, index); - } - else - { - /* Just an .ico file... */ - - hicon = (HICON)LoadImage (NULL, - file, - IMAGE_ICON, - sx, - sy, - LR_LOADFROMFILE|flags); - } } - return hicon; + return hicon; } /* @@ -637,54 +577,52 @@ LoadImageComma (char *fname, int sx, int sy, int flags) * ICONS{} section in the prefs file, and load the icon from a file */ HICON -winOverrideIcon (unsigned long longWin) +winOverrideIcon(unsigned long longWin) { - WindowPtr pWin = (WindowPtr) longWin; - char *res_name, *res_class; - int i; - HICON hicon; - char *wmName; + WindowPtr pWin = (WindowPtr) longWin; + char *res_name, *res_class; + int i; + HICON hicon; + char *wmName; + + if (pWin == NULL) + return 0; + + /* If we can't find the class, we can't override from default! */ + if (!winMultiWindowGetClassHint(pWin, &res_name, &res_class)) + return 0; + + winMultiWindowGetWMName(pWin, &wmName); + + for (i = 0; i < pref.iconItems; i++) { + if (!strcmp(pref.icon[i].match, res_name) || + !strcmp(pref.icon[i].match, res_class) || + (wmName && strstr(wmName, pref.icon[i].match))) { + free(res_name); + free(res_class); + free(wmName); + + if (pref.icon[i].hicon) + return pref.icon[i].hicon; + + hicon = LoadImageComma(pref.icon[i].iconFile, 0, 0, LR_DEFAULTSIZE); + if (hicon == NULL) + ErrorF("winOverrideIcon: LoadImageComma(%s) failed\n", + pref.icon[i].iconFile); + + pref.icon[i].hicon = hicon; + return hicon; + } + } - if (pWin==NULL) - return 0; + /* Didn't find the icon, fail gracefully */ + free(res_name); + free(res_class); + free(wmName); - /* If we can't find the class, we can't override from default! */ - if (!winMultiWindowGetClassHint (pWin, &res_name, &res_class)) return 0; - - winMultiWindowGetWMName (pWin, &wmName); - - for (i=0; i