213 lines
5.8 KiB
Vala
213 lines
5.8 KiB
Vala
/* vim: set tabstop=2:softtabstop=2:shiftwidth=2:noexpandtab */
|
|
// modules: X
|
|
|
|
using X;
|
|
|
|
namespace NeoLayoutViewer{
|
|
|
|
public ConfigManager configm;
|
|
public NeoLayoutViewerApp app;
|
|
|
|
public NeoWindow neo_win = null;
|
|
|
|
#if tray
|
|
public AppStatusIcon neo_tray = null; //for gnome2.x, kde(?)
|
|
#endif
|
|
#if indicator
|
|
public NeoIndicator neo_indicator = null; //for gnome3.x
|
|
#endif
|
|
#if _NO_WIN
|
|
public KeybindingManager manager = null;
|
|
#endif
|
|
|
|
private void bind_shortcuts() {
|
|
manager = new KeybindingManager(neo_win);
|
|
var show_shortcut = configm.getConfig().get("show_shortcut").strip();
|
|
var move_shortcut = configm.getConfig().get("move_shortcut").strip();
|
|
var monitor_shortcut = configm.getConfig().get("monitor_shortcut").strip();
|
|
|
|
if (move_shortcut.length > 0) {
|
|
manager.bind(move_shortcut, ()=>{neo_win.numkeypad_move(0);});
|
|
}
|
|
|
|
if (show_shortcut == monitor_shortcut) {
|
|
// combination of show + monitor move
|
|
debug("Use combined shortcut for window showing and monitor switching.");
|
|
manager.bind(monitor_shortcut, ()=>{neo_win.monitor_move(-1, true);});
|
|
|
|
} else {
|
|
if (monitor_shortcut.length > 0) {
|
|
manager.bind(monitor_shortcut, ()=>{neo_win.monitor_move();});
|
|
}
|
|
if (show_shortcut.length > 0) {
|
|
manager.bind(show_shortcut, ()=>{neo_win.toggle();});
|
|
}
|
|
}
|
|
}
|
|
|
|
public static int main(string[] args) {
|
|
|
|
// Minimal initialization. Check if primary instance and quit otherwise
|
|
app = new NeoLayoutViewerApp ();
|
|
try {
|
|
app.register(); // returns false if and only if throws Error
|
|
} catch (Error e) {
|
|
debug(@"Gtk.Application.register() failed.\n");
|
|
return -1;
|
|
}
|
|
if (app.is_remote) {
|
|
print(@"Application is already running.\n");
|
|
// Run without further initalization. It triggers transfer of arguments
|
|
// to command_line()-call of primary instance.
|
|
app.run(args);
|
|
|
|
/* Gives D-Bus some time.
|
|
* Only needed if app.run() isn't called.
|
|
*/
|
|
//GLib.Thread.usleep(100000);
|
|
return 0;
|
|
}
|
|
|
|
string[] paths = {
|
|
GLib.Environment.get_user_config_dir(),
|
|
GLib.Environment.get_home_dir(),
|
|
GLib.Environment.get_current_dir(),
|
|
};
|
|
|
|
configm = new ConfigManager(paths, "neo_layout_viewer.conf");
|
|
|
|
// Try to find asset folder (images)
|
|
string asset_folder = search_asset_folder( configm.getConfig().get("asset_folder") );
|
|
if (asset_folder == null) {
|
|
stdout.printf(@"Application start failed because asset folder was not found.\nTry to set path manually in the config file '$(configm.used_config_path)'\n");
|
|
stdout.flush();
|
|
return 0;
|
|
}
|
|
|
|
// Update asset folder in config
|
|
configm.getConfig().set("asset_folder", asset_folder);
|
|
debug(@"Asset folder: $(asset_folder)\n");
|
|
|
|
// Create the window of this application and show it
|
|
neo_win = new NeoWindow (configm, app);
|
|
|
|
#if tray
|
|
neo_tray = new AppStatusIcon(neo_win);
|
|
#endif
|
|
|
|
#if indicator
|
|
neo_indicator = new NeoIndicator(neo_win);
|
|
#endif
|
|
|
|
#if _NO_WIN
|
|
bind_shortcuts();
|
|
#endif
|
|
|
|
app.neo_win = neo_win; // Required for action handlers.
|
|
app.add_window(neo_win);
|
|
|
|
return app.run(args);
|
|
}
|
|
|
|
private static void quit() {
|
|
app.quit(); // stops app.run()
|
|
}
|
|
|
|
private static void about_dialog() {
|
|
/* This function create the about dialog in
|
|
tray menu or indicator menu */
|
|
|
|
var show_shortcut = configm.getConfig().get("show_shortcut").strip();
|
|
var move_shortcut = configm.getConfig().get("move_shortcut").strip();
|
|
var monitor_shortcut = configm.getConfig().get("monitor_shortcut").strip();
|
|
|
|
string tmp = "";
|
|
if (show_shortcut == monitor_shortcut) {
|
|
tmp = "Monitor wechseln/Ausblenden - %s".printf(show_shortcut);
|
|
} else {
|
|
tmp = """Ein-/Ausblenden - %s
|
|
Monitor wechseln - %s""".printf(show_shortcut,
|
|
monitor_shortcut);
|
|
}
|
|
|
|
var about = new Gtk.AboutDialog();
|
|
about.set_logo(app.neo_win.getIcon());
|
|
about.set_destroy_with_parent (true);
|
|
about.set_transient_for (app.neo_win);
|
|
about.set_version(@"$(RELEASE_VERSION) (git $(GIT_COMMIT_VERSION))");
|
|
about.set_program_name("Neo2.0 Ebenenanzeige");
|
|
about.set_comments("""Erleichtert das Nachschlagen von Tastenkombinationen im Neo 2.0-Layout.
|
|
|
|
Olaf Schulz
|
|
olaf_schulz+neo@posteo.de
|
|
|
|
Tastenkombinationen:
|
|
%s
|
|
Bewegen - %s
|
|
Beenden (sofern Fenster selektiert) - q
|
|
|
|
Verwendete Konfigurationsdatei:
|
|
%s""".printf(
|
|
tmp,
|
|
move_shortcut,
|
|
configm.used_config_path)
|
|
);
|
|
about.set_copyright("LGPLv3");
|
|
center_window(about);
|
|
about.run();
|
|
about.hide();
|
|
about.destroy();
|
|
|
|
}
|
|
|
|
private void center_window(Gtk.Window win) {
|
|
int screen_width = app.neo_win.get_screen_width();
|
|
int screen_height = app.neo_win.get_screen_height();
|
|
int x, y, w, h;
|
|
win.get_size(out w, out h);
|
|
x = (screen_width - w) / 2;
|
|
y = (screen_height - h) / 2;
|
|
win.move(x, y);
|
|
}
|
|
|
|
/* Check given path and shared files folders for the asset folder.
|
|
The folder will be assumed as right one if one required file was found.
|
|
@return: assed folder or null.
|
|
*/
|
|
private static string? search_asset_folder(string path) {
|
|
string filename = "/icons/Neo-Icon.png"; // Name of file we search for
|
|
|
|
string[] paths = {
|
|
path, // path from config file
|
|
"./assets",
|
|
"../assets",
|
|
SHARED_ASSETS_PATH, // path given by Makefile
|
|
};
|
|
|
|
foreach (var p in paths) {
|
|
debug(@"Search assets in $(p)\n");
|
|
var file = File.new_for_path (p+filename);
|
|
if (file.query_exists(null)) return p;
|
|
}
|
|
|
|
foreach (var s in GLib.Environment.get_system_data_dirs()) {
|
|
var env_path = @"$(s)/NeoLayoutViewer/assets";
|
|
debug(@"Search assets in $(env_path)\n");
|
|
var file2 = File.new_for_path (env_path+filename);
|
|
if (file2.query_exists(null)) return env_path;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
#if _NO_WIN
|
|
/* Extern C routines */
|
|
extern int keysend(uint keysym, int modifiers);
|
|
extern int keysend2(uint keysym, uint modsym1, uint modsym2);
|
|
extern bool checkCapsLock(X.Display* d);
|
|
extern void checkModifier(X.Display* d, int* keycodes, int nkeycodes, int* pressed );
|
|
#endif
|