2012-04-09 2 views
2

У меня есть панель xul: на моем расширении Firefox. Я предоставляю положение для отображения в соответствии с screen.width и screen.height. Моя проблема возникает, когда у меня есть несколько мониторов, и я запускаю браузер на первом мониторе, он появляется на втором, а панель xul: рисуется в соответствии с разрешением первого экрана на втором. Есть ли решение для рисования в соответствии с разрешением второго экрана?xul: положение панели на нескольких мониторах

+0

Это кровавое месиво, на самом деле! Мне пришлось приостановить разработку приложения на основе XULRunner для работы с управлением окнами. Я закончил использование Win32 или X11 apis (в зависимости от платформы) непосредственно из 'js-ctypes'. В принципе, я бы быстро изменил заголовок окна, чтобы идентифицировать его из кода C++ путем перечисления окон, а затем вернуть его в исходное название и сохранить ссылку на идентифицированное окно для последующего использования с API, которые я подвергал JavaScript, с помощью js -ctypes'. –

+0

Не уверен, что с XULJet что-то улучшилось, или если это вообще применимо к расширениям Firefox. –

+0

Я напишу ответ, но, возможно, кто-то может прослушивать чистое решение для JavaScript :-) –

ответ

2

фон:

Когда я занимаюсь разработкой приложений многоплатформенного монитора, основанными на XULRunner для работы, я обнаружил, что вы просто не могли предсказать, где оконный менеджер будет размещать окна запущенных после первого запуска ваших главное окно приложения/браузера.

XULRunner сделал правильно дать мне:

  • геометрии (ширину, высоту) для полного отображения несколько мониторов
  • положения окна для данного окна на дисплее несколько мониторов
  • состояния окна (МАКСИМАЛЬНЫЕ, MINIMIZED , ни) для данного окна
  • способности (un-) не максимизирует окно

Это не правильно соблюдать геометрию несколько мониторов, когда я Удельный отредактировал набор оконных координат, которые бы поместили окно на конкретный монитор (скорее, оконный менеджер разместил новое окно, где ему было угодно).

Это оставил меня с задачей как-то, выполнив следующие действия:

  • позиционирования окна относительно отображения на несколько мониторов, и
    (потому что перемещение окна иногда теряет фокус окна)
  • Фокусировка окна.

Я смог достичь как с помощью внешней DLL, загруженной/используемой js-ctypes.


Пример для Win32:

Вот являются основами для связывания внешних DLL в JavaScript. Этот пример охватывает только Win32, но я также сделал это для Linux и для MacOSX (которые были проще & соответственно по сравнению с Win32).

Есть 3 части:

  1. Привилегированное код JavaScript для загрузки/свяжи Win32 API,
  2. Заголовочный файл CPP для нашей внешней DLL
  3. Исходный файл CPP для нашей внешней DLL

Я создаю простой проект GUI DLL с более поздними двумя файлами & скомпилировал wmctrl.dll, в зависимости от msvcr100.dll и использовал Dependency Walker, чтобы найти символы «plain C», экспортируемые th e DLL для использования js-ctypes.

Я также создал библиотеку JavaScript вокруг API-интерфейсов, которые позволили манипулировать, отслеживать & состояние/геометрию состояния для нескольких окон в течение нескольких прогонов приложения, но это не имеет отношения к этому простому примеру.

В привилегированном коде JavaScript:

// get js-ctypes, you do this part a bit differently from browser chrome 
const {Cc,Ci,Cu} = require("chrome"); 
var file=null, lib=null, ctypes = {}; 
Cu.import("resource://gre/modules/ctypes.jsm", ctypes); 
var ctypes = ctypes.ctypes; 

// build platform specific library path 
var filename = ctypes.libraryName("wmctrl"); 
var comp = "@mozilla.org/file/directory_service;1"; 
var file = Cc[comp].getService(Ci.nsIProperties).get("CurProcD", Ci.nsIFile); 
file.append("browser_code"); 
file.append(filename); 

// get the JavaScript library interface (load the library) 
var lib = ctypes.open(file.path); 

// wmctrl_find_window: returing unsigned 32bit (long) "window handle" 
// takes string "window title". 
var find_window = lib.declare("[email protected]@[email protected]", 
    ctypes.stdcall_abi, ctypes.uint32_t, 
    ctypes.char.ptr); 

// wmctrl_window_focus: takes unsigned 32bit (long) "window handle". 
var window_focus = lib.declare("[email protected]@[email protected]", 
    ctypes.stdcall_abi, ctypes.void_t, 
    ctypes.uint32_t); 

// wmctrl_window_move: takes unsigned 32bit (long) "window handle", 
// and two (x & y) signed 32bit ints. 
var window_move = lib.declare("[email protected]@[email protected]", 
    ctypes.stdcall_abi, ctypes.void_t, 
    ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t); 

wmctrldll.h

#ifdef WMCTRLDLL_EXPORTS 
#define WMCTRLDLL_API __declspec(dllexport) 
#else 
#define WMCTRLDLL_API __declspec(dllimport) 
#endif 

WMCTRLDLL_API void wmctrl_window_focus (unsigned long wid); 
WMCTRLDLL_API void wmctrl_window_move (unsigned long wid, int x, int y); 
WMCTRLDLL_API unsigned long wmctrl_find_window(char* find_title); 

wmctrldll.cpp

#include "stdafx.h" 
#include "wmctrldll.h" 

typedef struct { 
    HWND hWnd; 
    char title[255]; 
} myWinSpec; 

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { 
    char String[255]; 
    myWinSpec* to_find = (myWinSpec*) lParam; 

    // not a window 
    if (!hWnd) return TRUE;          

    // not visible 
    if (!IsWindowVisible(hWnd)) return TRUE; 

    // no window title      
    if (!GetWindowTextA(hWnd, (LPSTR)String, 255)) return TRUE; 

    // no title match 
    if (strcmp(String, to_find->title) != 0) return TRUE;   

    to_find->hWnd = hWnd; 
    return FALSE; 
} 

WMCTRLDLL_API void wmctrl_window_focus(unsigned long wid) { 
    SetForegroundWindow((HWND) wid); 
} 

WMCTRLDLL_API unsigned long wmctrl_find_window(char* find_title) { 
    myWinSpec to_find; 

    sprintf_s(to_find.title, sizeof(to_find.title), "%s", find_title); 
    to_find.hWnd = 0; 

    EnumWindows(EnumWindowsProc, (LPARAM)&to_find); 
    return (unsigned long) to_find.hWnd; 
} 

WMCTRLDLL_API void wmctrl_window_move(unsigned long wid, int x, int y) { 
    UINT flags = SWP_SHOWWINDOW | SWP_NOSIZE; 

    SetForegroundWindow((HWND) wid); 
    SetWindowPos((HWND) wid, HWND_NOTOPMOST, x, y, NULL, NULL, flags); 
} 
Смежные вопросы