mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
03394f2857
--HG-- rename : widget/gtk2/Makefile.in => widget/gtk/Makefile.in rename : widget/gtk2/WidgetTraceEvent.cpp => widget/gtk/WidgetTraceEvent.cpp rename : widget/gtk2/compat/gdk/gdkdnd.h => widget/gtk/compat/gdk/gdkdnd.h rename : widget/gtk2/compat/gdk/gdkkeysyms.h => widget/gtk/compat/gdk/gdkkeysyms.h rename : widget/gtk2/compat/gdk/gdkvisual.h => widget/gtk/compat/gdk/gdkvisual.h rename : widget/gtk2/compat/gdk/gdkwindow.h => widget/gtk/compat/gdk/gdkwindow.h rename : widget/gtk2/compat/gdk/gdkx.h => widget/gtk/compat/gdk/gdkx.h rename : widget/gtk2/compat/glib/gmem.h => widget/gtk/compat/glib/gmem.h rename : widget/gtk2/compat/gtk/gtkcolorseldialog.h => widget/gtk/compat/gtk/gtkcolorseldialog.h rename : widget/gtk2/compat/gtk/gtkdialog.h => widget/gtk/compat/gtk/gtkdialog.h rename : widget/gtk2/compat/gtk/gtkplug.h => widget/gtk/compat/gtk/gtkplug.h rename : widget/gtk2/compat/gtk/gtkselection.h => widget/gtk/compat/gtk/gtkselection.h rename : widget/gtk2/compat/gtk/gtkwidget.h => widget/gtk/compat/gtk/gtkwidget.h rename : widget/gtk2/compat/gtk/gtkwindow.h => widget/gtk/compat/gtk/gtkwindow.h rename : widget/gtk2/crashtests/673390-1.html => widget/gtk/crashtests/673390-1.html rename : widget/gtk2/crashtests/crashtests.list => widget/gtk/crashtests/crashtests.list rename : widget/gtk2/gtk2drawing.c => widget/gtk/gtk2drawing.c rename : widget/gtk2/gtk3drawing.c => widget/gtk/gtk3drawing.c rename : widget/gtk2/gtkdrawing.h => widget/gtk/gtkdrawing.h rename : widget/gtk2/maiRedundantObjectFactory.c => widget/gtk/maiRedundantObjectFactory.c rename : widget/gtk2/maiRedundantObjectFactory.h => widget/gtk/maiRedundantObjectFactory.h rename : widget/gtk2/moz.build => widget/gtk/moz.build rename : widget/gtk2/mozcontainer.c => widget/gtk/mozcontainer.c rename : widget/gtk2/mozcontainer.h => widget/gtk/mozcontainer.h rename : widget/gtk2/nsAppShell.cpp => widget/gtk/nsAppShell.cpp rename : widget/gtk2/nsAppShell.h => widget/gtk/nsAppShell.h rename : widget/gtk2/nsBidiKeyboard.cpp => widget/gtk/nsBidiKeyboard.cpp rename : widget/gtk2/nsBidiKeyboard.h => widget/gtk/nsBidiKeyboard.h rename : widget/gtk2/nsCUPSShim.cpp => widget/gtk/nsCUPSShim.cpp rename : widget/gtk2/nsCUPSShim.h => widget/gtk/nsCUPSShim.h rename : widget/gtk2/nsClipboard.cpp => widget/gtk/nsClipboard.cpp rename : widget/gtk2/nsClipboard.h => widget/gtk/nsClipboard.h rename : widget/gtk2/nsColorPicker.cpp => widget/gtk/nsColorPicker.cpp rename : widget/gtk2/nsColorPicker.h => widget/gtk/nsColorPicker.h rename : widget/gtk2/nsDeviceContextSpecG.cpp => widget/gtk/nsDeviceContextSpecG.cpp rename : widget/gtk2/nsDeviceContextSpecG.h => widget/gtk/nsDeviceContextSpecG.h rename : widget/gtk2/nsDragService.cpp => widget/gtk/nsDragService.cpp rename : widget/gtk2/nsDragService.h => widget/gtk/nsDragService.h rename : widget/gtk2/nsFilePicker.cpp => widget/gtk/nsFilePicker.cpp rename : widget/gtk2/nsFilePicker.h => widget/gtk/nsFilePicker.h rename : widget/gtk2/nsGTKToolkit.h => widget/gtk/nsGTKToolkit.h rename : widget/gtk2/nsGtkCursors.h => widget/gtk/nsGtkCursors.h rename : widget/gtk2/nsGtkIMModule.cpp => widget/gtk/nsGtkIMModule.cpp rename : widget/gtk2/nsGtkIMModule.h => widget/gtk/nsGtkIMModule.h rename : widget/gtk2/nsGtkKeyUtils.cpp => widget/gtk/nsGtkKeyUtils.cpp rename : widget/gtk2/nsGtkKeyUtils.h => widget/gtk/nsGtkKeyUtils.h rename : widget/gtk2/nsGtkUtils.h => widget/gtk/nsGtkUtils.h rename : widget/gtk2/nsIImageToPixbuf.h => widget/gtk/nsIImageToPixbuf.h rename : widget/gtk2/nsIdleServiceGTK.cpp => widget/gtk/nsIdleServiceGTK.cpp rename : widget/gtk2/nsIdleServiceGTK.h => widget/gtk/nsIdleServiceGTK.h rename : widget/gtk2/nsImageToPixbuf.cpp => widget/gtk/nsImageToPixbuf.cpp rename : widget/gtk2/nsImageToPixbuf.h => widget/gtk/nsImageToPixbuf.h rename : widget/gtk2/nsLookAndFeel.cpp => widget/gtk/nsLookAndFeel.cpp rename : widget/gtk2/nsLookAndFeel.h => widget/gtk/nsLookAndFeel.h rename : widget/gtk2/nsNativeKeyBindings.cpp => widget/gtk/nsNativeKeyBindings.cpp rename : widget/gtk2/nsNativeKeyBindings.h => widget/gtk/nsNativeKeyBindings.h rename : widget/gtk2/nsNativeThemeGTK.cpp => widget/gtk/nsNativeThemeGTK.cpp rename : widget/gtk2/nsNativeThemeGTK.h => widget/gtk/nsNativeThemeGTK.h rename : widget/gtk2/nsPSPrinters.cpp => widget/gtk/nsPSPrinters.cpp rename : widget/gtk2/nsPSPrinters.h => widget/gtk/nsPSPrinters.h rename : widget/gtk2/nsPaperPS.cpp => widget/gtk/nsPaperPS.cpp rename : widget/gtk2/nsPaperPS.h => widget/gtk/nsPaperPS.h rename : widget/gtk2/nsPrintDialogGTK.cpp => widget/gtk/nsPrintDialogGTK.cpp rename : widget/gtk2/nsPrintDialogGTK.h => widget/gtk/nsPrintDialogGTK.h rename : widget/gtk2/nsPrintOptionsGTK.cpp => widget/gtk/nsPrintOptionsGTK.cpp rename : widget/gtk2/nsPrintOptionsGTK.h => widget/gtk/nsPrintOptionsGTK.h rename : widget/gtk2/nsPrintSettingsGTK.cpp => widget/gtk/nsPrintSettingsGTK.cpp rename : widget/gtk2/nsPrintSettingsGTK.h => widget/gtk/nsPrintSettingsGTK.h rename : widget/gtk2/nsScreenGtk.cpp => widget/gtk/nsScreenGtk.cpp rename : widget/gtk2/nsScreenGtk.h => widget/gtk/nsScreenGtk.h rename : widget/gtk2/nsScreenManagerGtk.cpp => widget/gtk/nsScreenManagerGtk.cpp rename : widget/gtk2/nsScreenManagerGtk.h => widget/gtk/nsScreenManagerGtk.h rename : widget/gtk2/nsSound.cpp => widget/gtk/nsSound.cpp rename : widget/gtk2/nsSound.h => widget/gtk/nsSound.h rename : widget/gtk2/nsToolkit.cpp => widget/gtk/nsToolkit.cpp rename : widget/gtk2/nsWidgetFactory.cpp => widget/gtk/nsWidgetFactory.cpp rename : widget/gtk2/nsWindow.cpp => widget/gtk/nsWindow.cpp rename : widget/gtk2/nsWindow.h => widget/gtk/nsWindow.h
140 lines
3.5 KiB
C++
140 lines
3.5 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
|
*/
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#include <gdk/gdk.h>
|
|
#include "nsAppShell.h"
|
|
#include "nsWindow.h"
|
|
#include "prlog.h"
|
|
#include "prenv.h"
|
|
#include "mozilla/HangMonitor.h"
|
|
#include "mozilla/unused.h"
|
|
|
|
using mozilla::unused;
|
|
|
|
#define NOTIFY_TOKEN 0xFA
|
|
|
|
#ifdef PR_LOGGING
|
|
PRLogModuleInfo *gWidgetLog = nullptr;
|
|
PRLogModuleInfo *gWidgetFocusLog = nullptr;
|
|
PRLogModuleInfo *gWidgetDragLog = nullptr;
|
|
PRLogModuleInfo *gWidgetDrawLog = nullptr;
|
|
#endif
|
|
|
|
static GPollFunc sPollFunc;
|
|
|
|
// Wrapper function to disable hang monitoring while waiting in poll().
|
|
static gint
|
|
PollWrapper(GPollFD *ufds, guint nfsd, gint timeout_)
|
|
{
|
|
mozilla::HangMonitor::Suspend();
|
|
gint result = (*sPollFunc)(ufds, nfsd, timeout_);
|
|
mozilla::HangMonitor::NotifyActivity();
|
|
return result;
|
|
}
|
|
|
|
/*static*/ gboolean
|
|
nsAppShell::EventProcessorCallback(GIOChannel *source,
|
|
GIOCondition condition,
|
|
gpointer data)
|
|
{
|
|
nsAppShell *self = static_cast<nsAppShell *>(data);
|
|
|
|
unsigned char c;
|
|
unused << read(self->mPipeFDs[0], &c, 1);
|
|
NS_ASSERTION(c == (unsigned char) NOTIFY_TOKEN, "wrong token");
|
|
|
|
self->NativeEventCallback();
|
|
return TRUE;
|
|
}
|
|
|
|
nsAppShell::~nsAppShell()
|
|
{
|
|
if (mTag)
|
|
g_source_remove(mTag);
|
|
if (mPipeFDs[0])
|
|
close(mPipeFDs[0]);
|
|
if (mPipeFDs[1])
|
|
close(mPipeFDs[1]);
|
|
}
|
|
|
|
nsresult
|
|
nsAppShell::Init()
|
|
{
|
|
#ifdef PR_LOGGING
|
|
if (!gWidgetLog)
|
|
gWidgetLog = PR_NewLogModule("Widget");
|
|
if (!gWidgetFocusLog)
|
|
gWidgetFocusLog = PR_NewLogModule("WidgetFocus");
|
|
if (!gWidgetDragLog)
|
|
gWidgetDragLog = PR_NewLogModule("WidgetDrag");
|
|
if (!gWidgetDrawLog)
|
|
gWidgetDrawLog = PR_NewLogModule("WidgetDraw");
|
|
#endif
|
|
|
|
if (!sPollFunc) {
|
|
sPollFunc = g_main_context_get_poll_func(NULL);
|
|
g_main_context_set_poll_func(NULL, &PollWrapper);
|
|
}
|
|
|
|
if (PR_GetEnv("MOZ_DEBUG_PAINTS"))
|
|
gdk_window_set_debug_updates(TRUE);
|
|
|
|
int err = pipe(mPipeFDs);
|
|
if (err)
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
GIOChannel *ioc;
|
|
GSource *source;
|
|
|
|
// make the pipe nonblocking
|
|
|
|
int flags = fcntl(mPipeFDs[0], F_GETFL, 0);
|
|
if (flags == -1)
|
|
goto failed;
|
|
err = fcntl(mPipeFDs[0], F_SETFL, flags | O_NONBLOCK);
|
|
if (err == -1)
|
|
goto failed;
|
|
flags = fcntl(mPipeFDs[1], F_GETFL, 0);
|
|
if (flags == -1)
|
|
goto failed;
|
|
err = fcntl(mPipeFDs[1], F_SETFL, flags | O_NONBLOCK);
|
|
if (err == -1)
|
|
goto failed;
|
|
|
|
ioc = g_io_channel_unix_new(mPipeFDs[0]);
|
|
source = g_io_create_watch(ioc, G_IO_IN);
|
|
g_io_channel_unref(ioc);
|
|
g_source_set_callback(source, (GSourceFunc)EventProcessorCallback, this, nullptr);
|
|
g_source_set_can_recurse(source, TRUE);
|
|
mTag = g_source_attach(source, nullptr);
|
|
g_source_unref(source);
|
|
|
|
return nsBaseAppShell::Init();
|
|
failed:
|
|
close(mPipeFDs[0]);
|
|
close(mPipeFDs[1]);
|
|
mPipeFDs[0] = mPipeFDs[1] = 0;
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
void
|
|
nsAppShell::ScheduleNativeEventCallback()
|
|
{
|
|
unsigned char buf[] = { NOTIFY_TOKEN };
|
|
unused << write(mPipeFDs[1], buf, 1);
|
|
}
|
|
|
|
bool
|
|
nsAppShell::ProcessNextNativeEvent(bool mayWait)
|
|
{
|
|
return g_main_context_iteration(NULL, mayWait);
|
|
}
|