If you compile wxWindows on Unix for the first time and don't like
to read install instructions just do (in the base dir):
-./configure --with-gtk --with-shared --without-threads
+./configure --without-threads
make
-and drink 10 coffees.
+and drink 10 coffees. Then you may log in as root and type
+make install
+
+You can leave out the --without-threads option if you have a NEW
+Linux distribution based on glibc (e.g. RedHat 5.1) or any other
+Unix that comes with Posix threads or SGI threads.
+
+Now create your super-application myfoo.app and compile anywhere with
+
+gcc -o -c myfoo.cpp -I/usr/local/include -L/usr/local/lib -lwx_gtk
* General
-----------------------
* General options
-------------------
-Obviously, you have to choose a toolkit. You must do this by
-running configure with either of
+Normally, you won't have to choose a toolkit, because when
+you download wxGTK, it will default to --with-gtk etc. But
+if you use all of our CVS repository you have to choose a
+toolkit. You must do this by running configure with either of:
--with-gtk Use the GIMP ToolKit (GTK)
--without-threads Compile without thread support.
- --with-shared Create shared libraries.
+ --without-shared Do not create shared libraries.
--without-optimise Do not optimise the code.
-------------
The following must be done in the base directory (e.g. ~/wxGTK
-or ~/wxWin)
-
-First you have to create all makefiles in all subdirectories:
-
- make Makefiles
+or ~/wxWin or whatever)
Dependencies are generated automatically using
make depend
-(For some reason, this doesn't seem to work completely.)
+(For some reason, this doesn't seem to work.)
Now the makefiles are created you can compile everything is as simple
as typing:
make
-make yourself some coffee, as it will try to compile
-ALL the files in this distribution.
+make yourself some coffee, as it will try to compile ALL the
+files in this distribution.
if you want to be more selective:
make other will build the other samples
make user will build the files in the directory other
+Then you may install the library and it's header files under
+/usr/local/include/wx and /usr/local/lib respectively. You
+have to log in as root (i.e. run "su" and enter the root
+password) and type
+
+ make install
+
Depending on the configuration of some files, the libraries
and binaries will be placed in different directories.
The "global" binaries and libraries will be placed in:
* Creating a new Project
--------------------------
-I propose to put all contributed programs in the directory
-"~/wxWin/user", with a directory of its own.
+There are two ways to create your own project. The first creates
+a project within the source code directories of wxWindows: In this
+case I propose to put all contributed programs in the directory
+"/user", with a directory of its own.
This directory then should include the following files:
put ALL your source code along with all the other stuff you need for
your application in this directory (subdirectories are welcome).
+The other way uses the installed libraries and header files in
+/usr/local/include/wx and /usr/local/lib. In this case, just
+compile your program like this:
+
+gcc -o -c myfoo.cpp -I/usr/local/include -L/usr/local/lib -lwx_gtk
+
+
** Something about Makefiles
------------------------------
GdkPixmap *GetPixmap() const;
GdkBitmap *GetBitmap() const;
-
+
void DestroyImage();
void RecreateImage();
void Render();
void BeginDrawing(void) {};
void EndDrawing(void) {};
- virtual bool Ok(void) const { return m_ok; };
+ virtual bool Ok(void) const;
virtual void FloodFill( long x1, long y1, wxColour *col, int style=wxFLOOD_SURFACE ) = 0;
virtual bool GetPixel( long x1, long y1, wxColour *col ) const = 0;
GdkPixmap *GetPixmap() const;
GdkBitmap *GetBitmap() const;
-
+
void DestroyImage();
void RecreateImage();
void Render();
void BeginDrawing(void) {};
void EndDrawing(void) {};
- virtual bool Ok(void) const { return m_ok; };
+ virtual bool Ok(void) const;
virtual void FloodFill( long x1, long y1, wxColour *col, int style=wxFLOOD_SURFACE ) = 0;
virtual bool GetPixel( long x1, long y1, wxColour *col ) const = 0;
wxMenu *help_menu = new wxMenu;
file_menu->Append(PNGDEMO_LOAD_FILE, "&Load file", "Load file");
+ file_menu->Append(PNGDEMO_SAVE_FILE, "&Save file", "Save file");
file_menu->Append(PNGDEMO_QUIT, "E&xit", "Quit program");
help_menu->Append(PNGDEMO_ABOUT, "&About", "About PNG demo");
EVT_MENU(PNGDEMO_QUIT, MyFrame::OnQuit)
EVT_MENU(PNGDEMO_ABOUT, MyFrame::OnAbout)
EVT_MENU(PNGDEMO_LOAD_FILE, MyFrame::OnLoadFile)
+ EVT_MENU(PNGDEMO_SAVE_FILE, MyFrame::OnSaveFile)
END_EVENT_TABLE()
// Define my frame constructor
"About PNG Demo", wxOK);
}
+void MyFrame::OnSaveFile(wxCommandEvent& WXUNUSED(event))
+{
+ char *f = wxFileSelector( "Save Image", (const char *)NULL, (const char *)NULL,
+ "png", "PNG files (*.png)|*.png" );
+
+ if (!f) return;
+
+ wxBitmap *backstore = new wxBitmap( 150, 150 );
+
+ wxMemoryDC memDC;
+ memDC.SelectObject( *backstore );
+ memDC.Clear();
+ memDC.SetBrush( *wxBLACK_BRUSH );
+ memDC.SetPen( *wxWHITE_PEN );
+ memDC.DrawRectangle( 0, 0, 150, 150 );
+ memDC.SetPen( *wxBLACK_PEN );
+ memDC.DrawLine( 0, 0, 0, 10 );
+ memDC.SetTextForeground( *wxWHITE );
+ memDC.DrawText( "This is a memory dc.", 10, 10 );
+
+ memDC.SelectObject( wxNullBitmap );
+
+ backstore->SaveFile( f, wxBITMAP_TYPE_PNG, (wxPalette*)NULL );
+
+ delete backstore;
+}
+
void MyFrame::OnLoadFile(wxCommandEvent& WXUNUSED(event))
{
// Show file selector.
bool OnClose(void);
void OnActivate(bool) {}
void OnLoadFile(wxCommandEvent& event);
+ void OnSaveFile(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
#define PNGDEMO_QUIT 100
#define PNGDEMO_ABOUT 101
#define PNGDEMO_LOAD_FILE 102
+#define PNGDEMO_SAVE_FILE 103
#include "gdk/gdkprivate.h"
#ifdef USE_GDK_IMLIB
+
#include "../gdk_imlib/gdk_imlib.h"
+#include "gdk/gdkx.h" // GDK_DISPLAY
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
#endif
//-----------------------------------------------------------------------------
bool wxBitmap::Ok(void) const
{
- return m_refData != NULL;
+ wxASSERT_MSG( m_refData != NULL, "invalid bitmap" );
+ return (m_refData != NULL);
}
int wxBitmap::GetHeight(void) const
void wxBitmap::SetHeight( int height )
{
if (!Ok()) return;
+
+ wxFAIL_MSG( "wxBitmap::SetHeight not implemented" );
+
M_BMPDATA->m_height = height;
}
void wxBitmap::SetWidth( int width )
{
if (!Ok()) return;
+
+ wxFAIL_MSG( "wxBitmap::SetWidth not implemented" );
+
M_BMPDATA->m_width = width;
}
void wxBitmap::SetDepth( int depth )
{
if (!Ok()) return;
+
+ wxFAIL_MSG( "wxBitmap::SetDepth not implemented" );
+
M_BMPDATA->m_bpp = depth;
}
if (!Ok()) return;
if (M_BMPDATA->m_mask) delete M_BMPDATA->m_mask;
+
M_BMPDATA->m_mask = mask;
}
Render();
+#else
+
+ wxFAIL_MSG( "wxBitmap::Resize not implemented without GdkImlib" );
+
#endif
}
return gdk_imlib_save_image( M_BMPDATA->m_image, WXSTRINGCAST name, (GdkImlibSaveInfo *) NULL );
+#else
+
+ wxFAIL_MSG( "wxBitmap::SaveFile not implemented without GdkImlib" );
+
#endif
return FALSE;
M_BMPDATA->m_bpp = 24; // ?
return TRUE;
+
+#else
+
+ wxFAIL_MSG( "wxBitmap::LoadFile not implemented without GdkImlib" );
+
#endif
return FALSE;
GdkPixmap *wxBitmap::GetPixmap(void) const
{
if (!Ok()) return (GdkPixmap *) NULL;
+
+// if (!M_BMPDATA->m_image) RecreateImage();
+
return M_BMPDATA->m_pixmap;
}
void wxBitmap::RecreateImage(void)
{
+ if (!Ok()) return;
+
+#ifdef USE_GDK_IMLIB
+
+ DestroyImage();
+
+ wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
+
+ long size = (long)(M_BMPDATA->m_width)*(long)(M_BMPDATA->m_height)*(long)3;
+ unsigned char *data = new unsigned char[size];
+ for (long i = 0; i < size; i++) data[i] = 100;
+
+ GdkImage *image = gdk_image_get( M_BMPDATA->m_pixmap, 0, 0, M_BMPDATA->m_width, M_BMPDATA->m_height );
+
+ long pos = 0;
+ for (int j = 0; j < M_BMPDATA->m_height; j++)
+ {
+ for (int i = 0; i < M_BMPDATA->m_width; i++)
+ {
+ XColor xcol;
+ xcol.pixel = gdk_image_get_pixel( image, i, j );
+ Colormap cm = ((GdkColormapPrivate*)gdk_imlib_get_colormap())->xcolormap;
+ XQueryColor( gdk_display, cm, &xcol );
+
+ data[pos] = xcol.red;
+ data[pos+1] = xcol.green;
+ data[pos+2] = xcol.blue;
+ pos += 3;
+ }
+ }
+
+ wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
+
+ M_BMPDATA->m_image = gdk_imlib_create_image_from_data(
+ data, (unsigned char*)NULL, M_BMPDATA->m_width, M_BMPDATA->m_height );
+
+ delete[] data;
+
+ gdk_image_destroy( image );
+
+ Render();
+
+#else
+
+ wxFAIL_MSG( "wxBitmap::RecreateImage not implemented without GdkImlib" );
+
+#endif
}
void wxBitmap::Render(void)
#ifdef USE_GDK_IMLIB
+ if (!M_BMPDATA->m_image) RecreateImage();
+
+ if (M_BMPDATA->m_pixmap)
+ {
+ gdk_imlib_free_pixmap( M_BMPDATA->m_pixmap );
+ M_BMPDATA->m_pixmap = (GdkPixmap*) NULL;
+ }
+ if (M_BMPDATA->m_mask)
+ {
+ delete M_BMPDATA->m_mask;
+ M_BMPDATA->m_mask = (wxMask*) NULL;
+ }
+
gdk_imlib_render( M_BMPDATA->m_image, M_BMPDATA->m_image->rgb_width, M_BMPDATA->m_image->rgb_height );
M_BMPDATA->m_width = M_BMPDATA->m_image->rgb_width;
M_BMPDATA->m_height = M_BMPDATA->m_image->rgb_height;
M_BMPDATA->m_pixmap = gdk_imlib_move_image( M_BMPDATA->m_image );
+
+ wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "pixmap rendering failed" )
+
GdkBitmap *mask = gdk_imlib_move_mask( M_BMPDATA->m_image );
if (mask)
{
M_BMPDATA->m_mask->m_bitmap = mask;
}
+#else
+
+ wxFAIL_MSG( "wxBitmap::Render not implemented without GdkImlib" );
+
#endif
}
{
}
+bool wxDC::Ok(void) const
+{
+ wxASSERT_MSG( !ok, "invalid display context" );
+ return m_ok;
+}
+
void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), long WXUNUSED(y2),
double WXUNUSED(xc), double WXUNUSED(yc) )
{
void wxPaintDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1),
wxColour *WXUNUSED(col), int WXUNUSED(style) )
{
+ wxFAIL_MSG( "wxPaintDC::FloodFill not implemented" );
}
bool wxPaintDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNUSED(col) ) const
{
+ wxFAIL_MSG( "wxPaintDC::GetPixel not implemented" );
return FALSE;
}
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() != wxTRANSPARENT)
{
gdk_draw_line( m_window, m_penGC,
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() != wxTRANSPARENT)
{
int w = 0;
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx1 = XLOG2DEV(x1);
long yy1 = YLOG2DEV(y1);
long xx2 = XLOG2DEV(x2);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() != wxTRANSPARENT)
gdk_draw_point( m_window, m_penGC, XLOG2DEV(x), YLOG2DEV(y) );
}
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() == wxTRANSPARENT) return;
for (int i = 0; i < n-1; i++)
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() == wxTRANSPARENT) return;
wxNode *node = points->First();
}
}
-void wxPaintDC::DrawPolygon( int n, wxPoint points[],
- long xoffset, long yoffset, int WXUNUSED(fillStyle) )
- {
- if (!Ok()) return;
+void wxPaintDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) )
+{
+ if (!Ok()) return;
+
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (!n) return; // Nothing to draw
GdkPoint *gdkpoints = new GdkPoint[n+1];
int i;
delete[] gdkpoints;
}
-void wxPaintDC::DrawPolygon( wxList *lines, long xoffset,
- long yoffset, int WXUNUSED(fillStyle))
- {
+void wxPaintDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXUNUSED(fillStyle))
+{
+ if (!Ok()) return;
+
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
int n = lines->Number();
-
- if (!Ok()) return;
GdkPoint *gdkpoints = new GdkPoint[n];
wxNode *node = lines->First();
int cnt=0;
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
long xx = XLOG2DEV(x);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
if (!icon.Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
int xx = XLOG2DEV(x);
int yy = YLOG2DEV(y);
{
if (!Ok()) return FALSE;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
// CMB 20/5/98: add blitting of bitmaps
if (source->IsKindOf(CLASSINFO(wxMemoryDC)))
{
wxMemoryDC* srcDC = (wxMemoryDC*)source;
- GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
+ GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
if (bmap)
{
- gdk_draw_bitmap (
- m_window,
- m_textGC,
- bmap,
- source->DeviceToLogicalX(xsrc), source->DeviceToLogicalY(ysrc),
- XLOG2DEV(xdest), YLOG2DEV(ydest),
- source->DeviceToLogicalXRel(width), source->DeviceToLogicalYRel(height)
- );
+ gdk_draw_bitmap( m_window, m_textGC, bmap,
+ source->DeviceToLogicalX(xsrc),
+ source->DeviceToLogicalY(ysrc),
+ XLOG2DEV(xdest),
+ YLOG2DEV(ydest),
+ source->DeviceToLogicalXRel(width),
+ source->DeviceToLogicalYRel(height) );
return TRUE;
}
}
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
GdkFont *font = m_font.GetInternalFont( m_scaleY );
x = XLOG2DEV(x);
{
if (!Ok()) return;
-// DestroyClippingRegion();
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_isDrawable)
{
#include "wx/dcmemory.h"
+#ifdef USE_GDK_IMLIB
+#include "../gdk_imlib/gdk_imlib.h"
+#endif
+
//-----------------------------------------------------------------------------
// wxMemoryDC
//-----------------------------------------------------------------------------
wxMemoryDC::wxMemoryDC(void)
{
m_ok = FALSE;
+
+#ifdef USE_GDK_IMLIB
+ m_cmap = gdk_imlib_get_colormap();
+#else
m_cmap = gdk_colormap_get_system();
+#endif
}
wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
{
m_ok = FALSE;
+
+#ifdef USE_GDK_IMLIB
+ m_cmap = gdk_imlib_get_colormap();
+#else
m_cmap = gdk_colormap_get_system();
+#endif
}
wxMemoryDC::~wxMemoryDC(void)
}
//-----------------------------------------------------------------------------
-// wxMenu
+// "activate"
//-----------------------------------------------------------------------------
static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
if (!menu->IsEnabled(id)) return;
- wxCommandEvent event( wxEVENT_TYPE_MENU_COMMAND, id );
+ wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, id );
+ event.SetEventObject( menu );
+ event.SetInt(id );
+
+ if (menu->m_callback)
+ {
+ (void) (*(menu->m_callback)) (*menu, event);
+ return;
+ }
+
+ if (menu->GetEventHandler()->ProcessEvent(event)) return;
+
+ wxWindow *win = menu->GetInvokingWindow();
+ if (win) win->GetEventHandler()->ProcessEvent( event );
+}
+
+//-----------------------------------------------------------------------------
+// "select"
+//-----------------------------------------------------------------------------
+
+static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
+{
+ int id = menu->FindMenuIdByMenuItem(widget);
+
+ wxASSERT( id != -1 ); // should find it!
+
+ if (!menu->IsEnabled(id)) return;
+
+ wxCommandEvent event( wxEVT_MENU_HIGHLIGHT, id );
event.SetEventObject( menu );
event.SetInt(id );
if (win) win->GetEventHandler()->ProcessEvent( event );
}
+//-----------------------------------------------------------------------------
+// wxMenu
+//-----------------------------------------------------------------------------
+
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem,wxObject)
wxMenuItem::wxMenuItem()
GTK_SIGNAL_FUNC(gtk_menu_clicked_callback),
(gpointer*)this );
+ gtk_signal_connect( GTK_OBJECT(menuItem), "select",
+ GTK_SIGNAL_FUNC(gtk_menu_hilight_callback),
+ (gpointer*)this );
+
gtk_menu_append( GTK_MENU(m_menu), menuItem );
gtk_widget_show( menuItem );
m_items.Append( mitem );
#include "gdk/gdkprivate.h"
#ifdef USE_GDK_IMLIB
+
#include "../gdk_imlib/gdk_imlib.h"
+#include "gdk/gdkx.h" // GDK_DISPLAY
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
#endif
//-----------------------------------------------------------------------------
bool wxBitmap::Ok(void) const
{
- return m_refData != NULL;
+ wxASSERT_MSG( m_refData != NULL, "invalid bitmap" );
+ return (m_refData != NULL);
}
int wxBitmap::GetHeight(void) const
void wxBitmap::SetHeight( int height )
{
if (!Ok()) return;
+
+ wxFAIL_MSG( "wxBitmap::SetHeight not implemented" );
+
M_BMPDATA->m_height = height;
}
void wxBitmap::SetWidth( int width )
{
if (!Ok()) return;
+
+ wxFAIL_MSG( "wxBitmap::SetWidth not implemented" );
+
M_BMPDATA->m_width = width;
}
void wxBitmap::SetDepth( int depth )
{
if (!Ok()) return;
+
+ wxFAIL_MSG( "wxBitmap::SetDepth not implemented" );
+
M_BMPDATA->m_bpp = depth;
}
if (!Ok()) return;
if (M_BMPDATA->m_mask) delete M_BMPDATA->m_mask;
+
M_BMPDATA->m_mask = mask;
}
Render();
+#else
+
+ wxFAIL_MSG( "wxBitmap::Resize not implemented without GdkImlib" );
+
#endif
}
return gdk_imlib_save_image( M_BMPDATA->m_image, WXSTRINGCAST name, (GdkImlibSaveInfo *) NULL );
+#else
+
+ wxFAIL_MSG( "wxBitmap::SaveFile not implemented without GdkImlib" );
+
#endif
return FALSE;
M_BMPDATA->m_bpp = 24; // ?
return TRUE;
+
+#else
+
+ wxFAIL_MSG( "wxBitmap::LoadFile not implemented without GdkImlib" );
+
#endif
return FALSE;
GdkPixmap *wxBitmap::GetPixmap(void) const
{
if (!Ok()) return (GdkPixmap *) NULL;
+
+// if (!M_BMPDATA->m_image) RecreateImage();
+
return M_BMPDATA->m_pixmap;
}
void wxBitmap::RecreateImage(void)
{
+ if (!Ok()) return;
+
+#ifdef USE_GDK_IMLIB
+
+ DestroyImage();
+
+ wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
+
+ long size = (long)(M_BMPDATA->m_width)*(long)(M_BMPDATA->m_height)*(long)3;
+ unsigned char *data = new unsigned char[size];
+ for (long i = 0; i < size; i++) data[i] = 100;
+
+ GdkImage *image = gdk_image_get( M_BMPDATA->m_pixmap, 0, 0, M_BMPDATA->m_width, M_BMPDATA->m_height );
+
+ long pos = 0;
+ for (int j = 0; j < M_BMPDATA->m_height; j++)
+ {
+ for (int i = 0; i < M_BMPDATA->m_width; i++)
+ {
+ XColor xcol;
+ xcol.pixel = gdk_image_get_pixel( image, i, j );
+ Colormap cm = ((GdkColormapPrivate*)gdk_imlib_get_colormap())->xcolormap;
+ XQueryColor( gdk_display, cm, &xcol );
+
+ data[pos] = xcol.red;
+ data[pos+1] = xcol.green;
+ data[pos+2] = xcol.blue;
+ pos += 3;
+ }
+ }
+
+ wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
+
+ M_BMPDATA->m_image = gdk_imlib_create_image_from_data(
+ data, (unsigned char*)NULL, M_BMPDATA->m_width, M_BMPDATA->m_height );
+
+ delete[] data;
+
+ gdk_image_destroy( image );
+
+ Render();
+
+#else
+
+ wxFAIL_MSG( "wxBitmap::RecreateImage not implemented without GdkImlib" );
+
+#endif
}
void wxBitmap::Render(void)
#ifdef USE_GDK_IMLIB
+ if (!M_BMPDATA->m_image) RecreateImage();
+
+ if (M_BMPDATA->m_pixmap)
+ {
+ gdk_imlib_free_pixmap( M_BMPDATA->m_pixmap );
+ M_BMPDATA->m_pixmap = (GdkPixmap*) NULL;
+ }
+ if (M_BMPDATA->m_mask)
+ {
+ delete M_BMPDATA->m_mask;
+ M_BMPDATA->m_mask = (wxMask*) NULL;
+ }
+
gdk_imlib_render( M_BMPDATA->m_image, M_BMPDATA->m_image->rgb_width, M_BMPDATA->m_image->rgb_height );
M_BMPDATA->m_width = M_BMPDATA->m_image->rgb_width;
M_BMPDATA->m_height = M_BMPDATA->m_image->rgb_height;
M_BMPDATA->m_pixmap = gdk_imlib_move_image( M_BMPDATA->m_image );
+
+ wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "pixmap rendering failed" )
+
GdkBitmap *mask = gdk_imlib_move_mask( M_BMPDATA->m_image );
if (mask)
{
M_BMPDATA->m_mask->m_bitmap = mask;
}
+#else
+
+ wxFAIL_MSG( "wxBitmap::Render not implemented without GdkImlib" );
+
#endif
}
{
}
+bool wxDC::Ok(void) const
+{
+ wxASSERT_MSG( !ok, "invalid display context" );
+ return m_ok;
+}
+
void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), long WXUNUSED(y2),
double WXUNUSED(xc), double WXUNUSED(yc) )
{
void wxPaintDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1),
wxColour *WXUNUSED(col), int WXUNUSED(style) )
{
+ wxFAIL_MSG( "wxPaintDC::FloodFill not implemented" );
}
bool wxPaintDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNUSED(col) ) const
{
+ wxFAIL_MSG( "wxPaintDC::GetPixel not implemented" );
return FALSE;
}
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() != wxTRANSPARENT)
{
gdk_draw_line( m_window, m_penGC,
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() != wxTRANSPARENT)
{
int w = 0;
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx1 = XLOG2DEV(x1);
long yy1 = YLOG2DEV(y1);
long xx2 = XLOG2DEV(x2);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() != wxTRANSPARENT)
gdk_draw_point( m_window, m_penGC, XLOG2DEV(x), YLOG2DEV(y) );
}
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() == wxTRANSPARENT) return;
for (int i = 0; i < n-1; i++)
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (m_pen.GetStyle() == wxTRANSPARENT) return;
wxNode *node = points->First();
}
}
-void wxPaintDC::DrawPolygon( int n, wxPoint points[],
- long xoffset, long yoffset, int WXUNUSED(fillStyle) )
- {
- if (!Ok()) return;
+void wxPaintDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) )
+{
+ if (!Ok()) return;
+
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (!n) return; // Nothing to draw
GdkPoint *gdkpoints = new GdkPoint[n+1];
int i;
delete[] gdkpoints;
}
-void wxPaintDC::DrawPolygon( wxList *lines, long xoffset,
- long yoffset, int WXUNUSED(fillStyle))
- {
+void wxPaintDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXUNUSED(fillStyle))
+{
+ if (!Ok()) return;
+
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
int n = lines->Number();
-
- if (!Ok()) return;
GdkPoint *gdkpoints = new GdkPoint[n];
wxNode *node = lines->First();
int cnt=0;
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
long xx = XLOG2DEV(x);
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
if (!icon.Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
int xx = XLOG2DEV(x);
int yy = YLOG2DEV(y);
{
if (!Ok()) return FALSE;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
// CMB 20/5/98: add blitting of bitmaps
if (source->IsKindOf(CLASSINFO(wxMemoryDC)))
{
wxMemoryDC* srcDC = (wxMemoryDC*)source;
- GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
+ GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
if (bmap)
{
- gdk_draw_bitmap (
- m_window,
- m_textGC,
- bmap,
- source->DeviceToLogicalX(xsrc), source->DeviceToLogicalY(ysrc),
- XLOG2DEV(xdest), YLOG2DEV(ydest),
- source->DeviceToLogicalXRel(width), source->DeviceToLogicalYRel(height)
- );
+ gdk_draw_bitmap( m_window, m_textGC, bmap,
+ source->DeviceToLogicalX(xsrc),
+ source->DeviceToLogicalY(ysrc),
+ XLOG2DEV(xdest),
+ YLOG2DEV(ydest),
+ source->DeviceToLogicalXRel(width),
+ source->DeviceToLogicalYRel(height) );
return TRUE;
}
}
{
if (!Ok()) return;
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
+
GdkFont *font = m_font.GetInternalFont( m_scaleY );
x = XLOG2DEV(x);
{
if (!Ok()) return;
-// DestroyClippingRegion();
+ if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_isDrawable)
{
#include "wx/dcmemory.h"
+#ifdef USE_GDK_IMLIB
+#include "../gdk_imlib/gdk_imlib.h"
+#endif
+
//-----------------------------------------------------------------------------
// wxMemoryDC
//-----------------------------------------------------------------------------
wxMemoryDC::wxMemoryDC(void)
{
m_ok = FALSE;
+
+#ifdef USE_GDK_IMLIB
+ m_cmap = gdk_imlib_get_colormap();
+#else
m_cmap = gdk_colormap_get_system();
+#endif
}
wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
{
m_ok = FALSE;
+
+#ifdef USE_GDK_IMLIB
+ m_cmap = gdk_imlib_get_colormap();
+#else
m_cmap = gdk_colormap_get_system();
+#endif
}
wxMemoryDC::~wxMemoryDC(void)
}
//-----------------------------------------------------------------------------
-// wxMenu
+// "activate"
//-----------------------------------------------------------------------------
static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
if (!menu->IsEnabled(id)) return;
- wxCommandEvent event( wxEVENT_TYPE_MENU_COMMAND, id );
+ wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, id );
+ event.SetEventObject( menu );
+ event.SetInt(id );
+
+ if (menu->m_callback)
+ {
+ (void) (*(menu->m_callback)) (*menu, event);
+ return;
+ }
+
+ if (menu->GetEventHandler()->ProcessEvent(event)) return;
+
+ wxWindow *win = menu->GetInvokingWindow();
+ if (win) win->GetEventHandler()->ProcessEvent( event );
+}
+
+//-----------------------------------------------------------------------------
+// "select"
+//-----------------------------------------------------------------------------
+
+static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
+{
+ int id = menu->FindMenuIdByMenuItem(widget);
+
+ wxASSERT( id != -1 ); // should find it!
+
+ if (!menu->IsEnabled(id)) return;
+
+ wxCommandEvent event( wxEVT_MENU_HIGHLIGHT, id );
event.SetEventObject( menu );
event.SetInt(id );
if (win) win->GetEventHandler()->ProcessEvent( event );
}
+//-----------------------------------------------------------------------------
+// wxMenu
+//-----------------------------------------------------------------------------
+
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem,wxObject)
wxMenuItem::wxMenuItem()
GTK_SIGNAL_FUNC(gtk_menu_clicked_callback),
(gpointer*)this );
+ gtk_signal_connect( GTK_OBJECT(menuItem), "select",
+ GTK_SIGNAL_FUNC(gtk_menu_hilight_callback),
+ (gpointer*)this );
+
gtk_menu_append( GTK_MENU(m_menu), menuItem );
gtk_widget_show( menuItem );
m_items.Append( mitem );