diff --git a/Makefile b/Makefile index 8d1a4d4..168104a 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ PREFIX = /usr/local APPNAME = NeoLayoutViewer GIT_COMMIT_VERSION=$(shell git log --oneline --max-count=1 | head --bytes=7) -RELEASE_VERSION=1.2 +RELEASE_VERSION=1.3 ENV_FILE=.build_env # compiler options for a debug build @@ -72,18 +72,18 @@ VAPIDIR = --vapidir=vapi/ # Source files SRC = src/version.vala \ - src/main.vala \ - src/neo-window.vala \ - src/config-manager.vala + src/main.vala \ + src/app.vala \ + src/neo-window.vala \ + src/config-manager.vala ifeq ($(WIN),) VALAC_DEBUG_OPTS += -D _NO_WIN VALAC_RELEASE_OPTS += -D _NO_WIN SRC += src/key-overlay.vala \ - src/unique.vala \ - src/keybinding-manager.vala \ - csrc/keysend.c \ - csrc/checkModifier.c + src/keybinding-manager.vala \ + csrc/keysend.c \ + csrc/checkModifier.c endif # Asset files @@ -102,7 +102,7 @@ else endif # Packages -PKGS = --pkg x11 --pkg keysym --pkg gtk+-3.0 --pkg gee-$(GEEVERSION) --pkg gdk-x11-3.0 --pkg posix --pkg unique-3.0 --pkg gdk-3.0 +PKGS = --pkg x11 --pkg keysym --pkg gtk+-3.0 --pkg gee-$(GEEVERSION) --pkg gdk-x11-3.0 --pkg posix --pkg gdk-3.0 # Add some args if tray icon is demanded. ifeq ($(ICON),tray) @@ -182,7 +182,7 @@ build_release: $(SRC) "$(BINDIR)" build_release2: $(SRC) "$(BINDIR)" $(VALAC) --ccode $(VAPIDIR) $(VALAC_RELEASE_OPTS) $(SRC) $(PKGS) $(CC_INCLUDES) gcc $(SRC:.vala=.c) $(CC_INCLUDES) -o "$(BINDIR)/$(BINNAME)$(BINEXT)" \ - `pkg-config --cflags --libs gtk+-3.0 gee-$(GEEVERSION) unique-3.0` + `pkg-config --cflags --libs gtk+-3.0 gee-$(GEEVERSION)` man: man/neo_layout_viewer.1.gz diff --git a/src/app.vala b/src/app.vala new file mode 100644 index 0000000..c95909a --- /dev/null +++ b/src/app.vala @@ -0,0 +1,70 @@ +using Gtk; + +namespace NeoLayoutViewer{ + + public class NeoLayoutViewerApp: Gtk.Application { + + public NeoWindow neo_win = null; + +#if tray + public AppStatusIcon neo_tray; //for gnome2.x, kde(?) +#endif +#if indicator + public NeoIndicator neo_indicator; //for gnome3.x +#endif +#if _NO_WIN + public KeybindingManager manager; +#endif + + public int start_layer = 0; // > 0: keybord events do not change displayed layer + public ConfigManager configm; + + + public NeoLayoutViewerApp(ConfigManager configm) { + Object(application_id: "org.gnome.neo_layout_viewer", + flags: ApplicationFlags.HANDLES_OPEN ); + + this.configm = configm; + } + + protected override void activate () { + if (this.neo_win == null ) { + // Create the window of this application and show it + this.neo_win = new NeoWindow (this); + +#if tray + this.neo_tray = new AppStatusIcon(neo_win); +#endif + +#if indicator + this.neo_indicator = new NeoIndicator(neo_win); +#endif + +#if _NO_WIN + manager = new KeybindingManager(this.neo_win); + manager.bind(configm.getConfig().get("show_shortcut"), ()=>{this.neo_win.toggle();}); + manager.bind(configm.getConfig().get("move_shortcut"), ()=>{this.neo_win.numkeypad_move(0);}); +#endif + + this.add_window(this.neo_win); + }else{ + // reached if app.activate() called by remote instance + this.neo_win.toggle(); + } + } + + public override void open (File[] files, string hint) { + // Threat non-option argument(s) as layer to show at startup. + // Note: This signal is not called in remote-case. + + foreach (File file in files) { + var slayer = file.get_basename(); + this.start_layer = int.parse(slayer); + break; + } + this.activate(); // init neo_win + this.neo_win.show(); + } + + } +} diff --git a/src/config-manager.vala b/src/config-manager.vala index 91e3a64..b9ef007 100644 --- a/src/config-manager.vala +++ b/src/config-manager.vala @@ -3,8 +3,8 @@ namespace NeoLayoutViewer { public class ConfigManager { - public Gee.Map config; - private Gee.Map description; // allow optional commenting config entrys. + public Gee.Map config; + private Gee.Map description; // allow optional commenting config entrys. public string used_config_path; public ConfigManager(string[] paths, string conffile) { @@ -79,25 +79,25 @@ namespace NeoLayoutViewer { if it was not found. */ public void add_defaults(){ - //config.set("show_shortcut","n", "Toggle the visibility of the window."); - addSetting("show_shortcut","q", "Toggle the visibility of the window."); - addSetting("on_top","1", "Show window on top."); - addSetting("position","3", "Window position on startup (num pad orientation)"); + //config.set("show_shortcut", "n", "Toggle the visibility of the window."); + addSetting("show_shortcut", "q", "Toggle the visibility of the window."); + addSetting("on_top", "1", "Show window on top."); + addSetting("position", "3", "Window position on startup (num pad orientation)"); /* width of application window if value between 'resolution width'*max_width and 'resolution width'*min_width */ - addSetting("width","1000","Width in Pixel. Min_width and max_width bound sensible values. "); - addSetting("min_width","0.25", "Minimal width. 1=full screen width"); - addSetting("max_width","0.5", "Maximal width. 1=full screen width"); - addSetting("move_shortcut","n", "Circle through window posisitions."); - addSetting("position_cycle","2 3 6 1 3 9 4 7 8", "List of positions (num pad orientation)\n# The n-th number marks the next position of the window.\n# To limit the used positions to screen corners use\n#position_cycle = 3 3 9 1 3 9 1 7 7"); - addSetting("display_numpad","1", null); - addSetting("display_function_keys","0", null); - addSetting("window_selectable","0","Disable window selection to use the program as virtual keyboard."); - addSetting("window_decoration","0","Show window decoration/border (not recommended)."); - addSetting("screen_width","auto", "Set the resolution of your screen manually, if the automatic detection fails."); - addSetting("screen_height","auto", "Set the resolution of your screen manually, if the automatic detection fails."); - addSetting("show_on_startup","1", "Show window on startup."); - addSetting("asset_folder","./assets", "Default lookup folder image data."); + addSetting("width", "1000", "Width in Pixel. Min_width and max_width bound sensible values. "); + addSetting("min_width", "0.25", "Minimal width. 1=full screen width"); + addSetting("max_width", "0.5", "Maximal width. 1=full screen width"); + addSetting("move_shortcut", "n", "Circle through window posisitions."); + addSetting("position_cycle", "2 3 6 1 3 9 4 7 8", "List of positions (num pad orientation)\n# The n-th number marks the next position of the window.\n# To limit the used positions to screen corners use\n#position_cycle = 3 3 9 1 3 9 1 7 7"); + addSetting("display_numpad", "1", null); + addSetting("display_function_keys", "0", null); + addSetting("window_selectable", "0", "Disable window selection to use the program as virtual keyboard."); + addSetting("window_decoration", "0", "Show window decoration/border (not recommended)."); + addSetting("screen_width", "auto", "Set the resolution of your screen manually, if the automatic detection fails."); + addSetting("screen_height", "auto", "Set the resolution of your screen manually, if the automatic detection fails."); + addSetting("show_on_startup", "1", "Show window on startup."); + addSetting("asset_folder", "./assets", "Default lookup folder image data."); } /* @@ -105,8 +105,8 @@ namespace NeoLayoutViewer { intern values overrides external values. */ private void add_intern_values() { - config.set("numpad_width","350"); - config.set("function_keys_height","30"); + config.set("numpad_width", "350"); + config.set("function_keys_height", "30"); } private bool search_config_file(string conffile) { @@ -166,7 +166,7 @@ namespace NeoLayoutViewer { split = regex.split(line); if(split.length>1){ - this.config.set(split[0].strip(),split[1].strip()); + this.config.set(split[0].strip(), split[1].strip()); } } } catch (GLib.IOError e) { diff --git a/src/indicator.vala b/src/indicator.vala index 58fcc3a..e206434 100644 --- a/src/indicator.vala +++ b/src/indicator.vala @@ -44,43 +44,43 @@ namespace NeoLayoutViewer { menuMain.append(menuAbout); var menuQuit = new ImageMenuItem.from_stock(Stock.QUIT, null); - menuQuit.activate.connect(Gtk.main_quit); + menuQuit.activate.connect(NeoLayoutViewer.quit); menuMain.append(menuQuit); #else - var anzeigenBox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 2); - var anzeigenLabel = new Gtk.Label.with_mnemonic("A_nzeigen"); - var anzeigenMenuItem = new Gtk.MenuItem(); - //anzeigenBox.add(anzeigenIcon); - anzeigenLabel.set_xalign(0.0f); - anzeigenBox.pack_end(anzeigenLabel, true, true, 0); - anzeigenMenuItem.add(anzeigenBox); + var anzeigenBox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 2); + var anzeigenLabel = new Gtk.Label.with_mnemonic("A_nzeigen"); + var anzeigenMenuItem = new Gtk.MenuItem(); + //anzeigenBox.add(anzeigenIcon); + anzeigenLabel.set_xalign(0.0f); + anzeigenBox.pack_end(anzeigenLabel, true, true, 0); + anzeigenMenuItem.add(anzeigenBox); anzeigenMenuItem.activate.connect(() => { this.neo_win.toggle(); }); - menuMain.append(anzeigenMenuItem); + menuMain.append(anzeigenMenuItem); - var aboutBox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 2); + var aboutBox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 2); var aboutIcon = new Gtk.Image.from_icon_name( "help-about", IconSize.SMALL_TOOLBAR); - var aboutLabel = new Gtk.Label.with_mnemonic("_About"); - var aboutMenuItem = new Gtk.MenuItem(); - aboutLabel.set_use_underline(true); - aboutLabel.set_xalign(0.0f); - aboutBox.pack_start(aboutIcon, false, false, 0); - aboutBox.pack_end(aboutLabel, true, true, 0); - aboutMenuItem.add(aboutBox); + var aboutLabel = new Gtk.Label.with_mnemonic("_About"); + var aboutMenuItem = new Gtk.MenuItem(); + aboutLabel.set_use_underline(true); + aboutLabel.set_xalign(0.0f); + aboutBox.pack_start(aboutIcon, false, false, 0); + aboutBox.pack_end(aboutLabel, true, true, 0); + aboutMenuItem.add(aboutBox); aboutMenuItem.activate.connect(NeoLayoutViewer.about_dialog); - menuMain.append(aboutMenuItem); + menuMain.append(aboutMenuItem); - var quitBox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 2); + var quitBox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 2); var quitIcon = new Gtk.Image.from_icon_name( "application-exit", IconSize.SMALL_TOOLBAR); - var quitLabel = new Gtk.Label.with_mnemonic("_QUIT"); - var quitMenuItem = new Gtk.MenuItem(); - quitLabel.set_use_underline(true); - quitLabel.set_xalign(0.0f); - quitBox.pack_start(quitIcon, false, false, 0); - quitBox.pack_end(quitLabel, true, true, 0); - quitMenuItem.add(quitBox); - quitMenuItem.activate.connect(Gtk.main_quit); - menuMain.append(quitMenuItem); + var quitLabel = new Gtk.Label.with_mnemonic("_QUIT"); + var quitMenuItem = new Gtk.MenuItem(); + quitLabel.set_use_underline(true); + quitLabel.set_xalign(0.0f); + quitBox.pack_start(quitIcon, false, false, 0); + quitBox.pack_end(quitLabel, true, true, 0); + quitMenuItem.add(quitBox); + quitMenuItem.activate.connect(NeoLayoutViewer.quit); + menuMain.append(quitMenuItem); #endif menuMain.show_all(); diff --git a/src/main.vala b/src/main.vala index 5b53e61..857c173 100644 --- a/src/main.vala +++ b/src/main.vala @@ -2,49 +2,18 @@ using X; namespace NeoLayoutViewer{ - public NeoWindow neo_win; -#if _NO_WIN - public KeybindingManager manager; -#endif public ConfigManager configm; - -#if tray - public AppStatusIcon neo_tray; //for gnome2.x, kde(?) -#endif -#if indicator - public NeoIndicator neo_indicator; //for gnome3.x -#endif + public NeoLayoutViewerApp app; public static int main(string[] args) { - string slayer; - - if (args.length < 2) { - slayer = "1"; - } else { - slayer = args[1]; - } - - Gtk.init(ref args); - - - //Get program path (no binding for getcwd found…) - string path = ""; - try { - var regex = new Regex("[^/]*$"); - path = regex.replace(args[0],-1,0,""); - } catch (RegexError e) { - path = ""; - } - debug(@"Path: $path"); - 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"); + 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") ); @@ -53,61 +22,47 @@ namespace NeoLayoutViewer{ stdout.flush(); return 0; } - //add path to asset folder - configm.getConfig().set("asset_folder",asset_folder); + // Update asset folder in config + configm.getConfig().set("asset_folder", asset_folder); debug(@"Asset folder: $(asset_folder)\n"); + // Init application window. + app = new NeoLayoutViewerApp (configm); - - neo_win = new NeoWindow (slayer, configm.getConfig()); - -#if _NO_WIN - var app = showPreviousInstance("org.gnome.neo_layout_viewer", neo_win); - - if (app == null) { - return 0; + 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"); + app.activate(); + }else{ + return app.run(args); } -#endif - -#if _NO_WIN - manager = new KeybindingManager(neo_win); -#endif - -#if tray - neo_tray = new AppStatusIcon(neo_win); -#endif - -#if indicator - neo_indicator = new NeoIndicator(neo_win); -#endif - -#if _NO_WIN - manager.bind(configm.getConfig().get("show_shortcut"), ()=>{neo_win.toggle();}); - manager.bind(configm.getConfig().get("move_shortcut"), ()=>{neo_win.numkeypad_move(0);}); -#endif - - //move window (Fehlerquelle: config von configm ist im allgemeinen nicht gleich neo_win.config?! Derzeit gleiches Objekt.) - - Gtk.main(); return 0; } + private static void quit() { + app.quit(); // stops app.run() + } -/* This function create the about dialog in - tray menu or indicator menu */ private static void about_dialog() { - var about = new Gtk.AboutDialog(); - about.set_logo(neo_win.getIcon()); - about.set_destroy_with_parent (true); - about.set_transient_for (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. + /* This function create the about dialog in + tray menu or indicator menu */ + 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 - funwithkinect-AT-googlemail.com + funwithkinect@googlemail.com Tastenkombinationen: @@ -117,26 +72,26 @@ Tastenkombinationen: Verwendete Konfigurationsdatei: %s""".printf( - neo_win.config.get("show_shortcut"), - neo_win.config.get("move_shortcut"), + app.neo_win.config.get("show_shortcut"), + app.neo_win.config.get("move_shortcut"), configm.used_config_path) - ); - about.set_copyright("LGPLv3"); - center_window(about); - about.run(); - about.hide(); - about.destroy(); + ); + about.set_copyright("LGPLv3"); + center_window(about); + about.run(); + about.hide(); + about.destroy(); - } + } private void center_window(Gtk.Window win){ - int screen_width = neo_win.get_screen_width(); - int screen_height = neo_win.get_screen_height(); - int x,y,w,h; + 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); + win.move(x, y); } /* Check given path and shared files folders for the asset folder. @@ -144,7 +99,7 @@ Tastenkombinationen: @return: assed folder or null. */ private static string? search_asset_folder(string path){ - const string filename = "/icons/Neo-Icon.png"; + /*const*/ string filename = "/icons/Neo-Icon.png"; string[] paths = { path, // path from config file diff --git a/src/neo-window.vala b/src/neo-window.vala index a48c42c..fb08b75 100644 --- a/src/neo-window.vala +++ b/src/neo-window.vala @@ -27,7 +27,7 @@ namespace NeoLayoutViewer { } } - public class NeoWindow : Gtk.Window { + public class NeoWindow : Gtk.ApplicationWindow { private Gtk.Image image; public Gtk.Label status; @@ -35,7 +35,12 @@ namespace NeoLayoutViewer { public Gee.List modifier_key_images; // for modifier which didn't toggle a layout layer. I.e. ctrl, alt. public Gee.Map config; - public int layer; + public bool fix_layer = false; + private int _layer = 1; + public int layer { + get { return _layer; } + set { if (value < 1 || value > 6) { _layer = 1; }else{ _layer = value; } } + } public int[] active_modifier_by_keyboard; public int[] active_modifier_by_mouse; public int numpad_width; @@ -54,51 +59,61 @@ namespace NeoLayoutViewer { /* Falls ein Modifier (oder eine andere Taste) gedrückt wird und schon Modifier gedrückt sind, gibt die Map an, welche Ebene dann aktiviert ist. */ private short[,] MODIFIER_MAP = { - {0,1,2,3,4,5}, - {1,1,4,3,4,5}, - {2,4,2,5,4,5}, - {3,3,5,3,4,5} }; + {0, 1, 2, 3, 4, 5}, + {1, 1, 4, 3, 4, 5}, + {2, 4, 2, 5, 4, 5}, + {3, 3, 5, 3, 4, 5} }; - /* [0,1]^3->{0,5}, Bildet aktive Modifier auf angezeigte Ebene ab. - Interpretationsreihenfolge der Dimensionen: Shift,Neo-Mod3, Neo-Mod4. */ + /* [0, 1]^3->{0, 5}, Bildet aktive Modifier auf angezeigte Ebene ab. + Interpretationsreihenfolge der Dimensionen: Shift, Neo-Mod3, Neo-Mod4. */ private short[,,] MODIFIER_MAP2 = { { {0 , 3}, {2 , 5 } }, // 000, 001; 010, 011 { {1 , 3}, {4 , 5}} // 100, 101; 110, 111 }; + /* {0, 5} -> [0, 1]^3 */ + private short[,] LAYER_TO_MODIFIERS = { + {0 , 0, 0}, // 0 + {1 , 0, 0}, // 1 + {0 , 1, 0}, // 2 + {0 , 0, 1}, // 3 + {1 , 1, 0}, // 4 + {1 , 1, 1} // 5 + }; + /* Analog zu oben für den Fall, dass eine Taste losgelassen wird. Funktioniert nicht immer. Ist beispielsweise ShiftL und ShiftR gedrückt und eine wird losgelassen, so wechselt die Anzeige zur ersten Ebene. Die Fehler sind imo zu vernachlässigen. */ private short[,] MODIFIER_MAP_RELEASE = { - {0,0,0,0,0,0}, - {0,0,2,3,2,5}, - {0,1,0,3,1,3}, - {0,1,2,0,4,2} }; + {0, 0, 0, 0, 0, 0}, + {0, 0, 2, 3, 2, 5}, + {0, 1, 0, 3, 1, 3}, + {0, 1, 2, 0, 4, 2} }; /* Modifier können per Tastatur und Maus aktiviert werden. Diese Abbildung entscheidet, wie bei einer Zustandsänderung verfahren werden soll. - k,m,K,M ∈ {0,1}. + k, m, K, M ∈ {0, 1}. k - Taste wurde gedrückt gehalten m - Taste wurde per Mausklick selektiert. K - Taste wird gedrückt M - Taste wird per Mausklick selektiert. - k' = f(k,m,K,M). Und wegen der Symmetrie(!) - m' = f(m,k,M,K) + k' = f(k, m, K, M). Und wegen der Symmetrie(!) + m' = f(m, k, M, K) Siehe auch change_active_modifier(…). */ private short[,,,] MODIFIER_KEYBOARD_MOUSE_MAP = { - // k = f(k,m,K,M,) and m = f(m,k,M,K) - { { {0, 0} , {1, 0} } , // 0000, 0001; 0010, 0011; - { {0, 0} , {1, 1} } }, // 0100, 0101; 0110, 0111(=swap); + // k = f(k, m, K, M, ) and m = f(m, k, M, K) + { { {0, 0} , {1, 0} } , // 0000, 0001; 0010, 0011; + { {0, 0} , {1, 1} } }, // 0100, 0101; 0110, 0111(=swap); { { {0, 0} , {1, 0} } , //1000, 1001; 1010, 1011(=swap); { {0, 0} , {1, 1} } }//1100, 1101; 1110, 1111; //k=m=1 should be impossible }; - public NeoWindow (string slayer, Gee.Map config) { - this.config = config; + public NeoWindow (NeoLayoutViewerApp app) { + this.config = app.configm.getConfig(); this.minimized = true; /* Set window type to let tiling window manager the chance @@ -118,51 +133,54 @@ namespace NeoLayoutViewer { this.MODIFIER_MASK = { 0, Gdk.ModifierType.SHIFT_MASK, //1 - Gdk.ModifierType.MOD5_MASK,//128 + Gdk.ModifierType.MOD5_MASK, //128 Gdk.ModifierType.MOD3_MASK, //32 Gdk.ModifierType.CONTROL_MASK, Gdk.ModifierType.MOD1_MASK // Alt-Mask do not work :-( }; - this.active_modifier_by_keyboard = {0,0,0,0,0,0}; - this.active_modifier_by_mouse = {0,0,0,0,0,0}; + this.active_modifier_by_keyboard = {0, 0, 0, 0, 0, 0}; + this.active_modifier_by_mouse = {0, 0, 0, 0, 0, 0}; this.modifier_key_images = new Gee.ArrayList(); - this.position_num = int.max(int.min(int.parse(config.get("position")),9),1); + this.position_num = int.max(int.min(int.parse(this.config.get("position")), 9), 1); //Anlegen des Arrays, welches den Positionsdurchlauf beschreibt. try { var space = new Regex(" "); - string[] split = space.split(config.get("position_cycle")); - position_cycle = new int[int.max(9,split.length)]; + string[] split = space.split(this.config.get("position_cycle")); + position_cycle = new int[int.max(9, split.length)]; for (int i = 0;i < split.length; i++) { - position_cycle[i] = int.max(int.min(int.parse(split[i]),9),1);//Zulässiger Bereich: 1-9 + position_cycle[i] = int.max(int.min(int.parse(split[i]), 9), 1);//Zulässiger Bereich: 1-9 } } catch (RegexError e) { - position_cycle = {3,3,9,1,3,9,1,7,7}; + position_cycle = {3, 3, 9, 1, 3, 9, 1, 7, 7}; } - - this.layer = int.parse(slayer); - if (this.layer < 1 || this.layer > 6) { this.layer = 1; } - + if (app.start_layer > 0 ){ + this.fix_layer = true; + this.layer = app.start_layer; + this.active_modifier_by_mouse[1] = this.LAYER_TO_MODIFIERS[this.layer-1, 0]; + this.active_modifier_by_mouse[2] = this.LAYER_TO_MODIFIERS[this.layer-1, 1]; + this.active_modifier_by_mouse[3] = this.LAYER_TO_MODIFIERS[this.layer-1, 2]; + } // Crawl dimensions of screen/display/monitor // Should be done before load_image_buffer() is called. - screen_dim_auto[0] = (config.get("screen_width") == "auto"); - screen_dim_auto[1] = (config.get("screen_height") == "auto"); + screen_dim_auto[0] = (this.config.get("screen_width") == "auto"); + screen_dim_auto[1] = (this.config.get("screen_height") == "auto"); if (screen_dim_auto[0]) { this.screen_dim[0] = this.get_screen_width(); this.screen_dim_auto[0] = false; // Disables further re-evaluations } else { - this.screen_dim[0] = int.max(1, int.parse(config.get("screen_width"))); + this.screen_dim[0] = int.max(1, int.parse(this.config.get("screen_width"))); } if(screen_dim_auto[1]) { this.screen_dim[1] = this.get_screen_height(); this.screen_dim_auto[1] = false; // Disables further re-evaluations } else { - this.screen_dim[1] = int.max(1, int.parse(config.get("screen_height"))); + this.screen_dim[1] = int.max(1, int.parse(this.config.get("screen_height"))); } @@ -196,42 +214,42 @@ namespace NeoLayoutViewer { //Fenstereigenschaften setzen this.key_press_event.connect(on_key_pressed); this.button_press_event.connect(on_button_pressed); - this.destroy.connect(Gtk.main_quit); + this.destroy.connect(NeoLayoutViewer.quit); //this.set_gravity(Gdk.Gravity.SOUTH); - this.decorated = (config.get("window_decoration") != "0"); + this.decorated = (this.config.get("window_decoration") != "0"); this.skip_taskbar_hint = true; //Icon des Fensters this.icon = this.image_buffer[0]; //Nicht selektierbar (für virtuelle Tastatur) - this.set_accept_focus((config.get("window_selectable") != "0")); + this.set_accept_focus((this.config.get("window_selectable") != "0")); if( this.config.get("show_on_startup") != "0" ){ //Move ist erst nach show() erfolgreich - this.numkeypad_move(int.parse(config.get("position"))); + this.numkeypad_move(int.parse(this.config.get("position"))); this.show(); }else{ this.hide(); - this.numkeypad_move(int.parse(config.get("position"))); + this.numkeypad_move(int.parse(this.config.get("position"))); } } public override void show() { this.minimized = false; - this.move(this.position_on_hide_x,this.position_on_hide_y); + this.move(this.position_on_hide_x, this.position_on_hide_y); debug(@"Show window on $(this.position_on_hide_x), $(this.position_on_hide_y)\n"); base.show(); - this.move(this.position_on_hide_x,this.position_on_hide_y); + this.move(this.position_on_hide_x, this.position_on_hide_y); /* Second move fixes issue for i3-wm(?). The move() before show() moves the current window as expected, but somehow does not propagate this values correcty to the wm. => The next hide() call will fetch wrong values and a second show() call plaes the window in the middle of the screen. */ - if (config.get("on_top") == "1") { + if (this.config.get("on_top") == "1") { this.set_keep_above(true); } else { this.present(); @@ -267,7 +285,7 @@ namespace NeoLayoutViewer { int screen_width = this.get_screen_width(); int screen_height = this.get_screen_height(); - int x,y,w,h; + int x, y, w, h; this.get_size(out w, out h); switch(pos) { @@ -319,7 +337,7 @@ namespace NeoLayoutViewer { this.position_on_hide_y = y; - this.move(x,y); + this.move(x, y); } public Gdk.Pixbuf open_image (int layer) { @@ -342,26 +360,26 @@ namespace NeoLayoutViewer { int screen_width = this.get_screen_width(); //Gdk.Screen.width(); int max_width = (int) (double.parse(this.config.get("max_width")) * screen_width); int min_width = (int) (double.parse(this.config.get("min_width")) * screen_width); - int width = int.min(int.max(int.parse(config.get("width")),min_width),max_width); + int width = int.min(int.max(int.parse(this.config.get("width")), min_width), max_width); int w, h; - this.numpad_width = int.parse(config.get("numpad_width")); - this.function_keys_height = int.parse(config.get("function_keys_height")); + this.numpad_width = int.parse(this.config.get("numpad_width")); + this.function_keys_height = int.parse(this.config.get("function_keys_height")); for (int i = 1; i < 7; i++) { this.image_buffer[i] = open_image(i); //Funktionstasten ausblennden, falls gefordert. - if (config.get("display_function_keys") == "0") { - var tmp = new Gdk.Pixbuf(image_buffer[i].colorspace,image_buffer[i].has_alpha,image_buffer[i].bits_per_sample, image_buffer[i].width ,image_buffer[i].height-function_keys_height); - this.image_buffer[i].copy_area(0,function_keys_height,tmp.width,tmp.height,tmp,0,0); + if (this.config.get("display_function_keys") == "0") { + var tmp = new Gdk.Pixbuf(image_buffer[i].colorspace, image_buffer[i].has_alpha, image_buffer[i].bits_per_sample, image_buffer[i].width , image_buffer[i].height-function_keys_height); + this.image_buffer[i].copy_area(0, function_keys_height, tmp.width, tmp.height, tmp, 0, 0); this.image_buffer[i] = tmp; } //Numpad-Teil abschneiden, falls gefordert. - if (config.get("display_numpad") == "0") { - var tmp = new Gdk.Pixbuf(image_buffer[i].colorspace,image_buffer[i].has_alpha,image_buffer[i].bits_per_sample, image_buffer[i].width-numpad_width ,image_buffer[i].height); - this.image_buffer[i].copy_area(0,0,tmp.width,tmp.height,tmp,0,0); + if (this.config.get("display_numpad") == "0") { + var tmp = new Gdk.Pixbuf(image_buffer[i].colorspace, image_buffer[i].has_alpha, image_buffer[i].bits_per_sample, image_buffer[i].width-numpad_width , image_buffer[i].height); + this.image_buffer[i].copy_area(0, 0, tmp.width, tmp.height, tmp, 0, 0); this.image_buffer[i] = tmp; } @@ -376,7 +394,7 @@ namespace NeoLayoutViewer { private bool on_key_pressed (Widget source, Gdk.EventKey key) { // If the key pressed was q, quit, else show the next page if (key.str == "q") { - Gtk.main_quit (); + NeoLayoutViewer.quit(); } if (key.str == "h") { @@ -455,12 +473,20 @@ namespace NeoLayoutViewer { public void redraw() { var tlayer = this.layer; - this.layer = this.MODIFIER_MAP2[ - this.active_modifier_by_keyboard[1] | this.active_modifier_by_mouse[1], //shift - this.active_modifier_by_keyboard[2] | this.active_modifier_by_mouse[2], //neo-mod3 - this.active_modifier_by_keyboard[3] | this.active_modifier_by_mouse[3] //neo-mod4 + if (this.fix_layer) { // Ignore key events + this.layer = this.MODIFIER_MAP2[ + this.active_modifier_by_mouse[1], //shift + this.active_modifier_by_mouse[2], //neo-mod3 + this.active_modifier_by_mouse[3] //neo-mod4 ] + 1; + }else{ + this.layer = this.MODIFIER_MAP2[ + this.active_modifier_by_keyboard[1] | this.active_modifier_by_mouse[1], //shift + this.active_modifier_by_keyboard[2] | this.active_modifier_by_mouse[2], //neo-mod3 + this.active_modifier_by_keyboard[3] | this.active_modifier_by_mouse[3] //neo-mod4 + ] + 1; + } // check, which extra modifier is pressed and update. foreach (var modkey in modifier_key_images) { modkey.change( @@ -511,8 +537,8 @@ namespace NeoLayoutViewer { this.check_modifier(iet1); } - public int get_screen_width(){ - // Return value derived from config.get("screen_width")) or Gdk.Screen.width() + public int get_screen_width(){ + // Return value derived from config.get("screen_width")) or Gdk.Screen.width() if( this.screen_dim_auto[0] ){ //Re-evaluate @@ -535,11 +561,11 @@ namespace NeoLayoutViewer { screen_dim[0] = geometry.width; #endif } - return screen_dim[0]; - } + return screen_dim[0]; + } - public int get_screen_height(){ - // Return value derived from config.get("screen_height")) or Gdk.Screen.height() + public int get_screen_height(){ + // Return value derived from config.get("screen_height")) or Gdk.Screen.height() if( this.screen_dim_auto[1] ){ //Re-evaluate @@ -562,8 +588,8 @@ namespace NeoLayoutViewer { screen_dim[1] = geometry.height; #endif } - return screen_dim[1]; - } + return screen_dim[1]; + } } //End class NeoWindow diff --git a/src/tray.vala b/src/tray.vala index b3448f0..0a01646 100644 --- a/src/tray.vala +++ b/src/tray.vala @@ -33,7 +33,8 @@ namespace NeoLayoutViewer { menuMain.append(menuAbout); var menuQuit = new ImageMenuItem.from_stock(Stock.QUIT, null); - menuQuit.activate.connect(Gtk.main_quit); + //menuQuit.activate.connect(Gtk.main_quit); + menuQuit.activate.connect(NeoLayoutViewer.quit); menuMain.append(menuQuit); #else @@ -58,7 +59,8 @@ namespace NeoLayoutViewer { quitBox.pack_start(quitIcon, false, false, 0); quitBox.pack_end(quitLabel, true, true, 0); quitMenuItem.add(quitBox); - quitMenuItem.activate.connect(Gtk.main_quit); + //quitMenuItem.activate.connect(Gtk.main_quit); + quitMenuItem.activate.connect(NeoLayoutViewer.quit); menuMain.append(quitMenuItem); #endif diff --git a/src/unique.vala b/src/unique.vala deleted file mode 100644 index 5eaada3..0000000 --- a/src/unique.vala +++ /dev/null @@ -1,29 +0,0 @@ -using Gtk; -using Unique; - -namespace NeoLayoutViewer { - - public const int SHOW=1000; - - public static Unique.App? showPreviousInstance(string name, Gtk.Window win){ - var app = new Unique.App(name, null); - app.add_command ("Show application", SHOW); - if( app.is_running ){ - //where is already a running instance - debug("Application already running. Show window of other instance."); - app.send_message(SHOW,null); - return null; - } - - app.message_received.connect( (t, command, data, time) =>{ - if(command == SHOW){ - ((NeoWindow)win).toggle(); - } - return Unique.Response.OK; - }); - - return app; - } - -} - diff --git a/vapi/unique-3.0.deps b/vapi/unique-3.0.deps deleted file mode 100644 index e762c58..0000000 --- a/vapi/unique-3.0.deps +++ /dev/null @@ -1,8 +0,0 @@ -gio-2.0 -cairo -atk -pango -gdk-3.0 -gdk-pixbuf-2.0 -gtk+-3.0 - diff --git a/vapi/unique-3.0.vapi b/vapi/unique-3.0.vapi deleted file mode 100644 index 532d4aa..0000000 --- a/vapi/unique-3.0.vapi +++ /dev/null @@ -1,94 +0,0 @@ -/* unique-1.0.vapi generated by vapigen, do not modify. */ - -namespace Unique { - [CCode (cheader_filename = "unique/unique.h")] - public class App : GLib.Object { - [CCode (has_construct_function = false)] - public App (string name, string? startup_id); - public void add_command (string command_name, int command_id); - public Unique.Response send_message (int command_id, Unique.MessageData? message_data); - public void watch_window (Gtk.Window window); - [CCode (has_construct_function = false)] - public App.with_commands (string name, string? startup_id, ...); - [NoAccessorMethod] - public bool is_running { get; } - [NoAccessorMethod] - public string name { owned get; construct; } - [NoAccessorMethod] - public Gdk.Screen screen { owned get; set construct; } - [NoAccessorMethod] - public string startup_id { owned get; construct; } - public virtual signal Unique.Response message_received (int command, Unique.MessageData message_data, uint time_); - } - [CCode (cheader_filename = "unique/unique.h")] - public class Backend : GLib.Object { - public weak string name; - public weak Unique.App parent; - public weak Gdk.Screen screen; - public weak string startup_id; - public uint workspace; - [CCode (has_construct_function = false)] - protected Backend (); - public static unowned Unique.Backend create (); - public unowned string get_name (); - public unowned Gdk.Screen get_screen (); - public unowned string get_startup_id (); - public uint get_workspace (); - public virtual bool request_name (); - public virtual Unique.Response send_message (int command_id, Unique.MessageData message_data, uint time_); - public void set_name (string name); - public void set_screen (Gdk.Screen screen); - public void set_startup_id (string startup_id); - } - [CCode (cheader_filename = "unique/unique.h", copy_function = "unique_message_data_copy", type_id = "unique_message_data_get_type ()")] - [Compact] - public class MessageData { - [CCode (has_construct_function = false)] - public MessageData (); - public Unique.MessageData copy (); - public unowned uchar[] @get (size_t length); - public unowned string get_filename (); - public unowned Gdk.Screen get_screen (); - public unowned string get_startup_id (); - public string get_text (); - [CCode (array_length = false)] - public string[] get_uris (); - public uint get_workspace (); - public void @set ([CCode (array_length_type = "gsize")] uchar[]? data); - public void set_filename (string filename); - public bool set_text (string str, ssize_t length); - public bool set_uris ([CCode (array_length = false)] string[] uris); - } - [CCode (cheader_filename = "unique/unique.h", cprefix = "UNIQUE_")] - public enum Command { - INVALID, - ACTIVATE, - NEW, - OPEN, - CLOSE - } - [CCode (cheader_filename = "unique/unique.h", cprefix = "UNIQUE_RESPONSE_")] - public enum Response { - INVALID, - OK, - CANCEL, - FAIL, - PASSTHROUGH - } - [CCode (cheader_filename = "unique/unique.h")] - public const string API_VERSION_S; - [CCode (cheader_filename = "unique/unique.h")] - public const string DEFAULT_BACKEND_S; - [CCode (cheader_filename = "unique/unique.h")] - public const int MAJOR_VERSION; - [CCode (cheader_filename = "unique/unique.h")] - public const int MICRO_VERSION; - [CCode (cheader_filename = "unique/unique.h")] - public const int MINOR_VERSION; - [CCode (cheader_filename = "unique/unique.h")] - public const string PROTOCOL_VERSION_S; - [CCode (cheader_filename = "unique/unique.h")] - public const int VERSION_HEX; - [CCode (cheader_filename = "unique/unique.h")] - public const string VERSION_S; -}