Commit 2396f46b authored by Cyril Deguet's avatar Cyril Deguet

* skeleton of X11 skins

parent a796b89d
/*****************************************************************************
* x11_api.cpp: Various x11-specific functions
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_api.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//--- SKIN ------------------------------------------------------------------
#include "../src/window.h"
#include "../os_window.h"
#include "../os_api.h"
#include "../src/event.h" // for MAX_PARAM_SIZE
#include <stdio.h>
//---------------------------------------------------------------------------
// Event API
//---------------------------------------------------------------------------
void OSAPI_SendMessage( SkinWindow *win, unsigned int message, unsigned int param1,
long param2 )
{
/* if( win == NULL )
SendMessage( NULL, message, param1, param2 );
else
SendMessage( ( (Win32Window *)win )->GetHandle(), message, param1,
param2 );*/
}
//---------------------------------------------------------------------------
void OSAPI_PostMessage( SkinWindow *win, unsigned int message, unsigned int param1,
long param2 )
{
/* GdkEventClient *event = new GdkEventClient;
event->type = GDK_CLIENT_EVENT;
if( win == NULL )
event->window = NULL;
else
event->window = (( Window )win)->GetHandle();
event->send_event = 0;
event->message_type = NULL;
event->data_format = 32;
event->data.l[0] = message;
event->data.l[1] = param1;
event->data.l[2] = param2;
gdk_event_put( (GdkEvent *)event );
delete event;*/
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Graphic API
//---------------------------------------------------------------------------
int OSAPI_GetNonTransparentColor( int c )
{
/* // Get desktop device context
HDC DeskDC = GetWindowDC( GetDesktopWindow() );
// If color is black or color is same as black wether pixel color depth
if( c == 0 || SetPixel( DeskDC, 0, 0, c ) == 0 )
{
if( GetDeviceCaps( DeskDC, BITSPIXEL ) < 24 )
c = RGB(8, 0, 0);
else
c = RGB(1, 0, 0);
}
ReleaseDC( GetDesktopWindow(), DeskDC );
return c;*/
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// General
//---------------------------------------------------------------------------
int OSAPI_GetTime()
{
/* GTimeVal time;
g_get_current_time( &time );
return ( time.tv_sec * 1000 + time.tv_usec / 1000 );*/
}
//---------------------------------------------------------------------------
void OSAPI_GetScreenSize( int &w, int &h )
{
/* w = GetSystemMetrics(SM_CXSCREEN);
h = GetSystemMetrics(SM_CYSCREEN);*/
}
//---------------------------------------------------------------------------
void OSAPI_GetMousePos( int &x, int &y )
{
/* gdk_window_get_pointer( gdk_get_default_root_window(), &x, &y, NULL );*/
}
//---------------------------------------------------------------------------
string OSAPI_GetWindowTitle( SkinWindow *win )
{
/* return ( (GTK2Window *)win )->GetName();*/
}
//---------------------------------------------------------------------------
bool OSAPI_RmDir( string path )
{
/* WIN32_FIND_DATA find;
string File;
string FindFiles = path + "\\*.*";
HANDLE handle = FindFirstFile( (char *)FindFiles.c_str(), &find );
while( handle != INVALID_HANDLE_VALUE )
{
// If file is neither "." nor ".."
if( strcmp( find.cFileName, "." ) && strcmp( find.cFileName, ".." ) )
{
// Set file name
File = path + "\\" + (string)find.cFileName;
// If file is a directory, delete it recursively
if( find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
OSAPI_RmDir( File );
}
// Else, it is a file so simply delete it
else
{
DeleteFile( (char *)File.c_str() );
}
}
// If no more file in directory, exit while
if( !FindNextFile( handle, &find ) )
break;
}
// Now directory is empty so can be removed
FindClose( handle );
RemoveDirectory( (char *)path.c_str() );
return true;*/
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_bitmap.cpp: X11 implementation of the Bitmap class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_bitmap.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Emmanuel Puig <karibu@via.ecp.fr>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
#include <X11/Xutil.h>
//--- VLC -------------------------------------------------------------------
#include <vlc/intf.h>
//--- SKIN ------------------------------------------------------------------
#include "../os_api.h"
#include "../src/graphics.h"
#include "x11_graphics.h"
#include "../src/bitmap.h"
#include "x11_bitmap.h"
#include "../src/theme.h"
#include "../os_theme.h"
#include "../src/skin_common.h"
//---------------------------------------------------------------------------
// X11Bitmap
//---------------------------------------------------------------------------
X11Bitmap::X11Bitmap( intf_thread_t *p_intf, string FileName, int AColor )
: Bitmap( p_intf, FileName, AColor )
{
// Find the display
display = p_intf->p_sys->display;
Window root = DefaultRootWindow( display );
AlphaColor = AColor;
// Load the bitmap image
int hotspotX, hotspotY;
int rc = XReadBitmapFile( display, root, FileName.c_str(),
(unsigned int*)&Width, (unsigned int*)&Height,
&Bmp, &hotspotX, &hotspotY );
if( rc != BitmapSuccess )
{
if( FileName != "" )
msg_Warn( p_intf, "Couldn't load bitmap: %s", FileName.c_str() );
Width = 0;
Height = 0;
}
/* else
{
Width = gdk_pixbuf_get_width( Bmp );
Height = gdk_pixbuf_get_height( Bmp );
if( AColor != 0 )
{
// Change black pixels to another color to avoid transparency
int rowstride = gdk_pixbuf_get_rowstride( Bmp );
guchar *pixel = gdk_pixbuf_get_pixels( Bmp );
int pix_size = ( gdk_pixbuf_get_has_alpha( Bmp ) ? 4 : 3 );
for( int y = 0; y < Height; y++ )
{
for( int x = 0; x < Width; x++ )
{
guint32 r = pixel[0];
guint32 g = pixel[1]<<8;
guint32 b = pixel[2]<<16;
if( r+g+b == 0 )
{
pixel[2] = 10; // slight blue
}
pixel += pix_size;
}
}
}
Bmp = gdk_pixbuf_add_alpha( Bmp, TRUE, AColor & 0xff, (AColor>>8) & 0xff,
(AColor>>16) & 0xff );
}*/
}
//---------------------------------------------------------------------------
X11Bitmap::X11Bitmap( intf_thread_t *p_intf, Graphics *from, int x, int y,
int w, int h, int AColor ) : Bitmap( p_intf, from, x, y, w, h, AColor )
{
/* Width = w;
Height = h;
AlphaColor = AColor;
HBITMAP HBmp;
HDC fromDC = ( (X11Graphics *)from )->GetImageHandle();
// Create image
bmpDC = CreateCompatibleDC( fromDC );
HBmp = CreateCompatibleBitmap( fromDC, Width, Height );
SelectObject( bmpDC, HBmp );
DeleteObject( HBmp );
BitBlt( bmpDC, 0, 0, Width, Height, fromDC, x, y, SRCCOPY );*/
}
//---------------------------------------------------------------------------
X11Bitmap::X11Bitmap( intf_thread_t *p_intf, Bitmap *c )
: Bitmap( p_intf, c )
{
/* HBITMAP HBuf;
// Copy attibutes
c->GetSize( Width, Height );
AlphaColor = c->GetAlphaColor();
// Copy bmpDC
bmpDC = CreateCompatibleDC( NULL );
HBuf = CreateCompatibleBitmap( bmpDC, Width, Height );
SelectObject( bmpDC, HBuf );
BitBlt( bmpDC, 0, 0, Width, Height, ( (X11Bitmap *)c )->GetBmpDC(),
0, 0, SRCCOPY );
DeleteObject( HBuf );*/
}
//---------------------------------------------------------------------------
X11Bitmap::~X11Bitmap()
{
XFreePixmap( display, Bmp );
}
//---------------------------------------------------------------------------
void X11Bitmap::DrawBitmap( int x, int y, int w, int h, int xRef, int yRef,
Graphics *dest )
{
if( Bmp )
{
/* GdkDrawable *destImg = ( (X11Graphics *)dest )->GetImage();
GdkGC *destGC = ( (X11Graphics *)dest )->GetGC();
gdk_pixbuf_render_to_drawable( Bmp, destImg, destGC, x, y, xRef, yRef,
w, h, GDK_RGB_DITHER_NORMAL, 0, 0);*/
}
}
//---------------------------------------------------------------------------
bool X11Bitmap::Hit( int x, int y)
{
// unsigned int c = (unsigned int)GetBmpPixel( x, y );
/* if( c == -1 || c == AlphaColor )
return false;
else
return true;*/
}
//---------------------------------------------------------------------------
int X11Bitmap::GetBmpPixel( int x, int y )
{
if( !Bmp || x < 0 || x >= Width || y < 0 || y >= Height )
return -1;
/* guchar *pixels;
int rowstride, offset;
gboolean has_alpha;
rowstride = gdk_pixbuf_get_rowstride( Bmp );
pixels = gdk_pixbuf_get_pixels( Bmp );
has_alpha = gdk_pixbuf_get_has_alpha( Bmp );
offset = y * rowstride + ( x * (has_alpha ? 4 : 3) );
int r = pixels [offset];
int g = pixels [offset + 1] << 8;
int b = pixels [offset + 2] << 16;
return r + g + b;*/
}
//---------------------------------------------------------------------------
void X11Bitmap::SetBmpPixel( int x, int y, int color )
{
// SetPixelV( bmpDC, x, y, color );
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_bitmap.h: X11 implementation of the Bitmap class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_bitmap.h,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifndef VLC_X11_BITMAP
#define VLC_X11_BITMAP
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//--- GENERAL ---------------------------------------------------------------
#include <string>
using namespace std;
//---------------------------------------------------------------------------
struct intf_thread_t;
class Bitmap;
class Graphics;
//---------------------------------------------------------------------------
class X11Bitmap : public Bitmap
{
private:
Display *display;
Pixmap Bmp;
public:
// Constructors
X11Bitmap( intf_thread_t *p_intf, string FileName, int AColor );
X11Bitmap( intf_thread_t *p_intf, Graphics *from, int x, int y,
int w, int h, int AColor );
X11Bitmap( intf_thread_t *p_intf, Bitmap *c );
// Destructor
virtual ~X11Bitmap();
virtual void DrawBitmap( int x, int y, int w, int h, int xRef, int yRef,
Graphics *dest );
virtual bool Hit( int x, int y );
virtual int GetBmpPixel( int x, int y );
virtual void SetBmpPixel( int x, int y, int color );
};
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_dragdrop.cpp: X11 implementation of the drag & drop
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_dragdrop.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//--- VLC -------------------------------------------------------------------
#include <vlc/intf.h>
//--- SKIN ------------------------------------------------------------------
#include "../src/event.h"
#include "../os_api.h"
#include "x11_dragdrop.h"
//---------------------------------------------------------------------------
X11DropObject::X11DropObject( intf_thread_t *_p_intf )
{
p_intf = _p_intf;
}
//---------------------------------------------------------------------------
X11DropObject::~X11DropObject()
{
}
//---------------------------------------------------------------------------
#if 0
void X11DropObject::HandleDropStart( GdkDragContext *context )
{
/* GdkAtom atom = gdk_drag_get_selection( context );
guchar *buffer;
GdkAtom prop_type;
gint prop_format;
// Get the owner of the selection
GdkWindow *owner = gdk_selection_owner_get( atom );
// Find the possible targets for the selection
string target = "";
gdk_selection_convert( owner, atom, gdk_atom_intern("TARGETS", FALSE),
OSAPI_GetTime() );
int len = gdk_selection_property_get( owner, &buffer, &prop_type,
&prop_format );
for( int i = 0; i < len / sizeof(GdkAtom); i++ )
{
GdkAtom atom = ( (GdkAtom*)buffer )[i];
gchar *name = gdk_atom_name( atom );
if( name )
{
string curTarget = name;
if( (curTarget == "text/plain" || curTarget == "STRING") )
{
target = curTarget;
break;
}
}
}
if( target == "" )
{
msg_Warn( p_intf, "Drag&Drop: target not found\n" );
}
else
{
gdk_selection_convert( owner, atom, gdk_atom_intern(target.c_str(),
FALSE), OSAPI_GetTime() );
len = gdk_selection_property_get( owner, &buffer, &prop_type,
&prop_format);
OSAPI_PostMessage( NULL, VLC_DROP, (unsigned int)buffer, 0 );
}
*/
/* // Get number of files that are dropped into vlc
int NbFiles = DragQueryFile( (HDROP)HDrop, 0xFFFFFFFF, NULL, 0 );
// For each dropped files
for( int i = 0; i < NbFiles; i++ )
{
// Get the name of the file
int NameLength = DragQueryFile( (HDROP)HDrop, i, NULL, 0 ) + 1;
char *FileName = new char[NameLength];
DragQueryFile( (HDROP)HDrop, i, FileName, NameLength );
// The pointer must not be deleted here because it will be deleted
// in the VLC specific messages processing function
PostMessage( NULL, VLC_DROP, (WPARAM)FileName, 0 );
}
DragFinish( (HDROP)HDrop );
*/
// gdk_drop_finish( context, TRUE,OSAPI_GetTime() );
}
#endif
#endif
/*****************************************************************************
* x11_dragdrop.h: X11 implementation of the drag & drop
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_dragdrop.h,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifndef VLC_SKIN_X11_DRAGDROP
#define VLC_SKIN_X11_DRAGDROP
//--- X11 -----------------------------------------------------------------
#include <X11/Xlib.h>
//---------------------------------------------------------------------------
class X11DropObject
{
private:
intf_thread_t *p_intf;
public:
X11DropObject( intf_thread_t *_p_intf );
virtual ~X11DropObject();
// void HandleDropStart( GdkDragContext *context );
};
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_event.cpp: x11 implementation of the Event class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_event.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Emmanuel Puig <karibu@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//--- VLC -------------------------------------------------------------------
#include <vlc/intf.h>
//--- SKIN ------------------------------------------------------------------
#include "../os_api.h"
#include "../src/event.h"
#include "../os_event.h"
#include "../src/window.h"
#include "../os_window.h"
#include "../src/theme.h"
#include "../os_theme.h"
#include "../src/skin_common.h"
//---------------------------------------------------------------------------
// VLC Event
//---------------------------------------------------------------------------
X11Event::X11Event( intf_thread_t *p_intf, string Desc, string shortcut )
: Event( p_intf, Desc, shortcut )
{
Wnd = NULL;
}
//---------------------------------------------------------------------------
X11Event::X11Event( intf_thread_t *p_intf, Window wnd, unsigned int msg,
unsigned int par1, long par2 ) : Event( p_intf, msg, par1, par2 )
{
Wnd = wnd;
}
//---------------------------------------------------------------------------
X11Event::X11Event( intf_thread_t *p_intf, SkinWindow *win, unsigned int msg,
unsigned int par1, long par2 ) : Event( p_intf, msg, par1, par2 )
{
// gWnd = ( (X11Window *)win )->GetHandle();
}
//---------------------------------------------------------------------------
X11Event::~X11Event()
{
}
//---------------------------------------------------------------------------
bool X11Event::SendEvent()
{
/* if( Message != VLC_NOTHING )
{
// Find window matching with gwnd
list<SkinWindow *>::const_iterator win;
for( win = p_intf->p_sys->p_theme->WindowList.begin();
win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
{
// If it is the correct window
if( gWnd == ( (X11Window *)(*win) )->GetHandle() )
{
OSAPI_PostMessage( *win, Message, Param1, Param2 );
PostSynchroMessage();
return true;
}
}
OSAPI_PostMessage( NULL, Message, Param1, Param2 );
return true;
}
*/
return false;
}
//---------------------------------------------------------------------------
bool X11Event::IsEqual( Event *evt )
{
/* X11Event *GTKEvt = (X11Event *)evt;
return( GTKEvt->GetWindow() == gWnd && GTKEvt->GetMessage() == Message &&
GTKEvt->GetParam1() == Param1 && GTKEvt->GetParam2() == Param2 );*/
}
//---------------------------------------------------------------------------
void X11Event::CreateOSEvent( string para1, string para2, string para3 )
{
// Find Parameters
/* switch( Message )
{
case WINDOW_MOVE:
gWnd = GetWindowFromName( para1 );
break;
case WINDOW_CLOSE:
gWnd = GetWindowFromName( para1 );
break;
case WINDOW_OPEN:
gWnd = GetWindowFromName( para1 );
break;
}*/
}
//---------------------------------------------------------------------------
Window X11Event::GetWindowFromName( string name )
{
/* X11Window *win = (X11Window *)
p_intf->p_sys->p_theme->GetWindow( name );
if( win == NULL )
{
return NULL;
}
else
{
return win->GetHandle();
}*/
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_event.h: X11 implementation of the Event class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_event.h,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifndef VLC_SKIN_X11_EVENT
#define VLC_SKIN_X11_EVENT
//--- GENERAL ---------------------------------------------------------------
#include <string>
using namespace std;
//--- X11 ------------------------------------------------------------------
#include <X11/Xlib.h>
//---------------------------------------------------------------------------
struct intf_thread_t;
class SkinWindow;
//---------------------------------------------------------------------------
class X11Event : Event
{
private:
Window GetWindowFromName( string name );
Window Wnd;
public:
// Constructor
X11Event( intf_thread_t *p_intf, string Desc, string shortcut );
X11Event( intf_thread_t *p_intf, Window wnd, unsigned int msg,
unsigned int par1, long par2 );
X11Event( intf_thread_t *p_intf, SkinWindow *win, unsigned int msg,
unsigned int par1, long par2 );
// Destructor
virtual ~X11Event();
// Event sending
virtual bool SendEvent();
// General operations on events
virtual void CreateOSEvent( string para1, string para2, string para3 );
virtual bool IsEqual( Event *evt );
// Getters
Window GetWindow() { return Wnd; }
};
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_font.cpp: X11 implementation of the Font class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_font.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Emmanuel Puig <karibu@via.ecp.fr>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -----------------------------------------------------------------
#include <X11/Xlib.h>
//--- VLC -------------------------------------------------------------------
#include <vlc/intf.h>
//--- SKIN ------------------------------------------------------------------
#include "../src/graphics.h"
#include "../os_graphics.h"
#include "../src/font.h"
#include "../os_font.h"
//---------------------------------------------------------------------------
// Font object
//---------------------------------------------------------------------------
X11Font::X11Font( intf_thread_t *_p_intf, string fontname, int size,
int color, int weight, bool italic, bool underline )
: SkinFont( _p_intf, fontname, size, color, weight, italic, underline )
{
/* Context = gdk_pango_context_get();
Layout = pango_layout_new( Context );
// Text properties setting
FontDesc = pango_font_description_new();
pango_font_description_set_family( FontDesc, fontname.c_str() );
pango_font_description_set_size( FontDesc, size * PANGO_SCALE );
if( italic )
{
pango_font_description_set_style( FontDesc, PANGO_STYLE_ITALIC );
}
else
{
pango_font_description_set_style( FontDesc, PANGO_STYLE_NORMAL );
}
pango_font_description_set_weight( FontDesc, (PangoWeight)weight );
//pango_context_set_font_description( Context, FontDesc );
pango_layout_set_font_description( Layout, FontDesc );
// Set attributes
PangoAttrList *attrs = pango_attr_list_new();
// FIXME: doesn't work
if( underline )
{
pango_attr_list_insert( attrs,
pango_attr_underline_new( PANGO_UNDERLINE_SINGLE ) );
}
pango_layout_set_attributes( Layout, attrs );*/
}
//---------------------------------------------------------------------------
X11Font::~X11Font()
{
}
//---------------------------------------------------------------------------
void X11Font::AssignFont( Graphics *dest )
{
}
//---------------------------------------------------------------------------
void X11Font::GetSize( string text, int &w, int &h )
{
/* pango_layout_set_text( Layout, text.c_str(), text.length() );
pango_layout_get_pixel_size( Layout, &w, &h );*/
}
//---------------------------------------------------------------------------
void X11Font::GenericPrint( Graphics *dest, string text, int x, int y,
int w, int h, int align, int color )
{
/* // Set text
pango_layout_set_text( Layout, text.c_str(), -1 );
// Set size
pango_layout_set_width( Layout, -1 );
int real_w, real_h;
// Create buffer image
Graphics* cov = (Graphics *)new OSGraphics( w, h );
cov->CopyFrom( 0, 0, w, h, dest, x, y, SRC_COPY );
// Get handles
GdkDrawable *drawable = ( (X11Graphics *)cov )->GetImage();
GdkGC *gc = ( (X11Graphics *)cov )->GetGC();
// Set width of text
pango_layout_set_width( Layout, w * PANGO_SCALE );
// Set attributes
pango_layout_set_alignment( Layout, (PangoAlignment)align );
// Avoid transrency for black text
if( color == 0 ) color = 10;
gdk_rgb_gc_set_foreground( gc, color );
// Render text on buffer
gdk_draw_layout( drawable, gc, 0, 0, Layout );
// Copy buffer on dest graphics
dest->CopyFrom( x, y, w, h, cov, 0, 0, SRC_COPY );
// Free memory
delete (OSGraphics *)cov;*/
}
//---------------------------------------------------------------------------
void X11Font::Print( Graphics *dest, string text, int x, int y, int w,
int h, int align )
{
GenericPrint( dest, text, x, y, w, h, align, Color );
}
//---------------------------------------------------------------------------
void X11Font::PrintColor( Graphics *dest, string text, int x, int y, int w,
int h, int align, int color )
{
GenericPrint( dest, text, x, y, w, h, align, color );
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_font.h: X11 implementation of the Font class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_font.h,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifndef VLC_SKIN_X11_FONT
#define VLC_SKIN_X11_FONT
//--- GENERAL ---------------------------------------------------------------
#include <string>
using namespace std;
//--- X11 -----------------------------------------------------------------
#include <X11/Xlib.h>
//---------------------------------------------------------------------------
struct intf_thread_t;
class Graphics;
//---------------------------------------------------------------------------
class X11Font : SkinFont
{
private:
/* PangoContext *Context;
PangoLayout *Layout;
PangoFontDescription *FontDesc;*/
// Assign font to Device Context
virtual void AssignFont( Graphics *dest );
// Helper function
virtual void GenericPrint( Graphics *dest, string text, int x, int y,
int w, int h, int align, int color );
public:
// Constructor
X11Font( intf_thread_t *_p_intf, string fontname, int size, int color,
int weight, bool italic, bool underline );
// Destructor
virtual ~X11Font();
// Get size of text
virtual void GetSize( string text, int &w, int &h );
// Draw text with boundaries
virtual void Print( Graphics *dest, string text, int x, int y, int w,
int h, int align );
virtual void PrintColor( Graphics *dest, string text, int x, int y,
int w, int h, int align, int color );
};
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_graphics.cpp: X11 implementation of the Graphics and Region classes
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_graphics.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
* Emmanuel Puig <karibu@via.ecp.fr>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -----------------------------------------------------------------
#include <X11/Xlib.h>
//--- SKIN ------------------------------------------------------------------
#include "../src/graphics.h"
#include "../src/window.h"
#include "../os_window.h"
#include "x11_graphics.h"
#include <stdio.h>
#include <math.h>
//---------------------------------------------------------------------------
// X11 GRAPHICS
//---------------------------------------------------------------------------
X11Graphics::X11Graphics( int w, int h, SkinWindow *from ) : Graphics( w, h )
{
/* if( from != NULL )
{
GdkWindow *fromWnd = ( (X11Window *)from )->GetHandle();
Image = (GdkDrawable*) gdk_pixmap_new( fromWnd, w, h, -1 );
Gc = gdk_gc_new( ( GdkDrawable* )fromWnd );
}
else
{
// FIXME: 8 -> screen depth
Image = (GdkDrawable*) gdk_pixmap_new( NULL, w, h, 16 );
gdk_drawable_set_colormap( Image, gdk_colormap_get_system() );
Gc = gdk_gc_new( Image );
}
// Set the background color to black
gdk_draw_rectangle( Image, Gc, TRUE, 0, 0, w, h );*/
}
//---------------------------------------------------------------------------
X11Graphics::~X11Graphics()
{
/* g_object_unref( Gc );
g_object_unref( Image );*/
}
//---------------------------------------------------------------------------
void X11Graphics::CopyFrom( int dx, int dy, int dw, int dh, Graphics *Src,
int sx, int sy, int Flag )
{
/* gdk_draw_drawable( Image, Gc, (( X11Graphics* )Src )->GetImage(),
sx, sy, dx, dy, dw, dh );*/
}
//---------------------------------------------------------------------------
void X11Graphics::DrawRect( int x, int y, int w, int h, int color )
{
/* gdk_rgb_gc_set_foreground( Gc, color );
gdk_draw_rectangle( Image, Gc, TRUE, x, y, w, h);*/
}
//---------------------------------------------------------------------------
void X11Graphics::SetClipRegion( SkinRegion *rgn )
{
/* gdk_gc_set_clip_region( Gc, ( (X11Region *)rgn )->GetHandle() );*/
}
//---------------------------------------------------------------------------
void X11Graphics::ResetClipRegion()
{
/* GdkRectangle rect;
rect.x = 0;
rect.y = 0;
rect.width = Width;
rect.height = Height;
GdkRegion *rgn = gdk_region_rectangle( &rect );
gdk_gc_set_clip_region( Gc, rgn );
gdk_region_destroy( rgn );*/
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// X11 REGION
//---------------------------------------------------------------------------
X11Region::X11Region()
{
/* Rgn = gdk_region_new();*/
}
//---------------------------------------------------------------------------
X11Region::X11Region( int x, int y, int w, int h )
{
/* GdkRectangle rect;
rect.x = x;
rect.y = y;
rect.width = w;
rect.height = h;
Rgn = gdk_region_rectangle( &rect );*/
}
//---------------------------------------------------------------------------
X11Region::~X11Region()
{
/* gdk_region_destroy( Rgn );*/
}
//---------------------------------------------------------------------------
void X11Region::AddPoint( int x, int y )
{
AddRectangle( x, y, 1, 1 );
}
//---------------------------------------------------------------------------
void X11Region::AddRectangle( int x, int y, int w, int h )
{
/* GdkRectangle rect;
rect.x = x;
rect.y = y;
rect.width = w;
rect.height = h;
GdkRegion *Buffer = gdk_region_rectangle( &rect );
gdk_region_union( Rgn, Buffer );*/
}
//---------------------------------------------------------------------------
void X11Region::AddElipse( int x, int y, int w, int h )
{
/* GdkRegion *Buffer;
GdkRectangle rect;
rect.height = 1;
double ex, ey;
double a = w / 2;
double b = h / 2;
if( !a || !b )
return;
for( ey = 0; ey < h; ey++ )
{
// Calculate coords
ex = a * sqrt( 1 - ey * ey / ( b * b ) );
// Upper line
rect.x = (gint)( x + a - ex );
rect.y = (gint)( y + b - ey );
rect.width = (gint)( 2 * ex );
Buffer = gdk_region_rectangle( &rect );
gdk_region_union( Rgn, Buffer );
gdk_region_destroy( Buffer );
// Lower line
rect.y = (gint)( y + b + ey );
Buffer = gdk_region_rectangle( &rect );
gdk_region_union( Rgn, Buffer );
gdk_region_destroy( Buffer );
}*/
}
//---------------------------------------------------------------------------
void X11Region::Move( int x, int y )
{
/* gdk_region_offset( Rgn, x, y );*/
}
//---------------------------------------------------------------------------
bool X11Region::Hit( int x, int y )
{
/* return gdk_region_point_in( Rgn, x, y );*/
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_graphics.h: X11 implementation of the Graphics and Region classes
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_graphics.h,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifndef VLC_SKIN_X11_GRAPHICS
#define VLC_SKIN_X11_GRAPHICS
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
#include <X11/Xutil.h>
//---------------------------------------------------------------------------
class SkinRegion;
class SkinWindow;
//---------------------------------------------------------------------------
class X11Graphics : public Graphics
{
protected:
/* Drawable *Image;
GdkGC *Gc;*/
public:
// Constructor
X11Graphics( int w, int h, SkinWindow *from = NULL );
// Destructor
virtual ~X11Graphics();
// Drawing methods
virtual void CopyFrom( int dx, int dy, int dw, int dh, Graphics *Src,
int sx, int sy, int Flag );
//virtual void CopyTo( Graphics *Dest, int dx, int dy, int dw, int dh,
// int sx, int sy, int Flag );
virtual void DrawRect( int x, int y, int w, int h, int color );
// Clipping methods
virtual void SetClipRegion( SkinRegion *rgn );
virtual void ResetClipRegion();
// Specific X11 methods
/* GdkDrawable *GetImage() { return Image; };
GdkGC *GetGC() { return Gc; };*/
};
//---------------------------------------------------------------------------
class X11Region : public SkinRegion
{
private:
Region *Rgn;
public:
// Constructor
X11Region();
X11Region( int x, int y, int w, int h );
// Destructor
~X11Region();
// Modify region
virtual void AddPoint( int x, int y );
virtual void AddRectangle( int x, int y, int w, int h );
virtual void AddElipse( int x, int y, int w, int h );
virtual void Move( int x, int y );
virtual bool Hit( int x, int y );
// Specific X11 methods
Region *GetHandle() { return Rgn; };
};
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_run.cpp:
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_run.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//--- WWWINDOWS -------------------------------------------------------------
#include <wx/wx.h>
//--- VLC -------------------------------------------------------------------
#include <vlc/intf.h>
//--- SKIN ------------------------------------------------------------------
#include "../os_api.h"
#include "../src/event.h"
#include "../os_event.h"
#include "../src/banks.h"
#include "../src/window.h"
#include "../os_window.h"
#include "../src/theme.h"
#include "../os_theme.h"
#include "../src/skin_common.h"
#include "../src/vlcproc.h"
#include "../src/wxdialogs.h"
// include the icon graphic
#include "share/vlc32x32.xpm"
//---------------------------------------------------------------------------
class CallBackObjects
{
public:
VlcProc *Proc;
};
//---------------------------------------------------------------------------
// Specific method
//---------------------------------------------------------------------------
bool IsVLCEvent( unsigned int msg );
int SkinManage( intf_thread_t *p_intf );
//---------------------------------------------------------------------------
// Local classes declarations.
//---------------------------------------------------------------------------
class Instance: public wxApp
{
public:
Instance();
Instance( intf_thread_t *_p_intf, CallBackObjects *callback );
bool OnInit();
OpenDialog *open;
private:
intf_thread_t *p_intf;
CallBackObjects *callbackobj;
};
//---------------------------------------------------------------------------
// GTK2 interface
//---------------------------------------------------------------------------
/*void GTK2Proc( GdkEvent *event, gpointer data )
{
// Get objects from data
CallBackObjects *obj = (CallBackObjects *)data;
VlcProc *proc = obj->Proc;
// Get pointer to thread info
intf_thread_t *p_intf = proc->GetpIntf();
// Variables
unsigned int msg;
Event *evt;
list<SkinWindow *>::const_iterator win;
GdkWindow *gwnd = ((GdkEventAny *)event)->window;
// Create event to dispatch in windows
// Skin event
if( event->type == GDK_CLIENT_EVENT )
{
msg = ( (GdkEventClient *)event )->data.l[0];
evt = (Event *)new OSEvent( p_intf,
((GdkEventAny *)event)->window,
msg,
( (GdkEventClient *)event )->data.l[1],
( (GdkEventClient *)event )->data.l[2] );
}
// System event
else
{
msg = event->type;
evt = (Event *)new OSEvent( p_intf,
((GdkEventAny *)event)->window, msg, 0, (long)event );
}
// Process keyboard shortcuts
if( msg == GDK_KEY_PRESS )
{
int KeyModifier = 0;
// If key is ALT
if( ((GdkEventKey *)event)->state & GDK_MOD1_MASK )
{
KeyModifier = 1;
}
// If key is CTRL
else if( ((GdkEventKey *)event)->state & GDK_CONTROL_MASK )
{
KeyModifier = 2;
}
int key = ((GdkEventKey *)event)->keyval;
// Translate into lower case
if( key >= 'a' && key <= 'z' )
{
key -= ('a' - 'A');
}
if( KeyModifier > 0 )
p_intf->p_sys->p_theme->EvtBank->TestShortcut( key , KeyModifier );
}
// Send event
else if( IsVLCEvent( msg ) )
{
if( !proc->EventProc( evt ) )
{
wxExit();
return; // Exit VLC !
}
}
else if( gwnd == NULL )
{
for( win = p_intf->p_sys->p_theme->WindowList.begin();
win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
{
(*win)->ProcessEvent( evt );
}
}
else
{
// Find window matching with gwnd
for( win = p_intf->p_sys->p_theme->WindowList.begin();
win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
{
// If it is the correct window
if( gwnd == ( (GTK2Window *)(*win) )->GetHandle() )
{
// Send event and check if processed
if( (*win)->ProcessEvent( evt ) )
{
delete (OSEvent *)evt;
return;
}
else
{
break;
}
}
}
}
evt->DestructParameters();
delete (OSEvent *)evt;
// Check if vlc is closing
proc->IsClosing();
gtk_main_do_event( event )
}*/
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// REFRESH TIMER CALLBACK
//---------------------------------------------------------------------------
/*gboolean RefreshTimer( gpointer data )
{
intf_thread_t *p_intf = (intf_thread_t *)data;
SkinManage( p_intf );
return true;
}*/
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Implementation of Instance class
//---------------------------------------------------------------------------
Instance::Instance( )
{
}
Instance::Instance( intf_thread_t *_p_intf, CallBackObjects *callback )
{
// Initialization
p_intf = _p_intf;
callbackobj = callback;
}
IMPLEMENT_APP_NO_MAIN(Instance)
bool Instance::OnInit()
{
// Set event callback. Yes, it's a big hack ;)
// gdk_event_handler_set( GTK2Proc, (gpointer)callbackobj, NULL );
p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );
p_intf->p_sys->OpenDlg = new OpenDialog( p_intf, NULL, FILE_ACCESS );
p_intf->p_sys->MessagesDlg = new Messages( p_intf, NULL );
p_intf->p_sys->SoutDlg = new SoutDialog( p_intf, NULL );
p_intf->p_sys->PrefsDlg = new PrefsDialog( p_intf, NULL );
p_intf->p_sys->InfoDlg = new FileInfo( p_intf, NULL );
// Add timer
// g_timeout_add( 200, (GSourceFunc)RefreshTimer, (gpointer)p_intf );
return TRUE;
}
//---------------------------------------------------------------------------
// GTK2 interface
//---------------------------------------------------------------------------
void OSRun( intf_thread_t *p_intf )
{
static char *p_args[] = { "" };
// Create VLC event object processing
CallBackObjects *callbackobj = new CallBackObjects();
callbackobj->Proc = new VlcProc( p_intf );
/* wxTheApp = new Instance( p_intf, callbackobj );
wxEntry( 1, p_args );*/
Display *display = ((OSTheme *)p_intf->p_sys->p_theme)->GetDisplay();
// Main event loop
while( 1 )
{
XEvent *event;
XNextEvent( display, event );
fprintf(stderr,"event %d\n", event->type);
}
delete callbackobj;
}
//---------------------------------------------------------------------------
bool IsVLCEvent( unsigned int msg )
{
return( msg > VLC_MESSAGE && msg < VLC_WINDOW );
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_theme.cpp: X11 implementation of the Theme class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_theme.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//--- VLC -------------------------------------------------------------------
#include <vlc/intf.h>
//--- SKIN ------------------------------------------------------------------
#include "../os_api.h"
#include "../src/banks.h"
#include "../src/window.h"
#include "../os_window.h"
#include "../src/event.h"
#include "../os_event.h"
#include "../src/theme.h"
#include "../os_theme.h"
#include "../src/vlcproc.h"
#include "../src/skin_common.h"
//---------------------------------------------------------------------------
void SkinManage( intf_thread_t *p_intf );
//---------------------------------------------------------------------------
// THEME
//---------------------------------------------------------------------------
X11Theme::X11Theme( intf_thread_t *_p_intf ) : Theme( _p_intf )
{
//Initialize values
ParentWindow = 0;
display = p_intf->p_sys->display;
}
//---------------------------------------------------------------------------
X11Theme::~X11Theme()
{/*
// Unregister the window class if needed
WNDCLASS wndclass;
if( GetClassInfo( hinst, "SkinWindow", &wndclass ) )
{
UnregisterClass( "SkinWindow", hinst );
}
if( GetClassInfo( hinst, "ParentWindow", &wndclass ) )
{
UnregisterClass( "ParentWindow", hinst );
}
// Delete tray icon if exists
if( ShowInTray )
{
Shell_NotifyIcon( NIM_DELETE, &TrayIcon );
}
*/
// Destroy parent window
/* if( ParentWindow )
{
gdk_window_destroy( ParentWindow );
}*/
}
//---------------------------------------------------------------------------
void X11Theme::OnLoadTheme()
{
/* // The create menu
CreateSystemMenu();
*/
// Set the parent window attributes
/* GdkWindowAttr attr;
attr.title = "VLC Media Player";
attr.event_mask = GDK_ALL_EVENTS_MASK;
attr.x = 0;
attr.y = 0;
attr.width = 0;
attr.height = 0;
attr.window_type = GDK_WINDOW_TOPLEVEL;
attr.wclass = GDK_INPUT_ONLY;
attr.override_redirect = FALSE;
gint mask = GDK_WA_TITLE|GDK_WA_X|GDK_WA_Y|GDK_WA_NOREDIR;
// Create the parent window
ParentWindow = gdk_window_new( NULL, &attr, mask);
if( !ParentWindow )
{
msg_Err( p_intf, "gdk_window_new failed" );
return;
}*/
/* Window root = DefaultRootWindow( display );
ParentWindow = XCreateSimpleWindow( display, root, 0, 0, 100, 100, 0, 0, 0 );
XSelectInput( display, ParentWindow, ExposureMask|
KeyPressMask|KeyReleaseMask|ButtonPressMask|PointerMotionMask|
PointerMotionHintMask| EnterWindowMask|LeaveWindowMask);
XMapRaised( display, ParentWindow );
XFlush( display );*/
}
//---------------------------------------------------------------------------
void X11Theme::AddSystemMenu( string name, Event *event )
{/*
if( name == "SEPARATOR" )
{
AppendMenu( SysMenu, MF_SEPARATOR, 0, NULL );
}
else
{
AppendMenu( SysMenu, MF_STRING, (unsigned int)event,
(char *)name.c_str() );
}*/
}
//---------------------------------------------------------------------------
void X11Theme::ChangeClientWindowName( string name )
{/*
SetWindowText( ParentWindow, name.c_str() );*/
}
//---------------------------------------------------------------------------
void X11Theme::AddWindow( string name, int x, int y, bool visible,
int fadetime, int alpha, int movealpha, bool dragdrop )
{
/* GdkWindowAttr attr;
attr.title = (gchar *)name.c_str();
attr.event_mask = GDK_ALL_EVENTS_MASK;
attr.width = 0;
attr.height = 0;
attr.window_type = GDK_WINDOW_TOPLEVEL;
attr.wclass = GDK_INPUT_OUTPUT;
attr.override_redirect = FALSE;
gint mask = GDK_WA_NOREDIR;
// Create the window
GdkWindow *gwnd = gdk_window_new( NULL, &attr, mask );
if( !gwnd )
{
msg_Err( p_intf, "gdk_window_new failed" );
return;
}
gdk_window_set_decorations( gwnd, (GdkWMDecoration)0 );
gdk_window_show( gwnd );*/
Window root = DefaultRootWindow( display );
Window wnd = XCreateSimpleWindow( display, root, 0, 0, 200, 100, 0, 0, 0 );
XSelectInput( display, wnd, ExposureMask|
KeyPressMask|KeyReleaseMask|ButtonPressMask|PointerMotionMask|
PointerMotionHintMask| EnterWindowMask|LeaveWindowMask);
XMapRaised( display, wnd );
XFlush( display );
WindowList.push_back( (SkinWindow *)new OSWindow( p_intf, wnd, x, y, visible,
fadetime, alpha, movealpha, dragdrop, name ) ) ;
}
//---------------------------------------------------------------------------
void X11Theme::ChangeTray()
{/*
if( ShowInTray )
{
Shell_NotifyIcon( NIM_DELETE, &TrayIcon );
ShowInTray = false;
}
else
{
Shell_NotifyIcon( NIM_ADD, &TrayIcon );
ShowInTray = true;
}*/
}
//---------------------------------------------------------------------------
void X11Theme::ChangeTaskbar()
{/*
if( ShowInTaskbar )
{
ShowWindow( ParentWindow, SW_HIDE );
SetWindowLongPtr( ParentWindow, GWL_EXSTYLE,
WS_EX_LAYERED|WS_EX_TOOLWINDOW );
ShowWindow( ParentWindow, SW_SHOW );
ShowInTaskbar = false;
}
else
{
ShowWindow( ParentWindow, SW_HIDE );
SetWindowLongPtr( ParentWindow, GWL_EXSTYLE,
WS_EX_LAYERED|WS_EX_APPWINDOW );
ShowWindow( ParentWindow, SW_SHOW );
ShowInTaskbar = true;
}*/
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_theme.h: X11 implementation of the Theme class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_theme.h,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifndef VLC_SKIN_X11_THEME
#define VLC_SKIN_X11_THEME
//--- GENERAL ---------------------------------------------------------------
#include <string>
using namespace std;
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//---------------------------------------------------------------------------
struct intf_thread_t;
class SkinWindow;
class EventBank;
class BitmapBank;
class FontBank;
//---------------------------------------------------------------------------
class X11Theme : public Theme
{
protected:
// Handles
Display *display;
Window ParentWindow;
/*
// System tray icon
NOTIFYICONDATA TrayIcon;
HMENU SysMenu;
*/
public:
// Constructor
X11Theme( intf_thread_t *_p_intf );
virtual void OnLoadTheme();
// Destructor
virtual ~X11Theme();
// Specific methods
Display * GetDisplay() { return display; }
Window GetParentWindow() { return ParentWindow; }
// !!!
virtual void AddWindow( string name, int x, int y, bool visible,
int fadetime, int alpha, int movealpha, bool dragdrop );
virtual void ChangeClientWindowName( string name );
// Taskbar && system tray
virtual void AddSystemMenu( string name, Event *event );
virtual void ChangeTray();
virtual void ChangeTaskbar();
// HMENU GetSysMenu() { return SysMenu; }
};
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_window.cpp: X11 implementation of the Window class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_window.cpp,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef X11_SKINS
//--- GENERAL ---------------------------------------------------------------
//#include <math.h>
//--- VLC -------------------------------------------------------------------
#include <vlc/intf.h>
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//--- SKIN ------------------------------------------------------------------
#include "../os_api.h"
#include "../src/anchor.h"
#include "../controls/generic.h"
#include "../src/window.h"
#include "../os_window.h"
#include "../src/event.h"
#include "../os_event.h"
#include "../src/graphics.h"
#include "../os_graphics.h"
#include "../src/skin_common.h"
#include "../src/theme.h"
//---------------------------------------------------------------------------
// Skinable Window
//---------------------------------------------------------------------------
X11Window::X11Window( intf_thread_t *p_intf, Window wnd, int x, int y,
bool visible, int transition, int normalalpha, int movealpha,
bool dragdrop, string name )
: SkinWindow( p_intf, x, y, visible, transition, normalalpha, movealpha,
dragdrop )
{
// Set handles
Wnd = wnd;
// gc = gdk_gc_new( gwnd );
Name = name;
LButtonDown = false;
RButtonDown = false;
// Removing fading effect
Transition = 0;
/*
// Set position parameters
CursorPos = new POINT;
WindowPos = new POINT;
// Create Tool Tip Window
ToolTipWindow = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
hWnd, 0, GetModuleHandle( NULL ), 0);
// Create Tool Tip infos
ToolTipInfo.cbSize = sizeof(TOOLINFO);
ToolTipInfo.uFlags = TTF_SUBCLASS|TTF_IDISHWND;
ToolTipInfo.hwnd = hWnd;
ToolTipInfo.hinst = GetModuleHandle( NULL );
ToolTipInfo.uId = (unsigned int)hWnd;
ToolTipInfo.lpszText = NULL;
ToolTipInfo.rect.left = ToolTipInfo.rect.top = 0;
ToolTipInfo.rect.right = ToolTipInfo.rect.bottom = 0;
SendMessage( ToolTipWindow, TTM_ADDTOOL, 0,
(LPARAM)(LPTOOLINFO) &ToolTipInfo );
*/
if( DragDrop )
{
// register the listview as a drop target
DropObject = new X11DropObject( p_intf );
// gdk_window_register_dnd( gwnd );
}
// Create Tool Tip window
/* GdkWindowAttr attr;
attr.event_mask = GDK_ALL_EVENTS_MASK;
attr.width = 100;
attr.height = 100;
attr.window_type = GDK_WINDOW_CHILD;
attr.wclass = GDK_INPUT_OUTPUT;
gint mask = 0;
ToolTipWindow = gdk_window_new( gwnd, &attr, mask);*/
}
//---------------------------------------------------------------------------
X11Window::~X11Window()
{
/* delete CursorPos;
delete WindowPos;
if( hWnd != NULL )
{
DestroyWindow( hWnd );
}
if( ToolTipWindow != NULL )
{
DestroyWindow( ToolTipWindow );
}
if( DragDrop )
{
// Remove the listview from the list of drop targets
RevokeDragDrop( hWnd );
DropTarget->Release();
// Uninitialize the OLE library
OleUninitialize();
}*/
/* if( gWnd )
{
gdk_window_destroy( gWnd );
}*/
}
//---------------------------------------------------------------------------
void X11Window::OSShow( bool show )
{
if( show )
{
/* gdk_window_show( gWnd );
gdk_window_move( gWnd, Left, Top );*/
}
else
{
/* gdk_window_hide( gWnd );*/
}
}
//---------------------------------------------------------------------------
bool X11Window::ProcessOSEvent( Event *evt )
{
unsigned int msg = evt->GetMessage();
unsigned int p1 = evt->GetParam1();
int p2 = evt->GetParam2();
/*
switch( msg )
{
case GDK_EXPOSE:
RefreshFromImage( 0, 0, Width, Height );
return true;
case GDK_MOTION_NOTIFY:
if( LButtonDown )
MouseMove( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 1 );
else if( RButtonDown )
MouseMove( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 2 );
else
MouseMove( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 0 );
gdk_window_get_pointer( gWnd, 0, 0, 0 );
return true;
case GDK_BUTTON_PRESS:
// Raise all the windows
for( list<SkinWindow *>::const_iterator win =
p_intf->p_sys->p_theme->WindowList.begin();
win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
{
gdk_window_raise( ( (X11Window *)(*win) )->GetHandle() );
}
switch( ( (GdkEventButton *)p2 )->button )
{
case 1:
// Left button
LButtonDown = true;
MouseDown( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 1 );
break;
case 3:
// Right button
RButtonDown = true;
MouseDown( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 2 );
break;
default:
break;
}
return true;
case GDK_BUTTON_RELEASE:
switch( ( (GdkEventButton *)p2 )->button )
{
case 1:
// Left button
LButtonDown = false;
MouseUp( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 1 );
break;
case 3:
// Right button
RButtonDown = false;
MouseUp( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 2 );
break;
default:
break;
}
return true;
case GDK_LEAVE_NOTIFY:
OSAPI_PostMessage( this, WINDOW_LEAVE, 0, 0 );
return true;
case GDK_2BUTTON_PRESS:
MouseDblClick( (int)( (GdkEventButton *)p2 )->x,
(int)( (GdkEventButton *)p2 )->y, 1 );
return true;
case GDK_DROP_START:
DropObject->HandleDropStart( ( (GdkEventDND *)p2 )->context );
return true;
case GDK_SCROLL:
switch( ( (GdkEventScroll *)p2 )->direction )
{
case GDK_SCROLL_UP:
MouseScroll( ( (GdkEventScroll *)p2 )->x,
( (GdkEventScroll *)p2 )->y,
MOUSE_SCROLL_UP);
break;
case GDK_SCROLL_DOWN:
MouseScroll( ( (GdkEventScroll *)p2 )->x,
( (GdkEventScroll *)p2 )->y,
MOUSE_SCROLL_DOWN);
break;
}
return true;
default:
return false;
}*/
}
//---------------------------------------------------------------------------
void X11Window::SetTransparency( int Value )
{
/* if( Value > -1 )
Alpha = Value;
SetLayeredWindowAttributes( hWnd, 0, Alpha, LWA_ALPHA | LWA_COLORKEY );
UpdateWindow( hWnd );*/
}
//---------------------------------------------------------------------------
void X11Window::RefreshFromImage( int x, int y, int w, int h )
{
// Initialize painting
/* HDC DC = GetWindowDC( hWnd );
// Draw image on window
BitBlt( DC, x, y, w, h, ( (X11Graphics *)Image )->GetImageHandle(),
x, y, SRCCOPY );
// Release window device context
ReleaseDC( hWnd, DC );
*/
/* GdkDrawable *drawable = (( X11Graphics* )Image )->GetImage();
GdkImage *image = gdk_drawable_get_image( drawable, 0, 0, Width, Height );
gdk_draw_drawable( gWnd, gc, drawable, x, y, x, y, w, h );
// Mask for transparency
GdkRegion *region = gdk_region_new();
for( int line = 0; line < Height; line++ )
{
int start = 0, end = 0;
while( start < Width )
{
while( start < Width && gdk_image_get_pixel( image, start, line ) == 0 )
{
start++;
}
end = start;
while( end < Width && gdk_image_get_pixel( image, end, line ) != 0)
{
end++;
}
GdkRectangle rect;
rect.x = start;
rect.y = line;
rect.width = end - start + 1;
rect.height = 1;
GdkRegion *rectReg = gdk_region_rectangle( &rect );
gdk_region_union( region, rectReg );
gdk_region_destroy( rectReg );
start = end + 1;
}
}
gdk_window_shape_combine_region( gWnd, region, 0, 0 );
gdk_region_destroy( region );*/
}
//---------------------------------------------------------------------------
void X11Window::WindowManualMove()
{
// Get mouse cursor position
int x, y;
OSAPI_GetMousePos( x, y );
// Move window and chek for magnetism
p_intf->p_sys->p_theme->MoveSkinMagnet( this,
WindowX + x - CursorX, WindowY + y - CursorY );
}
//---------------------------------------------------------------------------
void X11Window::WindowManualMoveInit()
{
/* gdk_window_get_pointer( gdk_get_default_root_window(), &CursorX, &CursorY,
NULL );*/
WindowX = Left;
WindowY = Top;
}
//---------------------------------------------------------------------------
void X11Window::Move( int left, int top )
{
Left = left;
Top = top;
/* gdk_window_move( gWnd, left, top );*/
}
//---------------------------------------------------------------------------
void X11Window::Size( int width, int height )
{
Width = width;
Height = height;
/* gdk_window_resize( gWnd, width, height );*/
}
//---------------------------------------------------------------------------
void X11Window::ChangeToolTipText( string text )
{
/* if( text == "none" )
{
if( ToolTipText != "none" )
{
ToolTipText = "none";
ToolTipInfo.lpszText = NULL;
SendMessage( ToolTipWindow, TTM_ACTIVATE, 0 , 0 );
}
}
else
{
if( text != ToolTipText )
{
ToolTipText = text;
ToolTipInfo.lpszText = (char *)ToolTipText.c_str();
SendMessage( ToolTipWindow, TTM_ACTIVATE, 1 , 0 );
SendMessage( ToolTipWindow, TTM_UPDATETIPTEXT, 0,
(LPARAM)(LPTOOLINFO)&ToolTipInfo );
}
}
*/
}
//---------------------------------------------------------------------------
#endif
/*****************************************************************************
* x11_window.h: X11 implementation of the Window class
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: x11_window.h,v 1.1 2003/04/28 14:32:57 asmax Exp $
*
* Authors: Cyril Deguet <asmax@videolan.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifndef VLC_SKIN_X11_WIN
#define VLC_SKIN_X11_WIN
//--- X11 -------------------------------------------------------------------
#include <X11/Xlib.h>
//---------------------------------------------------------------------------
class Graphics;
class Event;
//---------------------------------------------------------------------------
class X11Window : public SkinWindow
{
private:
// General parameters
Window Wnd;
// GdkGC *gc;
int CursorX;
int CursorY;
int WindowX;
int WindowY;
string Name;
// Drag&Drop
X11DropObject *DropObject;
// Tooltip texts
Window ToolTipWindow;
// TOOLINFO ToolTipInfo;
// Left button down
bool LButtonDown;
bool RButtonDown;
public:
// Cosntructors
X11Window( intf_thread_t *_p_intf, Window wnd, int x, int y,
bool visible, int transition, int normalalpha, int movealpha,
bool dragdrop, string name );
// Destructors
virtual ~X11Window();
// Event processing
virtual bool ProcessOSEvent( Event *evt );
// Window graphic aspect
virtual void OSShow( bool show );
virtual void RefreshFromImage( int x, int y, int w, int h );
virtual void SetTransparency( int Value = -1 );
virtual void WindowManualMove();
virtual void WindowManualMoveInit();
// Window methods
virtual void Move( int left, int top );
virtual void Size( int width, int height );
// Specific gtk2 methods
Window GetHandle() { return Wnd; };
// Tooltip texts
virtual void ChangeToolTipText( string text );
// Getters
string GetName() { return Name; }
};
//---------------------------------------------------------------------------
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment