Compare commits
11 Commits
jnance_str
...
DIE_GTKLAY
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad20a1de67 | ||
|
|
9966f3f1a8 | ||
|
|
6d93c5d47f | ||
|
|
8059e538b5 | ||
|
|
a45efc822e | ||
|
|
ed2fbcb18b | ||
|
|
1ba2a1ebb2 | ||
|
|
1d8185735b | ||
|
|
df70f9f698 | ||
|
|
b2d8e5ef55 | ||
|
|
70ef32cff9 |
File diff suppressed because it is too large
Load Diff
@@ -1,219 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
* ex: set tabstop=8 softtabstop=2 shiftwidth=2 expandtab:
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#ifndef nsFontMetricsGTK_h__
|
||||
#define nsFontMetricsGTK_h__
|
||||
|
||||
#include "nsDeviceContextGTK.h"
|
||||
#include "nsIFontMetrics.h"
|
||||
#include "nsIFontEnumerator.h"
|
||||
#include "nsFont.h"
|
||||
#include "nsString.h"
|
||||
#include "nsUnitConversion.h"
|
||||
#include "nsIDeviceContext.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsRenderingContextGTK.h"
|
||||
#include "nsICharRepresentable.h"
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
#undef FONT_HAS_GLYPH
|
||||
#define FONT_HAS_GLYPH(map, char) IS_REPRESENTABLE(map, char)
|
||||
|
||||
typedef struct nsFontCharSetInfo nsFontCharSetInfo;
|
||||
|
||||
typedef gint (*nsFontCharSetConverter)(nsFontCharSetInfo* aSelf,
|
||||
XFontStruct* aFont, const PRUnichar* aSrcBuf, PRInt32 aSrcLen,
|
||||
char* aDestBuf, PRInt32 aDestLen);
|
||||
|
||||
struct nsFontCharSet;
|
||||
struct nsFontFamily;
|
||||
struct nsFontNode;
|
||||
struct nsFontStretch;
|
||||
|
||||
class nsFontGTKUserDefined;
|
||||
class nsFontMetricsGTK;
|
||||
|
||||
class nsFontGTK
|
||||
{
|
||||
public:
|
||||
nsFontGTK();
|
||||
virtual ~nsFontGTK();
|
||||
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
|
||||
|
||||
void LoadFont(void);
|
||||
PRBool IsEmptyFont(GdkFont*);
|
||||
|
||||
inline int SupportsChar(PRUnichar aChar)
|
||||
{ return mFont && FONT_HAS_GLYPH(mMap, aChar); };
|
||||
|
||||
virtual GdkFont* GetGDKFont(void);
|
||||
virtual PRBool GetGDKFontIs10646(void);
|
||||
virtual gint GetWidth(const PRUnichar* aString, PRUint32 aLength) = 0;
|
||||
virtual gint DrawString(nsRenderingContextGTK* aContext,
|
||||
nsDrawingSurfaceGTK* aSurface, nscoord aX,
|
||||
nscoord aY, const PRUnichar* aString,
|
||||
PRUint32 aLength) = 0;
|
||||
#ifdef MOZ_MATHML
|
||||
// bounding metrics for a string
|
||||
// remember returned values are not in app units
|
||||
// - to emulate GetWidth () above
|
||||
virtual nsresult
|
||||
GetBoundingMetrics(const PRUnichar* aString,
|
||||
PRUint32 aLength,
|
||||
nsBoundingMetrics& aBoundingMetrics) = 0;
|
||||
#endif
|
||||
|
||||
PRUint32* mMap;
|
||||
nsFontCharSetInfo* mCharSetInfo;
|
||||
char* mName;
|
||||
nsFontGTKUserDefined* mUserDefinedFont;
|
||||
PRUint16 mSize;
|
||||
PRInt16 mBaselineAdjust;
|
||||
|
||||
protected:
|
||||
GdkFont* mFont;
|
||||
PRBool mAlreadyCalledLoadFont;
|
||||
};
|
||||
|
||||
class nsFontMetricsGTK : public nsIFontMetrics
|
||||
{
|
||||
public:
|
||||
nsFontMetricsGTK();
|
||||
virtual ~nsFontMetricsGTK();
|
||||
|
||||
NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Init(const nsFont& aFont, nsIAtom* aLangGroup,
|
||||
nsIDeviceContext* aContext);
|
||||
NS_IMETHOD Destroy();
|
||||
|
||||
NS_IMETHOD GetXHeight(nscoord& aResult);
|
||||
NS_IMETHOD GetSuperscriptOffset(nscoord& aResult);
|
||||
NS_IMETHOD GetSubscriptOffset(nscoord& aResult);
|
||||
NS_IMETHOD GetStrikeout(nscoord& aOffset, nscoord& aSize);
|
||||
NS_IMETHOD GetUnderline(nscoord& aOffset, nscoord& aSize);
|
||||
|
||||
NS_IMETHOD GetHeight(nscoord &aHeight);
|
||||
NS_IMETHOD GetNormalLineHeight(nscoord &aHeight);
|
||||
NS_IMETHOD GetLeading(nscoord &aLeading);
|
||||
NS_IMETHOD GetEmHeight(nscoord &aHeight);
|
||||
NS_IMETHOD GetEmAscent(nscoord &aAscent);
|
||||
NS_IMETHOD GetEmDescent(nscoord &aDescent);
|
||||
NS_IMETHOD GetMaxHeight(nscoord &aHeight);
|
||||
NS_IMETHOD GetMaxAscent(nscoord &aAscent);
|
||||
NS_IMETHOD GetMaxDescent(nscoord &aDescent);
|
||||
NS_IMETHOD GetMaxAdvance(nscoord &aAdvance);
|
||||
NS_IMETHOD GetFont(const nsFont *&aFont);
|
||||
NS_IMETHOD GetLangGroup(nsIAtom** aLangGroup);
|
||||
NS_IMETHOD GetFontHandle(nsFontHandle &aHandle);
|
||||
|
||||
virtual nsresult GetSpaceWidth(nscoord &aSpaceWidth);
|
||||
|
||||
nsFontGTK* FindFont(PRUnichar aChar);
|
||||
nsFontGTK* FindUserDefinedFont(PRUnichar aChar);
|
||||
nsFontGTK* FindStyleSheetSpecificFont(PRUnichar aChar);
|
||||
nsFontGTK* FindStyleSheetGenericFont(PRUnichar aChar);
|
||||
nsFontGTK* FindLangGroupPrefFont(nsIAtom* aLangGroup, PRUnichar aChar);
|
||||
nsFontGTK* FindLangGroupFont(nsIAtom* aLangGroup, PRUnichar aChar, nsCString* aName);
|
||||
nsFontGTK* FindAnyFont(PRUnichar aChar);
|
||||
nsFontGTK* FindSubstituteFont(PRUnichar aChar);
|
||||
|
||||
nsFontGTK* SearchNode(nsFontNode* aNode, PRUnichar aChar);
|
||||
nsFontGTK* TryAliases(nsCString* aName, PRUnichar aChar);
|
||||
nsFontGTK* TryFamily(nsCString* aName, PRUnichar aChar);
|
||||
nsFontGTK* TryNode(nsCString* aName, PRUnichar aChar);
|
||||
nsFontGTK* TryNodes(nsAWritableCString &aFFREName, PRUnichar aChar);
|
||||
nsFontGTK* TryLangGroup(nsIAtom* aLangGroup, nsCString* aName, PRUnichar aChar);
|
||||
|
||||
nsFontGTK* AddToLoadedFontsList(nsFontGTK* aFont);
|
||||
nsFontGTK* PickASizeAndLoad(nsFontStretch* aStretch,
|
||||
nsFontCharSetInfo* aCharSet,
|
||||
PRUnichar aChar,
|
||||
const char *aName);
|
||||
|
||||
static nsresult FamilyExists(const nsString& aFontName);
|
||||
|
||||
//friend struct nsFontGTK;
|
||||
|
||||
nsFontGTK **mLoadedFonts;
|
||||
PRUint16 mLoadedFontsAlloc;
|
||||
PRUint16 mLoadedFontsCount;
|
||||
|
||||
nsFontGTK *mSubstituteFont;
|
||||
|
||||
nsCStringArray mFonts;
|
||||
PRUint16 mFontsIndex;
|
||||
nsVoidArray mFontIsGeneric;
|
||||
|
||||
nsCAutoString mDefaultFont;
|
||||
nsCString *mGeneric;
|
||||
nsCOMPtr<nsIAtom> mLangGroup;
|
||||
nsCAutoString mUserDefined;
|
||||
|
||||
PRUint8 mTriedAllGenerics;
|
||||
PRUint8 mIsUserDefined;
|
||||
|
||||
protected:
|
||||
void RealizeFont();
|
||||
|
||||
nsIDeviceContext *mDeviceContext;
|
||||
nsFont *mFont;
|
||||
nsFontGTK *mWesternFont;
|
||||
|
||||
nscoord mLeading;
|
||||
nscoord mEmHeight;
|
||||
nscoord mEmAscent;
|
||||
nscoord mEmDescent;
|
||||
nscoord mMaxHeight;
|
||||
nscoord mMaxAscent;
|
||||
nscoord mMaxDescent;
|
||||
nscoord mMaxAdvance;
|
||||
nscoord mXHeight;
|
||||
nscoord mSuperscriptOffset;
|
||||
nscoord mSubscriptOffset;
|
||||
nscoord mStrikeoutSize;
|
||||
nscoord mStrikeoutOffset;
|
||||
nscoord mUnderlineSize;
|
||||
nscoord mUnderlineOffset;
|
||||
nscoord mSpaceWidth;
|
||||
|
||||
PRUint16 mPixelSize;
|
||||
PRUint8 mStretchIndex;
|
||||
PRUint8 mStyleIndex;
|
||||
nsFontCharSetConverter mDocConverterType;
|
||||
};
|
||||
|
||||
class nsFontEnumeratorGTK : public nsIFontEnumerator
|
||||
{
|
||||
public:
|
||||
nsFontEnumeratorGTK();
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIFONTENUMERATOR
|
||||
};
|
||||
|
||||
#endif
|
||||
345
mozilla/widget/src/gtk/gdksuperwin.c
Normal file
345
mozilla/widget/src/gtk/gdksuperwin.c
Normal file
@@ -0,0 +1,345 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "MPL"); you may not use this file except in
|
||||
* compliance with the MPL. You may obtain a copy of the MPL at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the MPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* MPL.
|
||||
*
|
||||
* The Initial Developers of this code under the MPL are Owen Taylor
|
||||
* <otaylor@redhat.com> and Christopher Blizzard <blizzard@redhat.com>.
|
||||
* Portions created by the Initial Developers are Copyright (C) 1999
|
||||
* Owen Taylor and Christopher Blizzard. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#include "gdksuperwin.h"
|
||||
|
||||
static void gdk_superwin_class_init(GdkSuperWinClass *klass);
|
||||
static void gdk_superwin_init(GdkSuperWin *superwin);
|
||||
|
||||
typedef struct _GdkSuperWinTranslate GdkSuperWinTranslate;
|
||||
|
||||
struct _GdkSuperWinTranslate
|
||||
{
|
||||
unsigned long serial;
|
||||
gint dx;
|
||||
gint dy;
|
||||
};
|
||||
|
||||
GtkType
|
||||
gdk_superwin_get_type(void)
|
||||
{
|
||||
static GtkType superwin_type = 0;
|
||||
|
||||
if (!superwin_type)
|
||||
{
|
||||
static const GtkTypeInfo superwin_info =
|
||||
{
|
||||
"GtkSuperWin",
|
||||
sizeof(GdkSuperWin),
|
||||
sizeof(GdkSuperWinClass),
|
||||
(GtkClassInitFunc) gdk_superwin_class_init,
|
||||
(GtkObjectInitFunc) gdk_superwin_init,
|
||||
/* reserved_1 */ NULL,
|
||||
/* reserved_2 */ NULL,
|
||||
(GtkClassInitFunc) NULL
|
||||
};
|
||||
|
||||
superwin_type = gtk_type_unique (gtk_object_get_type(), &superwin_info);
|
||||
}
|
||||
return superwin_type;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_superwin_class_init(GdkSuperWinClass *klass)
|
||||
{
|
||||
GtkObjectClass *object_class;
|
||||
|
||||
object_class = GTK_OBJECT_CLASS(klass);
|
||||
|
||||
/* XXX do we need a finalize in here to destroy the
|
||||
window? */
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_superwin_init(GdkSuperWin *superwin)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static GdkFilterReturn gdk_superwin_bin_filter (GdkXEvent *gdk_xevent,
|
||||
GdkEvent *event,
|
||||
gpointer data);
|
||||
static GdkFilterReturn gdk_superwin_shell_filter (GdkXEvent *gdk_xevent,
|
||||
GdkEvent *event,
|
||||
gpointer data);
|
||||
static void gdk_superwin_expose_area (GdkSuperWin *superwin,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height);
|
||||
static gboolean gravity_works;
|
||||
|
||||
GdkSuperWin *
|
||||
gdk_superwin_new (GdkWindow *parent_window,
|
||||
guint x,
|
||||
guint y,
|
||||
guint width,
|
||||
guint height)
|
||||
{
|
||||
GdkWindowAttr attributes;
|
||||
gint attributes_mask;
|
||||
GdkSuperWin *superwin = gtk_type_new(GDK_TYPE_SUPERWIN);
|
||||
|
||||
superwin->translate_queue = NULL;
|
||||
|
||||
superwin->shell_func = NULL;
|
||||
superwin->bin_func = NULL;
|
||||
superwin->func_data = NULL;
|
||||
superwin->notify = NULL;
|
||||
|
||||
/* Create the shell (clipping) window */
|
||||
attributes.window_type = GDK_WINDOW_CHILD;
|
||||
attributes.x = x;
|
||||
attributes.y = y;
|
||||
attributes.width = width;
|
||||
attributes.height = height;
|
||||
attributes.wclass = GDK_INPUT_OUTPUT;
|
||||
attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK;
|
||||
|
||||
attributes_mask = GDK_WA_X | GDK_WA_Y;
|
||||
|
||||
superwin->shell_window = gdk_window_new (parent_window,
|
||||
&attributes, attributes_mask);
|
||||
|
||||
/* Create the bin window for drawing */
|
||||
|
||||
attributes.x = 0;
|
||||
attributes.y = 0;
|
||||
attributes.event_mask = GDK_EXPOSURE_MASK;
|
||||
|
||||
superwin->bin_window = gdk_window_new (superwin->shell_window,
|
||||
&attributes, attributes_mask);
|
||||
gdk_window_show (superwin->bin_window);
|
||||
|
||||
gdk_window_add_filter (superwin->shell_window, gdk_superwin_shell_filter, superwin);
|
||||
gdk_window_add_filter (superwin->bin_window, gdk_superwin_bin_filter, superwin);
|
||||
|
||||
gravity_works = gdk_window_set_static_gravities (superwin->bin_window, TRUE);
|
||||
|
||||
return superwin;
|
||||
}
|
||||
|
||||
/* XXX this should really be part of the object... */
|
||||
/* XXX and it should chain up to the object's destructor */
|
||||
|
||||
void gdk_superwin_destroy(GdkSuperWin *superwin)
|
||||
{
|
||||
gdk_window_remove_filter(superwin->shell_window,
|
||||
gdk_superwin_shell_filter,
|
||||
superwin);
|
||||
gdk_window_remove_filter(superwin->bin_window,
|
||||
gdk_superwin_bin_filter,
|
||||
superwin);
|
||||
gdk_window_destroy(superwin->bin_window);
|
||||
gdk_window_destroy(superwin->shell_window);
|
||||
/* XXX this needs to free itself */
|
||||
}
|
||||
|
||||
void
|
||||
gdk_superwin_scroll (GdkSuperWin *superwin,
|
||||
gint dx,
|
||||
gint dy)
|
||||
{
|
||||
GdkSuperWinTranslate *translate;
|
||||
gint width, height;
|
||||
|
||||
gdk_window_get_size (superwin->shell_window, &width, &height);
|
||||
|
||||
if (dx > 0 || dy > 0)
|
||||
{
|
||||
translate = g_new (GdkSuperWinTranslate, 1);
|
||||
translate->dx = MAX (0, dx);
|
||||
translate->dy = MAX (0, dy);
|
||||
translate->serial = NextRequest (GDK_DISPLAY());
|
||||
superwin->translate_queue = g_list_append (superwin->translate_queue, translate);
|
||||
}
|
||||
|
||||
|
||||
gdk_window_move_resize (superwin->bin_window,
|
||||
MIN (0, -dx), MIN (0, -dy),
|
||||
width + ABS(dx), height + ABS(dy));
|
||||
|
||||
gdk_window_move (superwin->bin_window,
|
||||
MIN (0, -dx) + dx, MIN (0, -dy) + dy);
|
||||
|
||||
if (dx < 0 || dy < 0)
|
||||
{
|
||||
translate = g_new (GdkSuperWinTranslate, 1);
|
||||
translate->dx = MIN (0, dx);
|
||||
translate->dy = MIN (0, dy);
|
||||
translate->serial = NextRequest (GDK_DISPLAY());
|
||||
superwin->translate_queue = g_list_append (superwin->translate_queue, translate);
|
||||
}
|
||||
|
||||
gdk_window_move_resize (superwin->bin_window,
|
||||
0, 0, width, height);
|
||||
|
||||
if (dx < 0)
|
||||
gdk_superwin_expose_area (superwin,
|
||||
MAX (width + dx, 0), 0,
|
||||
MIN (-dx, width), height);
|
||||
else
|
||||
gdk_superwin_expose_area (superwin,
|
||||
0, 0,
|
||||
MIN (dx, width), height);
|
||||
|
||||
if (dy < 0)
|
||||
gdk_superwin_expose_area (superwin,
|
||||
MIN (dx, 0), MAX (height + dy, 0),
|
||||
MIN (width - ABS(dx), 0), MIN (-dy, height));
|
||||
else
|
||||
gdk_superwin_expose_area (superwin,
|
||||
MIN (dx, 0), 0,
|
||||
MIN (width - ABS(dx), 0), MIN (dy, height));
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
gdk_superwin_set_event_funcs (GdkSuperWin *superwin,
|
||||
GdkSuperWinFunc shell_func,
|
||||
GdkSuperWinFunc bin_func,
|
||||
gpointer func_data,
|
||||
GDestroyNotify notify)
|
||||
|
||||
{
|
||||
if (superwin->notify && superwin->func_data)
|
||||
superwin->notify (superwin->func_data);
|
||||
|
||||
superwin->shell_func = shell_func;
|
||||
superwin->bin_func = bin_func;
|
||||
superwin->func_data = func_data;
|
||||
superwin->notify = notify;
|
||||
|
||||
}
|
||||
|
||||
void gdk_superwin_resize (GdkSuperWin *superwin,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
gdk_window_resize (superwin->bin_window, width, height);
|
||||
gdk_window_resize (superwin->shell_window, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_superwin_expose_area (GdkSuperWin *superwin,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static GdkFilterReturn
|
||||
gdk_superwin_bin_filter (GdkXEvent *gdk_xevent,
|
||||
GdkEvent *event,
|
||||
gpointer data)
|
||||
{
|
||||
XEvent *xevent = (XEvent *)gdk_xevent;
|
||||
GdkSuperWin *superwin = data;
|
||||
GdkSuperWinTranslate *translate;
|
||||
GList *tmp_list;
|
||||
|
||||
switch (xevent->xany.type) {
|
||||
case Expose:
|
||||
tmp_list = superwin->translate_queue;
|
||||
while (tmp_list) {
|
||||
translate = tmp_list->data;
|
||||
|
||||
xevent->xexpose.x += translate->dx;
|
||||
xevent->xexpose.y += translate->dy;
|
||||
tmp_list = tmp_list->next;
|
||||
}
|
||||
|
||||
if (superwin->bin_func) {
|
||||
superwin->bin_func (superwin, xevent, superwin->func_data);
|
||||
}
|
||||
|
||||
return GDK_FILTER_REMOVE;
|
||||
break;
|
||||
|
||||
case ConfigureNotify:
|
||||
gdk_superwin_clear_translate_queue(superwin, xevent->xany.serial);
|
||||
break;
|
||||
}
|
||||
|
||||
return GDK_FILTER_CONTINUE;
|
||||
}
|
||||
|
||||
static GdkFilterReturn
|
||||
gdk_superwin_shell_filter (GdkXEvent *gdk_xevent,
|
||||
GdkEvent *event,
|
||||
gpointer data)
|
||||
{
|
||||
XEvent *xevent = (XEvent *)gdk_xevent;
|
||||
GdkSuperWin *superwin = data;
|
||||
|
||||
if (xevent->type == VisibilityNotify)
|
||||
{
|
||||
switch (xevent->xvisibility.state)
|
||||
{
|
||||
case VisibilityFullyObscured:
|
||||
superwin->visibility = GDK_VISIBILITY_FULLY_OBSCURED;
|
||||
break;
|
||||
|
||||
case VisibilityPartiallyObscured:
|
||||
superwin->visibility = GDK_VISIBILITY_PARTIAL;
|
||||
break;
|
||||
|
||||
case VisibilityUnobscured:
|
||||
superwin->visibility = GDK_VISIBILITY_UNOBSCURED;
|
||||
break;
|
||||
}
|
||||
|
||||
return GDK_FILTER_REMOVE;
|
||||
}
|
||||
|
||||
if (superwin->shell_func) {
|
||||
/* g_print("calling func %p with arg %p in win %p\n",
|
||||
superwin->event_func, superwin->func_data, superwin); */
|
||||
superwin->shell_func (superwin, xevent, superwin->func_data);
|
||||
}
|
||||
|
||||
return GDK_FILTER_CONTINUE;
|
||||
}
|
||||
|
||||
void
|
||||
gdk_superwin_clear_translate_queue(GdkSuperWin *superwin, unsigned long serial)
|
||||
{
|
||||
GdkSuperWinTranslate *translate;
|
||||
GList *tmp_list;
|
||||
GList *link_to_remove = NULL;
|
||||
|
||||
if (superwin->translate_queue) {
|
||||
tmp_list = superwin->translate_queue;
|
||||
while (tmp_list) {
|
||||
translate = tmp_list->data;
|
||||
if (serial == translate->serial) {
|
||||
g_free (tmp_list->data);
|
||||
superwin->translate_queue = g_list_remove_link (superwin->translate_queue, tmp_list);
|
||||
link_to_remove = tmp_list;
|
||||
}
|
||||
tmp_list = tmp_list->next;
|
||||
if (link_to_remove) {
|
||||
g_list_free_1(link_to_remove);
|
||||
link_to_remove = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
93
mozilla/widget/src/gtk/gdksuperwin.h
Normal file
93
mozilla/widget/src/gtk/gdksuperwin.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "MPL"); you may not use this file except in
|
||||
* compliance with the MPL. You may obtain a copy of the MPL at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the MPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* MPL.
|
||||
*
|
||||
* The Initial Developers of this code under the MPL are Owen Taylor
|
||||
* <otaylor@redhat.com> and Christopher Blizzard <blizzard@redhat.com>.
|
||||
* Portions created by the Initial Developers are Copyright (C) 1999
|
||||
* Owen Taylor and Christopher Blizzard. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_SUPERWIN_H__
|
||||
#define __GDK_SUPERWIN_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
#include <gtk/gtkobject.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef struct _GdkSuperWin GdkSuperWin;
|
||||
typedef struct _GdkSuperWinClass GdkSuperWinClass;
|
||||
|
||||
#define GDK_TYPE_SUPERWIN (gdk_superwin_get_type())
|
||||
#define GDK_SUPERWIN(obj) (GTK_CHECK_CAST((obj), GDK_TYPE_SUPERWIN, GdkSuperWin))
|
||||
#define GDK_SUPERWIN_CLASS(klass) (GTK_CHECK_CLASS_CAST((klass), GDK_TYPE_SUPERWIN, GdkSuperWinClass))
|
||||
#define GDK_IS_SUPERWIN(obj) (GTK_CHECK_TYPE((obj), GDK_TYPE_SUPERWIN))
|
||||
#define GDK_IS_SUPERWIN_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), GDK_TYPE_SUPERWIN))
|
||||
|
||||
typedef void (*GdkSuperWinFunc) (GdkSuperWin *super_win,
|
||||
XEvent *event,
|
||||
gpointer data);
|
||||
struct _GdkSuperWin
|
||||
{
|
||||
GtkObject object;
|
||||
GdkWindow *shell_window;
|
||||
GdkWindow *bin_window;
|
||||
|
||||
/* Private */
|
||||
GList *translate_queue;
|
||||
GdkSuperWinFunc shell_func;
|
||||
GdkSuperWinFunc bin_func;
|
||||
gpointer func_data;
|
||||
GDestroyNotify notify;
|
||||
|
||||
GdkVisibilityState visibility;
|
||||
};
|
||||
|
||||
struct _GdkSuperWinClass
|
||||
{
|
||||
GtkObjectClass object_class;
|
||||
};
|
||||
|
||||
GtkType gdk_superwin_get_type(void);
|
||||
|
||||
GdkSuperWin *gdk_superwin_new (GdkWindow *parent_window,
|
||||
guint x,
|
||||
guint y,
|
||||
guint width,
|
||||
guint height);
|
||||
|
||||
void
|
||||
gdk_superwin_set_event_funcs (GdkSuperWin *superwin,
|
||||
GdkSuperWinFunc shell_func,
|
||||
GdkSuperWinFunc bin_func,
|
||||
gpointer func_data,
|
||||
GDestroyNotify notify);
|
||||
|
||||
void gdk_superwin_scroll (GdkSuperWin *superwin,
|
||||
gint dx,
|
||||
gint dy);
|
||||
void gdk_superwin_resize (GdkSuperWin *superwin,
|
||||
gint width,
|
||||
gint height);
|
||||
void gdk_superwin_destroy(GdkSuperWin *superwin);
|
||||
void gdk_superwin_clear_translate_queue(GdkSuperWin *superwin,
|
||||
unsigned long serial);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _GDK_SUPERWIN_H__ */
|
||||
|
||||
110
mozilla/widget/src/gtk/gtkmozarea.c
Normal file
110
mozilla/widget/src/gtk/gtkmozarea.c
Normal file
@@ -0,0 +1,110 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "MPL"); you may not use this file except in
|
||||
* compliance with the MPL. You may obtain a copy of the MPL at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the MPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* MPL.
|
||||
*
|
||||
* The Initial Developers of this code under the MPL are Owen Taylor
|
||||
* <otaylor@redhat.com> and Christopher Blizzard <blizzard@redhat.com>.
|
||||
* Portions created by the Initial Developers are Copyright (C) 1999
|
||||
* Owen Taylor and Christopher Blizzard. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#include "gtkmozarea.h"
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
static void gtk_mozarea_class_init (GtkMozAreaClass *klass);
|
||||
static void gtk_mozarea_init (GtkMozArea *mozarea);
|
||||
static void gtk_mozarea_realize (GtkWidget *widget);
|
||||
static void gtk_mozarea_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
|
||||
|
||||
GtkType
|
||||
gtk_mozarea_get_type (void)
|
||||
{
|
||||
static GtkType mozarea_type = 0;
|
||||
|
||||
if (!mozarea_type)
|
||||
{
|
||||
static const GtkTypeInfo mozarea_info =
|
||||
{
|
||||
"GtkMozArea",
|
||||
sizeof (GtkMozArea),
|
||||
sizeof (GtkMozAreaClass),
|
||||
(GtkClassInitFunc) gtk_mozarea_class_init,
|
||||
(GtkObjectInitFunc) gtk_mozarea_init,
|
||||
/* reserved_1 */ NULL,
|
||||
/* reserved_2 */ NULL,
|
||||
(GtkClassInitFunc) NULL
|
||||
};
|
||||
|
||||
mozarea_type = gtk_type_unique (GTK_TYPE_WIDGET, &mozarea_info);
|
||||
}
|
||||
|
||||
return mozarea_type;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mozarea_class_init (GtkMozAreaClass *klass)
|
||||
{
|
||||
GtkWidgetClass *widget_class;
|
||||
|
||||
widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
widget_class->realize = gtk_mozarea_realize;
|
||||
widget_class->size_allocate = gtk_mozarea_size_allocate;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mozarea_init (GtkMozArea *mozarea)
|
||||
{
|
||||
mozarea->superwin = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mozarea_realize (GtkWidget *widget)
|
||||
{
|
||||
GtkMozArea *mozarea;
|
||||
|
||||
g_return_if_fail (GTK_IS_MOZAREA (widget));
|
||||
|
||||
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
|
||||
|
||||
mozarea = GTK_MOZAREA (widget);
|
||||
|
||||
mozarea->superwin = gdk_superwin_new (gtk_widget_get_parent_window (widget),
|
||||
widget->allocation.x, widget->allocation.y,
|
||||
widget->allocation.width, widget->allocation.height);
|
||||
gdk_window_set_user_data (mozarea->superwin->shell_window, mozarea);
|
||||
widget->window = mozarea->superwin->shell_window;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mozarea_size_allocate (GtkWidget *widget,
|
||||
GtkAllocation *allocation)
|
||||
{
|
||||
GtkMozArea *mozarea;
|
||||
|
||||
g_return_if_fail (GTK_IS_MOZAREA (widget));
|
||||
|
||||
mozarea = GTK_MOZAREA (widget);
|
||||
|
||||
if (GTK_WIDGET_REALIZED (widget))
|
||||
{
|
||||
gdk_window_move (mozarea->superwin->shell_window,
|
||||
allocation->x, allocation->y);
|
||||
gdk_superwin_resize (mozarea->superwin,
|
||||
allocation->width, allocation->height);
|
||||
}
|
||||
}
|
||||
|
||||
GtkWidget*
|
||||
gtk_mozarea_new (GdkWindow *parent_window)
|
||||
{
|
||||
return GTK_WIDGET (gtk_type_new (GTK_TYPE_MOZAREA));
|
||||
}
|
||||
56
mozilla/widget/src/gtk/gtkmozarea.h
Normal file
56
mozilla/widget/src/gtk/gtkmozarea.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "MPL"); you may not use this file except in
|
||||
* compliance with the MPL. You may obtain a copy of the MPL at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the MPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* MPL.
|
||||
*
|
||||
* The Initial Developers of this code under the MPL are Owen Taylor
|
||||
* <otaylor@redhat.com> and Christopher Blizzard <blizzard@redhat.com>.
|
||||
* Portions created by the Initial Developers are Copyright (C) 1999
|
||||
* Owen Taylor and Christopher Blizzard. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_MOZAREA_H__
|
||||
#define __GTK_MOZAREA_H__
|
||||
|
||||
#include <gtk/gtkwindow.h>
|
||||
#include "gdksuperwin.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef struct _GtkMozArea GtkMozArea;
|
||||
typedef struct _GtkMozAreaClass GtkMozAreaClass;
|
||||
|
||||
#define GTK_TYPE_MOZAREA (gtk_mozarea_get_type ())
|
||||
#define GTK_MOZAREA(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_MOZAREA, GtkMozArea))
|
||||
#define GTK_MOZAREA_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_MOZAREA, GtkMozAreaClass))
|
||||
#define GTK_IS_MOZAREA(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_MOZAREA))
|
||||
#define GTK_IS_MOZAREA_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_MOZAREA))
|
||||
|
||||
struct _GtkMozArea
|
||||
{
|
||||
GtkWidget widget;
|
||||
GdkSuperWin *superwin;
|
||||
};
|
||||
|
||||
struct _GtkMozAreaClass
|
||||
{
|
||||
GtkWindowClass window_class;
|
||||
};
|
||||
|
||||
GtkType gtk_mozarea_get_type (void);
|
||||
GtkWidget *gtk_mozarea_new ();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __GTK_MOZAREA_H__ */
|
||||
155
mozilla/widget/src/gtk/gtkmozbox.c
Normal file
155
mozilla/widget/src/gtk/gtkmozbox.c
Normal file
@@ -0,0 +1,155 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "MPL"); you may not use this file except in
|
||||
* compliance with the MPL. You may obtain a copy of the MPL at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the MPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* MPL.
|
||||
*
|
||||
* The Initial Developers of this code under the MPL are Owen Taylor
|
||||
* <otaylor@redhat.com> and Christopher Blizzard <blizzard@redhat.com>.
|
||||
* Portions created by the Initial Developers are Copyright (C) 1999
|
||||
* Owen Taylor and Christopher Blizzard. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#include "gtkmozbox.h"
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
static void gtk_mozbox_class_init (GtkMozBoxClass *klass);
|
||||
static void gtk_mozbox_init (GtkMozBox *mozbox);
|
||||
static void gtk_mozbox_realize (GtkWidget *widget);
|
||||
static GdkFilterReturn gtk_mozbox_filter (GdkXEvent *xevent,
|
||||
GdkEvent *event,
|
||||
gpointer data);
|
||||
|
||||
GtkType
|
||||
gtk_mozbox_get_type (void)
|
||||
{
|
||||
static GtkType mozbox_type = 0;
|
||||
|
||||
if (!mozbox_type)
|
||||
{
|
||||
static const GtkTypeInfo mozbox_info =
|
||||
{
|
||||
"GtkMozBox",
|
||||
sizeof (GtkMozBox),
|
||||
sizeof (GtkMozBoxClass),
|
||||
(GtkClassInitFunc) gtk_mozbox_class_init,
|
||||
(GtkObjectInitFunc) gtk_mozbox_init,
|
||||
/* reserved_1 */ NULL,
|
||||
/* reserved_2 */ NULL,
|
||||
(GtkClassInitFunc) NULL
|
||||
};
|
||||
|
||||
mozbox_type = gtk_type_unique (GTK_TYPE_WINDOW, &mozbox_info);
|
||||
}
|
||||
|
||||
return mozbox_type;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mozbox_class_init (GtkMozBoxClass *klass)
|
||||
{
|
||||
GtkWidgetClass *widget_class;
|
||||
|
||||
widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
widget_class->realize = gtk_mozbox_realize;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mozbox_init (GtkMozBox *mozbox)
|
||||
{
|
||||
mozbox->parent_window = NULL;
|
||||
mozbox->x = 0;
|
||||
mozbox->y = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mozbox_realize (GtkWidget *widget)
|
||||
{
|
||||
GdkWindowAttr attributes;
|
||||
gint attributes_mask;
|
||||
GtkMozBox *mozbox;
|
||||
|
||||
g_return_if_fail (GTK_IS_MOZBOX (widget));
|
||||
|
||||
mozbox = GTK_MOZBOX (widget);
|
||||
|
||||
/* GtkWindow checks against premature realization here. Just
|
||||
* don't do it.
|
||||
*/
|
||||
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
|
||||
|
||||
attributes.window_type = GDK_WINDOW_CHILD;
|
||||
attributes.x = mozbox->x;
|
||||
attributes.y = mozbox->y;
|
||||
attributes.width = widget->allocation.width;
|
||||
attributes.height = widget->allocation.height;
|
||||
attributes.wclass = GDK_INPUT_OUTPUT;
|
||||
attributes.visual = gtk_widget_get_visual (widget);
|
||||
attributes.colormap = gtk_widget_get_colormap (widget);
|
||||
attributes.event_mask = gtk_widget_get_events (widget);
|
||||
attributes.event_mask |= GDK_EXPOSURE_MASK;
|
||||
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
|
||||
|
||||
widget->window = gdk_window_new (mozbox->parent_window,
|
||||
&attributes, attributes_mask);
|
||||
gdk_window_set_user_data (widget->window, mozbox);
|
||||
|
||||
widget->style = gtk_style_attach (widget->style, widget->window);
|
||||
gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
|
||||
|
||||
gdk_window_add_filter (widget->window, gtk_mozbox_filter, mozbox);
|
||||
}
|
||||
|
||||
static GdkFilterReturn
|
||||
gtk_mozbox_filter (GdkXEvent *xevent,
|
||||
GdkEvent *event,
|
||||
gpointer data)
|
||||
{
|
||||
XEvent *xev = xevent;
|
||||
GtkWidget *widget = data;
|
||||
|
||||
switch (xev->xany.type)
|
||||
{
|
||||
case ConfigureNotify:
|
||||
event->configure.type = GDK_CONFIGURE;
|
||||
event->configure.window = widget->window;
|
||||
event->configure.x = 0;
|
||||
event->configure.y = 0;
|
||||
event->configure.width = xev->xconfigure.width;
|
||||
event->configure.height = xev->xconfigure.height;
|
||||
return GDK_FILTER_TRANSLATE;
|
||||
default:
|
||||
return GDK_FILTER_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
GtkWidget*
|
||||
gtk_mozbox_new (GdkWindow *parent_window)
|
||||
{
|
||||
GtkMozBox *mozbox;
|
||||
|
||||
mozbox = gtk_type_new (GTK_TYPE_MOZBOX);
|
||||
mozbox->parent_window = parent_window;
|
||||
|
||||
return GTK_WIDGET (mozbox);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_mozbox_set_position (GtkMozBox *mozbox,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
mozbox->x = x;
|
||||
mozbox->y = y;
|
||||
|
||||
if (GTK_WIDGET_REALIZED (mozbox))
|
||||
gdk_window_move (GTK_WIDGET (mozbox)->window, x, y);
|
||||
}
|
||||
|
||||
60
mozilla/widget/src/gtk/gtkmozbox.h
Normal file
60
mozilla/widget/src/gtk/gtkmozbox.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "MPL"); you may not use this file except in
|
||||
* compliance with the MPL. You may obtain a copy of the MPL at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the MPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* MPL.
|
||||
*
|
||||
* The Initial Developers of this code under the MPL are Owen Taylor
|
||||
* <otaylor@redhat.com> and Christopher Blizzard <blizzard@redhat.com>.
|
||||
* Portions created by the Initial Developers are Copyright (C) 1999
|
||||
* Owen Taylor and Christopher Blizzard. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_MOZBOX_H__
|
||||
#define __GTK_MOZBOX_H__
|
||||
|
||||
#include <gtk/gtkwindow.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef struct _GtkMozBox GtkMozBox;
|
||||
typedef struct _GtkMozBoxClass GtkMozBoxClass;
|
||||
|
||||
#define GTK_TYPE_MOZBOX (gtk_mozbox_get_type ())
|
||||
#define GTK_MOZBOX(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_MOZBOX, GtkMozBox))
|
||||
#define GTK_MOZBOX_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_MOZBOX, GtkMozBoxClass))
|
||||
#define GTK_IS_MOZBOX(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_MOZBOX))
|
||||
#define GTK_IS_MOZBOX_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_MOZBOX))
|
||||
|
||||
struct _GtkMozBox
|
||||
{
|
||||
GtkWindow window;
|
||||
GdkWindow *parent_window;
|
||||
gint x;
|
||||
gint y;
|
||||
};
|
||||
|
||||
struct _GtkMozBoxClass
|
||||
{
|
||||
GtkWindowClass window_class;
|
||||
};
|
||||
|
||||
GtkType gtk_mozbox_get_type (void);
|
||||
GtkWidget *gtk_mozbox_new (GdkWindow *parent_window);
|
||||
void gtk_mozbox_set_position (GtkMozBox *mozbox,
|
||||
gint x,
|
||||
gint y);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __GTK_MOZBOX_H__ */
|
||||
@@ -1,134 +0,0 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = xpcom
|
||||
XPIDL_MODULE = xpcom_ds
|
||||
LIBRARY_NAME = xpcomds_s
|
||||
REQUIRES = unicharutil string
|
||||
|
||||
CSRCS = \
|
||||
pldhash.c \
|
||||
plvector.c \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
nsArena.cpp \
|
||||
nsAtomTable.cpp \
|
||||
nsAtomService.cpp \
|
||||
nsAVLTree.cpp \
|
||||
nsByteBuffer.cpp \
|
||||
nsCRT.cpp \
|
||||
nsConjoiningEnumerator.cpp \
|
||||
nsDeque.cpp \
|
||||
nsEmptyEnumerator.cpp \
|
||||
nsEnumeratorUtils.cpp \
|
||||
nsFixedSizeAllocator.cpp \
|
||||
nsHashtable.cpp \
|
||||
nsHashtableEnumerator.cpp \
|
||||
nsObserver.cpp \
|
||||
nsObserverList.cpp \
|
||||
nsObserverService.cpp \
|
||||
nsProperties.cpp \
|
||||
nsPersistentProperties.cpp \
|
||||
nsQuickSort.cpp \
|
||||
nsSizeOfHandler.cpp \
|
||||
nsStaticNameTable.cpp \
|
||||
nsStatistics.cpp \
|
||||
nsStringMap.cpp \
|
||||
nsSupportsArray.cpp \
|
||||
nsSupportsArrayEnumerator.cpp \
|
||||
nsSupportsPrimitives.cpp \
|
||||
nsUnicharBuffer.cpp \
|
||||
nsVoidArray.cpp \
|
||||
nsVoidBTree.cpp \
|
||||
nsTextFormatter.cpp \
|
||||
nsTimelineService.cpp \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS = \
|
||||
nsAVLTree.h \
|
||||
nsAtomService.h \
|
||||
nsCppSharedAllocator.h \
|
||||
nsCRT.h \
|
||||
nsDeque.h \
|
||||
nsEnumeratorUtils.h \
|
||||
nsFixedSizeAllocator.h \
|
||||
nsHashtable.h \
|
||||
nsHashtableEnumerator.h \
|
||||
nsIArena.h \
|
||||
nsIByteBuffer.h \
|
||||
nsIObserverList.h \
|
||||
nsISimpleEnumerator.h \
|
||||
nsISizeOfHandler.h \
|
||||
nsIUnicharBuffer.h \
|
||||
nsInt64.h \
|
||||
nsQuickSort.h \
|
||||
nsStaticNameTable.h \
|
||||
nsStatistics.h \
|
||||
nsStringMap.h \
|
||||
nsSupportsArray.h \
|
||||
nsSupportsPrimitives.h \
|
||||
nsTime.h \
|
||||
nsUnitConversion.h \
|
||||
nsVector.h \
|
||||
nsVoidArray.h \
|
||||
nsVoidBTree.h \
|
||||
pldhash.h \
|
||||
plvector.h \
|
||||
nsTextFormatter.h \
|
||||
$(NULL)
|
||||
|
||||
XPIDLSRCS = \
|
||||
nsIAtom.idl \
|
||||
nsIAtomService.idl \
|
||||
nsICollection.idl \
|
||||
nsIEnumerator.idl \
|
||||
nsIObserver.idl \
|
||||
nsIObserverService.idl \
|
||||
nsIPersistentProperties2.idl \
|
||||
nsIProperties.idl \
|
||||
nsISerializable.idl \
|
||||
nsIStopwatch.idl \
|
||||
nsISupportsArray.idl \
|
||||
nsISupportsIterators.idl \
|
||||
nsISupportsPrimitives.idl \
|
||||
nsITimelineService.idl \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a static lib.
|
||||
FORCE_STATIC_LIB = 1
|
||||
|
||||
# Force use of PIC
|
||||
FORCE_USE_PIC = 1
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
DEFINES += -D_IMPL_NS_COM -D_IMPL_NS_BASE
|
||||
|
||||
@@ -1,300 +0,0 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is James L. Nance
|
||||
* Portions created by James L. Nance are Copyright (C) 2001
|
||||
* James L. Nance. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Patricia Jewell Nance, Jesse Jacob Nance
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU General Public License Version 2 or later (the
|
||||
* "GPL"), in which case the provisions of the GPL are applicable
|
||||
* instead of those above. If you wish to allow use of your
|
||||
* version of this file only under the terms of the GPL and not to
|
||||
* allow others to use your version of this file under the MPL,
|
||||
* indicate your decision by deleting the provisions above and
|
||||
* replace them with the notice and other provisions required by
|
||||
* the GPL. If you do not delete the provisions above, a recipient
|
||||
* may use your version of this file under either the MPL or the
|
||||
* GPL.
|
||||
*/
|
||||
|
||||
// #define TEST_PATRICIA
|
||||
|
||||
#if defined(TEST_PATRICIA)
|
||||
# include "stdlib.h"
|
||||
# include "stdio.h"
|
||||
# include "string.h"
|
||||
# define PRBool bool
|
||||
# define PRUint32 unsigned int
|
||||
# define PRInt32 int
|
||||
# define PR_CALLBACK
|
||||
# define PLArenaPool int
|
||||
# define PL_FinishArenaPool(a)
|
||||
# define PL_InitArenaPool(a, b, c, d)
|
||||
# define PL_ArenaAllocate(a, size) malloc(size)
|
||||
# define PR_TRUE true
|
||||
# define PR_FALSE false
|
||||
|
||||
struct nsCRT {
|
||||
static int strlen(const char *a) {return ::strlen(a);}
|
||||
static int memcmp(const void *a, const void *b, PRUint32 c) {
|
||||
return ::memcmp(a,b,c);
|
||||
}
|
||||
};
|
||||
#else
|
||||
# include "nsCRT.h"
|
||||
#endif
|
||||
|
||||
#include "nsStringMap.h"
|
||||
|
||||
const char nsStringMap::zero_str[] = "\0";
|
||||
|
||||
nsStringMap::~nsStringMap()
|
||||
{
|
||||
// Get rid of the arena memory
|
||||
PL_FinishArenaPool(&mPool);
|
||||
}
|
||||
|
||||
nsStringMap::nsStringMap() : numEntries(0)
|
||||
{
|
||||
// Initialize the head
|
||||
head.l = head.r = &head;
|
||||
head.bit = ~0;
|
||||
head.key = zero_str;
|
||||
head.len = 1;
|
||||
head.obj = 0;
|
||||
|
||||
// Initialize the arena. Guess that a 512 byte block size is good
|
||||
PL_InitArenaPool(&mPool, "nsStringMap", 512, sizeof(void*));
|
||||
}
|
||||
|
||||
void
|
||||
nsStringMap::Reset()
|
||||
{
|
||||
// Initialize the head
|
||||
head.l = head.r = &head;
|
||||
head.bit = ~0;
|
||||
head.key = zero_str;
|
||||
head.len = 1;
|
||||
head.obj = 0;
|
||||
|
||||
// Reinitialize the Arena
|
||||
PL_FinishArenaPool(&mPool);
|
||||
PL_InitArenaPool(&mPool, "nsStringMap", 512, sizeof(void*));
|
||||
}
|
||||
|
||||
void
|
||||
nsStringMap::Reset(nsStringMapEnumFunc destroyFunc, void *aClosure)
|
||||
{
|
||||
Enumerate(destroyFunc, aClosure);
|
||||
Reset();
|
||||
}
|
||||
|
||||
nsStringMap::Patricia *
|
||||
nsStringMap::newNode()
|
||||
{
|
||||
return (Patricia*) PL_ArenaAllocate(&mPool, sizeof(Patricia));
|
||||
}
|
||||
|
||||
nsStringMap::Patricia *
|
||||
nsStringMap::searchDown(BitTester &key)
|
||||
{
|
||||
// The head node only branches to the left, so we can optimize here.
|
||||
Patricia *x = head.l;
|
||||
|
||||
PRUint32 lastBits;
|
||||
|
||||
do {
|
||||
lastBits = x->bit;
|
||||
|
||||
if(key.isset(lastBits))
|
||||
x = x->r;
|
||||
else
|
||||
x = x->l;
|
||||
|
||||
} while(lastBits > x->bit);
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
void*
|
||||
nsStringMap::Get(const char *str, PRUint32 slen)
|
||||
{
|
||||
BitTester key(str, slen);
|
||||
|
||||
Patricia *t = searchDown(key);
|
||||
|
||||
if(!key.memcmp(t->key, t->len)) {
|
||||
return t->obj;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void*
|
||||
nsStringMap::Get(const char *str)
|
||||
{
|
||||
BitTester key(str);
|
||||
|
||||
Patricia *t = searchDown(key);
|
||||
|
||||
if(!key.memcmp(t->key, t->len)) {
|
||||
return t->obj;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsStringMap::Put(const char *str, void *obj, PRBool copy)
|
||||
{
|
||||
PRUint32 slen = nsCRT::strlen(str);
|
||||
return Put(str, slen, obj, copy);
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsStringMap::Put(const char *str, PRUint32 slen, void *obj, PRBool copy)
|
||||
{
|
||||
if(copy) {
|
||||
PRUint32 mask = sizeof(double) - 1;
|
||||
PRUint32 asize = (slen+mask) & ~mask;
|
||||
char *tstr = (char*) PL_ArenaAllocate(&mPool, asize);
|
||||
memcpy(tstr, str, slen);
|
||||
str = tstr;
|
||||
}
|
||||
|
||||
BitTester key(str, slen);
|
||||
|
||||
Patricia *t = searchDown(key);
|
||||
|
||||
if(!key.memcmp(t->key, t->len)) {
|
||||
t->obj = obj;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
// This is somewhat ugly. We need to find the maximum bit position that
|
||||
// differs, but this is complicated by the fact that we have random length
|
||||
// data. Assume that data past the end of the string is 0.
|
||||
const PRUint32 klen = key.datalen();
|
||||
const PRUint32 tlen = t->len;
|
||||
PRUint32 bpos;
|
||||
if(klen>tlen) {
|
||||
bpos = 8 * klen - 1;
|
||||
while(!BitTester::isset_checked(str, bpos)) --bpos;
|
||||
} else if(tlen>klen) {
|
||||
bpos = 8 * tlen - 1;
|
||||
while(!BitTester::isset_checked(t->key, bpos)) --bpos;
|
||||
} else /* equal */ {
|
||||
bpos = 8 * tlen - 1;
|
||||
while(BitTester::bitsequal(t->key, str, bpos)) --bpos;
|
||||
}
|
||||
|
||||
Patricia *p, *x = &head;
|
||||
|
||||
do {
|
||||
p = x;
|
||||
x = key.isset(x->bit) ? x->r : x->l;
|
||||
} while(x->bit > bpos && p->bit > x->bit);
|
||||
|
||||
t = newNode();
|
||||
|
||||
if(!t) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
t->key = str;
|
||||
t->len = key.datalen();
|
||||
t->obj = obj;
|
||||
t->bit = bpos;
|
||||
|
||||
if(key.isset(t->bit)) {
|
||||
t->r = t;
|
||||
t->l = x;
|
||||
} else {
|
||||
t->r = x;
|
||||
t->l = t;
|
||||
}
|
||||
|
||||
if(key.isset(p->bit)) {
|
||||
p->r = t;
|
||||
} else {
|
||||
p->l = t;
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
nsStringMap::enumerate_recurse(
|
||||
nsStringMapEnumFunc aEnumFunc, void* aClosure, Patricia *node)
|
||||
{
|
||||
aEnumFunc(node->key, node->obj, aClosure);
|
||||
if(node->l && node->l->bit<node->bit)
|
||||
enumerate_recurse(aEnumFunc, aClosure, node->l);
|
||||
if(node->r && node->r->bit<node->bit)
|
||||
enumerate_recurse(aEnumFunc, aClosure, node->r);
|
||||
}
|
||||
|
||||
void
|
||||
nsStringMap::Enumerate(nsStringMapEnumFunc aEnumFunc, void *aClosure)
|
||||
{
|
||||
// We dont want to process head, its a sentinal
|
||||
if(head.l && head.l->bit<head.bit)
|
||||
enumerate_recurse(aEnumFunc, aClosure, head.l);
|
||||
if(head.r && head.r->bit<head.bit)
|
||||
enumerate_recurse(aEnumFunc, aClosure, head.r);
|
||||
}
|
||||
|
||||
#if defined(TEST_PATRICIA)
|
||||
|
||||
PRBool etest(const char *key, void *data, void *closure)
|
||||
{
|
||||
printf("%s\n", key);
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
nsStringMap map;
|
||||
const char *strings[] = {
|
||||
"I am number 1 string",
|
||||
"I am number 2 string",
|
||||
"I am number 3 string",
|
||||
"a different string",
|
||||
"a similar string",
|
||||
"I am a very long string and I want to make sure we can handle this",
|
||||
"I am a very long string and I want to make sure we can handle this too",
|
||||
0
|
||||
};
|
||||
|
||||
int idx;
|
||||
for(idx=0; strings[idx]; ++idx) {
|
||||
map.Put(strings[idx], (void*)(1+idx));
|
||||
}
|
||||
|
||||
printf("Lookup Test\n");
|
||||
while(--idx>=0) {
|
||||
void *ptr = map.Get(strings[idx]);
|
||||
printf("%d: %s\n", (long)ptr, strings[idx]);
|
||||
}
|
||||
|
||||
printf("\nEnumeration Test\n");
|
||||
|
||||
map.Enumerate(etest, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,112 +0,0 @@
|
||||
#ifndef nsStringMap_h__
|
||||
#define nsStringMap_h__
|
||||
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is James L. Nance
|
||||
* Portions created by James L. Nance are Copyright (C) 2001
|
||||
* James L. Nance. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Patricia Jewell Nance, Jesse Jacob Nance
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU General Public License Version 2 or later (the
|
||||
* "GPL"), in which case the provisions of the GPL are applicable
|
||||
* instead of those above. If you wish to allow use of your
|
||||
* version of this file only under the terms of the GPL and not to
|
||||
* allow others to use your version of this file under the MPL,
|
||||
* indicate your decision by deleting the provisions above and
|
||||
* replace them with the notice and other provisions required by
|
||||
* the GPL. If you do not delete the provisions above, a recipient
|
||||
* may use your version of this file under either the MPL or the
|
||||
* GPL.
|
||||
*/
|
||||
|
||||
#if !defined(TEST_PATRICIA)
|
||||
# include "nscore.h"
|
||||
# include "prtypes.h"
|
||||
# include "plarena.h"
|
||||
#endif
|
||||
|
||||
typedef PRBool (*PR_CALLBACK nsStringMapEnumFunc) (
|
||||
const char *aKey, void *aData, void *aClosure);
|
||||
|
||||
class nsStringMap
|
||||
{
|
||||
public:
|
||||
nsStringMap();
|
||||
~nsStringMap();
|
||||
PRBool Put(const char *str, PRUint32 slen, void *obj, PRBool copy=PR_FALSE);
|
||||
PRBool Put(const char *str, void *obj, PRBool copy=PR_FALSE);
|
||||
void* Get(const char *str);
|
||||
void* Get(const char *str, PRUint32 slen);
|
||||
void Reset();
|
||||
void Reset(nsStringMapEnumFunc destroyFunc, void *aClosure = 0);
|
||||
void Enumerate(nsStringMapEnumFunc aEnumFunc, void *aClosure = 0);
|
||||
|
||||
struct Patricia {
|
||||
Patricia *l, *r;
|
||||
PRUint32 bit; // Bit position for l/r comp
|
||||
const char *key;
|
||||
PRUint32 len;
|
||||
void *obj;
|
||||
};
|
||||
|
||||
// The BitTester class is used to test a particular bit position in an
|
||||
// array of characters. It does not assign any special meaning to 0
|
||||
// characters. Bits past the end of the array are treated as 0
|
||||
class BitTester {
|
||||
const PRUint32 slen;
|
||||
const char *cstr;
|
||||
public:
|
||||
BitTester(const char *s) : slen(nsCRT::strlen(s)), cstr(s) {}
|
||||
BitTester(const char *s, PRUint32 l) : slen(l), cstr(s) {}
|
||||
|
||||
PRInt32 memcmp(const char *ostr, PRUint32 olen) {
|
||||
if(olen==slen) {
|
||||
return ::memcmp((void*)cstr, ostr, slen);
|
||||
} else {
|
||||
return olen - slen;
|
||||
}
|
||||
}
|
||||
|
||||
PRUint32 datalen() const {return slen;}
|
||||
|
||||
static PRBool isset_checked(const char *str, PRUint32 idx) {
|
||||
return (str[idx/8] & (1<<(idx & 7))) != 0;
|
||||
}
|
||||
|
||||
static PRBool
|
||||
bitsequal(const char *str1, const char*str2, PRUint32 idx) {
|
||||
return (str1[idx/8] & (1<<(idx&7)))==(str2[idx/8] & (1<<(idx&7)));
|
||||
}
|
||||
|
||||
PRBool isset(PRUint32 idx) {
|
||||
const PRUint32 base = idx/8;
|
||||
if(base>=slen) return 0;
|
||||
return (cstr[base] & (1<<(idx & 7))) != 0;
|
||||
}
|
||||
};
|
||||
|
||||
private:
|
||||
PLArenaPool mPool;
|
||||
Patricia *newNode();
|
||||
Patricia *searchDown(BitTester&);
|
||||
void enumerate_recurse(nsStringMapEnumFunc, void*, Patricia*);
|
||||
Patricia head; // Sentinal node
|
||||
PRInt32 numEntries;
|
||||
static const char zero_str[];
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user