2011-10-13 19:15:00 +02:00
using Gtk ;
using Gdk ;
using X ; //keysym.h
using Posix ; //system-calls
2013-09-18 20:32:40 +02:00
namespace NeoLayoutViewer {
2011-10-13 19:15:00 +02:00
2013-09-18 20:32:40 +02:00
public class Modkey {
2011-10-17 20:38:29 +02:00
public Gtk . Image modKeyImage ;
public int modifier_index ;
public int active ;
2013-09-18 20:32:40 +02:00
public Modkey ( ref Gtk . Image i , int m ) {
2011-10-17 20:38:29 +02:00
this . modKeyImage = i ;
this . modifier_index = m ;
this . active = 0 ;
}
2013-09-18 20:32:40 +02:00
public void change ( int new_state ) {
if ( new_state = = this . active ) return ;
2011-10-17 20:38:29 +02:00
this . active = new_state ;
2013-09-18 20:32:40 +02:00
if ( this . active = = 0 ) {
2011-10-17 20:38:29 +02:00
modKeyImage . hide ( ) ;
} else {
modKeyImage . show ( ) ;
}
}
}
2019-01-25 03:22:18 +01:00
public class NeoWindow : Gtk . ApplicationWindow {
2011-10-13 19:15:00 +02:00
private Gtk . Image image ;
public Gtk . Label status ;
private Gdk . Pixbuf [ ] image_buffer ;
2011-10-17 20:38:29 +02:00
public Gee . List < Modkey > modifier_key_images ; // for modifier which didn't toggle a layout layer. I.e. ctrl, alt.
2011-10-21 00:45:41 +02:00
public Gee . Map < string , string > config ;
2011-10-13 19:15:00 +02:00
2019-01-25 03:22:18 +01:00
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 ; } }
}
2011-10-16 19:09:33 +02:00
public int [ ] active_modifier_by_keyboard ;
public int [ ] active_modifier_by_mouse ;
2011-10-17 15:17:34 +02:00
public int numpad_width ;
2011-10-17 20:38:29 +02:00
public int function_keys_height ;
2011-10-13 19:15:00 +02:00
private bool minimized ;
private int position_num ;
private int [ ] position_cycle ;
2011-10-18 09:46:19 +02:00
private int position_on_hide_x ;
private int position_on_hide_y ;
2011-10-21 00:37:43 +02:00
private int screen_dim [ 2 ] ;
private bool screen_dim_auto [ 2 ] ; //if true, x/y screen dimension will detect on every show event.
2011-10-13 19:15:00 +02:00
2011-10-17 20:38:29 +02:00
/* Die Neo-Modifier unterscheiden sich zum Teil von den Normalen, für die Konstanten definiert sind. Bei der Initialisierung werden aus den Standardkonstanen die Konstanten für die Ebenen 1-6 berechnet.*/
2011-10-13 19:15:00 +02:00
public int [ ] NEO_MODIFIER_MASK ;
public int [ ] MODIFIER_MASK ;
2011-10-14 22:10:11 +02:00
/* 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. */
2011-10-13 19:15:00 +02:00
private short [ , ] MODIFIER_MAP = {
2019-01-25 03:22:18 +01:00
{ 0 , 1 , 2 , 3 , 4 , 5 } ,
{ 1 , 1 , 4 , 3 , 4 , 5 } ,
{ 2 , 4 , 2 , 5 , 4 , 5 } ,
{ 3 , 3 , 5 , 3 , 4 , 5 } } ;
2011-10-13 19:15:00 +02:00
2019-01-25 03:22:18 +01:00
/ * [ 0 , 1 ] ^ 3 - > { 0 , 5 } , Bildet aktive Modifier auf angezeigte Ebene ab .
Interpretationsreihenfolge der Dimensionen : Shift , Neo - Mod3 , Neo - Mod4 . * /
2011-10-13 19:15:00 +02:00
private short [ , , ] MODIFIER_MAP2 = {
2011-10-14 22:10:11 +02:00
{ { 0 , 3 } , { 2 , 5 } } , // 000, 001; 010, 011
{ { 1 , 3 } , { 4 , 5 } } // 100, 101; 110, 111
2011-10-13 19:15:00 +02:00
} ;
2019-01-25 03:22:18 +01:00
/* {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
} ;
2011-10-14 22:10:11 +02:00
/ * Analog zu oben für den Fall , dass eine Taste losgelassen wird . Funktioniert nicht immer .
2011-10-17 20:38:29 +02:00
Ist beispielsweise ShiftL und ShiftR gedrückt und eine wird losgelassen , so wechselt die Anzeige zur ersten Ebene .
2011-10-14 22:10:11 +02:00
Die Fehler sind imo zu vernachlässigen .
* /
2011-10-13 19:15:00 +02:00
private short [ , ] MODIFIER_MAP_RELEASE = {
2019-01-25 03:22:18 +01:00
{ 0 , 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 2 , 3 , 2 , 5 } ,
{ 0 , 1 , 0 , 3 , 1 , 3 } ,
{ 0 , 1 , 2 , 0 , 4 , 2 } } ;
2011-10-13 19:15:00 +02:00
2017-11-12 12:59:17 +01:00
/ *
Modifier können per Tastatur und Maus aktiviert werden . Diese Abbildung entscheidet ,
wie bei einer Zustandsänderung verfahren werden soll .
2019-01-25 03:22:18 +01:00
k , m , K , M ∈ { 0 , 1 } .
2017-11-12 12:59:17 +01:00
k - Taste wurde gedrückt gehalten
m - Taste wurde per Mausklick selektiert .
K - Taste wird gedrückt
M - Taste wird per Mausklick selektiert .
2019-01-25 03:22:18 +01:00
k ' = f ( k , m , K , M ) . Und wegen der Symmetrie ( ! )
m ' = f ( m , k , M , K )
2017-11-12 12:59:17 +01:00
Siehe auch change_active_modifier ( … ) .
* /
2011-10-16 19:09:33 +02:00
private short [ , , , ] MODIFIER_KEYBOARD_MOUSE_MAP = {
2019-01-25 03:22:18 +01:00
// 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);
2011-10-16 19:09:33 +02:00
{ { { 0 , 0 } , { 1 , 0 } } , //1000, 1001; 1010, 1011(=swap);
{ { 0 , 0 } , { 1 , 1 } } } //1100, 1101; 1110, 1111; //k=m=1 should be impossible
} ;
2011-10-16 19:14:47 +02:00
2019-01-25 03:22:18 +01:00
public NeoWindow ( NeoLayoutViewerApp app ) {
this . config = app . configm . getConfig ( ) ;
2011-10-13 19:15:00 +02:00
this . minimized = true ;
2011-10-14 22:10:11 +02:00
2014-06-09 22:44:45 +02:00
/ * Set window type to let tiling window manager the chance
* to float the window automatically .
* /
//this.type_hint = Gdk.WindowTypeHint.SPLASHSCREEN;
this . type_hint = Gdk . WindowTypeHint . UTILITY ;
2011-10-13 19:15:00 +02:00
this . NEO_MODIFIER_MASK = {
0 ,
Gdk . ModifierType . SHIFT_MASK , //1
Gdk . ModifierType . MOD5_MASK + Gdk . ModifierType . LOCK_MASK , //128+2
Gdk . ModifierType . MOD3_MASK , //32
Gdk . ModifierType . MOD5_MASK + Gdk . ModifierType . LOCK_MASK + Gdk . ModifierType . SHIFT_MASK , //128+2+1
Gdk . ModifierType . MOD5_MASK + Gdk . ModifierType . LOCK_MASK + Gdk . ModifierType . MOD3_MASK //128+2+32
} ;
this . MODIFIER_MASK = {
2011-10-14 22:10:11 +02:00
0 ,
Gdk . ModifierType . SHIFT_MASK , //1
2019-01-25 03:22:18 +01:00
Gdk . ModifierType . MOD5_MASK , //128
2011-10-14 22:10:11 +02:00
Gdk . ModifierType . MOD3_MASK , //32
Gdk . ModifierType . CONTROL_MASK ,
Gdk . ModifierType . MOD1_MASK // Alt-Mask do not work :-(
2011-10-13 19:15:00 +02:00
} ;
2019-01-25 03:22:18 +01:00
this . active_modifier_by_keyboard = { 0 , 0 , 0 , 0 , 0 , 0 } ;
this . active_modifier_by_mouse = { 0 , 0 , 0 , 0 , 0 , 0 } ;
2011-10-13 19:15:00 +02:00
2011-10-17 20:38:29 +02:00
this . modifier_key_images = new Gee . ArrayList < Modkey > ( ) ;
2019-01-25 03:22:18 +01:00
this . position_num = int . max ( int . min ( int . parse ( this . config . get ( " position " ) ) , 9 ) , 1 ) ;
2013-09-13 20:22:53 +02:00
2011-10-13 19:15:00 +02:00
//Anlegen des Arrays, welches den Positionsdurchlauf beschreibt.
2013-09-18 20:32:40 +02:00
try {
2011-10-14 22:10:11 +02:00
var space = new Regex ( " " ) ;
2019-01-25 03:22:18 +01:00
string [ ] split = space . split ( this . config . get ( " position_cycle " ) ) ;
position_cycle = new int [ int . max ( 9 , split . length ) ] ;
2013-09-18 20:32:40 +02:00
for ( int i = 0 ; i < split . length ; i + + ) {
2019-01-25 03:22:18 +01:00
position_cycle [ i ] = int . max ( int . min ( int . parse ( split [ i ] ) , 9 ) , 1 ) ; //Zulässiger Bereich: 1-9
2011-10-14 22:10:11 +02:00
}
2011-10-13 19:15:00 +02:00
} catch ( RegexError e ) {
2019-01-25 03:22:18 +01:00
position_cycle = { 3 , 3 , 9 , 1 , 3 , 9 , 1 , 7 , 7 } ;
2011-10-13 19:15:00 +02:00
}
2019-01-25 03:22:18 +01:00
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 ] ;
}
2017-11-17 16:56:34 +01:00
// Crawl dimensions of screen/display/monitor
// Should be done before load_image_buffer() is called.
2019-01-25 03:22:18 +01:00
screen_dim_auto [ 0 ] = ( this . config . get ( " screen_width " ) = = " auto " ) ;
screen_dim_auto [ 1 ] = ( this . config . get ( " screen_height " ) = = " auto " ) ;
2017-11-17 16:56:34 +01:00
if ( screen_dim_auto [ 0 ] ) {
this . screen_dim [ 0 ] = this . get_screen_width ( ) ;
this . screen_dim_auto [ 0 ] = false ; // Disables further re-evaluations
} else {
2019-01-25 03:22:18 +01:00
this . screen_dim [ 0 ] = int . max ( 1 , int . parse ( this . config . get ( " screen_width " ) ) ) ;
2017-11-17 16:56:34 +01:00
}
if ( screen_dim_auto [ 1 ] ) {
this . screen_dim [ 1 ] = this . get_screen_height ( ) ;
this . screen_dim_auto [ 1 ] = false ; // Disables further re-evaluations
} else {
2019-01-25 03:22:18 +01:00
this . screen_dim [ 1 ] = int . max ( 1 , int . parse ( this . config . get ( " screen_height " ) ) ) ;
2017-11-17 16:56:34 +01:00
}
// Load pngs of all six layers
2011-10-13 19:15:00 +02:00
this . load_image_buffer ( ) ;
2011-10-17 20:38:29 +02:00
this . image = new Gtk . Image ( ) ; //.from_pixbuf(this.image_buffer[layer]);
2017-11-17 16:56:34 +01:00
2011-10-17 20:38:29 +02:00
image . show ( ) ;
2013-09-18 20:32:40 +02:00
render_page ( ) ;
2011-10-13 19:15:00 +02:00
var fixed = new Fixed ( ) ;
fixed . put ( this . image , 0 , 0 ) ;
2017-11-17 16:56:34 +01:00
# if _NO_WIN
2013-09-18 20:32:40 +02:00
fixed . put ( new KeyOverlay ( this ) , 0 , 0 ) ;
2017-11-17 16:56:34 +01:00
# endif
2011-10-13 19:15:00 +02:00
this . status = new Label ( " " ) ;
2011-10-17 20:38:29 +02:00
status . show ( ) ;
2013-12-08 01:09:00 +01:00
int width ;
2011-10-16 19:09:33 +02:00
int height ;
this . get_size2 ( out width , out height ) ;
2013-09-13 20:22:53 +02:00
2011-10-17 15:17:34 +02:00
//bad position, if numpad not shown...
fixed . put ( status , ( int ) ( ( 0.66 ) * width ) , ( int ) ( 0.40 * height ) ) ;
2011-10-13 19:15:00 +02:00
2011-10-17 20:38:29 +02:00
add ( fixed ) ;
fixed . show ( ) ;
2011-10-13 19:15:00 +02:00
//Fenstereigenschaften setzen
2013-09-18 20:32:40 +02:00
this . key_press_event . connect ( on_key_pressed ) ;
this . button_press_event . connect ( on_button_pressed ) ;
2019-01-25 03:22:18 +01:00
this . destroy . connect ( NeoLayoutViewer . quit ) ;
2011-10-13 19:15:00 +02:00
2017-11-17 16:56:34 +01:00
//this.set_gravity(Gdk.Gravity.SOUTH);
2019-01-25 03:22:18 +01:00
this . decorated = ( this . config . get ( " window_decoration " ) ! = " 0 " ) ;
2011-10-13 19:15:00 +02:00
this . skip_taskbar_hint = true ;
//Icon des Fensters
this . icon = this . image_buffer [ 0 ] ;
//Nicht selektierbar (für virtuelle Tastatur)
2019-01-25 03:22:18 +01:00
this . set_accept_focus ( ( this . config . get ( " window_selectable " ) ! = " 0 " ) ) ;
2011-10-16 19:14:47 +02:00
2013-12-08 01:09:00 +01:00
if ( this . config . get ( " show_on_startup " ) ! = " 0 " ) {
//Move ist erst nach show() erfolgreich
2019-01-25 03:22:18 +01:00
this . numkeypad_move ( int . parse ( this . config . get ( " position " ) ) ) ;
2014-06-08 17:36:56 +02:00
this . show ( ) ;
2013-12-08 01:09:00 +01:00
} else {
2017-11-12 12:59:17 +01:00
this . hide ( ) ;
2019-01-25 03:22:18 +01:00
this . numkeypad_move ( int . parse ( this . config . get ( " position " ) ) ) ;
2013-12-08 01:09:00 +01:00
}
2011-10-18 09:46:19 +02:00
2011-10-13 19:15:00 +02:00
}
2013-09-18 20:32:40 +02:00
public override void show ( ) {
2011-10-14 22:10:11 +02:00
this . minimized = false ;
2019-01-25 03:22:18 +01:00
this . move ( this . position_on_hide_x , this . position_on_hide_y ) ;
2017-11-12 12:59:17 +01:00
debug ( @" Show window on $(this.position_on_hide_x), $(this.position_on_hide_y) \n " ) ;
2013-09-13 20:22:53 +02:00
base . show ( ) ;
2019-01-25 03:22:18 +01:00
this . move ( this . position_on_hide_x , this . position_on_hide_y ) ;
2017-11-12 12:59:17 +01:00
/ * 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 .
* /
2011-10-14 22:10:11 +02:00
2019-01-25 03:22:18 +01:00
if ( this . config . get ( " on_top " ) = = " 1 " ) {
2011-10-14 22:10:11 +02:00
this . set_keep_above ( true ) ;
2013-09-18 20:32:40 +02:00
} else {
2011-10-14 22:10:11 +02:00
this . present ( ) ;
2013-09-18 20:32:40 +02:00
}
2011-10-14 22:10:11 +02:00
}
2011-10-13 19:15:00 +02:00
2011-10-17 20:38:29 +02:00
public override void hide ( ) {
2011-10-18 09:46:19 +02:00
//store current coordinates
int tmpx ;
int tmpy ;
this . get_position ( out tmpx , out tmpy ) ;
this . position_on_hide_x = tmpx ;
this . position_on_hide_y = tmpy ;
2017-11-12 12:59:17 +01:00
debug ( @" Hide window on $(this.position_on_hide_x), $(this.position_on_hide_y) \n " ) ;
2011-10-18 09:46:19 +02:00
2011-10-14 22:10:11 +02:00
this . minimized = true ;
2011-10-17 20:38:29 +02:00
base . hide ( ) ;
2011-10-14 22:10:11 +02:00
}
2011-10-13 19:15:00 +02:00
2011-10-14 22:10:11 +02:00
public bool toggle ( ) {
2011-10-17 20:38:29 +02:00
if ( this . minimized ) show ( ) ;
else hide ( ) ;
2011-10-14 22:10:11 +02:00
return this . minimized ;
}
2011-10-13 19:15:00 +02:00
/* Falsche Werte bei „Tiled Window Managern“. */
2011-10-14 22:10:11 +02:00
public void get_size2 ( out int width , out int height ) {
width = this . image_buffer [ 1 ] . width ;
height = this . image_buffer [ 1 ] . height ;
2011-10-13 19:15:00 +02:00
}
public void numkeypad_move ( int pos ) {
2017-11-17 16:56:34 +01:00
int screen_width = this . get_screen_width ( ) ;
int screen_height = this . get_screen_height ( ) ;
2011-10-21 00:37:43 +02:00
2019-01-25 03:22:18 +01:00
int x , y , w , h ;
2013-09-18 20:32:40 +02:00
this . get_size ( out w , out h ) ;
2011-10-13 19:15:00 +02:00
2013-09-18 20:32:40 +02:00
switch ( pos ) {
2011-10-14 22:10:11 +02:00
case 0 : //Zur nächsten Position wechseln
2011-10-13 19:15:00 +02:00
numkeypad_move ( this . position_cycle [ this . position_num - 1 ] ) ;
return ;
case 7 :
x = 0 ;
y = 0 ;
break ;
case 8 :
2013-09-18 20:32:40 +02:00
x = ( screen_width - w ) / 2 ;
2011-10-13 19:15:00 +02:00
y = 0 ;
break ;
case 9 :
2013-09-18 20:32:40 +02:00
x = screen_width - w ;
2011-10-13 19:15:00 +02:00
y = 0 ;
break ;
case 4 :
x = 0 ;
2013-09-18 20:32:40 +02:00
y = ( screen_height - h ) / 2 ;
2011-10-13 19:15:00 +02:00
break ;
case 5 :
2013-09-18 20:32:40 +02:00
x = ( screen_width - w ) / 2 ;
y = ( screen_height - h ) / 2 ;
2011-10-13 19:15:00 +02:00
break ;
case 6 :
2013-09-18 20:32:40 +02:00
x = screen_width - w ;
y = ( screen_height - h ) / 2 ;
2011-10-13 19:15:00 +02:00
break ;
case 1 :
x = 0 ;
2013-09-18 20:32:40 +02:00
y = screen_height - h ;
2011-10-13 19:15:00 +02:00
break ;
case 2 :
2013-09-18 20:32:40 +02:00
x = ( screen_width - w ) / 2 ;
y = screen_height - h ;
2011-10-13 19:15:00 +02:00
break ;
default :
2013-09-18 20:32:40 +02:00
x = screen_width - w ;
y = screen_height - h ;
2011-10-13 19:15:00 +02:00
break ;
2011-10-14 22:10:11 +02:00
}
2011-10-13 19:15:00 +02:00
this . position_num = pos ;
2013-12-08 01:09:00 +01:00
2014-06-09 22:44:45 +02:00
//store current coordinates
2013-12-08 01:09:00 +01:00
this . position_on_hide_x = x ;
this . position_on_hide_y = y ;
2019-01-25 03:22:18 +01:00
this . move ( x , y ) ;
2011-10-13 19:15:00 +02:00
}
2011-10-17 20:38:29 +02:00
public Gdk . Pixbuf open_image ( int layer ) {
2013-12-08 02:35:03 +01:00
var bildpfad = @" $(config.get( " asset_folder " ))/neo2.0/tastatur_neo_Ebene$(layer).png " ;
2011-10-13 19:15:00 +02:00
return open_image_str ( bildpfad ) ;
}
public Gdk . Pixbuf open_image_str ( string bildpfad ) {
try {
return new Gdk . Pixbuf . from_file ( bildpfad ) ;
} catch ( Error e ) {
error ( " %s " , e . message ) ;
}
}
public void load_image_buffer ( ) {
this . image_buffer = new Gdk . Pixbuf [ 7 ] ;
2013-12-08 02:35:03 +01:00
this . image_buffer [ 0 ] = open_image_str ( @" $(config.get( " asset_folder " ))/icons/Neo-Icon.png " ) ;
2011-10-13 19:15:00 +02:00
2017-11-17 16:56:34 +01:00
int screen_width = this . get_screen_width ( ) ; //Gdk.Screen.width();
2013-09-18 20:32:40 +02:00
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 ) ;
2019-01-25 03:22:18 +01:00
int width = int . min ( int . max ( int . parse ( this . config . get ( " width " ) ) , min_width ) , max_width ) ;
2013-09-18 20:32:40 +02:00
int w , h ;
2011-10-13 19:15:00 +02:00
2019-01-25 03:22:18 +01:00
this . numpad_width = int . parse ( this . config . get ( " numpad_width " ) ) ;
this . function_keys_height = int . parse ( this . config . get ( " function_keys_height " ) ) ;
2011-10-17 20:38:29 +02:00
2013-09-18 20:32:40 +02:00
for ( int i = 1 ; i < 7 ; i + + ) {
2011-10-13 19:15:00 +02:00
this . image_buffer [ i ] = open_image ( i ) ;
2011-10-17 20:38:29 +02:00
//Funktionstasten ausblennden, falls gefordert.
2019-01-25 03:22:18 +01:00
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 ) ;
2011-10-17 20:38:29 +02:00
this . image_buffer [ i ] = tmp ;
}
//Numpad-Teil abschneiden, falls gefordert.
2019-01-25 03:22:18 +01:00
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 ) ;
2011-10-13 19:15:00 +02:00
this . image_buffer [ i ] = tmp ;
}
//Bilder einmaling beim Laden skalieren. (Keine spätere Skalierung durch Größenänderung des Fensters)
w = this . image_buffer [ i ] . width ;
h = this . image_buffer [ i ] . height ;
2013-09-18 20:32:40 +02:00
this . image_buffer [ i ] = this . image_buffer [ i ] . scale_simple ( width , h * width / w , Gdk . InterpType . BILINEAR ) ;
2011-10-13 19:15:00 +02:00
}
2014-06-09 22:44:45 +02:00
2011-10-13 19:15:00 +02:00
}
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 " ) {
2019-01-25 03:22:18 +01:00
NeoLayoutViewer . quit ( ) ;
2011-10-13 19:15:00 +02:00
}
if ( key . str = = " h " ) {
2011-10-17 20:38:29 +02:00
this . hide ( ) ;
2011-10-13 19:15:00 +02:00
}
return false ;
}
2011-10-23 03:48:20 +02:00
private bool on_button_pressed ( Widget source , Gdk . EventButton event ) {
2013-09-18 20:32:40 +02:00
if ( event . button = = 3 ) {
2011-10-23 03:48:20 +02:00
this . hide ( ) ;
}
return false ;
}
2011-10-16 19:09:33 +02:00
/ *
2014-06-09 22:44:45 +02:00
Use the for values
2011-10-16 19:14:47 +02:00
- “ modifier was pressed ”
- “ modifier is pressed ”
- “ modifier was seleted by mouseclick ” and
- “ modifier is seleted by mouseclick ”
2011-10-17 20:38:29 +02:00
as array indizes to eval an new state . See comment of MODIFIER_KEYBOARD_MOUSE_MAP , too .
2011-10-16 19:14:47 +02:00
* /
2013-09-18 20:32:40 +02:00
public void change_active_modifier ( int mod_index , bool keyboard , int new_mod_state ) {
2011-10-16 19:09:33 +02:00
int old_mod_state ;
2013-09-18 20:32:40 +02:00
if ( keyboard ) {
2011-10-16 19:09:33 +02:00
//Keypress or Release of shift etc.
old_mod_state = this . active_modifier_by_keyboard [ mod_index ] ;
this . active_modifier_by_keyboard [ mod_index ] = MODIFIER_KEYBOARD_MOUSE_MAP [
old_mod_state ,
this . active_modifier_by_mouse [ mod_index ] ,
new_mod_state ,
this . active_modifier_by_mouse [ mod_index ]
2013-09-18 20:32:40 +02:00
] ;
2011-10-16 19:09:33 +02:00
this . active_modifier_by_mouse [ mod_index ] = MODIFIER_KEYBOARD_MOUSE_MAP [
this . active_modifier_by_mouse [ mod_index ] ,
old_mod_state ,
this . active_modifier_by_mouse [ mod_index ] ,
new_mod_state
2013-09-18 20:32:40 +02:00
] ;
} else {
2011-10-16 19:09:33 +02:00
//Mouseclick on shift button etc.
old_mod_state = this . active_modifier_by_mouse [ mod_index ] ;
this . active_modifier_by_mouse [ mod_index ] = MODIFIER_KEYBOARD_MOUSE_MAP [
old_mod_state ,
this . active_modifier_by_keyboard [ mod_index ] ,
new_mod_state ,
this . active_modifier_by_keyboard [ mod_index ]
2011-10-16 19:14:47 +02:00
] ;
2011-10-16 19:09:33 +02:00
this . active_modifier_by_keyboard [ mod_index ] = MODIFIER_KEYBOARD_MOUSE_MAP [
this . active_modifier_by_keyboard [ mod_index ] ,
old_mod_state ,
this . active_modifier_by_keyboard [ mod_index ] ,
new_mod_state
2013-09-18 20:32:40 +02:00
] ;
2011-10-16 19:09:33 +02:00
}
}
2013-09-18 20:32:40 +02:00
public int getActiveModifierMask ( int [ ] modifier ) {
2011-10-16 19:09:33 +02:00
int modMask = 0 ;
2013-09-18 20:32:40 +02:00
foreach ( int i in modifier ) {
modMask + = ( this . active_modifier_by_keyboard [ i ] | this . active_modifier_by_mouse [ i ] ) * this . MODIFIER_MASK [ i ] ;
2011-10-16 19:09:33 +02:00
}
return modMask ;
}
2013-09-18 20:32:40 +02:00
private void check_modifier ( int iet1 ) {
2011-10-13 19:15:00 +02:00
2013-09-18 20:32:40 +02:00
if ( iet1 ! = this . layer ) {
2011-10-17 20:38:29 +02:00
this . layer = iet1 ;
2013-09-18 20:32:40 +02:00
render_page ( ) ;
2011-10-14 22:10:11 +02:00
}
2011-10-13 19:15:00 +02:00
}
2013-09-18 20:32:40 +02:00
public void redraw ( ) {
2011-10-17 20:38:29 +02:00
var tlayer = this . layer ;
2019-01-25 03:22:18 +01:00
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
2013-09-18 20:32:40 +02:00
] + 1 ;
2011-10-13 19:15:00 +02:00
2019-01-25 03:22:18 +01:00
} 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 ;
}
2011-10-17 20:38:29 +02:00
// check, which extra modifier is pressed and update.
2013-09-18 20:32:40 +02:00
foreach ( var modkey in modifier_key_images ) {
2011-10-17 20:38:29 +02:00
modkey . change (
this . active_modifier_by_keyboard [ modkey . modifier_index ] |
this . active_modifier_by_mouse [ modkey . modifier_index ]
) ;
}
2013-09-18 20:32:40 +02:00
if ( tlayer ! = this . layer ) {
2011-10-16 19:09:33 +02:00
render_page ( ) ;
2013-09-18 20:32:40 +02:00
}
2011-10-17 20:38:29 +02:00
2011-10-13 19:15:00 +02:00
}
private void render_page ( ) {
2011-10-17 20:38:29 +02:00
this . image . set_from_pixbuf ( this . image_buffer [ this . layer ] ) ;
2011-10-13 19:15:00 +02:00
}
2013-09-18 20:32:40 +02:00
public Gdk . Pixbuf getIcon ( ) {
2011-10-13 19:15:00 +02:00
return this . image_buffer [ 0 ] ;
}
2013-09-18 20:32:40 +02:00
public void external_key_press ( int iet1 , int modifier_mask ) {
for ( int iet2 = 0 ; iet2 < 4 ; iet2 + + ) {
if ( this . NEO_MODIFIER_MASK [ iet2 ] = = modifier_mask ) {
iet1 = this . MODIFIER_MAP [ iet1 , iet2 ] + 1 ;
2011-10-14 22:10:11 +02:00
this . check_modifier ( iet1 ) ;
return ;
2011-10-13 19:15:00 +02:00
}
2011-10-14 22:10:11 +02:00
}
2013-09-18 20:32:40 +02:00
iet1 = this . MODIFIER_MAP [ iet1 , 0 ] + 1 ;
2011-10-14 22:10:11 +02:00
this . check_modifier ( iet1 ) ;
2011-10-13 19:15:00 +02:00
}
2013-09-18 20:32:40 +02:00
public void external_key_release ( int iet1 , int modifier_mask ) {
for ( int iet2 = 0 ; iet2 < 4 ; iet2 + + ) {
if ( this . NEO_MODIFIER_MASK [ iet2 ] = = modifier_mask ) {
iet1 = this . MODIFIER_MAP_RELEASE [ iet1 , iet2 ] + 1 ;
2011-10-14 22:10:11 +02:00
this . check_modifier ( iet1 ) ;
return ;
2011-10-13 19:15:00 +02:00
}
2011-10-14 22:10:11 +02:00
}
2011-10-13 19:15:00 +02:00
2013-09-18 20:32:40 +02:00
iet1 = this . MODIFIER_MAP_RELEASE [ iet1 , 0 ] + 1 ;
2011-10-14 22:10:11 +02:00
this . check_modifier ( iet1 ) ;
2011-10-13 19:15:00 +02:00
}
2019-01-25 03:22:18 +01:00
public int get_screen_width ( ) {
// Return value derived from config.get("screen_width")) or Gdk.Screen.width()
2017-11-17 16:56:34 +01:00
if ( this . screen_dim_auto [ 0 ] ) {
//Re-evaluate
# if GTK_MINOR_VERSION = = 18 | | GTK_MINOR_VERSION = = 19 | | GTK_MINOR_VERSION = = 20 | | GTK_MINOR_VERSION = = 21
// Old variant for ubuntu 16.04 ( '<' check not defined in vala preprozessor :-()
var display = Gdk . Display . get_default ( ) ;
var screen = display . get_default_screen ( ) ;
//Gdk.Rectangle geometry = {0, 0, screen.get_width(), screen.get_height()};
screen_dim [ 0 ] = screen . get_width ( ) ;
# else
var display = Gdk . Display . get_default ( ) ;
var screen = this . get_screen ( ) ;
var monitor = display . get_monitor_at_window ( screen . get_active_window ( ) ) ;
//Note that type of this is Gtk.Window, but get_active_window() return Gdk.Window
if ( monitor = = null ) {
monitor = display . get_primary_monitor ( ) ;
}
Gdk . Rectangle geometry = monitor . get_geometry ( ) ;
screen_dim [ 0 ] = geometry . width ;
# endif
}
2019-01-25 03:22:18 +01:00
return screen_dim [ 0 ] ;
}
2017-11-12 17:18:57 +01:00
2019-01-25 03:22:18 +01:00
public int get_screen_height ( ) {
// Return value derived from config.get("screen_height")) or Gdk.Screen.height()
2017-11-17 16:56:34 +01:00
if ( this . screen_dim_auto [ 1 ] ) {
//Re-evaluate
# if GTK_MINOR_VERSION = = 18 | | GTK_MINOR_VERSION = = 19 | | GTK_MINOR_VERSION = = 20 | | GTK_MINOR_VERSION = = 21
// Old variant for ubuntu 16.04 ( '<' check not defined in vala preprozessor :-()
var display = Gdk . Display . get_default ( ) ;
var screen = display . get_default_screen ( ) ;
//Gdk.Rectangle geometry = {0, 0, screen.get_width(), screen.get_height()};
screen_dim [ 1 ] = screen . get_height ( ) ;
# else
var display = Gdk . Display . get_default ( ) ;
var screen = this . get_screen ( ) ;
var monitor = display . get_monitor_at_window ( screen . get_active_window ( ) ) ;
//Note that type of this is Gtk.Window, but get_active_window() return Gdk.Window
if ( monitor = = null ) {
monitor = display . get_primary_monitor ( ) ;
}
Gdk . Rectangle geometry = monitor . get_geometry ( ) ;
screen_dim [ 1 ] = geometry . height ;
# endif
}
2019-01-25 03:22:18 +01:00
return screen_dim [ 1 ] ;
}
2017-11-12 17:18:57 +01:00
2011-10-14 22:10:11 +02:00
} //End class NeoWindow
2011-10-13 19:15:00 +02:00
}