gecko/widget/gtk/nsAppShell.cpp
Martin Stransky 03394f2857 Bug 917270 - Rename widget/gtk2 to widget/gtk. r=karlt
--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
2013-09-23 09:21:57 -04:00

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);
}