?? gui.c
字號:
/* * MPlayer GUI for Win32 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> * * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MPlayer; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <fcntl.h>#include <windows.h>#include <windowsx.h>#include <shlobj.h>#include "version.h"#include "mplayer.h"#include "mp_fifo.h"#include "mp_msg.h"#include "help_mp.h"#include "input/input.h"#include "input/mouse.h"#include "osdep/keycodes.h"#include "stream/stream.h"#include "libvo/video_out.h"#include "interface.h"#include "gui.h"#include "wincfg.h"#include "dialogs.h"// HACK around bug in old mingw#undef INVALID_FILE_ATTRIBUTES#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)#ifndef WM_XBUTTONDOWN# define WM_XBUTTONDOWN 0x020B# define WM_XBUTTONUP 0x020C# define WM_XBUTTONDBLCLK 0x020D#endif/* Globals / Externs */extern void renderinfobox(skin_t *skin, window_priv_t *priv);extern void renderwidget(skin_t *skin, image *dest, widget *item, int state);extern void mplayer_put_key(int code);extern void print_version(void);extern int WinID;float sub_aspect;DWORD oldtime;NOTIFYICONDATA nid;int console_state = 0;play_tree_t *playtree = NULL;static HBRUSH colorbrush = NULL; //Handle to colorkey brushstatic COLORREF windowcolor = RGB(255,0,255); //Windowcolor == colorkeyvoid console_toggle(void){ if (console_state) { FreeConsole(); console = 0; console_state = 0; } else { /* This code comes from: http://dslweb.nwnexus.com/~ast/dload/guicon.htm */ CONSOLE_SCREEN_BUFFER_INFO coninfo; FILE *fp; HWND hwnd = NULL; console = 1; AllocConsole(); SetConsoleTitle(MP_TITLE); /* disable the close button for now */ while (!hwnd) { hwnd = FindWindow(NULL, MP_TITLE); Sleep(100); } DeleteMenu(GetSystemMenu(hwnd, 0), SC_CLOSE, MF_BYCOMMAND); GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); coninfo.dwSize.Y = 1000; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); fp = freopen("con", "w", stdout); *stdout = *fp; setvbuf(stdout, NULL, _IONBF, 0); fp = freopen("con", "r", stdin); *stdin = *fp; setvbuf(stdin, NULL, _IONBF, 0); fp = freopen("con", "w", stdout); *stderr = *fp; setvbuf(stderr, NULL, _IONBF, 0); print_version(); console_state = 1; }}void capitalize(char *filename){ unsigned int i; BOOL cap = TRUE; for (i=0; i < strlen(filename); i++) { if (cap) { cap = FALSE; filename[i] = toupper(filename[i]); } else if (filename[i] == ' ') cap = TRUE; else filename[i] = tolower(filename[i]); }}static image *get_drawground(HWND hwnd){ gui_t * gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA); unsigned int i; if(!gui) return NULL; for(i=0; i<gui->window_priv_count; i++) if(gui->window_priv[i]->hwnd==hwnd) return &gui->window_priv[i]->img; return NULL;}static HBITMAP get_bitmap(HWND hwnd){ gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA); unsigned int i; if(!gui) return NULL; for(i=0; i<gui->window_priv_count; i++) if(gui->window_priv[i]->hwnd == hwnd) return gui->window_priv[i]->bitmap; return NULL;}static int get_windowtype(HWND hwnd){ gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA); unsigned int i; if(!gui) return -1; for(i=0; i<gui->window_priv_count; i++) if(gui->window_priv[i]->hwnd == hwnd) return gui->window_priv[i]->type; return -1;}static void uninit(gui_t *gui){ if(gui->skin) destroy_window(gui); if(gui->playlist) gui->playlist->free_playlist(gui->playlist); gui->playlist = NULL;}/* the gui message handler tries to handle the incoming messages and passes them to the player's message handler if it can't handle them*/static void handlemsg(HWND hWnd, int msg){ gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); if(msg == evNone) return; switch(msg) { case evLoadPlay: case evLoad: if(display_openfilewindow(gui, 0) && (msg == evLoadPlay)) handlemsg(hWnd, evDropFile); return; case evLoadSubtitle: display_opensubtitlewindow(gui); break; case evPreferences: display_prefswindow(gui); return; case evPlayList: display_playlistwindow(gui); return; case evSkinBrowser: display_skinbrowser(gui); break; case evEqualizer: display_eqwindow(gui); break; case evAbout: MessageBox(hWnd, COPYRIGHT, "About", MB_OK); break; case evIconify: ShowWindow(hWnd, SW_MINIMIZE); break; case evIncVolume: mplayer_put_key(KEY_VOLUME_UP); break; case evDecVolume: mplayer_put_key(KEY_VOLUME_DOWN); break; default: mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] received msg %s (%i)\n", gui->skin->geteventname(msg), msg); break; } gui->playercontrol(msg);}static widget *clickedinsidewidget(gui_t *gui, int window, int x, int y){ unsigned int i; widget *item; for(i=0; i<gui->skin->widgetcount; i++) { item = gui->skin->widgets[i]; if((item->window == window) && (item->x <= x) && (item->x + item->width >= x) && (item->y <= y) && (item->y + item->height >= y)) return item; } return NULL;}/* updates sliders and the display */static void updatedisplay(gui_t *gui, HWND hwnd){ unsigned int i; window_priv_t *priv = NULL; DWORD time = timeGetTime(); if(!hwnd) return; /* load all potmeters hpotmeters */ for(i=0; i<gui->skin->widgetcount; i++) { if(gui->skin->widgets[i]->type == tyHpotmeter || gui->skin->widgets[i]->type == tyPotmeter) { if(gui->skin->widgets[i]->msg == evSetVolume) gui->skin->widgets[i]->value = guiIntfStruct.Volume; else if(gui->skin->widgets[i]->msg == evSetMoviePosition) gui->skin->widgets[i]->value = guiIntfStruct.Position; else if(gui->skin->widgets[i]->msg == evSetBalance) gui->skin->widgets[i]->value = guiIntfStruct.Balance; if(gui->skin->widgets[i]->window == get_windowtype(hwnd)) renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i], gui->skin->widgets[i]->pressed ? 0 : 1); } /* update some buttons */ if(gui->skin->widgets[i]->type == tyButton && gui->skin->widgets[i]->window == get_windowtype(hwnd)) { if(gui->skin->widgets[i]->msg == evPlaySwitchToPause) { gui->skin->widgets[i]->value = guiIntfStruct.Playing; renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i], guiIntfStruct.Playing == 1 ? 0 : 1); } if(gui->skin->widgets[i]->msg == evMute) { gui->skin->widgets[i]->value = guiIntfStruct.Volume; renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i], guiIntfStruct.Volume == 0.0f ? 0 : 1); } } } /* updating the display once a 100.second is enough imo */ if((time - oldtime) < 100) return; oldtime=time; /* suppress directx's fullscreen window when using the sub window */ if(sub_window && &video_driver_list[0] && strstr("directx", video_driver_list[0])) { HWND hWndFS = NULL; //handle to directx's fullscreen window if(hWndFS == NULL) { hWndFS = FindWindow(NULL, "MPlayer Fullscreen"); if(hWndFS != NULL) DestroyWindow(hWndFS); //sub window handles fullscreen } } for (i=0; i<gui->window_priv_count; i++) { if(gui->window_priv[i]->hwnd == hwnd) priv=gui->window_priv[i]; }// Sherpya /* display the status msgs */ renderinfobox(gui->skin, priv); RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE);}static LRESULT CALLBACK SubProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); if (gui && (gui->subwindow != hWnd)) return FALSE; switch (message) { case WM_CLOSE: handlemsg(hWnd, evExit); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_KEYDOWN: { switch(wParam) { case VK_LEFT: mplayer_put_key(KEY_LEFT); break; case VK_UP: mplayer_put_key(KEY_UP); break; case VK_RIGHT: mplayer_put_key(KEY_RIGHT); break; case VK_DOWN: mplayer_put_key(KEY_DOWN); break; case VK_TAB: mplayer_put_key(KEY_TAB); break; case VK_BACK: mplayer_put_key(KEY_BS); break; case VK_DELETE: mplayer_put_key(KEY_DELETE); break; case VK_INSERT: mplayer_put_key(KEY_INSERT); break; case VK_HOME: mplayer_put_key(KEY_HOME); break; case VK_END: mplayer_put_key(KEY_END); break; case VK_PRIOR: mplayer_put_key(KEY_PAGE_UP); break; case VK_NEXT: mplayer_put_key(KEY_PAGE_DOWN); break; case VK_ESCAPE: mplayer_put_key(KEY_ESC); break; } break; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDEXIT: PostQuitMessage(0); handlemsg(hWnd, evExit); break; case IDFILE_OPEN: handlemsg(hWnd, evLoadPlay); break; case IDURL_OPEN: display_openurlwindow(gui, 0); break; case IDDIR_OPEN: { static char path[MAX_PATH]; BROWSEINFO bi; LPITEMIDLIST pidl; memset(&bi, 0, sizeof(BROWSEINFO)); bi.lpszTitle = "Choose a Directory..."; pidl = SHBrowseForFolder(&bi); if (SHGetPathFromIDList(pidl, path)) { gui->playlist->clear_playlist(gui->playlist);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -