make menus partially dismiss on unix

This commit is contained in:
pavlov%netscape.com 1999-09-27 02:16:18 +00:00
Родитель 452f5c0084
Коммит 68a0eee3bb
4 изменённых файлов: 52 добавлений и 4 удалений

Просмотреть файл

@ -46,7 +46,7 @@ static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CI
#include <X11/Xutil.h>
#ifdef DEBUG_pavlov
#define DEBUG_EVENTS 1
//#define DEBUG_EVENTS 1
#endif
struct EventInfo {

Просмотреть файл

@ -29,7 +29,7 @@
#include "nsWidgetsCID.h"
#include "nsGfxCIID.h"
#include <gdk/gdkx.h>
#include "nsIRollupListener.h"
#ifdef USE_XIM
#include "nsIServiceManager.h"
@ -43,6 +43,11 @@ static NS_DEFINE_CID(kRegionCID, NS_REGION_CID);
nsILookAndFeel *nsWidget::sLookAndFeel = nsnull;
PRUint32 nsWidget::sWidgetCount = 0;
static nsIRollupListener *gRollupListener = nsnull;
static nsIWidget *gRollupWidget = nsnull;
//
// Keep track of the last widget being "dragged"
//
@ -314,6 +319,30 @@ NS_IMETHODIMP nsWidget::Show(PRBool bState)
return NS_OK;
}
NS_IMETHODIMP nsWidget::CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture)
{
// printf("nsWindow::CaptureRollupEvents() this = %p , doCapture = %i\n", this, aDoCapture);
if (aDoCapture) {
// gtk_grab_add(mWidget);
NS_IF_RELEASE(gRollupListener);
NS_IF_RELEASE(gRollupWidget);
gRollupListener = aListener;
NS_ADDREF(aListener);
gRollupWidget = this;
NS_ADDREF(this);
} else {
// gtk_grab_remove(mWidget);
NS_IF_RELEASE(gRollupListener);
//gRollupListener = nsnull;
NS_IF_RELEASE(gRollupWidget);
}
return NS_OK;
}
NS_IMETHODIMP nsWidget::SetModal(void)
{
GtkWindow *toplevel;
@ -1630,8 +1659,19 @@ nsWidget::OnButtonPressSignal(GdkEventButton * aGdkButtonEvent)
nsMouseEvent event;
PRUint32 eventType = 0;
if (gRollupWidget && gRollupListener)
{
GtkWidget *rollupWidget = GTK_WIDGET(gRollupWidget->GetNativeData(NS_NATIVE_WIDGET));
GtkWidget *thisWidget = GTK_WIDGET(GetNativeData(NS_NATIVE_WIDGET));
if (rollupWidget != thisWidget && gtk_widget_get_toplevel(thisWidget) != rollupWidget)
{
gRollupListener->Rollup();
return;
}
}
#ifdef DEBUG_pavlov
printf("button press\n");
// printf("button press\n");
#endif
// Switch on single, double, triple click.

Просмотреть файл

@ -84,6 +84,7 @@ public:
NS_IMETHOD SetModal(void);
NS_IMETHOD Show(PRBool state);
NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener, PRBool aDoCapture);
NS_IMETHOD IsVisible(PRBool &aState);
NS_IMETHOD Move(PRInt32 aX, PRInt32 aY);

Просмотреть файл

@ -42,6 +42,7 @@
#include "stdio.h"
//-------------------------------------------------------------------------
//
// nsWindow constructor
@ -641,6 +642,7 @@ NS_IMETHODIMP nsWindow::Show(PRBool bState)
if (mIsToplevel && mShell)
{
gtk_widget_hide(mShell);
gtk_widget_unmap(mShell);
}
gtk_widget_hide(mWidget);
@ -768,7 +770,10 @@ NS_IMETHODIMP nsWindow::Resize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint)
aHeight = 1;
mIsTooSmall = PR_TRUE;
if (GTK_WIDGET_VISIBLE(mShell))
{
gtk_widget_hide(mShell);
gtk_widget_unmap(mShell);
}
}
else
{
@ -776,6 +781,7 @@ NS_IMETHODIMP nsWindow::Resize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint)
aHeight = 1;
mIsTooSmall = PR_TRUE;
gtk_widget_hide(mWidget);
gtk_widget_unmap(mWidget);
}
}
else
@ -827,8 +833,9 @@ NS_IMETHODIMP nsWindow::Resize(PRInt32 aWidth, PRInt32 aHeight, PRBool aRepaint)
NS_IMETHODIMP nsWindow::Resize(PRInt32 aX, PRInt32 aY, PRInt32 aWidth,
PRInt32 aHeight, PRBool aRepaint)
{
Resize(aWidth,aHeight,aRepaint);
Move(aX,aY);
// resize can cause a show to happen, so do this last
Resize(aWidth,aHeight,aRepaint);
return NS_OK;
}